« Prev | Next » 知的財産の相互運用が可能なHDL暗号化 はじめに Verilog 2005、およびその後のハードウェア記述言語規格でスタートした知的財産保護のためにソースレベルでの暗号化を使用する考えは、設計と検証フローで導入されました。Verilog、VHDLそしてSystemVerilog の規格で示されたソリューションは、同じ寄贈をベースにしており非常に類似しているが、各言語規格でいくつかの欠点を示しています。1つのツールのみで暗号化を使用している場合はこれらの問題が如実ではありませんが、同じIP を複数ベンダーによって作成された複数ツールで使用する場合はフローを無効化する恐れがあります。現在(2013年4月)、IEEE は暗号化、およにIP 保護方法の拡張、統一化を行う1735 (別名 IEEE P1735)規格の提案に取り組んでいます。ALDEC はP1735 のワーキンググループに参加し、グループのメンバによって確立されたVersion 1 と呼ばれる勧告を2012 以降にリリースされたALDEC シミュレータでサポートしています。勧告はまだワーキンググループによって公開されていないため、そこに記述された中で最も重要な問題のみを発します:: 暗号化と復号化プロセスで使用されるプラグマの統一 CBCモードの対称暗号化フローの明確化、とりわけ初期設定ベクタの取り扱い RSA 暗号を使用した非対象暗号化フローの明確化、メッセージのさらに適切なパディング コードで暗号化/復号化を制御 Version 1 勧告 IP 作成者は、ソースに特別にマークしたコマンド (またはプラグマ) を追加することで、HDLソースの暗号化と複合化の両方を制御することが出来ます。これらのコマンドの一般的なフォーマットは次の通りです: <prefix> <command> <optional arguments> ... <prefix>は、VerilogとSystemVerilog では `pragma protect 、VHDL では`protect になります。明確にP1735 の拡張機能をサポートするコードを既存規格へマークするために、P1735 ワーキンググループのメンバは、Version 1 勧告のための暗号化コマンドのversion 引数に1 を設定し実装することに合意しました。下記は、ラインを含むVHDL コードになります: `protect version = 1 または、ラインを含んでいるVerilog/SystemVerilogコード `pragma protect version = 1 同じ勧告をサポートするどの暗号化ツールでよってそれを作成したとしても、Version 1 勧告をサポートする全ツールでコンパイルする必要があります。 他ベンダツールで暗号化した際のALDECシミュレータを承認 暗号化ツールは、コードに直接置かれたIP の使用について権限を与えるツール/ベンダの公開鍵を認識し使用することが必要です。ターゲットツールで適切な承認を保証するために、公開鍵は明確にラベル付けする必要があります: Key owner name – ベンダツールにそれのためにこのセクションが作成されたと知らせる Key name – ツールは、適切な秘密鍵(ベンダが複数の鍵をサポートする場合がある)の選択 Encryption method – RSAは最も人気のあるアルゴリズム。他のものもサポート VHDLコードで適切にマークされALDEC公開鍵の例を以下に示します: `protect key_keyowner = "Aldec" `protect key_method = "rsa" `protect key_keyname = "ALDEC15_001" `protect key_public_key MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1+Sho7wbmV55WteRlk1A Wr9gdsSIWpH5Lq7YEbdyGUyUclNHckfaQysgbfh2qktqrhC9SKC+IDTJ83XfZUGZ ZbXdlDcW3hC3eM7Wbr7ddZTPp7geXYjMt9XIQDdpXAmPwGylpIBD6+BGmUf+HiDm 0qoNa2vUbfx3PQDa5m3MK89AyMKmGumF54kDU/eYgXgi3TWrckqYokyDUD6r1Xea Mtjvyi8oaI4bh6ewm2U+D700CLfeLP3+xgANjNZUfYevjo9xfKM9dnLx5EC7HyqT kM4RFYqABQsbrinRqZespR3gtCVMoU8dIic440ORqPtIvQ8Kyc9zK8XV4gZAN3Et bwIDAQAB 図 1: VHDL コードのALDEC公開鍵 Verilog/SystemVerilog コードの同様のセクションは次のようになります: `pragma protect key_keyowner = "Aldec" `pragma protect key_method = "rsa" `pragma protect key_keyname = "ALDEC15_001" `pragma protect key_public_key MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1+Sho7wbmV55WteRlk1A Wr9gdsSIWpH5Lq7YEbdyGUyUclNHckfaQysgbfh2qktqrhC9SKC+IDTJ83XfZUGZ ZbXdlDcW3hC3eM7Wbr7ddZTPp7geXYjMt9XIQDdpXAmPwGylpIBD6+BGmUf+HiDm 0qoNa2vUbfx3PQDa5m3MK89AyMKmGumF54kDU/eYgXgi3TWrckqYokyDUD6r1Xea Mtjvyi8oaI4bh6ewm2U+D700CLfeLP3+xgANjNZUfYevjo9xfKM9dnLx5EC7HyqT kM4RFYqABQsbrinRqZespR3gtCVMoU8dIic440ORqPtIvQ8Kyc9zK8XV4gZAN3Et bwIDAQAB 図 2: Verilog コードのALDEC公開鍵 IP 生成がALDEC 以外のベンダから提供されている暗号化ツールを使用していますが、暗号化されたコードをALDECシミュレータでサポートすることを望む場合、暗号化ツールによって処理されたソースに上記のコードの断片を追加する必要があります。それ使用方法の詳細な手順については暗号化ツールのマニュアルを参照してください。"ALDEC15_001"キーは、Active-HDL 10.2 Update 2 (BUILD 3312.5682.02)およびRiviera-PRO 2015.06 (BUILD 2015.06.92.5791)以降の利用可能なALDECシミュレータでのみ動作することに注意してください。将来、セキュリティが損なわれた場合には、ALDECによって取り消される可能性があります。 ALDECツールで暗号化した際の他ツールの承認 ALDEC は、シミュレータインストール内のbin フォルダにあるprotectip と呼ばれる実行可能な暗号化ツールを提供しています。Version 1 勧告のサポートするために、実行可能なツールのバージョン(以前のリリースでは利用できないPerl スクリプト)が必要です。ALDEC 暗号化ツールを使用する場合、スクリプトで自動的に追加するためコード内にALDEC公開鍵の指定が必要ありません。例えば、図 6 と図 7 に示す基本の暗号化エンベロープはALDEC公開鍵で暗号化されたブロックが生成されます。ALDEC ツールによって暗号化されたコードを他ツールで使用する場合、他ツールの公開鍵と一致するラベルを含む適切なセクションを前述のALDEC スクリプトによる暗号化を参考に追加する必要があります。ALDEC が他ベンダやツールに関する公開鍵を配布許可がないため、IP 生成者はこれらのツールの最新ドキュメント、またはツールベンダに連絡してそれらを取得してください。Acme と言うダミーベンダを使用しベンダキーセクションの例を示したコードリストを下記 (図 3) に示します。 `pragma protect key_keyowner = "Acme" `pragma protect key_method = "rsa" `pragma protect key_keyname = "ACME_KEY7_11" `pragma protect key_public_key MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCh/TyTxv6yTpGxBRQ0RBuTNc05 gcwndTBEOgJVKinj9bNiUCLoFU3YTGa/L+M0pTfR/eetiIu1AnFg9Y4sKXYmaCjx 1/7hOB07hUK+vl0xNXk701/Q0wwoQfVsHctTbwRP8NGVKbqlP//QL+o1UC1FPixy FZy6oMnRULLoBy0s8QIDAQAB `pragma protect begin // Verilog code to be encrypted module top; . . . 図 3: 暗号化のために準備したAcme鍵を持ったコード 暗号化コマンドのプレフィックスは、VHDLソースを変更しながら`protect に変更する必要があります。ベンダー公開鍵を上記のような形式で使用できない場合は、以下に示す.PEM ファイルフォーマットで配信されることがあります: -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCh/TyTxv6yTpGxBRQ0RBuTNc05 gcwndTBEOgJVKinj9bNiUCLoFU3YTGa/L+M0pTfR/eetiIu1AnFg9Y4sKXYmaCjx 1/7hOB07hUK+vl0xNXk701/Q0wwoQfVsHctTbwRP8NGVKbqlP//QL+o1UC1FPixy FZy6oMnRULLoBy0s8QIDAQAB -----END PUBLIC KEY----- 図 4: .PEMフォーマットによる公開鍵のサンプル “-----BEGIN PUBLIC KEY-----” と“-----END PUBLIC KEY-----” アンカーの間に位置するエンコードされた公開鍵は先に提示したテンプレートにコピーすることができます。鍵とその所有者を識別するプレフィックスコマンドは、ベンダによって提供されたデータを反映するように調整する必要があります。IPソースで暗号化エンベロープに非ALDEC公開鍵が含まれている場合、ALDECツールによって暗号化されたソースは2つの復号エンベロープが含まれます: ALDEC公開鍵を使用して暗号化されたセッションキーを含む1つ 暗号化エンベロープで指定された公開鍵を用いて暗号化されたセッションキーを含む1つ 例えば図 3 で示すコードをALDECで提供するprotectip.pl ツールを使用して暗号化される場合、 図 5 に示すコードが生成されます。二つの復号エンベロープを図 5 で異なる背景色で強調表示しています。ALDECツール、または他ベンダツールは、エンベロー内の鍵の所有者と鍵名フィールドを使用して復号化エンベロープを認識することができます。 図 5: 2つの復号エンベロープを持った暗号化コード 暗号化するコードをマーク 暗号化ツールの適切なオプションを指定することによりソース全体を暗号化することは出来ますが、暗号化しない方がIPファイルのいくつかの部分がよりよく動作する可能性があります。典型的な例は、IP またはIP のエンドユーザーにより修正される必要がある補助のブロックのインスタンスを簡素化するラッパーを含みます。IP の作成者は、ソースコードの領域はそれらの周りに暗号化コマンドのbegin とend を入れることで正確に制御できます。これら2つのコマンドを配置すると、IP ソースに基本暗号化エンベロープ を作成します。例えばbegin コマンドの前に公開鍵の仕様を追加(簡単な例については、上記図 3 を参照)することにより、基本暗号化エンベロープを拡張することが可能です。暗号化が成功した後、それぞれの暗号化エンベロープを解読エンベロープに変換します。 `pragma protect begin module A; // this module will be encrypted ... endmodule `pragma protect end module B; // this module will not be encrypted ... endmodule 図 6: 基本暗号化エンベロープを持ったVerilog コード 部分的に保護されたVHDLソースの同様な例: package my_pack is -- this portion will not be encrypted function magic (arg : integer) return integer; end package my_pack; `protect begin package body my_pack is -- this portion will be encrypted function magic (arg : integer) return integer is begin report "Magic function was called!"; return arg * arg + 777; end function magic; end package body my_pack; `protect end 図 7: 基本暗号化エンベロープを持ったVHDL コード コードの一部のみを保護する暗号化エンベロープを持ったソースの両方の場合において、下記図 8 に示すように暗号化ツールは'そのまま'保護されていないコードをを残し、解読エンベロープと暗号化エンベロープを交換します。 package my_pack is -- this portion will not be encrypted function magic (arg : integer) return integer; end package my_pack; package my_pack is -- this portion will not be encrypted function magic (arg : integer) return integer; end package my_pack; `protect begin_protected `protect version = 1 `protect encrypt_agent= "Aldec protectip.EXE", encrypt_agent_info= "Riviera-PRO <version>" `protect key_keyowner= "Aldec", key_keyname= "ALDEC15_001", key_method= "rsa" `protect encoding= (enctype="base64", line_length= 76, bytes= 256) `protect key_block tZn7yT+LkIkXqQ6lJSKmhadLXsPeUqm6aCG6QfAhlZ1GabzBjZrvvUNKPR9AaY81UGqwMpTQDByK lLdAxX/5JJ9k1AtAs4tHbJ9dngdBFvhdP6uTtl7f1sYw/hAYmpZ3MMymaOgf0jkzyG6Fzkie+f2c OOtIZKSBR3oy5plVENHq8xVZ5doCBu3RKGr7t0Bnk3mcm0iWuAdg7XAaPp2boNlFSP2hUOe87XIZ pIax/SLYA/wVwJfScU/rg6BnUJL/uFIelxy5dwZ7PEL5kGFaaBRxDStfbdnsmiekzhLu8TUA3tz0 cWZrV/csNozicvoqRBH//5Rn63Wxgxa96qnYyA== `protect data_method= "aes128-cbc" `protect encoding= (enctype="base64", line_length= 76, bytes= 256) `protect data_block +U8qeYNCk+5gj/tbATIYK2yDzbq3fRffL+Qfg1LHdiXCDlOM40DuKqCdjfx8gHd2NGvKUzYIdW1m zijtJvFck2oLWVilm5V5W87h78D3IdDMTscN+OyRwG1j1zVGb21zSnYWpG5M38bjSBrxyL5LZRwf tNvLjbhekjlNZF4at140jqNMcrqU/PGBgEkACJs0AO1EtrCyC4a+OQD0VF4OO3VcGOEnitt8qW/4 t9znhCAfgiRKf12N2Vj//7XwSMzP8kqGIB2V76SwKYrrdGPwlbwnciYynW0sr1rW0vp+ZLYz1cGN 2MZ8GtFiVHTq/xju5KxSeM64FxLahM3P+9nPUg== `protect end_protected 図 8: 図 7のコード暗号化後の部分的に保護されたソース 対称鍵勧告 マニュアルでソース暗号化に使用された対称鍵(セッションキー)を指定し、次に承認されたツール/ベンダの公開鍵を使用して暗号化することが可能です。このような行為は、全体の保護スキームを破壊するリスクが増大するため推奨されません。明示的に指定された対称鍵の使用は、暗号化/復号化フローの社内テストに限定されるべきであり、生産IP で使用は避けた方が良いです。明示的に指定された対称キーが存在しない状態では、ALDEC 暗号化ツールは適切な長さのランダム鍵を生成します。対称鍵を生成するこの方法は生産IP で必要であり、他の全てのケースでも強く推奨されます。 ALDEC 暗号化ツールの便利なオプション 以下の表は、protectip 暗号化ツールの実行時に指定することが可能な最も有効なオプションを示します。 Option Explanation -out<name> Encrypted output file name (can contain path). -vhd VHDL 2008 style of encryption. -v2k5 Verilog 2005 style of encryption (also applies to SystemVerilog). -a IP author identification (e.g. “johnd@acme.com”). -dko Symmetric encryption key owner (e.g. “Acme”). -dkn Symmetric encryption key name (e.g. “Random”). -c Symmetric cipher to be used: des-cbc, 3des-cbc, aes128-cbc, aes256-cbc or bf-cbc; key will be generated randomly. Riviera-PRO GUI から実行している間、以下の例のVerilog の暗号化に示すように暗号化ルーツ名はsh コマンドで始まる必要があります: sh protectip top.v -out top_ip.v -v2k5 -a "johnd@iphouse.com" -dko "IP_House"-dkn "Random" -c aes128-cbc Active-HDL GUI から実行している間、以下の例のVHDL の暗号化に示すように暗号化ツール名は! コマンドで始まる必要があります: ! protectip top.vhd -out top_ip.vhd -vhd -a "johnd@iphouse.com" -dko "IP_House" -dkn "Random" -c aes128-cbc 上に示した例は、ALDECシミュレータで使用するスクリプトと互換性があります。それらの特定アプリケーションに有益である可能性のある追加オプションについては、現在の使用しているシミュレータのオンラインドキュメントを確認することを推奨します。 注意: 暗号化ツールの–ef オプションは下位互換性のために提供されており、相互運用可能な暗号化では使用する必要はありません。 Previous article Next article