Zynq® UltraScale+™ MPSoC デバイスは、AES-GCM コアを使用します。このコアは 32 ビット ワード ベースのデー タ インターフェイスを備えており、256 ビット キーをサポートします。AES-GCM モードは、暗号化と復号化、複数 のキーソース、内蔵のメッセージ インテグリティ チェックをサポートします。
操作キー
優れたキー管理の方法の 1 つは、秘密キーの使用を最小限に抑えることです。このためには、Bootgen で有効になっ
チャネル攻撃にさらされる可能性が大幅に制限されます。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, encryption = aes,
aeskeyfile = aes_p2.nky]hello.elf
}
操作キーは、次に示すように、AES キー (.nky) ファイルでKey Optを使用して指定します。
図 10: 操作キー
Bootgen は暗号化キー ファイルを生成します。前の例に示すように、BIF ファイルで opt_key が有効になっている 場合、操作キー opt_key が .nkyファイルで生成されます。
操作キーを使用するその他の例は、開発環境での操作キーを使用したデバイス キーの保護を参照してください。
この機能の詳細は、『Zynq UltraScale+ デバイス テクニカル リファレンス マニュアル』 (UG1085: 英語版、日本語版) の「セキュリティ」章のキー管理を参照してください。
キーの差し替え
AES-GCM は、暗号化されたイメージ全体をより小規模な AES 暗号化ブロック/モジュール単位で表すキー差し替え 機能もサポートしています。各モジュールは独自のキーを使用して暗号化されます。最初のキーはデバイスのキー ソースで格納され、後続の各モジュールのキーは直前のモジュール内で暗号化 (ラップ) されます。キー差し替えをサ ポートするブート イメージは、Bootgen を使用して生成できます。BIF の属性 (blocks) を使用して、暗号化用に複数 の小さなブロックを作成するためのパターンを指定します。
image:
{ [keysrc_encryption] bbram_red_key
[
bootloader,
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 ペアは、セキュア ヘッダーの暗号化に使用されます。
○ Key0 と IV0 以外のキーと IV のペアは、1 つの BIF で指定されるどの aes キー ファイルでも繰り返さないよう
にしてください。
グレー/難読化キー
ユーザー キーは、ファミリ キーで暗号化されており、デバイスの金属層に埋め込まれています。このファミリ キー は、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 を配置します。
キーの生成
Bootgen には、AES-GCM キーを生成する機能があります。Bootgen は、NIST が認定する Counter Mode KDF を使用
し、CMAC を疑似ランダム関数として使用します。ユーザーがキー ローリングのためにシードから複数のキーを派生
させる場合、Bootgen はシードを入力として受け取ります。シードが指定されている場合、これを使用してキーが生 成されます。シードが指定されていない場合、Key0 に基づいてキーが生成されます。空のキー ファイルが指定され ている場合、Bootgen は時間ベースのランダム化 (KDF ではない) でシードを生成します。これは KDF がほかのキ ー/IV ペアを生成するための入力となります。
注記:
• 1 つの暗号化ファイルが指定され、ほかの暗号化ファイルが生成される場合、Bootgen は最初のパーティションの 暗号化ファイルにある Key0/IV0 ペアと同じものを生成されたキーに使用できます。
• 最初のパーティションに暗号化ファイルが生成され、それ以降のパーティションには Key0/IV0 を含むほかの暗号 化ファイルが指定されると、Bootgen は終了し、誤った Key0/IV0 ペアが使用されたというエラーを返します。
キーの生成
キー ファイルのサンプルを次に示します。
図 11: キー ファイルの例
難読化キーの生成
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
し、ユーザー キーを暗号化します。生成されたブラック キーは、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
}
ブラック キーを使用するその他の例は、第 7 章: ユース ケースおよび例を参照してください。
複数の暗号化キー ファイル
以前のバージョンの 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_p1.nky
]hello.elf }
• fsbla53.elf パーティションは、key_p0.nky ファイルのキーを使用して暗号化されます。
• hello.elf にロード可能なセクションが 3 つあるため 3 つのパーティションが存在するとした場合、
hello.elf.0 パーティションは test2.nky ファイルのキーを使用して暗号化されます。
• その後 hello.elf.1 パーティションが test2.1.nky のキーを使用して暗号化されます。
• hello.elf.2 パーティションは test2.2.nky からキーを使用して暗号化されます。