こんにちは。セキュアブートを有効にした後、FBLを変更する際に再認証を行う方法があるかどうかお伺いしたいのですが。
Securebootが有効になっている状態で別のFBLに変更すると、HMACキーを介して生成されるMETAデータ値が変更されます。FBLが変更されると、HSEはHMACキーを使用してメタデータを再計算する必要があります。しかし、新しいFBLによってHMACキーが削除されるため、メタデータの再計算が不可能になります。その結果、FBLでの検証失敗によりリセットが発生し、アプリケーションの起動が不可能になります。HMACキーを使って変更されたFBLを再認証し、FBLとアプリケーションの両方が正常に動作できるようにする方法はありますか?
こんにちは、 @jeongwoo
これがセキュアブートの本質的な目的であり、認証に失敗したソフトウェアの実行を防ぐことです。
重要なのは、まだデバッグインターフェースにアクセスできるか、それともデバッガアクセスなしで現場で問題を回復しなければならないかです。
現場では、事前にそのような機能を備えた代替・復旧イメージ(例:HMAC鍵のインポート、新しい認証タグの生成、外部生成の認証タグの受け入れ、SMRの再インストール・再構成など)がなければ、通常は復旧は不可能です。
デバッグインターフェースにアクセスできる場合、最も簡単な解決策は外部で新しい認証タグを計算し、デバッガを使って更新したタグをフラッシュにプログラムすることです。この方法では、SMRのインストール時にHSE_SMR_CFG_FLAG_INSTALL_AUTHフラグが設定されていることが必要です。
HSE_SMR_CFG_FLAG_INSTALL_AUTHが設定されていない場合、HSEは内部に保存されているハッシュを使用して検証を行います。その場合、認証タグの更新だけでは不十分であり、新しいイメージパラメータでSMRを再インストールする必要があります。
よろしくお願いいたします。
ルーカス
こんにちは、ルーカスさん。
前回の状態では、コントローラーにはHSE_SMR_CFG_FLAG_INSTALL_AUTHが設定されていません。あなたが言った方法、つまり新しいイメージパラメータでSMRを再インストールする方法を試そうとしています。以下に示す Fota_S32k3_SecureBootProcess の該当部分は正しいでしょうか?
pSmrEntryInstall->accessMode = HSE_ACCESS_MODE_ONE_PASS;
pSmrEntryInstall->entryIndex = 0u;
pSmrEntryInstall->pSmrEntry = (HOST_ADDR)&smrEntry;
pSmrEntryInstall->pSmrData = (HOST_ADDR)IVT.pAppImg_addr_0;/* アクティブなパーティションを指す */
pSmrEntryInstall->smrDataLength = smrEntry.smrSize;
pSmrEntryInstall->pAuthTag[0] = (HOST_ADDR)smrEntry.pInstAuthTag[0];/* パッシブパーティションを指す */
pSmrEntryInstall->pAuthTag[1] = (HOST_ADDR)smrEntry.pInstAuthTag[1];/* パッシブパーティションを指す */
pSmrEntryInstall->authTagLength[0] = HmacTagLength;
pSmrEntryInstall->authTagLength[1] = HmacTagLength;
これが正しい場合、HSE_SRV_ID_SMR_ENTRY_INSTALL サービスを実行すると、HseResponse は 0xA5AA5317 として返され、これは以下に対応します。
#define HSE_SRV_RSP_KEY_EMPTY ((hseSrvResponse_t)0xA5AA5317UL)
キーが空であることを示しています。(以前にも質問したように、この表示は該当部分が削除されたために生じているのではないかと推測しています。)
キーの注入方法やこの問題の解決方法について、ぜひご案内いただけると大変ありがたいです。
ご返信よろしくお願いします。
こんにちは、 @jeongwoo
そのパラメータに問題は見当たりません。しかし、共有したのは hseSmrEntryInstallSrv_t だけで、hseSmrEntry_t (pSmrEntryInstall->pSmrEntry = (HOST_ADDR)&smrEntry;) は共有していません。
構造体 hseSmrEntry_t には、インストールに必要なその他の重要なパラメータが含まれています。
キーが消去されているかどうかを確認するには、Service HSE_SRV_ID_GET_KEY_INFO Structure Struct hseGetKeyInfoSrv_t を使うことができます。このサービスを使うと、hseKeyInfo_tの情報が得られ、キーの状態を確認することができます。
よろしくお願いいたします。
ルーカス
こんにちは、ルーカスさん。
お返事ありがとうございます。ご指摘いただいたsmrEntryの値を確認しました。SecurebootStateが0になる箇所にブレークポイントを設定したところ、smrEntryが完全に0であることを確認しました。また、Fota_S32k3_SecureBootProcessが終了する戻り値部分にブレークポイントを設定したところ、値が表示されることを確認しました。復帰時のSecureBootStateの値は1です。
この情報は問題解決に役立ちましたか?
1) if(SecureBootState == 0) にブレークポイントが設定された場合 / 結果: smrEntry = 0
2) Fota_S32k3_SecureBootProcess 関数の最後の部分である return secureBootProcessResult にブレークポイントを設定します。
よろしくお願いいたします、ジョンウ