« JTAGチャレンジ基板(仮称)を作ります | トップページ | ロックインアンプ実装中 »

2018.07.16

VivadoでIEEE-1735によるソースコード暗号化

製品を作る際に、ユーザがカスタマイズできるようにしたいけれども、FPGAのソースコードを公開したくないという場合があります。

そんな場合、どうすればよいでしょうか。ISEのころは、EDIFのネットリストで配ったり難読化を施したコードを配ったりすることもあったと思います。

VivadoではIEEE-1735という暗号化の方法がサポートされています。IEEE-1735を使うとVivadoの公開鍵であなたのソースコードを暗号化し、Vivadoでしかそれを解読できないので、秘密を守ることができるようになります。

やり方を説明します。

https://japan.xilinx.com/support/answers/68071.htmlのページを参考に、ライセンスが欲しい旨を英語でメールします。しばらくすると、ライセンスが追加された旨のメールが送られてくるので、XILINXのライセンスサイトに行きます。

すると、1735のライセンスが使えるようになっているので、Createします。

Enc_1

② ライセンスを生成するとメールでlicファイルが送られてくるので、これをVivadoに取り込みます。

Enc_2

これでVivadoで暗号化ができるようになります。

③ Vivadoのプロジェクトを作り、暗号化したいソースを作ります。

ここではD:/enctest/project_1/というフォルダにプロジェクトを作ります。

以下は暗号化させたいソースファイルの例です。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity led is
    Port ( clk_ip : in std_logic;
           din    : in STD_LOGIC_VECTOR(3 downto 0);
           dout   : out STD_LOGIC_VECTOR(3 downto 0));
end led;
architecture Behavioral of led is
begin
    process(clk_ip) begin
        if(clk_ip'event and clk_ip = '1') then 
            case din is
                when x"0" =>
                    dout <= "1000";
                when x"1" =>
                    dout <= "0100";
                when x"2" =>
                    dout <= "0010";
                when x"3" =>
                    dout <= "0001";
                when others =>
                    dout <= "0000";
            end case;
        end if;
    end process;
end Behavioral;

④ Keyファイルを作ります。

`protect version = 2
`protect encrypt_agent = "XILINX"
`protect encrypt_agent_info = "Xilinx Encryption Tool 2017"
`protect begin_commonblock
`protect control error_handling = "delegated"
`protect control runtime_visibility = "delegated"
`protect control child_visibility = "delegated"
`protect control decryption=(activity==simulation) ? "false" : "true"
`protect end_commonblock
`protect begin_toolblock
`protect rights_digest_method="sha256"
`protect key_keyowner = "Xilinx", key_keyname= "xilinxt_2017_05", key_method = "rsa", key_public_key
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxngMPQrDv/s/Rz/ED4Ri
j3tGzeObw/Topab4sl+WDRl/up6SWpAfcgdqb2jvLontfkiQS2xnGoq/Ye0JJEp2
h0NYydCB5GtcEBEe+2n5YJxgiHJ5fGaPguuM6pMX2GcBfKpp3dg8hA/KVTGwvX6a
L4ThrFgEyCSRe2zVd4DpayOre1LZlFVO8X207BNIJD29reTGSFzj5fbVsHSyRpPl
kmOpFQiXMjqOtYFAwI9LyVEJpfx2B6GxwA+5zrGC/ZptmaTTj1a3Z815q1GUZu1A
dpBK2uY9B4wXer6M8yKeqGX0uxDAOW1zh7tvzBysCJoWkZD39OJJWaoaddvhq6HU
MwIDAQAB
`protect control xilinx_configuration_visible = "false"
`protect control xilinx_enable_modification = "false"
`protect control xilinx_enable_probing = "false"
`protect control xilinx_enable_netlist_export = "false"
`protect control xilinx_enable_bitstream = "true"
`protect control decryption=(xilinx_activity==simulation) ? "false" : "true"
`protect end_toolblock = ""

中央にある公開鍵の部分(緑色の部分)は、Vivadoをインストールしたフォルダの Vivado\2018.1\data\pubkey にあります。

protect controlの部分は、暗号化したコアがユーザにどのようなアクセスを許可するかを指定します。

  • xilinx_configuration_visible・・・VivadoビューワーでLUT値を表示できるかどうかを設定します。
  • xilinx_enable_modification・・・Vivadoツールで、保護領域内の情報を変更できるかどうかを設定します。
  • xilinx_enable_probing・・・Vivadoデバッグプローブを保護領域内に挿入できるかどうかを設定します。
  • xilinx_enable_netlist_export・・・保護領域のネットリストをエクスポートできるかどうかを指定します。
  • xilinx_enable_bitstream・・・Vivadoでビットストリームを生成できるようにします。

例えば、ビットストリームの生成を不可にすると、Generate Bitstreamで以下のようなエラーが出ます。

Enc_3

⑤ VivadoのTclコンソールで以下のコマンドを打つ

cd D:/enctest/project_1/src/
encrypt -key keyfile.txt -ext .vhdp -lang vhd led.vhd

こうすると、led.vhdからled.vhdpが生成されます。.vhdpの内容は以下のようになります。

`protect begin_protected
`protect version = 2
`protect encrypt_agent = "XILINX"
`protect encrypt_agent_info = "Xilinx Encryption Tool 2015"
`protect begin_commonblock
`protect control error_handling = "delegated"
`protect control runtime_visibility = "delegated"
`protect control child_visibility = "delegated"
`protect control decryption=(activity==simulation) ? "false" : "true"
`protect end_commonblock
`protect begin_toolblock
`protect rights_digest_method="sha256"
`protect key_keyowner = "Xilinx", key_keyname= "xilinxt_2017_05", key_method = "rsa", key_block
pdjNjyoCm2WBMs0KG3Q+ePaDB6ARbd7Y7H3A26a55OOdnew+1OzTUK2k96Ntxukr+wj/aCI2W080
iHpbvKfzLLHduvQ2c1dY3pwuILRpF/YrHydz3MK+Z2IVWvREP/HYxv29SL9MCchFczqEoILOZLfP
PqBHW8jMADoKFmexdPzUm3dx10P1hOGMQ5/4Twzq9dj1Ff3x0QHNcDwsuPj1ed1DXdXP9LAUlWAa
MSTo8PBOP9BHKipCYhrDYSWJqXrAqFtdwzMyixefO7cSleSt4QYoZ6wXS3cgV7hfxtgjsD+C2eu8
RnTUg7kB/iZJT93cNeLAopn9eFLt6Mo9mu1lMw==

`protect control xilinx_configuration_visible = "false"
`protect control xilinx_enable_modification = "false"
`protect control xilinx_enable_probing = "false"
`protect control xilinx_enable_netlist_export = "false"
`protect control xilinx_enable_bitstream = "true"
`protect control decryption=(xilinx_activity==simulation) ? "false" : "true"
`protect end_toolblock="Gvz94Xjb16LqWZIuHZl19gXgAJUP/A9Ayg7PWzSp71Q="
`protect data_method = "AES128-CBC"
`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 464)
`protect data_block
vZGEdHA8Zx5d5yGCb7CGj0ZiCC7CbVudUtULGxqOfj8l+1wRnXKQ4uevKFe6wrMj+P8OXGSBZrl4
VPAnc7iJAC5jXR7TwXtDbO9YzXA8d6sPl2PEb9W/gdLZSEoPqcLfi7oG0pxYaSXzSur2BN9LDYX8
jTYhPDwhPQqOEUwDpmxHxYTqIo+lJEKGOkJDE/Gh2VQ1pZnP1huOVn6MD60nZRZ0CnNL2+zFtf8z
BggLumqLrIY+4yWGI/qLgeDL9zo/COv/AWBmJsb9oCRmBrEcPKOS86jX8nmVejTTuQJwxDId2h2p
w+tj7NFlIF3ay1x26G8UVrQvxxtUsqsfgj+IZ1hIiBr7b6Ae11p2zSKRzW9dQTW5nc1E6C7DzqlJ
6eTAnJ29y9AhU/zH4Q1WBVHlutg0wAANMIwEEjLH+9ZicjzZQBpIwG3A65e1ylAnLw8mCP6aeXTt
cSM2Mwfx+GSWOaJCaymED+E1w6qGw6efC2vdeTzIuedN2ejxDGG45uNzW8zhZGrb/oFToDwh2NaB
CAy3AXRgadtedUPE/mt9Jq0MXqDqh1aHv5e3x8Ebqbiq6tQsI8jUi7BhWis9fSG7kVP2jDTB257q
NX/VL7bljOo=
`protect end_protected

この最後にあるprotect data_block~protect end_protectedの間の暗号化された部分が、元のled.vhdに相当します。

このled.vhdは、人間が読んでもわかりませんが、Vivadoには元のled.vhdを復元できるので、論理合成できるというわけです。

⑥ ラッパを作る

上で暗号化した、led.vhd→led.vhdpは暗号化されていて使いにくいので、led_wrap.vhdというラッパを作ります。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity led_wrap is
    Port ( clk_ip : in std_logic;
           din : in STD_LOGIC_VECTOR(3 downto 0);
           dout : out STD_LOGIC_VECTOR(3 downto 0));
end led_wrap;

architecture Behavioral of led_wrap is
    component led
        Port ( clk_ip : in std_logic;
           din : in STD_LOGIC_VECTOR(3 downto 0);
           dout : out STD_LOGIC_VECTOR(3 downto 0));
    end component;
begin

    u0 : led
    port map( clk_ip => clk_ip, din => din, dout => dout );

end Behavioral;

これで論理合成すれば、led.vhdが暗号化されたIPとなって、無事に回路が合成されます。

Enc_4

いかがでしたでしょうか?

意外と簡単だったと思います。

ポイントは、

  • 暗号化ライセンスを取得してVivadoに機能追加する
  • keyファイルを作り、ユーザに与えたい権限を設定し、tclコマンドでVHDLファイルを暗号化する
  • vhdpファイルは、人間には読めないが、ツールにはVHDLと同じように使用可能

このような手順で、貴方のつくった回路の秘密が守られるので、ぜひ試してみてください。

|

« JTAGチャレンジ基板(仮称)を作ります | トップページ | ロックインアンプ実装中 »

コメント

なひたふさん

はじめまして。記事を読ませて頂きました。

>ライセンスが欲しい旨を英語でメールします。しばらくすると、ライセンスが追加された旨のメールが送られてくるので、XILINXのライセンスサイトに行きます。

とあるのですがライセンス申請に使用したメールを(可能な範囲で)開示いただくことはできないでしょうか。
突然のコメントで申し訳ないのですがご検討いただけないでしょうか。


/木村

投稿: hirok | 2023.06.08 09:44

それは自分で考えましょう

投稿: なひたふ | 2023.06.08 09:53

それは自分で考えましょう

投稿: なひたふ | 2023.06.08 09:53

コメントを書く



(ウェブ上には掲載しません)




« JTAGチャレンジ基板(仮称)を作ります | トップページ | ロックインアンプ実装中 »