@@ -78,7 +78,6 @@ extern CHIP_ERROR ECDSA_validate_msg_signature_H(const P256PublicKey * public_ke
78
78
extern CHIP_ERROR ECDSA_validate_hash_signature_H (const P256PublicKey * public_key, const uint8_t * hash, const size_t hash_length,
79
79
const P256ECDSASignature & signature);
80
80
81
- #if (ENABLE_TRUSTM_GENERATE_EC_KEY || ENABLE_TRUSTM_ECDSA_VERIFY)
82
81
static CHIP_ERROR get_trustm_keyid_from_keypair (const P256KeypairContext mKeypair , uint32_t * key_id)
83
82
{
84
83
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
89
88
*key_id += (mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET]) | (mKeypair .mBytes [CRYPTO_KEYPAIR_KEYID_OFFSET + 1 ] << 8 );
90
89
return CHIP_NO_ERROR;
91
90
}
92
- #endif // #if (ENABLE_TRUSTM_GENERATE_EC_KEY || ENABLE_TRUSTM_ECDSA_VERIFY)
93
91
94
92
P256Keypair::~P256Keypair ()
95
93
{
@@ -106,122 +104,132 @@ CHIP_ERROR P256Keypair::Initialize(ECPKeyTarget key_target)
106
104
{
107
105
CHIP_ERROR error = CHIP_ERROR_INTERNAL;
108
106
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;
118
115
119
- return error;
120
- }
121
- else
116
+ if (key_target == ECPKeyTarget::ECDH)
122
117
{
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
-
134
118
keyid = TRUSTM_ECDH_OID_KEY;
135
119
136
120
// Trust M ECC 256 Key Gen
137
121
ChipLogDetail (Crypto, " Generating NIST256 key for ECDH!" );
138
122
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);
141
144
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);
144
147
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);
149
152
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 ;
153
156
154
- mInitialized = true ;
155
- error = CHIP_NO_ERROR;
157
+ mInitialized = true ;
158
+ error = CHIP_NO_ERROR;
156
159
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 ();
163
164
}
165
+ return error;
164
166
}
165
167
166
168
CHIP_ERROR P256Keypair::ECDSA_sign_msg (const uint8_t * msg, size_t msg_length, P256ECDSASignature & out_signature) const
167
169
{
168
170
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 );
176
172
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;
181
175
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 ]);
184
190
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
+ {
187
193
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
+
192
195
// Api call to calculate the signature
193
196
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);
196
214
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);
198
216
199
- SuccessOrExit (error);
217
+ SuccessOrExit (error);
200
218
201
- out_signature.SetLength (2 * kP256_FE_Length );
219
+ out_signature.SetLength (2 * kP256_FE_Length );
202
220
203
- error = CHIP_NO_ERROR;
221
+ error = CHIP_NO_ERROR;
204
222
205
223
exit :
206
224
if (error != CHIP_NO_ERROR)
207
225
{
208
226
trustm_close ();
209
227
}
210
228
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
- }
218
229
}
219
230
220
231
CHIP_ERROR P256Keypair::ECDH_derive_secret (const P256PublicKey & remote_public_key, P256ECDHDerivedSecret & out_secret) const
221
232
{
222
- #if !ENABLE_TRUSTM_GENERATE_EC_KEY
223
- return ECDH_derive_secret_H (&mKeypair , remote_public_key, out_secret);
224
- #else
225
233
CHIP_ERROR error = CHIP_ERROR_INTERNAL;
226
234
optiga_lib_status_t return_status = OPTIGA_LIB_BUSY;
227
235
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
256
264
trustm_close ();
257
265
}
258
266
return error;
259
- #endif
260
267
}
261
268
262
269
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
426
433
427
434
CHIP_ERROR P256Keypair::NewCertificateSigningRequest (uint8_t * csr, size_t & csr_length) const
428
435
{
429
- #if !ENABLE_TRUSTM_GENERATE_EC_KEY
430
- return NewCertificateSigningRequest_H (&mKeypair , csr, csr_length);
431
- #else
432
436
CHIP_ERROR error = CHIP_ERROR_INTERNAL;
433
437
optiga_lib_status_t return_status = OPTIGA_LIB_BUSY;
434
438
@@ -581,8 +585,6 @@ CHIP_ERROR P256Keypair::NewCertificateSigningRequest(uint8_t * csr, size_t & csr
581
585
trustm_close ();
582
586
}
583
587
return error;
584
-
585
- #endif
586
588
}
587
589
588
590
} // namespace Crypto
0 commit comments