Skip to content

Commit fa6a22e

Browse files
committed
Provision to choose NOC keygen using trustm or using fw.
* Added the flag ENABLE_TRUSTM_NOC_KEYGEN in the config. * Updated the functions to support NOC keygen with and without trustm.
1 parent 48b91ae commit fa6a22e

File tree

3 files changed

+94
-91
lines changed

3 files changed

+94
-91
lines changed

src/platform/Infineon/crypto/trustm/CHIPCryptoPALHsm_P256_trustm.cpp

+87-85
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ extern CHIP_ERROR ECDSA_validate_msg_signature_H(const P256PublicKey * public_ke
7878
extern CHIP_ERROR ECDSA_validate_hash_signature_H(const P256PublicKey * public_key, const uint8_t * hash, const size_t hash_length,
7979
const P256ECDSASignature & signature);
8080

81-
#if (ENABLE_TRUSTM_GENERATE_EC_KEY || ENABLE_TRUSTM_ECDSA_VERIFY)
8281
static CHIP_ERROR get_trustm_keyid_from_keypair(const P256KeypairContext mKeypair, uint32_t * key_id)
8382
{
8483
if (0 != memcmp(&mKeypair.mBytes[0], trustm_magic_no, sizeof(trustm_magic_no)))
@@ -89,7 +88,6 @@ static CHIP_ERROR get_trustm_keyid_from_keypair(const P256KeypairContext mKeypai
8988
*key_id += (mKeypair.mBytes[CRYPTO_KEYPAIR_KEYID_OFFSET]) | (mKeypair.mBytes[CRYPTO_KEYPAIR_KEYID_OFFSET + 1] << 8);
9089
return CHIP_NO_ERROR;
9190
}
92-
#endif // #if (ENABLE_TRUSTM_GENERATE_EC_KEY || ENABLE_TRUSTM_ECDSA_VERIFY)
9391

9492
P256Keypair::~P256Keypair()
9593
{
@@ -106,122 +104,132 @@ CHIP_ERROR P256Keypair::Initialize(ECPKeyTarget key_target)
106104
{
107105
CHIP_ERROR error = CHIP_ERROR_INTERNAL;
108106

109-
if (key_target == ECPKeyTarget::ECDSA)
110-
{
111-
printf("Generating ECDSA key");
112-
// Use the mbedtls based method
113-
if (CHIP_NO_ERROR == Initialize_H(this, &mPublicKey, &mKeypair))
114-
{
115-
mInitialized = true;
116-
}
117-
error = CHIP_NO_ERROR;
107+
uint8_t pubkey[128] = {
108+
0,
109+
};
110+
uint16_t pubKeyLen = sizeof(pubkey);
111+
optiga_lib_status_t return_status = OPTIGA_LIB_BUSY;
112+
P256PublicKey & public_key = const_cast<P256PublicKey &>(Pubkey());
113+
optiga_key_usage_t key_usage;
114+
uint16_t keyid;
118115

119-
return error;
120-
}
121-
else
116+
if (key_target == ECPKeyTarget::ECDH)
122117
{
123-
// For ECDH use Trust M
124-
125-
uint8_t pubkey[128] = {
126-
0,
127-
};
128-
uint16_t pubKeyLen = sizeof(pubkey);
129-
optiga_lib_status_t return_status = OPTIGA_LIB_BUSY;
130-
P256PublicKey & public_key = const_cast<P256PublicKey &>(Pubkey());
131-
optiga_key_usage_t key_usage;
132-
uint16_t keyid;
133-
134118
keyid = TRUSTM_ECDH_OID_KEY;
135119

136120
// Trust M ECC 256 Key Gen
137121
ChipLogDetail(Crypto, "Generating NIST256 key for ECDH!");
138122
key_usage = OPTIGA_KEY_USAGE_KEY_AGREEMENT;
139-
trustm_Open();
140-
return_status = trustm_ecc_keygen(keyid, key_usage, OPTIGA_ECC_CURVE_NIST_P_256, pubkey, &pubKeyLen);
123+
}
124+
else
125+
{
126+
#if !ENABLE_TRUSTM_NOC_KEYGEN
127+
if (CHIP_NO_ERROR == Initialize_H(this, &mPublicKey, &mKeypair))
128+
{
129+
mInitialized = true;
130+
}
131+
error = CHIP_NO_ERROR;
132+
return error;
133+
#else
134+
// Add the logic to use different keyid
135+
keyid = TRUSTM_NODE_OID_KEY_START;
136+
// Trust M ECC 256 Key Gen
137+
ChipLogDetail(Crypto, "Generating NIST256 key in TrustM !");
138+
key_usage = (optiga_key_usage_t) (OPTIGA_KEY_USAGE_SIGN | OPTIGA_KEY_USAGE_AUTHENTICATION);
139+
#endif //!ENABLE_TRUSTM_NOC_KEYGEN
140+
}
141+
// Trust M init
142+
trustm_Open();
143+
return_status = trustm_ecc_keygen(keyid, key_usage, OPTIGA_ECC_CURVE_NIST_P_256, pubkey, &pubKeyLen);
141144

142-
// Add signature length
143-
VerifyOrExit(return_status == OPTIGA_LIB_SUCCESS, error = CHIP_ERROR_INTERNAL);
145+
// Add signature length
146+
VerifyOrExit(return_status == OPTIGA_LIB_SUCCESS, error = CHIP_ERROR_INTERNAL);
144147

145-
/* Set the public key */
146-
VerifyOrReturnError((size_t) pubKeyLen > NIST256_HEADER_OFFSET, CHIP_ERROR_INTERNAL);
147-
VerifyOrReturnError(((size_t) pubKeyLen - NIST256_HEADER_OFFSET) <= kP256_PublicKey_Length, CHIP_ERROR_INTERNAL);
148-
memcpy((void *) Uint8::to_const_uchar(public_key), pubkey + NIST256_HEADER_OFFSET, pubKeyLen - NIST256_HEADER_OFFSET);
148+
/* Set the public key */
149+
VerifyOrReturnError((size_t) pubKeyLen > NIST256_HEADER_OFFSET, CHIP_ERROR_INTERNAL);
150+
VerifyOrReturnError(((size_t) pubKeyLen - NIST256_HEADER_OFFSET) <= kP256_PublicKey_Length, CHIP_ERROR_INTERNAL);
151+
memcpy((void *) Uint8::to_const_uchar(public_key), pubkey + NIST256_HEADER_OFFSET, pubKeyLen - NIST256_HEADER_OFFSET);
149152

150-
memcpy(&mKeypair.mBytes[0], trustm_magic_no, sizeof(trustm_magic_no));
151-
mKeypair.mBytes[CRYPTO_KEYPAIR_KEYID_OFFSET] = (keyid >> (0 * 8)) & 0xFF;
152-
mKeypair.mBytes[CRYPTO_KEYPAIR_KEYID_OFFSET + 1] = (keyid >> (1 * 8)) & 0xFF;
153+
memcpy(&mKeypair.mBytes[0], trustm_magic_no, sizeof(trustm_magic_no));
154+
mKeypair.mBytes[CRYPTO_KEYPAIR_KEYID_OFFSET] = (keyid >> (0 * 8)) & 0xFF;
155+
mKeypair.mBytes[CRYPTO_KEYPAIR_KEYID_OFFSET + 1] = (keyid >> (1 * 8)) & 0xFF;
153156

154-
mInitialized = true;
155-
error = CHIP_NO_ERROR;
157+
mInitialized = true;
158+
error = CHIP_NO_ERROR;
156159

157-
exit:
158-
if (error != CHIP_NO_ERROR)
159-
{
160-
trustm_close();
161-
}
162-
return error;
160+
exit:
161+
if (error != CHIP_NO_ERROR)
162+
{
163+
trustm_close();
163164
}
165+
return error;
164166
}
165167

166168
CHIP_ERROR P256Keypair::ECDSA_sign_msg(const uint8_t * msg, size_t msg_length, P256ECDSASignature & out_signature) const
167169
{
168170
VerifyOrReturnError(mInitialized, CHIP_ERROR_UNINITIALIZED);
169-
uint16_t keyid = (mKeypair.mBytes[CRYPTO_KEYPAIR_KEYID_OFFSET+1]) | (mKeypair.mBytes[CRYPTO_KEYPAIR_KEYID_OFFSET] << 8);
170-
171-
// Check if there is any matching key_id to Optiga OID
172-
if (keyid == OPTIGA_KEY_ID_E0F0)
173-
{
174-
CHIP_ERROR error = CHIP_ERROR_INTERNAL;
175-
optiga_lib_status_t return_status = OPTIGA_LIB_BUSY;
171+
uint16_t keyid = (mKeypair.mBytes[CRYPTO_KEYPAIR_KEYID_OFFSET]) | (mKeypair.mBytes[CRYPTO_KEYPAIR_KEYID_OFFSET+1] << 8);
176172

177-
uint8_t signature_trustm[kMax_ECDSA_Signature_Length_Der] = { 0 };
178-
uint16_t signature_trustm_len = (uint16_t) kMax_ECDSA_Signature_Length_Der;
179-
uint8_t digest[32];
180-
uint8_t digest_length = sizeof(digest);
173+
CHIP_ERROR error = CHIP_ERROR_INTERNAL;
174+
optiga_lib_status_t return_status = OPTIGA_LIB_BUSY;
181175

182-
memset(&digest[0], 0, sizeof(digest));
183-
MutableByteSpan out_raw_sig_span(out_signature.Bytes(), out_signature.Capacity());
176+
uint8_t signature_trustm[kMax_ECDSA_Signature_Length_Der] = { 0 };
177+
uint16_t signature_trustm_len = (uint16_t) kMax_ECDSA_Signature_Length_Der;
178+
uint8_t digest[32];
179+
uint8_t digest_length = sizeof(digest);
180+
181+
memset(&digest[0], 0, sizeof(digest));
182+
MutableByteSpan out_raw_sig_span(out_signature.Bytes(), out_signature.Capacity());
183+
184+
VerifyOrReturnError(msg != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
185+
VerifyOrReturnError(msg_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
186+
// Trust M Init
187+
trustm_Open();
188+
// Hash to get the digest
189+
Hash_SHA256(msg, msg_length, &digest[0]);
184190

185-
VerifyOrReturnError(msg != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
186-
VerifyOrReturnError(msg_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
191+
if (keyid == OPTIGA_KEY_ID_E0F0)
192+
{
187193
ChipLogDetail(Crypto, "TrustM: ECDSA_sign_msg");
188-
// Trust M Init
189-
trustm_Open();
190-
// Hash to get the digest
191-
Hash_SHA256(msg, msg_length, &digest[0]);
194+
192195
// Api call to calculate the signature
193196
return_status = trustm_ecdsa_sign(OPTIGA_KEY_ID_E0F0, digest, digest_length, signature_trustm, &signature_trustm_len);
194-
195-
VerifyOrExit(return_status == OPTIGA_LIB_SUCCESS, error = CHIP_ERROR_INTERNAL);
197+
}
198+
else
199+
{
200+
#if !ENABLE_TRUSTM_NOC_KEYGEN
201+
// Use the mbedtls based method
202+
printf("ECDSA sing msg mbedtls\n");
203+
return ECDSA_sign_msg_H(&mKeypair, msg, msg_length, out_signature);
204+
#else
205+
if (keyid == OPTIGA_KEY_ID_E0F2)
206+
{
207+
ChipLogDetail(Crypto, "TrustM: ECDSA_sign_msg");
208+
return_status = trustm_ecdsa_sign(OPTIGA_KEY_ID_E0F2, digest, digest_length, signature_trustm, &signature_trustm_len);
209+
}
210+
#endif //!ENABLE_TRUSTM_NOC_KEYGEN
211+
}
212+
213+
VerifyOrExit(return_status == OPTIGA_LIB_SUCCESS, error = CHIP_ERROR_INTERNAL);
196214

197-
error = EcdsaAsn1SignatureToRaw(kP256_FE_Length, ByteSpan{ signature_trustm, signature_trustm_len }, out_raw_sig_span);
215+
error = EcdsaAsn1SignatureToRaw(kP256_FE_Length, ByteSpan{ signature_trustm, signature_trustm_len }, out_raw_sig_span);
198216

199-
SuccessOrExit(error);
217+
SuccessOrExit(error);
200218

201-
out_signature.SetLength(2 * kP256_FE_Length);
219+
out_signature.SetLength(2 * kP256_FE_Length);
202220

203-
error = CHIP_NO_ERROR;
221+
error = CHIP_NO_ERROR;
204222

205223
exit:
206224
if (error != CHIP_NO_ERROR)
207225
{
208226
trustm_close();
209227
}
210228
return error;
211-
}
212-
// Use the mbedtls based method
213-
else
214-
{
215-
printf("ECDSA sing msg mbedtls\n");
216-
return ECDSA_sign_msg_H(&mKeypair, msg, msg_length, out_signature);
217-
}
218229
}
219230

220231
CHIP_ERROR P256Keypair::ECDH_derive_secret(const P256PublicKey & remote_public_key, P256ECDHDerivedSecret & out_secret) const
221232
{
222-
#if !ENABLE_TRUSTM_GENERATE_EC_KEY
223-
return ECDH_derive_secret_H(&mKeypair, remote_public_key, out_secret);
224-
#else
225233
CHIP_ERROR error = CHIP_ERROR_INTERNAL;
226234
optiga_lib_status_t return_status = OPTIGA_LIB_BUSY;
227235
size_t secret_length = (out_secret.Length() == 0) ? out_secret.Capacity() : out_secret.Length();
@@ -256,7 +264,6 @@ CHIP_ERROR P256Keypair::ECDH_derive_secret(const P256PublicKey & remote_public_k
256264
trustm_close();
257265
}
258266
return error;
259-
#endif
260267
}
261268

262269
CHIP_ERROR P256PublicKey::ECDSA_validate_hash_signature(const uint8_t * hash, size_t hash_length,
@@ -426,9 +433,6 @@ static void add_tlv(uint8_t * buf, size_t buf_index, uint8_t tag, size_t len, ui
426433

427434
CHIP_ERROR P256Keypair::NewCertificateSigningRequest(uint8_t * csr, size_t & csr_length) const
428435
{
429-
#if !ENABLE_TRUSTM_GENERATE_EC_KEY
430-
return NewCertificateSigningRequest_H(&mKeypair, csr, csr_length);
431-
#else
432436
CHIP_ERROR error = CHIP_ERROR_INTERNAL;
433437
optiga_lib_status_t return_status = OPTIGA_LIB_BUSY;
434438

@@ -581,8 +585,6 @@ CHIP_ERROR P256Keypair::NewCertificateSigningRequest(uint8_t * csr, size_t & csr
581585
trustm_close();
582586
}
583587
return error;
584-
585-
#endif
586588
}
587589

588590
} // namespace Crypto

src/platform/Infineon/crypto/trustm/CHIPCryptoPALHsm_config_trustm.h

+6-5
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,6 @@
3232
*/
3333
#define ENABLE_TRUSTM_ECDSA_VERIFY 1
3434

35-
/*
36-
* Enable Key Import for trustm
37-
*/
38-
#define ENABLE_TRUSTM_KEY_IMPORT 0
39-
4035
/*
4136
* Enable trustm for HKDF SHA256
4237
*/
@@ -51,3 +46,9 @@
5146
* Enable trustm for DA
5247
*/
5348
#define ENABLE_TRUSTM_DEVICE_ATTESTATION 1
49+
50+
51+
/*
52+
* Enable trustm for NOC key-pair generation
53+
*/
54+
#define ENABLE_TRUSTM_NOC_KEYGEN 0

src/platform/Infineon/crypto/trustm/CHIPCryptoPALHsm_utils_trustm.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ extern optiga_util_t * p_local_util;
5151
}
5252

5353
static const uint8_t trustm_magic_no[] = IFX_CRYPTO_KEY_MAGIC;
54-
static const uint8_t DA_KEY_ID[] = { 0xE0, 0xF0 };
54+
static const uint8_t DA_KEY_ID[] = { 0xF0, 0xE0 }; //OID --> 0xE0F0
5555
/* Open session to trustm */
5656
void trustm_Open(void);
5757
void read_certificate_from_optiga(uint16_t optiga_oid, char * cert_pem, uint16_t * cert_pem_length);

0 commit comments

Comments
 (0)