[
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 からキーを使用して暗号化されます。
レッドシートを参照してください。
all:{
id_code = 0x04ca8093 extended_id_code = 0x01 id = 0x2
metaheader {
encryption = aes,
keysrc = bbram_red_key,
aeskeyfile = efuse_red_metaheader_key.nky, dpacm_enable
} image {
name = pmc_subsys, id = 0x1c000001 partition
{
id = 0x01, type = bootloader, encryption = aes,
keysrc = bbram_red_key,
aeskeyfile = bbram_red_key.nky, dpacm_enable,
blocks = 4096(2);1024;2048(2);4096(*), file = executable.elf
}
partition {
id = 0x09, type = pmcdata, load = 0xf2000000, aeskeyfile = pmcdata.nky,
file = topology_xcvc1902.v1.cdo, file = pmc_data.cdo
} } image {
name = lpd, id = 0x4210002 partition
{
id = 0x0C, type = cdo, encryption = aes,
keysrc = bbram_red_key, aeskeyfile = key1.nky, dpacm_enable,
blocks = 8192(20);4096(*), file = lpd_data.cdo
}
partition {
id = 0x0B, core = psm, encryption = aes,
keysrc = bbram_red_key,
image {
name = fpd, id = 0x420c003 partition
{
id = 0x08, type = cdo, encryption = aes,
keysrc = bbram_red_key, aeskeyfile = key5.nky, dpacm_enable,
blocks = 8192(20);4096(*), file = fpd_data.cdo
} } } 注記:
• キー ファイル内のキーの数は、暗号化されるブロックの数と常に一致する必要があります。
• キーの数が暗号化されるブロック数より少ない場合、Bootgen はエラーを返します。
• キーの数が暗号化されるブロック数より多い場合、Bootgen は余分なキーを無視します。
キーの生成
Bootgen は AES-GCM キーを生成できます。Bootgen は、NIST が認定する Counter Mode KDF を使用し、CMAC を 疑似ランダム関数として使用します。ユーザーがキー ローリングのためにシードから複数のキーを派生させる場合、
Bootgen はシードを入力として受け取ります。シードが指定されている場合、これを使用してキーが生成されます。
シードが指定されていない場合、Key0 に基づいてキーが生成されます。空のキー ファイルが指定されている場合、
Bootgen は時間ベースのランダム化 (KDF ではない) でシードを生成します。これは KDF がほかのキー/IV ペアを生 成するための入力となります。次の条件が適用されます。
• 1 つの暗号化ファイルが指定され、ほかの暗号化ファイルが生成される場合、Bootgen は最初のパーティションの
暗号化ファイルにある Key0/IV0 ペアと同じものを生成されたキーに使用できます。
• 最初のパーティションに暗号化ファイルが生成され、それ以降のパーティションには Key0/IV0 を含むほかの暗号 化ファイルが指定されると、Bootgen は終了し、誤った Key0/IV0 ペアが使用されたというエラーを返します。
• キー ファイルが指定されず、暗号化が 1 つのパーティションにない場合、Bootgen はデフォルトでそのパーティ ション名の付いた aes キー ファイルを生成します。これによりパーティションごとに別の aeskeyfile が使用 されるようになります。
• ファイル名に ".1", ".2"...".n" を付けたキー ファイルを該当パーティションのキー ファイルの同じディレクトリに読 み込んだり生成することで、ロード可能なセクションが複数あるために作成された各パーティションに対して一 意のキー ファイルを使用できます。
ブラック キー/PUF キー
ブラックキーのストレージソリューションは、PUF から生成された暗号強度の高い KEK (key encryption key) を使用 し、ユーザー キーを暗号化します。生成されたブラック キーは、eFUSE に格納するか、認証されたブート ヘッダー の一部として格納できます。例:
test:
{ bh_kek_iv = black_iv.txt bh_keyfile = black_key.txt
{type=bootloader, encryption = aes, keysrc=bh_blk_key, pufhd_bh, aeskeyfile = red_grey.nky, file=plm.elf}
{type=pmcdata,load=0xf2000000, aeskeyfile = pmcdata.nky, file=pmc_data.cdo}
{core=psm, file=psm.elf}
{type=cdo, file=ps_data.cdo}
{type=cdo, file=subsystem.cdo}
{core=a72-0, exception_level = el-3, file=hello_world.elf}
}}
メタ ヘッダーの暗号化
Versal ACAP の場合、暗号化が metaheader 属性の下で指定されると、Bootgen がメタ ヘッダーを暗号化します。使 用する aeskeyfile は、[metaheader] の下のパラメーターを使用して bif で指定できます。次は、その使用例です。
metaheader
{ encryption = aes,
keysrc = bbram_red_key, aeskeyfile = headerkey.nky, }
次の条件が適用されます。
• 特定の aeskeyfile がメタ ヘッダーに指定されていない場合、Bootgen は meta_header.nky というファイル を生成して、暗号化中に使用します。
• ブートローダーが bif に含まれる場合は、ブートローダーを暗号化してメタ ヘッダーを暗号化する必要がありま す。パーシャル PDI の場合、メタ ヘッダーの暗号化はオプションです。
認証の使用
AES 暗号化は対称キーを用いた自己認証アルゴリズムで、暗号化と復号化に同じキーを使用します。したがって、こ のキーは非公開キーとして保護する必要があり、キーを格納するための領域が内部に必要になります。RSA (Rivest Shamir Adleman) による認証手段もあります。RSA は非対称アルゴリズムで、署名に使用するキーと検証に使用する キーが異なります。認証には一対のキーが必要です。
• 署名には、秘密キーを使用します。
• 検証には、公開キーを使用します。
この公開キーは保護の必要がないため、セキュアな格納領域は不要です。この認証方式と暗号化を組み合わせること により、真正性と機密性の両方を確保できます。RSA は、暗号化されているパーティションと暗号化されていないパ ーティションのいずれにも使用可能です。
RSA のメリットは、公開キーを使用することだけではなく、復号化する前に認証を実行できることが挙げられます。
RSA 公開キーのハッシュ値は eFUSE に格納する必要があります。ザイリンクス SoC デバイスでは、パーティション
キーを示す頭文字の最初のアルファベットは、プライマリの場合 P、セカンダリの場合 S となります。キーを示す頭 文字の 2 番目のアルファベットは、公開の場合 P、秘密の場合 S となります。キーの種類は次の 4 つです。
• PPK = プライマリ公開キー
• PSK = プライマリ秘密キー
• SPK = セカンダリ公開キー
• SSK = セカンダリ秘密キー
Bootgen は、次の 2 つの方法で認証証明を作成できます。
• PSK と SSK を供給します。これらの 2 つの入力を使用し、SPK 署名がオンザフライで計算されます。
• PPK、SSK、および SPK 署名を入力として供給します。この方法は、PSK がわからない場合に使用されます。
プライマリ キーはハッシュ化されて eFUSE 内に格納されます。このハッシュ値は、FSBL によってブート イメージに 格納されたプライマリ キーのハッシュ値と比較されます。このハッシュは、Vitis に付属するスタンドアロン ドライ バーを使用して PS の eFUSE メモリに書き込むことができます。
BIF ファイルの例を次に示します。
image:
{ [pskfile]primarykey.pem [sskfile]secondarykey.pem
[bootloader,authentication=rsa] fsbl.elf [authentication=rsa]uboot.elf
}
デバイス固有の認証の詳細は、次の資料を参照してください。
• Zynq-7000 SoC デバイスの認証証明
• Zynq UltraScale+ MPSoC デバイスの認証証明
• Versal ACAP 認証証明
署名
次の図に、パーティションの RSA 署名プロセスを示します。セキュアな施設から Bootgen により秘密キーを使用し てパーティションに署名します。署名プロセスの手順は、次のとおりです。
1. PPK および SPK を認証証明 (AC) に格納します。
2. PSK を使用して SPK に署名し、SPK 署名を取得します。これは、AC の一部としても格納されます。
3. SSK を使用してパーティションに署名し、パーティション署名を取得し、AC に格納します。
4. デバイスによって認証が選択されている各パーティションの先頭または末尾に AC を追加します。
5. PPK をハッシュ化し、eFUSE 内に格納します。
Hash
eFUSE
Hash + RSA
Hash + RSA
Primary Keys
PPK
PSK
Secondary Keys SPK SSK
Partition
Authentication Header
PPK
SPK
SPK Signature
Partition Signature
Partition Authentication
Certificate Partition Authentication
Certificate Partition Headers
Boot Header
Secret Key
Secret Key
X21278-080618
次の表に、認証のオプションを示します。
表 34: 認証キーに対してサポートされているファイル フォーマット
キー 名前 説明 サポートされているファ
イル フォーマット PPK プライマリ公開キー パーティションを認証するために使用するキーで
す。
パーティションの認証時に必ず指定する必要があ ります。
*.txt
*.pem
*.pub
*.pk1 PSK プライマリ秘密キー パーティションを認証するために使用するキーで
す。
パーティションの認証時に必ず指定する必要があ ります。
*.txt
*.pem
*.pk1 SPK セカンダリ公開キー このキーを指定した場合、パーティションの認証に
使用されます。 *.txt
*.pem
*.pub
キー 名前 説明 イル フォーマット SSK セカンダリ秘密キー このキーを指定した場合、パーティションの認証に
使用されます。 *.txt
*.pem
*.pk1
検証
デバイス内では、公開キーを使用して、bootROM が FSBL を検証し、FSBL または U-Boot のいずれかが続くパーテ ィションを検証します。
1. PPK の検証: この手順では、プライマリキーの認証が確立されます。プライマリキーは、セカンダリキーの認証
に使用します。
a. ブートイメージの AC から PPK が読み出されます。
b. PPK ハッシュ値を生成します。
c. ハッシュ化された PPK と、eFUSE から取得された PPK ハッシュ値を比較します。
d. 同じ場合はプライマリキーが信頼されます。そうでない場合はセキュアブートエラーとなります。
2. セカンダリ キーの検証 - この手順では、セカンダリ キーの認証が確立されます。セカンダリ キーはパーティシ ョンの認証に使用します。
a. ブート イメージの AC から SPK が読み出されます。
b. SPK ハッシュ値を生成します。
c. PPK を使用して AC に格納されている SPK 署名を検証し、SPK ハッシュ値を取得します。
d. ステップ (b) およびステップ (c) からのハッシュ値を比較します。
e. 同じ場合はセカンダリ キーが信頼されます。そうでない場合はセキュア ブート エラーとなります。
3. パーティションの検証: この手順では、ブートされているパーティションの信頼性を確立します。
a. ブート イメージからパーティションが読み出されます。
b. パーティションのハッシュ値を生成します。
c. SPK を使用して AC に格納されているパーティション署名を検証し、パーティション ハッシュ値を取得しま
す。
d. ステップ (b) およびステップ (c) からのハッシュ値を比較します。
e. 同じ場合はパーティションが信頼されます。そうでない場合はセキュア ブート エラーとなります。