• 検索結果がありません。

BBRAM

ドキュメント内 Bootgen ユーザー ガイド (UG1283) (ページ 44-74)

Partition Encrypted Partition

OR

X21274-080918

bootROM は、フラッシュから FSBL を読み出し、復号化し、ロードし、制御を FSBL に渡します。FSBL の実行が開 始されると、残りのパーティションが読み込まれ、復号化され、ロードされます。パーティションの復号化に必要な

AES キーは、eFUSE または BBRAM のいずれかから取得できます。暗号化キーのソースを把握するために、ブート イ

メージ内のブート ヘッダー テーブルのキー ソース フィールドが読み出されます。暗号化されたパーティションはそ れぞれ、AES ハードウェア エンジンを使用して復号化されます。

図 11: 復号化プロセスの図

Key

Decryption AES

eFUSE

BBRAM

Partition Decrypted Partition

OR

X21274-081518

Zynq-7000 デバイスのパーティションの暗号化

Zynq®-7000 SoC デバイスは、内蔵型でプログラマブル ロジック (PL) ベースの HMAC (Hash-based Message Authentication Code)、および Cipher Block Chaining (CBC) モードの Advanced Encryption Standard (AES) モジュール を使用します。

BIF ファイルの例

暗号化されたパーティションを持つブート イメージを作成するには、aeskeyfile 属性を使用して BIF で AES キー ファ イルを指定します。暗号化する BIF ファイルにリストされている各イメージ ファイルに対して encryption=aes 属性を指定します。BIF ファイル (secure.bif) の例を次に示します。

image:

{

[aeskeyfile] secretkey.nky [keysrc_encryption] efuse

[bootloader, encryption=aes] fsbl.elf [encryption=aes] uboot.elf

}

コマンドラインから、次のコマンドを使用して、暗号化されたfsbl.elfおよびuboot.elfを含むブートイメー ジを生成します。

bootgen -arch zynq -image secure.bif -w -o BOOT.bin キーの生成

Bootgen は AES-CBC キーを生成できます。Bootgen は、BIF で指定された AES キー ファイルを使用し、パーティシ ョンを暗号化します。キー ファイルが空または存在しない場合、Bootgen は BIF ファイルで指定されたファイルにキ ーを生成します。キー ファイルが BIF で指定されておらず、いずれかのパーティションに対して暗号化が要求されて いる場合、Bootgen は BIF と同じディレクトリに拡張子 .nky の BIF ファイル名を用いたキー ファイルを生成しま す。次に、キーファイルの例を示します。

図 12: キー ファイルの例

Zynq MPSoC デバイスのパーティションの暗号化

Zynq® UltraScale+™ MPSoC デバイスは、AES-GCM コアを使用します。このコアは 32 ビット ワード ベースのデー

タ インターフェイスを備えており、256 ビット キーをサポートします。AES-GCM モードは、暗号化と復号化、複数 のキーソース、内蔵のメッセージ インテグリティ チェックをサポートします。

操作キー

優れたキー管理の方法の 1 つは、秘密キーの使用を最小限に抑えることです。このためには、Bootgen で有効になっ ている操作キーオプションを使用します。

Bootgen は、暗号化された安全なヘッダーを作成します。このヘッダーには、ユーザー指定の操作キー (opt_key)

と、Bootgen が有効のときにコンフィギュレーションファイルの最初のブロックに必要な初期化ベクトル (IV) が含ま

れます。このため、BBRAM または eFUSE のいずれかに格納された AES キーは 384 ビットのみで使用され、サイド チャネル攻撃にさらされる可能性が大幅に制限されます。opt_key 属性は、操作キーの使用方法を指定するもので す。fsbl_config 属性に対する引数であるopt_key 値の詳細は、fsbl_configを参照してください。次に、opt_key 属性の使用例を示します。

image:

{

[fsbl_config] opt_key

[keysrc_encryption] bbram_red_key

[

bootloader,

destination_cpu = a53-0, encryption = aes, aeskeyfile = aes_p1.nky ] fsbl.elf

[

destination_cpu = a53-3,

}

操作キーは、次に示すように、AES キー (.nky) ファイルで Key Opt 名を用いて与えられます。

図 13: 操作キー

Bootgen は暗号化キーファイルを生成します。前の例に示すように、BIF ファイルでopt_keyが有効になっている

場合、操作キー opt_key が .nkyファイルで生成されます。

操作キーを使用するその他の例は、操作キーを使用して開発環境のデバイスキーを保護するを参照してください。

この機能の詳細は、『Zynq UltraScale+ デバイス テクニカル リファレンス マニュアル』 (UG1085: 英語版、日本語版) の「セキュリティ」章のキー管理を参照してください。

キーの差し替え

AES-GCM は、暗号化されたイメージ全体をより小規模な AES 暗号化ブロック/モジュール単位で表すキー差し替え機 能もサポートしています。各モジュールは独自のキーを使用して暗号化されます。最初のキーはデバイスのキー ソ ースで格納され、後続の各モジュールのキーは直前のモジュール内で暗号化 (ラップ) されます。キー差し替えをサポ ートするブート イメージは、Bootgen を使用して生成できます。BIF の属性 (blocks) を使用して、暗号化用に複数の 小さなブロックを作成するためのパターンを指定します。

image:

{

[keysrc_encryption] bbram_red_key

[

bootloader,

destination_cpu = a53-0, encryption = aes,

aeskeyfile = aes_p1.nky,

blocks = 1024(2);2048;4096(2);8192(2);4096;2048;1024, ] fsbl.elf

[

destination_cpu = a53-3, encryption = aes,

aeskeyfile = aes_p2.nky, blocks = 4096(1);1024, ] hello.elf

} 注記:

キーファイル内のキーの数は、暗号化されるブロックの数と常に一致する必要があります。

キーの数が暗号化されるブロック数より少ない場合、Bootgen はエラーを返します。

キーの数が暗号化されるブロック数より多い場合、Bootgen は余分なキーを無視します。

複数のキー/IV ペアを指定する場合は、no. of blocks + 1 ペアを指定する必要があります。

余ったキー/IV ペアは、セキュア ヘッダーの暗号化に使用されます。

グレー/難読化キー

ユーザー キーは、ファミリ キーで暗号化されており、デバイスの金属層に埋め込まれています。このファミリ キー

は、Zynq® UltraScale+™ MPSoC のすべてのデバイスで同じであり、結果、難読化キーとして使用されます。難読化キ

ーは、認証されたブート ヘッダーまたは eFUSE のいずれかに配置できます。

image:

{

[keysrc_encryption] efuse_gry_key [bh_key_iv] bhiv.txt

[

bootloader,

destination_cpu = a53-0, encryption = aes, aeskeyfile = aes_p1.nky fsbl.elf

] [

destination_cpu = r5-0, encryption = aes,

aeskeyfile = aes_p2.nky hello.elf

[ }

Bootgen は、イメージの作成中に次を実行します。

1. ブート ヘッダーの BH IV フィールドに bhiv.txt の IV を置きます。

2. ブート ヘッダーのセキュア ヘッダー IV フィールドに aes.nky の IV 0 を置きます。

3. aes.nky の Key0 および IV0 を使用して、パーティションを暗号化します。

グレー/ファミリ キーを使用する別の例については、付録 A: ユース ケースおよび例を参照してください。

この機能の詳細は、『Zynq UltraScale+ デバイステクニカルリファレンスマニュアル』 (UG1085: 英語版、日本語版) を参照してください。

キーの生成

Bootgen には、AES-GCM キーを生成する機能があります。Bootgen は、NIST が認定する Counter Mode KDF を使用

し、CMAC を疑似ランダム関数として使用します。ユーザーがキーローリングのためにシードから複数のキーを派生

させる場合、Bootgen はシードを入力として受け取ります。シードが指定されている場合、これを使用してキーが生 成されます。シードが指定されていない場合、Key0 に基づいてキーが生成されます。空のキー ファイルが指定され ている場合、Bootgen は時間ベースのランダム化 (KDF ではない) でシードを生成します。これは KDF がほかのキー/

IV ペアを生成するための入力となります。

注記:

化ファイルが指定されると、Bootgen は終了し、誤った Key0/IV0 ペアが使用されたというエラーを返します。

キーの生成

キー ファイルのサンプルを次に示します。

図 14: キー ファイルの例

難読化キーの生成

Bootgen は、ファミリ キーと、ユーザー提供の IV を用いてレッド キーを暗号化することで難読化キーを生成できま す。ファミリ キーは、ザイリンクス セキュリティ グループが提供します。詳細は、familykeyを参照してください。

難読化キーを生成するために、Bootgen は BIF ファイルから次の入力を取得します。

obf_key:

{

[aeskeyfile] aes.nky [familykey] familyKey.cfg [bh_key_iv] bhiv.txt

}

難読化キーを生成する構文は、次のとおりです。

bootgen -arch zynqmp -image all.bif -generate_keys obfuscatedkey

ブラック キー/PUF キー

ブラック キーのストレージ ソリューションは、PUF から生成された暗号強度の高い KEK (key encryption key) を使用 し、ユーザー キーを暗号化します。生成されたブラック キーは、eFUSE に格納するか、認証されたブート ヘッダー の一部として格納できます。

image:

{

[puf_file] pufdata.txt [bh_key_iv]black_iv.txt [bh_keyfile]black_key.txt

[fsbl_config] puf4kmode, shutter=0x0100005E, pufhd_bh

[keysrc_encryption]bh_blk_key }

[

bootloader,

destination_cpu = a53-0, encryption = aes, aeskeyfile = aes_p1.nky ] fsbl.elf

[

destination_cpu = r5-0, encryption = aes,

aeskeyfile = aes_p2.nky ] hello.elf

}

ブラック キーを使用するその他の例は、付録 A: ユース ケースおよび例を参照してください。

複数の暗号化キー ファイル

以前のバージョンの Bootgen では、1 つの暗号化キーで複数のパーティションを暗号化してブート イメージを作成で きました。この場合、各パーティションで同じキーが繰り返し使用されます。これはセキュリティの脆弱性の要因と なるため、推奨されていません。各キーの使用は、フローで一度だけとする必要があります。

Bootgen は、パーティションごとに個別の暗号化キーをサポートしています。キー ファイルが複数ある場合、各暗号 化キー ファイルで同じ Key0 (デバイス キー)、IV0、および操作キーが使用されるようにしてください。各暗号化キー ファイルでブート イメージが異なると、Bootgen でブート イメージを作成できません。

ユーザーは、複数の暗号化キー ファイル (イメージ内の各パーティションに 1 つずつ) を指定する必要があります。パ ーティションは、各パーティションに指定されたキーを使用して暗号化されます。

注記: ファイル名に ".1", ".2"...".n" を付けたキー ファイルを該当パーティションのキー ファイルの同じディ レクトリに置くことで、ロード可能なセクションが複数あるために作成された各パーティションに対して一意のキー ファイルを使用できます。

all: {

[keysrc_encryption] bbram_red_key // FSBL (Partition-0)

[

bootloader,

destination_cpu = a53-0, encryption = aes,

aeskeyfile = key_p0.nky, fsbla53.elf

[

// application (Partition-1) [

destination_cpu = a53-0, encryption = aes,

aeskeyfile = key_p1.nky, hello.elf

] }

fsbla53.elf パーティションは、key_p0.nky ファイルのキーで暗号化されます。

hello.elf にロード可能なセクションが 3 つあるため 3 つのパーティションが存在するとした場合、

hello.elf.0 パーティションは test2.nky ファイルのキーで暗号化されます。

続いてhello.elf.1パーティションがtest2.1.nkyのキーで暗号化されます。

ドキュメント内 Bootgen ユーザー ガイド (UG1283) (ページ 44-74)

関連したドキュメント