@@ -85,6 +85,9 @@ CHIP_ERROR FactoryDataProvider<FlashFactoryData>::Init()
8585 }
8686
8787#ifdef CONFIG_CHIP_CRYPTO_PSA
88+ #ifdef CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU
89+ FallbackToItsIfNeeded ();
90+ #endif
8891 VerifyOrDie (MoveDACPrivateKeyToSecureStorage (factoryData, factoryDataSize) == CHIP_NO_ERROR );
8992#endif
9093
@@ -125,14 +128,25 @@ CHIP_ERROR FactoryDataProvider<FlashFactoryData>::MoveDACPrivateKeyToSecureStora
125128 memset (clearedDACPrivKey, 0x00 , sizeof (clearedDACPrivKey));
126129
127130// If key should be migrated to KMU save the KMU key slot to keyId.
128- #ifdef CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU
131+ #if defined( CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU) && !defined(CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU_ITS_FALLBACK)
129132 mDACPrivKeyId = static_cast <psa_key_id_t >(PSA_KEY_ID_FROM_CRACEN_KMU_SLOT (
130133#ifdef CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU_ENCRYPTED
131134 CRACEN_KMU_KEY_USAGE_SCHEME_ENCRYPTED ,
132135#else
133136 CRACEN_KMU_KEY_USAGE_SCHEME_RAW ,
134137#endif // CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU_ENCRYPTED
135138 CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU_SLOT_ID ));
139+ #elif defined(CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU) && defined(CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU_ITS_FALLBACK)
140+ if (!mUseDacPrivKeyFromIts )
141+ {
142+ mDACPrivKeyId = static_cast <psa_key_id_t >(PSA_KEY_ID_FROM_CRACEN_KMU_SLOT (
143+ #ifdef CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU_ENCRYPTED
144+ CRACEN_KMU_KEY_USAGE_SCHEME_ENCRYPTED ,
145+ #else
146+ CRACEN_KMU_KEY_USAGE_SCHEME_RAW ,
147+ #endif // CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU_ENCRYPTED
148+ CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU_SLOT_ID ));
149+ }
136150#endif // CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU
137151
138152 // Check if factory data contains DAC private key
@@ -220,6 +234,37 @@ CHIP_ERROR FactoryDataProvider<FlashFactoryData>::MoveDACPrivateKeyToSecureStora
220234
221235 return CHIP_NO_ERROR ;
222236}
237+
238+ #ifdef CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU
239+ template <class FlashFactoryData >
240+ void FactoryDataProvider<FlashFactoryData>::FallbackToItsIfNeeded()
241+ {
242+ const psa_key_id_t itsDacKeyId = to_underlying (chip::Crypto::KeyIdBase::DACPrivKey);
243+
244+ psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT ;
245+ const psa_status_t status = psa_get_key_attributes (itsDacKeyId, &attributes);
246+
247+ psa_reset_key_attributes (&attributes);
248+
249+ if (status == PSA_SUCCESS )
250+ {
251+ #ifdef CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU_ITS_FALLBACK
252+ ChipLogProgress (DeviceLayer,
253+ " Warning: DAC private key found in PSA ITS while CRACEN KMU storage is configured. "
254+ " Using the ITS key for attestation signing. Automatic migration from ITS to KMU is "
255+ " not supported; re-provision the device to move the key to KMU." );
256+ mUseDacPrivKeyFromIts = true ;
257+ mDACPrivKeyId = itsDacKeyId;
258+ #else
259+ ChipLogError (DeviceLayer,
260+ " DAC private key found in PSA ITS while CRACEN KMU storage is configured. "
261+ " Automatic migration from ITS to KMU is not supported. "
262+ " Re-provision the device." );
263+ VerifyOrDie (false );
264+ #endif // CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU_ITS_FALLBACK
265+ }
266+ }
267+ #endif // CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU
223268#endif // CONFIG_CHIP_CRYPTO_PSA
224269
225270template <class FlashFactoryData >
@@ -288,7 +333,15 @@ CHIP_ERROR FactoryDataProvider<FlashFactoryData>::SignWithDeviceAttestationKey(c
288333#ifdef CONFIG_CHIP_CRYPTO_PSA
289334 size_t outputLen = 0 ;
290335
291- psa_status_t err = psa_sign_message (mDACPrivKeyId , PSA_ALG_ECDSA (PSA_ALG_SHA_256 ), messageToSign.data (), messageToSign.size (),
336+ psa_key_id_t dacPrivKeyId = mDACPrivKeyId ;
337+ #if defined(CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU) && defined(CONFIG_CHIP_CRYPTO_PSA_DAC_PRIV_KEY_KMU_ITS_FALLBACK)
338+ if (mUseDacPrivKeyFromIts )
339+ {
340+ dacPrivKeyId = static_cast <psa_key_id_t >(to_underlying (chip::Crypto::KeyIdBase::DACPrivKey));
341+ }
342+ #endif
343+
344+ psa_status_t err = psa_sign_message (dacPrivKeyId, PSA_ALG_ECDSA (PSA_ALG_SHA_256 ), messageToSign.data (), messageToSign.size (),
292345 signature.Bytes (), signature.Capacity (), &outputLen);
293346
294347 VerifyOrReturnError (!err, CHIP_ERROR_INTERNAL );
0 commit comments