@@ -48,7 +48,6 @@ const uint8_t kTlvHeader = 2;
48
48
49
49
// Define keyid
50
50
uint32_t keyid =0 ;
51
-
52
51
namespace chip {
53
52
namespace Crypto {
54
53
@@ -87,8 +86,7 @@ static CHIP_ERROR get_trustm_keyid_from_keypair(const P256KeypairContext mKeypai
87
86
return CHIP_ERROR_INTERNAL;
88
87
}
89
88
90
- *key_id += (mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET] << (8 * 1 ) & 0xFF00 ) |
91
- (mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET + 1 ] << (8 * 0 ) & 0x00FF );
89
+ *key_id += (mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET]) | (mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET + 1 ] << 8 );
92
90
93
91
return CHIP_NO_ERROR;
94
92
}
@@ -117,6 +115,7 @@ CHIP_ERROR P256Keypair::Initialize(ECPKeyTarget key_target)
117
115
{
118
116
mInitialized = true ;
119
117
}
118
+ error = CHIP_NO_ERROR;
120
119
return error;
121
120
#else
122
121
uint8_t pubkey[128 ] = {
@@ -125,61 +124,40 @@ CHIP_ERROR P256Keypair::Initialize(ECPKeyTarget key_target)
125
124
uint16_t pubKeyLen = sizeof (pubkey);
126
125
optiga_lib_status_t return_status = OPTIGA_LIB_BUSY;
127
126
P256PublicKey & public_key = const_cast <P256PublicKey &>(Pubkey ());
127
+ optiga_key_usage_t key_usage;
128
+ uint16_t keyid;
128
129
129
- if (key_target == ECPKeyTarget::ECDH)
130
- {
130
+ if (key_target == ECPKeyTarget::ECDH) {
131
131
keyid = TRUSTM_ECDH_OID_KEY;
132
- // Trust M init
133
- trustm_Open ();
132
+
134
133
// Trust M ECC 256 Key Gen
135
134
ChipLogDetail (Crypto, " Generating NIST256 key in TrustM for ECDH!" );
136
- uint8_t key_usage = (optiga_key_usage_t )(OPTIGA_KEY_USAGE_KEY_AGREEMENT);
137
-
138
- return_status = trustm_ecc_keygen (OPTIGA_KEY_ID_E0F3, key_usage, OPTIGA_ECC_CURVE_NIST_P_256, pubkey, &pubKeyLen);
139
-
140
- // Add signature length
141
- VerifyOrExit (return_status == OPTIGA_LIB_SUCCESS, error = CHIP_ERROR_INTERNAL);
142
-
143
- /* Set the public key */
144
- VerifyOrReturnError ((size_t ) pubKeyLen > NIST256_HEADER_OFFSET, CHIP_ERROR_INTERNAL);
145
- VerifyOrReturnError (((size_t ) pubKeyLen - NIST256_HEADER_OFFSET) <= kP256_PublicKey_Length , CHIP_ERROR_INTERNAL);
146
- memcpy ((void *) Uint8::to_const_uchar (public_key), pubkey + NIST256_HEADER_OFFSET, pubKeyLen - NIST256_HEADER_OFFSET);
147
-
148
- memcpy (&mKeypair .mBytes [0 ], trustm_magic_no, sizeof (trustm_magic_no));
149
- mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET] = (keyid >> (1 * 8 )) & 0x00FF ;
150
- mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET + 1 ] = (keyid >> (0 * 8 )) & 0x00FF ;
151
-
152
- mInitialized = true ;
153
- error = CHIP_NO_ERROR;
154
- }
155
- else
156
- {
135
+ key_usage = OPTIGA_KEY_USAGE_KEY_AGREEMENT;
136
+ } else {
157
137
// Add the logic to use different keyid
158
- keyid = TRUSTM_NODE_OID_KEY_START;
159
- // Trust M init
160
- trustm_Open ();
138
+ keyid = TRUSTM_NODE_OID_KEY_START;
161
139
// Trust M ECC 256 Key Gen
162
140
ChipLogDetail (Crypto, " Generating NIST256 key in TrustM !" );
163
- uint8_t key_usage = (optiga_key_usage_t )(OPTIGA_KEY_USAGE_SIGN | OPTIGA_KEY_USAGE_AUTHENTICATION);
164
-
165
- return_status = trustm_ecc_keygen (OPTIGA_KEY_ID_E0F2, key_usage, OPTIGA_ECC_CURVE_NIST_P_256, pubkey, &pubKeyLen);
166
- // Add signature length
167
- VerifyOrExit (return_status == OPTIGA_LIB_SUCCESS, error = CHIP_ERROR_INTERNAL);
168
-
169
- /* Set the public key */
170
- VerifyOrReturnError ((size_t ) pubKeyLen > NIST256_HEADER_OFFSET, CHIP_ERROR_INTERNAL);
171
- VerifyOrReturnError (((size_t ) pubKeyLen - NIST256_HEADER_OFFSET) <= kP256_PublicKey_Length , CHIP_ERROR_INTERNAL);
172
- memcpy ((void *) Uint8::to_const_uchar (public_key), pubkey + NIST256_HEADER_OFFSET, pubKeyLen - NIST256_HEADER_OFFSET);
141
+ key_usage = (optiga_key_usage_t )(OPTIGA_KEY_USAGE_SIGN | OPTIGA_KEY_USAGE_AUTHENTICATION);
142
+ }
143
+ // Trust M init
144
+ trustm_Open ();
145
+ return_status = trustm_ecc_keygen (keyid, key_usage, OPTIGA_ECC_CURVE_NIST_P_256, pubkey, &pubKeyLen);
173
146
174
- memcpy (&mKeypair .mBytes [0 ], trustm_magic_no, sizeof (trustm_magic_no));
175
- mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET] = (keyid >> (1 * 8 )) & 0x00FF ;
176
- mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET + 1 ] = (keyid >> (0 * 8 )) & 0x00FF ;
147
+ // Add signature length
148
+ VerifyOrExit (return_status == OPTIGA_LIB_SUCCESS, error = CHIP_ERROR_INTERNAL);
177
149
178
- mInitialized = true ;
179
- error = CHIP_NO_ERROR;
150
+ /* Set the public key */
151
+ VerifyOrReturnError ((size_t ) pubKeyLen > NIST256_HEADER_OFFSET, CHIP_ERROR_INTERNAL);
152
+ VerifyOrReturnError (((size_t ) pubKeyLen - NIST256_HEADER_OFFSET) <= kP256_PublicKey_Length , CHIP_ERROR_INTERNAL);
153
+ memcpy ((void *) Uint8::to_const_uchar (public_key), pubkey + NIST256_HEADER_OFFSET, pubKeyLen - NIST256_HEADER_OFFSET);
180
154
181
- }
155
+ memcpy (&mKeypair .mBytes [0 ], trustm_magic_no, sizeof (trustm_magic_no));
156
+ mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET] = (keyid >> (0 * 8 )) & 0xFF ;
157
+ mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET + 1 ] = (keyid >> (1 * 8 )) & 0xFF ;
182
158
159
+ mInitialized = true ;
160
+ error = CHIP_NO_ERROR;
183
161
184
162
exit :
185
163
if (error != CHIP_NO_ERROR)
@@ -213,14 +191,19 @@ CHIP_ERROR P256Keypair::ECDSA_sign_msg(const uint8_t * msg, size_t msg_length, P
213
191
trustm_Open ();
214
192
// Hash to get the digest
215
193
Hash_SHA256 (msg, msg_length, &digest[0 ]);
194
+ uint16_t keyid = (mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET]) | (mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET+1 ] << 8 );
216
195
// Api call to calculate the signature
217
- return_status = trustm_ecdsa_sign (OPTIGA_KEY_ID_E0F0, digest, digest_length, signature_trustm, &signature_trustm_len);
218
-
196
+ if (keyid == OPTIGA_KEY_ID_E0F2) {
197
+ return_status = trustm_ecdsa_sign (OPTIGA_KEY_ID_E0F2, digest, digest_length, signature_trustm, &signature_trustm_len);
198
+ } else {
199
+ return_status = trustm_ecdsa_sign (OPTIGA_KEY_ID_E0F0, digest, digest_length, signature_trustm, &signature_trustm_len);
200
+ }
201
+
219
202
VerifyOrExit (return_status == OPTIGA_LIB_SUCCESS, error = CHIP_ERROR_INTERNAL);
220
203
221
204
error = EcdsaAsn1SignatureToRaw (kP256_FE_Length , ByteSpan{ signature_trustm, signature_trustm_len }, out_raw_sig_span);
222
205
223
- ChipLogError (NotSpecified, " EcdsaAsn1SignatureToRaw %" CHIP_ERROR_FORMAT, error.Format ());
206
+ // ChipLogError(NotSpecified, "EcdsaAsn1SignatureToRaw %" CHIP_ERROR_FORMAT, error.Format());
224
207
225
208
SuccessOrExit (error);
226
209
@@ -257,9 +240,16 @@ CHIP_ERROR P256Keypair::ECDH_derive_secret(const P256PublicKey & remote_public_k
257
240
258
241
const uint8_t * const rem_pubKey = Uint8::to_const_uchar (remote_public_key);
259
242
const size_t rem_pubKeyLen = remote_public_key.Length ();
260
- return_status = trustm_ecdh_derive_secret (OPTIGA_KEY_ID_E0F3, (uint8_t *)rem_pubKey, (uint16_t )rem_pubKeyLen,
261
- out_secret.Bytes (), (uint8_t )secret_length);
262
-
243
+
244
+ uint8_t remote_key[68 ];
245
+ uint8_t header[3 ] = {0x03 , 0x42 , 0x00 };
246
+
247
+ memcpy (remote_key, &header, 3 );
248
+ memcpy (remote_key+3 , rem_pubKey, rem_pubKeyLen);
249
+
250
+ return_status = trustm_ecdh_derive_secret (OPTIGA_KEY_ID_E0F3, (uint8_t *)remote_key, (uint16_t )rem_pubKeyLen+3 ,
251
+ out_secret.Bytes (), (uint8_t )secret_length);
252
+
263
253
VerifyOrExit (return_status == OPTIGA_LIB_SUCCESS, error = CHIP_ERROR_INTERNAL) ;
264
254
265
255
exit :
@@ -357,9 +347,10 @@ CHIP_ERROR P256Keypair::Deserialize(P256SerializedKeypair & input)
357
347
VerifyOrReturnError (bbuf.Fit (), CHIP_ERROR_NO_MEMORY);
358
348
359
349
memcpy (&mKeypair .mBytes [0 ], trustm_magic_no, sizeof (trustm_magic_no));
360
- mKeypair .mBytes [8 ] = *(privkey + 8 );
361
- mKeypair .mBytes [9 ] = *(privkey + 9 );
362
- // ChipLogDetail(Crypto, "Parsed keyId = 0x%02X%02X", mKeypair.mBytes[8], mKeypair.mBytes[9]);
350
+
351
+ mKeypair .mBytes [4 ] = *(privkey + 4 );
352
+ mKeypair .mBytes [5 ] = *(privkey + 5 );
353
+ // ChipLogDetail(Crypto, "Parsed keyId = 0x%02X%02X", mKeypair.mBytes[4], mKeypair.mBytes[5]);
363
354
364
355
mInitialized = true ;
365
356
@@ -443,7 +434,7 @@ CHIP_ERROR P256Keypair::NewCertificateSigningRequest(uint8_t * csr, size_t & csr
443
434
{
444
435
#if !ENABLE_TRUSTM_GENERATE_EC_KEY
445
436
return NewCertificateSigningRequest_H (&mKeypair , csr, csr_length);
446
- #else
437
+ #else
447
438
CHIP_ERROR error = CHIP_ERROR_INTERNAL;
448
439
optiga_lib_status_t return_status = OPTIGA_LIB_BUSY;
449
440
@@ -593,7 +584,6 @@ CHIP_ERROR P256Keypair::NewCertificateSigningRequest(uint8_t * csr, size_t & csr
593
584
csr_length = (csr_index + signature_len);
594
585
595
586
error = CHIP_NO_ERROR;
596
-
597
587
exit :
598
588
if (error != CHIP_NO_ERROR)
599
589
{
0 commit comments