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のキーで暗号化されます。