こんにちは、
私はS32N55プラットフォームを使用したお客様プロジェクトに取り組んでおり、HSE_OTP_FOEM_ADKP_ATTR_IDを指定してSetAttributeを初めて呼び出す際に問題が発生しています。
---
[環境]
- プラットフォーム:S32N55 EVB(シリコンB0)
- GrayVIP: 1.0.24
- FSS FW SDK: 1.13.0以降
- 現在のライフサイクル:OEM_OPEN(GetAttributeで確認済み)
- ADKP: プロビジョニングされていません(初回試行)
- HSEタイムアウト: CRYPTO_43_HSE_TIMEOUT_DURATION_U32 = 1,000,000,000
---
[問題]
SetAttribute を HSE_OTP_FOEM_ADKP_ATTR_ID で呼び出した場合、HSE は同期モードで応答を返しません。Mu_Ip_IsResponseReady() は決して TRUE を返さないため、タイムアウト値に関係なくタイムアウトが発生します。
その他の SetAttribute 呼び出し (例:HSE_OTP_GO_SECURE_ATTR_ID) は同じ同期メカニズムで正しく動作します。
---
[コード]
hseSrvDescriptor_t xLocalDesc = {0};
hseSetAttrSrv_t* pSetAttrReq;
xLocalDesc.srvId = HSE_SRV_ID_SET_ATTR;
pSetAttrReq = &(xLocalDesc.hseSrv.setAttrReq);
pSetAttrReq->attrId = HSE_OTP_FOEM_ADKP_ATTR_ID;
pSetAttrReq->attrLen = sizeof(hseAttrOtpFoemAdkp_t); /* 32バイト */
pSetAttrReq->pAttr = Hse_Ip_ToAHBAddress((HOST_ADDR)pAdkpBuf);
xHseIpReq.eReqType = HSE_IP_REQTYPE_SYNC;
xHseIpReq.u32Timeout = CRYPTO_43_HSE_TIMEOUT_DURATION_U32;
hseResp = Hse_Ip_ServiceRequest(u8MuInst, u8MuCh, &xHseIpReq,
(hseSrvDescriptor_t *)Hse_Ip_ToAHBAddress(
(HOST_ADDR)&g_hseShared.axHseSrvDesc[u8MuInst][u8MuCh]));
/* HSE は決して応答しない - Mu_Ip_IsResponseReady() は常に FALSE を返す */
---
[SetAttribute呼び出し前に前提条件を確認します]
1. LCはOEM_OPENです(GetAttributeで確認済み)。
2. このデバイスではADKPが一度もプロビジョニングされていません。
3. ADKPバッファはキャッシュ不可能な共有メモリに配置されます。
4. アドレスは Hse_Ip_ToAHBAddress() を介して変換されます
---
[観察事項1 - 非同期モード]
GrayVIP リファレンス実装 (Fss_Firmware_ProgSecureFuseADK) を見ると、
ADKP の SetAttribute は、WaitEvent を使用した非同期メカニズムで呼び出されます。
RetVal = Fss_Sem_SetHseAttribute(&setAttr);
if (E_OK == hseResponse)
ヤージュ
WaitEvent(FSS_SEM_HSESETATTR_EVENT_NAME);
RetVal = Fss_Sem_GetHseAsynResponse();
}
これは、S32N55 HSE2 では OTP 書き込み操作に非同期モードが必要になる可能性があることを示唆しています。
---
[観察事項2 - VGPIOヒューズ電源有効化]
GrayVIPでは、Fss_Firmware_FuseProgramming()によってヒューズプログラミング機能が有効になります。
ブート構成ヒューズを書き込む前に、VGPIO を介して以下の情報を取得します。
VGPIO_Type *pVgpio = (VGPIO_Type *)FUSE_VDD_EN_PORT_ADDRESS;
pVgpio->OV[FUSE_VDD_EN_BANK].PMOS = (1 << FUSE_VDD_EN_PIN);
pVgpio->OV[FUSE_VDD_EN_BANK].OE |= (1 << FUSE_VDD_EN_PIN);
pVgpio->OV[FUSE_VDD_EN_BANK].OVS = (1 << FUSE_VDD_EN_PIN);
しかし、Fss_Firmware_ProgSecureFuseADK() (ADKP書き込み) は明示的に
これを電源投入シーケンスと呼ぶ。以下の点については不明です。
1. HSE2 は OTP 属性書き込みのためにヒューズ電源を内部的に処理します。
2. SetAttribute(ADKP)を実行する前に、VGPIOヒューズ電源の有効化も必要です。
さらに、GrayVIPにはヒューズ電源無効化シーケンスは含まれていません。
書く。VGPIOヒューズ電源を有効にしたままにしておくことについて懸念しています
OTP書き込み後に意図しないヒューズ書き込みやセキュリティ上の問題が発生する可能性があります。
---
【質問】
1.SetAttribute(ADKP) で同期モード (HSE_IP_REQTYPE_SYNC) がサポートされていますか?
または、S32N55 HSE2でのOTP書き込み操作には非同期モードが必須ですか?
2. VGPIOヒューズプログラミング電源有効化は呼び出し前に必要ですか?
SetAttribute(HSE_OTP_FOEM_ADKP_ATTR_ID)?
3. VGPIOヒューズ電源有効化が必要な場合、正しい手順は何ですか?
OTP書き込み完了後に無効にするには?
4. SetAttribute(HSE_OTP_FOEM_ADKP_ATTR_ID) を呼び出す前に、他に前提条件はありますか?
それは文書化されていない可能性がある?
これは、お客様へのプロジェクト納品における重大な障害となっています。
何かご助言いただければ大変ありがたいです。
よろしくお願いします。
エディ・パークさん、こんにちは。
ご質問への回答は以下のとおりです。
他に質問があれば、遠慮なくお尋ねください。
なお、他の投稿でも述べたように、S32N55はまだ試作段階であるため、この件に関する私の専門知識はまだ最高レベルには達していません。とはいえ、できる限りお手伝いさせていただきます。
こんにちは、 @EddiePark さん、
この件については、より専門的なサポートを受けるために、社内チームに連絡する必要があります。彼らから最新情報が入り次第、ご連絡いたします。
ご理解とご協力に感謝いたします。
こんにちは、
S32N55 上で HSE2 SetAttribute サービスを使用して ADKP (アプリケーションデバッグキー/パスワード) をプログラムしようとしていますが、HSE2 から応答がありません。
---
## 環境
- プラットフォーム: S32N55 EVB
- GrayVIP バージョン: SW32N5_GRAYVIP_1_0_22_0
- FSS FW バージョン: S32N_FSS_FW_R21-11_1.10.0
- EB Tresos バージョン: 29.0.0
- 呼び出し元: FSS M7 コア、Fss_FW_Init_Task() 内
---
## 私たちが試したこと
### 試行 1: 同期モード (HSE_IP_REQTYPE_SYNC)
「`c」
xLocalDesc.srvId = HSE_SRV_ID_SET_ATTR;
pSetAttrReq->attrId = HSE_OTP_FOEM_ADKP_ATTR_ID;
pSetAttrReq->attrLen = 32U; /* hseAttrOtpFoemKey_t サイズ */
pSetAttrReq->pAttr = Hse_Ip_ToAHBAddress((HOST_ADDR)pAttr);
RetVal = Sherpa_Cdd_Execute(&xLocalDesc); /* 同期 */
「`」
結果:タイムアウト - HSE2からの応答なし
### 試行2:非同期モード(HSE_IP_REQTYPE_ASYNC_IRQ)
「`c」
g_xSherpaHseIpReq.eReqType = HSE_IP_REQTYPE_ASYNC_IRQ;
g_xSherpaHseIpReq.pfCallback = &Sherpa_Cdd_HseCallback;
/* IRQコールバックによってポーリングbDoneフラグが設定されます */
((FALSE == g_xSherpaCallbackParam.bDone) && (u32Timeout > 0U)) の間
ヤージュ
u32タイムアウト--;
}
「`」
結果:タイムアウト - bDoneがTRUEに設定されませんでした(コールバックが呼び出されませんでした)
### 試行3:VGPIO VDD_EFUSE電源有効化
「`c」
/* VGPIO経由でVDD_EFUSEを有効にする */
pVgpio->OV[BANK].PMOS = (1U << PIN);
pVgpio->OV[BANK].OE |= (1U << PIN);
pVgpio->OV[BANK].OVS = (1U << PIN);
「`」
結果:ShutdownHookが呼び出されました(VGPIOレジスタへのアクセス時にバスエラーが発生しました)
---
## 現在の実装
「`c」
Std_ReturnType SecureDebug_SetADKP(const uint8_t* pDebugKey)
ヤージュ
/* 1. LC == OEM_OPEN を確認する */
eRetVal = Sherpa_Cdd_GetAttribute(HSE_OTP_LIFECYCLE_ATTR_ID, ...);
if (HSE_LC_OEM_OPEN != *pLcInSharedMem) { break; }
/* 2. ADKPが既にプログラムされているか確認する */
eRetVal = Sherpa_Cdd_GetAttribute(HSE_OTP_FOEM_ADKP_ATTR_ID, ...);
if (E_OK == eRetVal) { /* 既にプログラム済み */ break; }
/* 3. 32バイトのキーをキャッシュ不可能な共有バッファにコピーする */
memcpy(pAdkpInSharedMem, pDebugKey, HSE_OTP_FOEM_KEY_SIZE);
__DMB();
__ DSB();
/* 4. SetAttribute */
eRetVal = Sherpa_Cdd_SetAttribute(
HSE_OTP_FOEM_ADKP_ATTR_ID、
HSE_OTP_FOEM_KEY_SIZE、/* 32バイト */
(void*)pAdkpInSharedMem);
}
「`」
---
## 質問
1.HSE2ファームウェアリファレンスマニュアルの図12によると、入力サイズが16の場合、HSEはそれを通常のAES-128キーとして扱います。入力サイズが16でない場合、HSEはそれをキーハンドルとして扱います。S32N55 HSE2のADKPサイズは16バイト(AES-128)ですか、それとも32バイトですか?
2. HSE_OTP_FOEM_ADKP_ATTR_ID SetAttribute には、VDD_EFUSE 電源 (J18 ジャンパーまたは VGPIO) が必要ですか?(以前のNXPの回答では、OTPタイプには必要なく、ヒューズボックスタイプにのみ必要であると述べられていました。)
3. S32N55 HSE2では、セキュアADKPプロビジョニング(RAMキースロット+キーハンドル経由)が推奨される方法ですか?
「`c」
/* AES-128キーをRAMスロットにインポート */
SecureStorage_CipherKey_Import(RAM_SLOT, pDebugKey, 16U);
/* キーハンドルを使用して属性を設定します */
Sherpa_Cdd_SetAttribute(HSE_OTP_FOEM_ADKP_ATTR_ID,
sizeof(hseKeyHandle_t)、
&keyHandle);
「`」
4. 前提条件となる手順はありますか(例:ADKP_MASTERヒューズ設定)をADKPプログラミング前に確認すべき事項で、見落としている可能性のあるものはありますか?
5. S32N55 で HSE_OTP_FOEM_ADKP_ATTR_ID SetAttribute に使用する正しい MU インスタンスは何ですか?
こんにちは、
HSE_FW_S32N5_1_0_24_0に関する以前のご回答ありがとうございました。
HSE_FW_S32N5_1_0_24_0を使用して再テストを実施しましたので、その結果を共有し、さらに1つ質問をしたいと思います。
---
## 更新1:ADKPプロビジョニング結果
HSE_FW_S32N5_1_0_24_0にアップグレード後、ADKPプロビジョニングが正常に動作するようになりました。
GetAttribute(HSE_OTP_FOEM_ADKP_ATTR_ID)を呼び出すことで、ADKPが正常にプログラムされたことを確認しました。この呼び出しは、SHA3_384参照値とともにE_OKを返します。
以前のタイムアウト/シャットダウンの問題(リリースノートではバージョン1.0.24.0より前のバージョンのバグとして報告されていた)は解決されました。
---
## アップデート2:通話場所
通話場所も重要であることが分かりました。
SetAttribute(HSE_OTP_FOEM_ADKP_ATTR_ID) は、Fss_Btm_PlatformApi_SetFssCohortState(FSS_BTM_COHORT_RUNNING) の後に呼び出す必要があります。
それを早く呼び出す(例:Crypto_43_HSE_Init の直後に実行したところ、HSE2 から応答がありませんでした。
---
## 質問: VDD_EFUSE 電源有効化要件
前回のNXPコミュニティの投稿では、次のように述べました。
「OTP属性(HSE_OTP_FOEM_ADKP_ATTR_ID)はVDD_EFUSE電源を必要としません。
ヒューズボックスの操作とは異なります(hseSrvProgFuse_t)。
しかしながら、VGPIO経由でVDD_EFUSEを有効にしようとしたところ、ShutdownHook(バスエラー)が発生したため、この点を再確認したいと思います。
「`c」
VGPIO_Type *pVgpio = (VGPIO_Type *)SECURE_DEBUG_FUSE_VDD_ADDR;
pVgpio->OV[SECURE_DEBUG_FUSE_VDD_BANK].PMOS = (1U << SECURE_DEBUG_FUSE_VDD_PIN);
pVgpio->OV[SECURE_DEBUG_FUSE_VDD_BANK].OE |= (1U << SECURE_DEBUG_FUSE_VDD_PIN);
pVgpio->OV[SECURE_DEBUG_FUSE_VDD_BANK].OVS = (1U << SECURE_DEBUG_FUSE_VDD_PIN);
「`」
質問:
1.S32N55のHSE_OTP_FOEM_ADKP_ATTR_ID SetAttributeでは、VDD_EFUSE電源(J18ジャンパーまたはVGPIO)は本当に不要なのでしょうか?
2. VDD_EFUSEが不要な場合、なぜADKPのプロビジョニングはFss_Btm_PlatformApi_SetFssCohortState()の後にのみ機能するのでしょうか?
これは電源の問題ではなく、タイミングや初期化の問題でしょうか?
3. S32N55 EVB の VDD_EFUSE 制御のための正しい VGPIO アドレスとピン構成は何ですか。
他のOTP操作に必要な場合(例:MCK、SRKH)?
よろしくお願いします。
ハイ
早速のご返信ありがとうございます。
HSE_FW_S32N5_1_0_24_0を使用してテストします。
検査結果が出たらまたご連絡します。
こんにちは、 @EddiePark さん、
フィードバックをいただきました。驚くほど速かったことを付け加えておきます。S32N5 HSEファームウェア1.0.24.0のリリースノートには、以下の内容が記載されています。
HSE は、OTP ヒューズの SET/GET ATTR を使用して SRKH/ODAK、ADKP、MCK などのキー関連の OTP ヒューズを設定/取得している間にシャットダウンします。
したがって、バージョン1.0.24.0より古いバージョンを使用している場合、これが問題の原因である可能性があります。S32N HSE FWのバージョン1.0.24.0にアクセスするにはライセンスを更新する必要があったため、アカウントにそのバージョン(またはそれ以降のバージョン)が表示されない場合は、NXPの担当者に連絡してアクティベーションを依頼する必要があるかもしれません。
バージョン1.0.24.0以降で再度テストしていただき、動作が変わったかどうかをお知らせください。