SHE(Secure Hardware Extensions)を理解しよう

SHE,勉強,暗号演算

業務にて、SHE(Secure Hardware Extensions)の理解が必要となっているため勉強してみました。

今回は以下で公開されている規格書をメインに、確認をしていきます。

初めに

SHEはAUTOSARによって標準化されているセキュリティ規格であり、任意のマイクロコントローラに対してオンチップで設計するものです。

そのため、複数のベンダからSHEに準拠したチップが提供されています。

SHEは車載ECUにおけるHSMとしての役割を担います。

HSMに関しては以下で触れているので合わせて参考にしてみてください。

規格書ではSHEによる目的は以下とされています。

  • ソフトウェアによる攻撃から暗号鍵を保護する
  • 安全なソフトウェア環境を提供する
  • システムにおけるセキュリティ強度が、基礎となるアルゴリズムの強さと鍵の機密性にのみ依存するようにする
  • 鍵の機密性
  • 鍵の所有者の分散
  • 柔軟性を高く、コストを低く抑える

SHEの構成

SHEは基本的にメモリブロック暗号(AES)制御ロジックの3つのブロックから構成されています。

SHEへのアクセスは必ずSHEに規定されている制御ロジック経由で行われます。

上記以外のSHEに対するアクセスに対し保護機能を設けることで、鍵情報などの機密情報が外部に漏れないような設計とする必要があります。

このような設計思想は、SHEに限らずHSM全般共通の設計方針とも言えます。

ブロック概要
メモリ暗号鍵や対応する追加情報を管理する。
AES任意の暗号演算処理を実施する。乱数生成も本ブロックに含む。
制御ロジックマイコンのCPUからの要求に応じて、任意の処理を動作させる。
ブロック一覧
簡易論理ブロック図

AES

SHEで対応が必要とされている暗号方式はAES-128です。

また、AESの中でもECBCBCCMACのサポートが必須とされています。

圧縮処理

SHEでは宮口・プレネルという圧縮処理を使用します。

SHEの圧縮処理で使用される暗号利用モードはAES-ECBです。

圧縮処理宮口・プレネルについては以前取り上げているためこちらを参照してください。

パディング方式

SHEの圧縮処理では、AES-128ECBを使用して圧縮処理を行うため、128bitのブロック長へパディングを行う必要があります。

単純なパディングではなく、メッセージの末尾に任意のパラメータを複数付与することでパディングを実施します。

データの内訳は以下の通りです。

データ種別サイズ(bit)概要
メッセージ任意 (l)圧縮処理を実施するおおもとのメッセージ。
1bit付加データ1メッセージの末尾に1ビットだけ付与する値「1」のbit。
任意bit付加データ任意 (k)1bit付加データの後に付与する任意bit長の値「0」のパディングデータ。
サイズは l + 1 + k + 40 がブロック(128bit)単位となる最小の値を設定する。
ブロック長40メッセージのbit長である l を本値として設定する。
圧縮データ内訳
圧縮データ

実際には圧縮処理使用時のパラメータ長が各コマンドで決まり切っているため、上記パディング方式に則った定数がSHEでは提示されています。

圧縮処理の流れ

事前にパディングを実施したデータを128bit単位のブロック(m1、m2、m3…)に分割。

① Hi-1(前回の算出結果)を鍵として、メッセージブロックmiを暗号化

  (初回メッセージブロックm1を暗号化するときの鍵値H0はALL0の値を使用)

② 出力された暗号文とHi-1をXOR

③ ②の出力値とメッセージブロックmiをさらにXORすることでHiを生成

①~③をブロック数分繰り返す。

デビッドゴスバーグ, Public domain, via Wikimedia Commons, https://commons.wikimedia.org/wiki/File:Matyas-Meyer-Oseas_hash.svg

KDF

SHEでは、処理シーケンス中で一時的に使われる鍵値を生成するKDF(key derivation function)と呼ばれる処理を実施します。

一般的なKDFの方法は様々なものがあります。

SHEにおいては前述の圧縮処理をKDFとして利用します。

メモリ

SHEでは揮発と不揮発のメモリ管理を行います。

不揮発性メモリは、マイコンの電源再投入やリセット後も利用可能な情報を格納します。

一方で揮発性メモリには、一時的な情報を保存します。本情報はマイコンのリセットやパワーサイクルの際に内容が失われる可能性があります。

前述の通り、SHE の制御ロジック経由以外で外部からSHEの管理するメモリへのアクセスは出来ません。

メモリの種類

管理するメモリは主にROM、フラッシュメモリ、RAMの三種類に分けられます。

メモリ揮発/不揮発更新主な管理情報
ROM不揮発SECRET_KEY、UID
フラシュメモリ不揮発MASTER_ECU_KEY、BOOT_MAC_KEY、BOOT_MAC、KEY_<n>、PRNG_SEED
RAM揮発RAM_KEY、PRNG_KEY、PRNG_STATE
メモリ情報一覧

メモリスロット

SHEで保持する鍵情報とセキュアブート用MAC値は、メモリスロットと呼ばれる論理ブロックに分けて管理されています。

各メモリスロットにはKEY_IDと呼ばれる4bitの識別子が割り振られており、鍵使用時は主にKEY_IDから使用する鍵を指定します。

スロットメモリKEY_ID概要
SECRET_KEYROM0x0チップ固有の秘密鍵。
メーカーがチップ製造時に書き込む必要があり、SHE以外に保存してはならない。
MASTER_ECU_KEYフラッシュメモリ0x 1SHE 内の他のメモリスロットの更新にのみ使用される鍵。
BOOT_MAC_KEYフラッシュメモリ0x2セキュアブートで使用する鍵。
BOOT_MACフラッシュメモリ0x3セキュアブートで使用するMAC値。
KEY_1フラッシュメモリ0x4任意のアプリケーションが暗号演算に使用する鍵。
SHEは少なくとも3つ、最大で10個のキーを任意に使用できるように実装する必要がある。
KEY_2フラッシュメモリ0x5同上。
KEY_3フラッシュメモリ0x6同上。
KEY_4フラッシュメモリ0x7同上。
KEY_5フラッシュメモリ0x8同上。
KEY_6フラッシュメモリ0x9同上。
KEY_7フラッシュメモリ0xa同上。
KEY_8フラッシュメモリ0xb同上。
KEY_9フラッシュメモリ0xc同上。
KEY_10フラッシュメモリ0xd同上。
RAM_KEYRAM0xe任意のアプリケーションが暗号演算に使用する鍵。
事前にアプリケーションが鍵値をSHEへ渡す必要がある。
本鍵の使用時には、リプレイ攻撃やサービ ス拒否攻撃などの攻撃に対して脆弱であることの考慮が必要。
各メモリスロット概要

メモリスロットの付加情報について

各メモリスロットごとに付加情報を持っており、任意のタイミングで読み出しと更新を実施します。

付加情報は大きく分けてフラグとカウンタの二種類があります。

鍵データとフラグ、カウンタそれぞれのセグメントは別々に書き込み/消去できるようにする必要があります。

フラグは6種類のセキュリティビットが存在し、"0 “はフラグが設定されていないことを意味、"1 “はフラグが設定されていることを意味します。

カウンタはフラッシュメモリで管理するデータの更新回数を意味し、サイズは28bitとなります。

メモリスロットごとに実装が必要な付加情報と、実装が不要な付加情報が存在します。

管理情報データ種別概要実装する
メモリスロット
Write-protectionフラグ設定することでメモリスロットへの書き込みを禁止にする。
本フラグはSHEのみがアクセス可能な不揮発性メモリに保存され、
ライトアクセス時にSHEを制御するステートマシンが評価する。
MASTER_ECU_KEY
BOOT_MAC_KEY
BOOT_MAC
KEY_<n>
Secure boot failureフラグセキュアブート失敗時に鍵の使用を禁止する。
リセット後にセキュアブート成功した場合、本フラグ設定もクリアされる。
SECRET_KEY
MASTER_ECU_KEY
KEY_<n>
Debugger activationフラグデバッガ起動時に鍵の使用を禁止する。SECRET_KEY
MASTER_ECU_KEY
BOOT_MAC_KEY
BOOT_MAC
KEY_<n>
Wildcard UIDフラグUIDを指定せずに鍵を更新可能にする。MASTER_ECU_KEY
BOOT_MAC_KEY
BOOT_MAC
KEY_<n>
Key usageフラグ鍵の用途を指定する。
0:暗号化/復号化
1:MAC生成/検証用
KEY_<n>
Plain keyフラグRAM_KEYに対してのみ実装するフラグ。
CPUからRAM_KEYをインポートした場合、本フラグを設定する。
RAM_KEY
カウンタカウンタフラッシュメモリで管理するデータの更新回数を意味する。
サイズは28bitとなる。
MASTER_ECU_KEY
BOOT_MAC_KEY
BOOT_MAC
KEY_<n>
メモリスロット付加情報一覧

メモリスロット以外の管理情報

メモリスロット以外にも各種SHEで管理している情報が存在します。

管理情報メモリサイズ概要
UIDROM120bit120ビットのシリアル番号。
この識別子は、半導体メーカーがチップを製造する際に書き込む。
PRNG_SEEDフラッシュメモリ128bit疑似乱数生成で使用するシード値。
PRNG_KEYRAM128bit疑似乱数生成で使用する鍵値。
PRNG_STATERAM128bit疑似乱数発生器の状態。
ステータスレジスタRAM8bitSHEの内部状態。
メモリスロット以外の管理情報一覧

ステータスレジスタについては、各bitごとに8つのステータスを管理しています。

ビットがセットされるとその値は’1’となり、クリアされるとその値は’0’となります。

名称bit位置概要
BUSY0SHEがコマンド処理中の場合、このビットは設定される。
SECURE_BOOT1セキュアブートが有効な場合、このビットは設定される。
BOOT_INIT2ブートシーケンス中にセキュアブートが実行された場合、このビットが設定される。
BOOT_FINISHED3CMD_BOOT_FAILUREまたはCMD_BOOT_OKを呼び出してセキュアブートを終了した場合、
またはCMD_SECURE_BOOTでBOOT_MACの確認に失敗した場合、このビットは設定されます。
BOOT_OK4セキュアブート(CMD_SECURE_BOOT)が成功した場合、このビットが設定される。
CMD_BOOT_FAILUREが呼び出された場合、ビットはクリアされる。
RND_INIT5乱数発生器が初期化(CMD_INIT_RNG)された場合、このビットは設定される。
EXT_DEBUGGER6外部デバッガがチップに接続されている場合、このビットが設定されます。
INT_DEBUGGER7SHEの内部デバッギング機構が作動している場合、このビットは設定されます
ステータスレジスタ設定一覧

制御ロジック

制御ロジックは大きく分けて二つです。

一つはCPUからの要求取得と応答通知のための通信制御。

もう一つが要求処理をSHE内で実行するためのシーケンス制御です。

要求と応答

CPUからSHEに対する要求と、SHEからCPUに対する応答はSHEで規定されているパラメータに則って行われます。

ただしCPU-SHE間の通信方法、要求データと応答データの受け渡し方法についてはSHEでは厳密に規定されておりません。

そのため、各ハードに合わせたデータの受け渡し方法を検討する必要があります。

また要求取得から応答までの処理は非同期で行われます。そのため、SHEはノンブロッキングI/Oである必要があります。

コマンド

CPUは任意のコマンドとパラメータをSHEへ通知することで、SHEに対し処理を要求します。

コマンド概要入力 
(bit単位)
出力
(bit単位)
CMD_ENC_ECB平文の暗号化(AES_ECB)を要求。
要求可能なサイズは128bit固定。
KEY_ID:4
平文:128
暗号文:128
CMD_ENC_CBC平文の暗号化(AES_CBC)を要求。
128bit単位であれば任意のデータ長の要求が可能。
KEY_ID:4
IV:128
平文:n*128
暗号文:n*128
CMD_DEC_ECB暗号文の復号化(AES_ECB)を要求。
要求可能なサイズは128bit固定。
KEY_ID:4
暗号文:128
平文:128
CMD_DEC_CBC暗号文の復号化(AES_CBC)を要求。
128bit単位であれば任意のデータ長の要求が可能。
KEY_ID:4
IV:128
暗号文:n*128
平文:n*128
CMD_GENERATE_MAC任意のメッセージに対しMAC生成を要求。
サイズはメッセージのbit長を意味する。
KEY_ID:4
サイズ:64
メッセージ:n*128
MAC:128
CMD_VERIFY_MAC任意のメッセージに対しMAC値の検証を要求。
サイズはメッセージのbit長を意味する。
MACサイズは比較するMAC値のビット数(左端のビットから始まる)を指定。
MAC値が一致した場合、検証結果は"0″を通知。
KEY_ID:4
サイズ:64
メッセージ:n*128
MAC:128
MACサイズ:7
検証結果:1
CMD_LOAD_KEYSHE の鍵を更新する。M1:128
M2:256
M3:128
M4:256
M5:128
CMD_LOAD_PLAIN_KEYSHE のRAM_KEYを更新する。平文:128
CMD_EXPORT_RAM_KEYSHE のRAM_KEYを取得する。M1:128
M2:256
M3:128
M4:256
M5:128
CMD_INIT_RNGSHEの乱数生成で使用するシード値を初期化する。
本コマンドは電源再投入のたびに必ず実施しなければCMD_RNDは使用できない。
CMD_EXTEND_SEEDSHEが乱数生成で使用するシード値の更新を要求する。
なおSHEは、本コマンドで渡すシード値と、もともとSHEで保持していたシード値の圧縮値を、新たなシード値として扱う。
本コマンド使用前にCMD_INIT_RNG で初期化する必要がある。
SEED:128
CMD_RND128ビットの乱数を要求する。
本コマンド使用前にCMD_INIT_RNG で初期化する必要がある。
RND:128
CMD_SECURE_BOOTSHEへセキュアブートの実施を要求する。
本コマンドは電源再投入のたびに一度しか使用できない。
サイズ:32
データ:
サイズ * 8
CMD_BOOT_FAILURESHEのブートステータスを失敗へ設定する。
CMD_BOOT_OKSHEのブートステータスを成功へ設定する。
CMD_GET_STATUSステータスレジスタ(SREG)の値を取得する。SREG:8
CMD_GET_IDUIDとステータスレジスタの値を取得する。
このとき取得するUIDとステータスレジスタの値は、MASTER_ECU_KEYによるチャレンジレスポンス処理により、完全性が保証されている。
チャレンジ:128UID:120
SREG:8
MAC:128
CMD_CANCELSHEが行っている任意の処理を中断し、すべての計算と結果を破棄する。
CMD_DEBUGSHEの内部デバッグ機能を有効可する。認証子:128チャレンジ:
128
コマンド一覧

レスポンス

SHEは任意のコマンドに対応したエラーコードとパラメータをCPUへ渡すことで、処理結果を通知します。

エラーコード概要
ERC_NO_ERROR要求処理を正常に完了した。
ERC_SEQUENCE_ERRORシーケンス不正。
ERC_KEY_NOT_AVAILABLEメモリスロットの管理情報におけるSecure boot failure、またはDebugger activationにて使用が禁止されている鍵を指定。
ERC_KEY_INVALID与えられた操作に対して許可されていない鍵を指定。
ERC_KEY_EMPTY鍵が格納されていないメモリスロットを指定。
ERC_NO_SECURE_BOOTCMD_SECURE_BOOT実行時、実行条件を満たさない。
ERC_KEY_WRITE_PROTECTED書き込み保護(Write-protection)されているメモリースロットに対し、鍵更新を実施。
ERC_KEY_UPDATE_ERROR鍵の更新シーケンスにおけるメッセージ検証に失敗。
ERC_RNG_SEEDシード値の初期化(CMD_INIT_RNG)前に、CMD_RNDまたはCMD_DEBUGを実行。
ERC_NO_DEBUGGINGCMD_DEBUGにおける、チャレンジレスポンスプロトコルによる認証が失敗。
ERC_BUSY他の関数が処理中(ステータスレジスタのBUSY = 1の場合)にSHEの関数を呼び出した。
ERC_MEMORY_FAILUREメモリの読み取りまたは書き込み操作中に、ビット反転などの物理エラーを検出。
ERC_GENERAL_ERROR上記のエラーコードに該当しないエラーをSHE内部で検出。
レスポンス一覧

鍵管理(CMD_LOAD_KEY)

SHEはコマンドCMD_LOAD_KEYを使用し前述のメモリスロットを更新することで、鍵更新を行います。

このとき行われる操作は機密性、完全性、真正性が保証されていなければなりません。

そのための操作が次で説明する鍵更新プロトコルになります。

なお、CMD_LOAD_PLAIN_KEYというRAM上の鍵を更新する操作もありますが、あくまでも一時的な鍵の使用時にのみ本コマンドは使用します。

鍵更新パラメータ

鍵更新で使用するパラメータは以下の通り。

パラメータサイズ(bit)概要
KEY128更新予定の鍵値
KEY_ID4更新予定の鍵のKEY_ID
AuthKEY128鍵更新時に認証処理のため使用する鍵
AuthID4鍵更新時に認証処理のため使用する鍵のKEY_ID
UID120SHRで規定されるシリアル番号
CID28データの更新回数
FID5更新対象のメモリスロットに対する設定を示すbit
以下の連結値
WRITE_PROTECTION |BOOT_PROTECTION |DEBUGGER_PROTECTION|KEY_USAGE |WILDCARD
使用パラメータ一覧

鍵更新の過程で各種鍵生成を行います。

前述の通り鍵生成は圧縮処理を用いて行うのですが、付加パラメータとパディング値は定数としてSHEにて記載があります。

鍵生成パラメータ用途定数値
KDF_KEY1AuthKEY | KEY_UPDATE_ENC_CM2生成0x01015348 45008000 00000000 000000B0
KDF_KEY2AuthKEY | KEY_UPDATE_MAC_CM3生成0x01025348 45008000 00000000 000000B0
KDF_KEY3KEY | KEY_UPDATE_ENC_CM4生成0x01015348 45008000 00000000 000000B0
KDF_KEY4KEY | KEY_UPDATE_MAC_CM5生成0x01025348 45008000 00000000 000000B0
生成鍵一覧

実際にSHE間でやり取りを行う値は以下のM1からM5になります。

本値を用いて取得値の検証を相互に行い、鍵更新が正常に行われていることを確認します、

パラメータサイズ(bit)IN/OUT設定値
M1128IN以下連結値
 UID | KEY_ID | AuthID
M2256IN以下連結値を、KDF_KEY1でCBC暗号化した値(IV = 0)
 CID | FID| 0パディング(95bit) | KEY
M3128IN以下連結値から、KDF_KEY2で生成されたMAC値
 M1 | M2
M4256OUTCIDに対し最初に1、以降は0の値でパディングした値(128bit)とKDF_KEY3でECB暗号化をおこなう
 CID | 0b1000……
上記出力値(OUT0)を以下のように連結させた値
 UID | KEY_ID | AuthID | OUT0
M5128OUTM4から、KDF_KEY4で生成されたMAC値
M1~M5

簡単な鍵更新処理の流れになります。

STEPSHE実施処理判定NGレスポンス
(鍵更新不可)
1コマンド"CMD_LOAD_KEY"にてM1、M2、M3を取得
2KEY_IDで指定されるメモリスロットの、WRITE_PROTECTIONが無効であることを確認ERC_WRITE_PROTECTED
3KDF_KEY2’生成
4取得したM1 | M2と、生成したKDF_KEY2’からM3’を生成
5生成したM3’と取得したM3が一致することを確認ERC_KEYUPDATE_ERROR
6以下のいずれかであることを確認
・M1のUIDが0、かつ更新対象メモリスロットのWildcard UIDが有効
・M1のUIDが一致している
ERC_KEYUPDATE_ERROR
7KDF_KEY1’生成
8M2をKDF_KEY1’を用いてCBC復号化
9STEP7で復号した値からCIDを取得
更新対象のメモリスロットのCIDよりも取得したCIDの方が値が大きいことを確認
ERC_KEYUPDATE_ERROR
10取得したパラメータ(KEY、CID、FID)をメモリスロットへ反映させる。
11KDF_KEY3’生成
12M4生成
13KDF_KEY4’生成
14M5生成
15M4、M5とともにERC_NO_ERRORを応答
コマンド"CMD_LOAD_KEY"実施処理

最後に

SHEの内容についてざっくりとまとめてみました。

車載向けのセキュリティ規格書ということで身構えていましたが、ちゃんと読んでみるとそこまで難しい内容ではないのが意外でした。

また、pythonを使って鍵更新の処理を実装してみようかとも思いましたが、すでに取り組んでいた方がいたため紹介します。

非常にコードが整理されていて見やすいので、鍵更新の理解を深める上でもお勧めです。

SHE,勉強HSM,SHE,暗号演算