知的財産の相互運用が可能な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 = "ALDEC08_001"
`protect key_public_key
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuCBKhb5D1it6SrQHYbkX
Z4AZlUxuC9LHGNn+uU/j3reqrFIJ1r6P6upprCHWffR4Enncaf6g5HLR52PccTVA
xpBRD0T8U9tTJzf1biWtbVYxVvPs2gp6xH8pBJBkeEpUcDQKrul7/mEr7yg5I92S
uzHx/1xGuuJ0HAq0+FivR9+wB29seSwk3cyrWrPlK6QsnEodnFbiHVEQXLbAtXdV
XqmGej1a8nNqO8EzdY/d4vFd01MAFhKUZNah2lDS6p6dIp3wzxlog9bmEmj/4g4D
/RS6RXkjIrsB6r7ZOlPHuMCueoDhm4h7mjapAJo0KG7sIqE3hNTS0NuXtLD6UOSa
aQIDAQAB

図 1: VHDL コードのALDEC公開鍵

Verilog/SystemVerilog コードの同様のセクションは次のようになります:

`pragma protect key_keyowner = "Aldec"
`pragma protect key_method = "rsa"
`pragma protect key_keyname = "ALDEC08_001"
`pragma protect key_public_key
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuCBKhb5D1it6SrQHYbkX
Z4AZlUxuC9LHGNn+uU/j3reqrFIJ1r6P6upprCHWffR4Enncaf6g5HLR52PccTVA
xpBRD0T8U9tTJzf1biWtbVYxVvPs2gp6xH8pBJBkeEpUcDQKrul7/mEr7yg5I92S
uzHx/1xGuuJ0HAq0+FivR9+wB29seSwk3cyrWrPlK6QsnEodnFbiHVEQXLbAtXdV
XqmGej1a8nNqO8EzdY/d4vFd01MAFhKUZNah2lDS6p6dIp3wzxlog9bmEmj/4g4D
/RS6RXkjIrsB6r7ZOlPHuMCueoDhm4h7mjapAJo0KG7sIqE3hNTS0NuXtLD6UOSa
aQIDAQAB

図 2: Verilog コードのALDEC公開鍵

IP 生成がALDEC 以外のベンダから提供されている暗号化ツールを使用していますが、暗号化されたコードをALDECシミュレータでサポートすることを望む場合、暗号化ツールによって処理されたソースに上記のコードの断片を追加する必要があります。それ使用方法の詳細な手順については暗号化ツールのマニュアルを参照してください。"ALDEC08_001"という名前のALDECキーは、2015年以降にリリースされたALDEC シミュレータでのみ動作しますのでご注意ください。セキュリティが危険にさらされた場合、将来的にALDEC によって取り消される可能性があります。.

ALDECツールで暗号化した際の他ツールの承認

ALDEC は、シミュレータインストール内のbin フォルダにあるprotectip と呼ばれる実行可能な暗号化ツールを提供しています。Version 1 勧告のサポートするために、実行可能なツールのバージョン(以前のリリースでは利用できないPerl スクリプト)が必要です。ALDEC 暗号化ツールを使用する場合、スクリプトで自動的に追加するためコード内にALDEC公開鍵の指定が必要ありません。例えば、図 67 に示す基本の暗号化エンベロープは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 の作成者は、ソースコードの領域はそれらの周りに暗号化コマンドのbeginend を入れることで正確に制御できます。これら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;

`protect begin_protected
`protect version = 1
`protect author= "john.smith@iphouse.com"
`protect encrypt_agent= "Aldec protectip.exe, Riviera-PRO 2013.02.81"
`protect key_keyowner= "Aldec", key_keyname= "ALDEC08_001", key_method= "rsa"
`protect encoding= (enctype="base64")
`protect key_block
CBbtjb/TnL8uQsfiqMNPicHtioL2Kxzi0mf+iRQn4Af1P9cO1HAEpDrSU7J2DdMItSXg9P/bHZ4A
2Vjx+4VyoEyboG+NeXaE7UV7djweCJ0bOPVASagQsuLAWWlj6UiqUIOVa3C1fLkr+0quEzKhcNVn
mbvs92U0oKCuyC4JwlQXwuKyl81x1pJxDySMrs74oFqNeoLt4ZHdKiy6yeNn9OiP0QMXzGR3wpe5
CypVsLF15SibeocemLNO7fUINw0ZgmaoirkVS/kqfo++3nIlWKvhzytWxxKurGzo2RQOZuApYO/q
4NN9wW8MY0ohT1YbNJivApWD/fMdYQ7VRgr/3g==
`protect data_keyowner= "IP_House", data_keyname= "Random"
`protect data_method= "aes256-cbc"
`protect encoding= (enctype="base64")
`protect data_block
pyB+WqJ2KgutN0E39HXls+8GUPF+YedbmZ1CV+u8bz5P8zlj+2FPzWXb9vswNElksxAojMA50VHx
tAN21ebA0gI9tqt4iC7UQkM2epiuvMEm6APC9a7q9XD8LeLqWILv1cqF57PFIiBGvj/EdpC8xwl6
iKV7QP+/Lmd0AV7BNtVEGpr+LpsAcVb/2f11KjU2xkOE3UgI9tki7RTUJ3sD9+OlL4yxljU5Vl9E
BoxCtbegynYyt2yeMsSEE4QtnEbzSgeAZDgr9hGx3QayYEdL2tLwDGV7Ce4BWB1D1Tk7KL4=
`protect end_protected

図 8: 図 7のコード暗号化後の部分的に保護されたソース

対称鍵勧告

マニュアルでソース暗号化に使用された対称鍵(セッションキー)を指定し、次に承認されたツール/ベンダの公開鍵を使用して暗号化することが可能です。このような行為は、全体の保護スキームを破壊するリスクが増大するため推奨されません。明示的に指定された対称鍵の使用は、暗号化/復号化フローの社内テストに限定されるべきであり、生産IP で使用は避けた方が良いです。明示的に指定された対称キーが存在しない状態では、ALDEC 暗号化ツールは適切な長さのランダム鍵を生成します。対称鍵を生成するこの方法は生産IP で必要であり、他の全てのケースでも強く推奨されます。

ALDEC 暗号化ツールの便利なオプション

以下の表は、protectip 暗号化ツールの実行時に指定することが可能な最も有効なオプションを示します。

Option

Explanation

-out

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 オプションは下位互換性のために提供されており、相互運用可能な暗号化では使用する必要はありません。

Ask Us a Question
x

Ask Us a Question

x
Captcha ImageReload Captcha
Incorrect data entered.
Thank you! Your question has been submitted. Please allow 1-3 business days for someone to respond to your question.
Internal error occurred. Your question was not submitted. Please contact us using Feedback form.