@@ -72,53 +72,52 @@ static ATCAIfaceCfg atca_iface_config = {
72
72
73
73
psa_status_t atecc608a_to_psa_error (ATCA_STATUS ret )
74
74
{
75
- switch (ret )
76
- {
77
- case ATCA_SUCCESS :
78
- case ATCA_RX_NO_RESPONSE :
79
- case ATCA_WAKE_SUCCESS :
80
- return PSA_SUCCESS ;
81
- case ATCA_BAD_PARAM :
82
- case ATCA_INVALID_ID :
83
- return PSA_ERROR_INVALID_ARGUMENT ;
84
- case ATCA_ASSERT_FAILURE :
85
- return PSA_ERROR_TAMPERING_DETECTED ;
86
- case ATCA_SMALL_BUFFER :
87
- return PSA_ERROR_BUFFER_TOO_SMALL ;
88
- case ATCA_RX_CRC_ERROR :
89
- case ATCA_RX_FAIL :
90
- case ATCA_STATUS_CRC :
91
- case ATCA_RESYNC_WITH_WAKEUP :
92
- case ATCA_PARITY_ERROR :
93
- case ATCA_TX_TIMEOUT :
94
- case ATCA_RX_TIMEOUT :
95
- case ATCA_TOO_MANY_COMM_RETRIES :
96
- case ATCA_COMM_FAIL :
97
- case ATCA_TIMEOUT :
98
- case ATCA_TX_FAIL :
99
- case ATCA_NO_DEVICES :
100
- return PSA_ERROR_COMMUNICATION_FAILURE ;
101
- case ATCA_UNIMPLEMENTED :
102
- return PSA_ERROR_NOT_SUPPORTED ;
103
- case ATCA_ALLOC_FAILURE :
104
- return PSA_ERROR_INSUFFICIENT_MEMORY ;
105
- case ATCA_BAD_OPCODE :
106
- case ATCA_CONFIG_ZONE_LOCKED :
107
- case ATCA_DATA_ZONE_LOCKED :
108
- case ATCA_NOT_LOCKED :
109
- case ATCA_WAKE_FAILED :
110
- case ATCA_STATUS_UNKNOWN :
111
- case ATCA_STATUS_ECC :
112
- case ATCA_STATUS_SELFTEST_ERROR :
113
- case ATCA_CHECKMAC_VERIFY_FAILED :
114
- case ATCA_PARSE_ERROR :
115
- case ATCA_FUNC_FAIL :
116
- case ATCA_GEN_FAIL :
117
- case ATCA_EXECUTION_ERROR :
118
- case ATCA_HEALTH_TEST_ERROR :
119
- case ATCA_INVALID_SIZE :
120
- default :
121
- return PSA_ERROR_HARDWARE_FAILURE ;
75
+ switch (ret ) {
76
+ case ATCA_SUCCESS :
77
+ case ATCA_RX_NO_RESPONSE :
78
+ case ATCA_WAKE_SUCCESS :
79
+ return PSA_SUCCESS ;
80
+ case ATCA_BAD_PARAM :
81
+ case ATCA_INVALID_ID :
82
+ return PSA_ERROR_INVALID_ARGUMENT ;
83
+ case ATCA_ASSERT_FAILURE :
84
+ return PSA_ERROR_CORRUPTION_DETECTED ;
85
+ case ATCA_SMALL_BUFFER :
86
+ return PSA_ERROR_BUFFER_TOO_SMALL ;
87
+ case ATCA_RX_CRC_ERROR :
88
+ case ATCA_RX_FAIL :
89
+ case ATCA_STATUS_CRC :
90
+ case ATCA_RESYNC_WITH_WAKEUP :
91
+ case ATCA_PARITY_ERROR :
92
+ case ATCA_TX_TIMEOUT :
93
+ case ATCA_RX_TIMEOUT :
94
+ case ATCA_TOO_MANY_COMM_RETRIES :
95
+ case ATCA_COMM_FAIL :
96
+ case ATCA_TIMEOUT :
97
+ case ATCA_TX_FAIL :
98
+ case ATCA_NO_DEVICES :
99
+ return PSA_ERROR_COMMUNICATION_FAILURE ;
100
+ case ATCA_UNIMPLEMENTED :
101
+ return PSA_ERROR_NOT_SUPPORTED ;
102
+ case ATCA_ALLOC_FAILURE :
103
+ return PSA_ERROR_INSUFFICIENT_MEMORY ;
104
+ case ATCA_BAD_OPCODE :
105
+ case ATCA_CONFIG_ZONE_LOCKED :
106
+ case ATCA_DATA_ZONE_LOCKED :
107
+ case ATCA_NOT_LOCKED :
108
+ case ATCA_WAKE_FAILED :
109
+ case ATCA_STATUS_UNKNOWN :
110
+ case ATCA_STATUS_ECC :
111
+ case ATCA_STATUS_SELFTEST_ERROR :
112
+ case ATCA_CHECKMAC_VERIFY_FAILED :
113
+ case ATCA_PARSE_ERROR :
114
+ case ATCA_FUNC_FAIL :
115
+ case ATCA_GEN_FAIL :
116
+ case ATCA_EXECUTION_ERROR :
117
+ case ATCA_HEALTH_TEST_ERROR :
118
+ case ATCA_INVALID_SIZE :
119
+ default :
120
+ return PSA_ERROR_HARDWARE_FAILURE ;
122
121
}
123
122
}
124
123
@@ -140,7 +139,7 @@ static void pubkey_for_psa(uint8_t *data)
140
139
static psa_status_t is_public_key_slot (uint16_t key_slot )
141
140
{
142
141
/* Keys 8 to 15 can store public keys. Slots 1-7 are too small. */
143
- return ((key_slot >= 8 && key_slot <=15 ) ? PSA_SUCCESS : PSA_ERROR_INVALID_ARGUMENT );
142
+ return ((key_slot >= 8 && key_slot <= 15 ) ? PSA_SUCCESS : PSA_ERROR_INVALID_ARGUMENT );
144
143
}
145
144
146
145
psa_status_t atecc608a_init ()
@@ -153,7 +152,8 @@ psa_status_t atecc608a_deinit()
153
152
return atecc608a_to_psa_error (atcab_release ());
154
153
}
155
154
156
- static psa_status_t atecc608a_export_public_key (psa_key_slot_number_t key ,
155
+ static psa_status_t atecc608a_export_public_key (psa_drv_se_context_t * drv_context ,
156
+ psa_key_slot_number_t key ,
157
157
uint8_t * p_data , size_t data_size ,
158
158
size_t * p_data_length )
159
159
{
@@ -164,8 +164,7 @@ static psa_status_t atecc608a_export_public_key(psa_key_slot_number_t key,
164
164
const uint16_t slot = key ;
165
165
psa_status_t status = PSA_ERROR_GENERIC_ERROR ;
166
166
167
- if (data_size < key_data_len )
168
- {
167
+ if (data_size < key_data_len ) {
169
168
return PSA_ERROR_BUFFER_TOO_SMALL ;
170
169
}
171
170
@@ -185,13 +184,15 @@ static psa_status_t atecc608a_export_public_key(psa_key_slot_number_t key,
185
184
atecc608a_deinit ();
186
185
return status ;
187
186
}
188
- static psa_status_t atecc608a_import_public_key (psa_key_slot_number_t key_slot ,
187
+ static psa_status_t atecc608a_import_public_key (psa_drv_se_context_t * drv_context ,
188
+ psa_key_slot_number_t key_slot ,
189
189
psa_key_lifetime_t lifetime ,
190
190
psa_key_type_t type ,
191
191
psa_algorithm_t alg ,
192
192
psa_key_usage_t usage ,
193
193
const uint8_t * p_data ,
194
- size_t data_length )
194
+ size_t data_length ,
195
+ size_t * bits )
195
196
{
196
197
const uint16_t key_id = key_slot ;
197
198
psa_status_t status = PSA_ERROR_GENERIC_ERROR ;
@@ -201,19 +202,16 @@ static psa_status_t atecc608a_import_public_key(psa_key_slot_number_t key_slot,
201
202
/* Check if the key has a size of 65 {0x04, X, Y}. */
202
203
if (data_length != PSA_KEY_EXPORT_MAX_SIZE (PSA_KEY_TYPE_ECC_PUBLIC_KEY (
203
204
PSA_ECC_CURVE_SECP256R1 ),
204
- 256 ))
205
- {
205
+ 256 )) {
206
206
return PSA_ERROR_INVALID_ARGUMENT ;
207
207
}
208
208
209
- if (type != PSA_KEY_TYPE_ECC_PUBLIC_KEY (PSA_ECC_CURVE_SECP256R1 ))
210
- {
209
+ if (type != PSA_KEY_TYPE_ECC_PUBLIC_KEY (PSA_ECC_CURVE_SECP256R1 )) {
211
210
return PSA_ERROR_NOT_SUPPORTED ;
212
211
}
213
212
214
213
/* The driver can only do randomized ECDSA on SHA-256 */
215
- if (alg != PSA_ALG_ECDSA (PSA_ALG_SHA_256 ) && alg != PSA_ALG_ECDSA_ANY )
216
- {
214
+ if (alg != PSA_ALG_ECDSA (PSA_ALG_SHA_256 ) && alg != PSA_ALG_ECDSA_ANY ) {
217
215
return PSA_ERROR_NOT_SUPPORTED ;
218
216
}
219
217
@@ -225,12 +223,11 @@ static psa_status_t atecc608a_import_public_key(psa_key_slot_number_t key_slot,
225
223
return status ;
226
224
}
227
225
228
- static psa_status_t atecc608a_generate_key (psa_key_slot_number_t key_slot ,
226
+ static psa_status_t atecc608a_generate_key (psa_drv_se_context_t * drv_context ,
227
+ psa_key_slot_number_t key_slot ,
229
228
psa_key_type_t type ,
230
229
psa_key_usage_t usage ,
231
230
size_t bits ,
232
- const void * extra ,
233
- size_t extra_size ,
234
231
uint8_t * p_pubkey_out ,
235
232
size_t pubkey_out_size ,
236
233
size_t * p_pubkey_length )
@@ -239,40 +236,32 @@ static psa_status_t atecc608a_generate_key(psa_key_slot_number_t key_slot,
239
236
psa_status_t status = PSA_ERROR_GENERIC_ERROR ;
240
237
241
238
/* The hardware has slots 0-15 */
242
- if (key_slot > 15 )
243
- {
239
+ if (key_slot > 15 ) {
244
240
return PSA_ERROR_INVALID_ARGUMENT ;
245
241
}
246
242
247
- if (type != PSA_KEY_TYPE_ECC_KEYPAIR (PSA_ECC_CURVE_SECP256R1 ))
248
- {
243
+ if (type != PSA_KEY_TYPE_ECC_KEY_PAIR (PSA_ECC_CURVE_SECP256R1 )) {
249
244
return PSA_ERROR_NOT_SUPPORTED ;
250
245
}
251
246
252
- if (bits != PSA_BYTES_TO_BITS (ATCA_PRIV_KEY_SIZE ))
253
- {
247
+ if (bits != PSA_BYTES_TO_BITS (ATCA_PRIV_KEY_SIZE )) {
254
248
return PSA_ERROR_NOT_SUPPORTED ;
255
249
}
256
250
257
- if (p_pubkey_out != NULL && pubkey_out_size < 1 + ATCA_PUB_KEY_SIZE )
258
- {
259
- return PSA_ERROR_BUFFER_TOO_SMALL ;
251
+ if (p_pubkey_out != NULL && pubkey_out_size < 1 + ATCA_PUB_KEY_SIZE ) {
252
+ return PSA_ERROR_BUFFER_TOO_SMALL ;
260
253
}
261
254
262
255
ASSERT_SUCCESS_PSA (atecc608a_init ());
263
256
264
- if (p_pubkey_out != NULL )
265
- {
257
+ if (p_pubkey_out != NULL ) {
266
258
ASSERT_SUCCESS (atcab_genkey (key_id , pubkey_for_driver (p_pubkey_out )));
267
259
pubkey_for_psa (p_pubkey_out );
268
- }
269
- else
270
- {
260
+ } else {
271
261
ASSERT_SUCCESS (atcab_genkey (key_id , NULL ));
272
262
}
273
263
274
- if (p_pubkey_length != NULL )
275
- {
264
+ if (p_pubkey_length != NULL ) {
276
265
* p_pubkey_length = 1 + ATCA_PUB_KEY_SIZE ;
277
266
}
278
267
@@ -281,7 +270,8 @@ static psa_status_t atecc608a_generate_key(psa_key_slot_number_t key_slot,
281
270
return status ;
282
271
}
283
272
284
- static psa_status_t atecc608a_asymmetric_sign (psa_key_slot_number_t key_slot ,
273
+ static psa_status_t atecc608a_asymmetric_sign (psa_drv_se_context_t * drv_context ,
274
+ psa_key_slot_number_t key_slot ,
285
275
psa_algorithm_t alg ,
286
276
const uint8_t * p_hash ,
287
277
size_t hash_length ,
@@ -293,19 +283,16 @@ static psa_status_t atecc608a_asymmetric_sign(psa_key_slot_number_t key_slot,
293
283
psa_status_t status = PSA_ERROR_GENERIC_ERROR ;
294
284
295
285
/* The driver can only do randomized ECDSA on SHA-256 */
296
- if (alg != PSA_ALG_ECDSA (PSA_ALG_SHA_256 ) && alg != PSA_ALG_ECDSA_ANY )
297
- {
286
+ if (alg != PSA_ALG_ECDSA (PSA_ALG_SHA_256 ) && alg != PSA_ALG_ECDSA_ANY ) {
298
287
return PSA_ERROR_NOT_SUPPORTED ;
299
288
}
300
289
301
- if (hash_length != PSA_HASH_SIZE (PSA_ALG_SHA_256 ))
302
- {
290
+ if (hash_length != PSA_HASH_SIZE (PSA_ALG_SHA_256 )) {
303
291
/* The driver only supports signing things of length 32. */
304
292
return PSA_ERROR_NOT_SUPPORTED ;
305
293
}
306
294
307
- if (signature_size < ATCA_SIG_SIZE )
308
- {
295
+ if (signature_size < ATCA_SIG_SIZE ) {
309
296
return PSA_ERROR_BUFFER_TOO_SMALL ;
310
297
}
311
298
@@ -327,7 +314,8 @@ static psa_status_t atecc608a_asymmetric_sign(psa_key_slot_number_t key_slot,
327
314
return status ;
328
315
}
329
316
330
- psa_status_t atecc608a_asymmetric_verify (psa_key_slot_number_t key_slot ,
317
+ psa_status_t atecc608a_asymmetric_verify (psa_drv_se_context_t * drv_context ,
318
+ psa_key_slot_number_t key_slot ,
331
319
psa_algorithm_t alg ,
332
320
const uint8_t * p_hash ,
333
321
size_t hash_length ,
@@ -341,19 +329,16 @@ psa_status_t atecc608a_asymmetric_verify(psa_key_slot_number_t key_slot,
341
329
ASSERT_SUCCESS_PSA (is_public_key_slot (key_id ));
342
330
343
331
/* The driver can only do randomized ECDSA on SHA-256 */
344
- if (alg != PSA_ALG_ECDSA (PSA_ALG_SHA_256 ) && alg != PSA_ALG_ECDSA_ANY )
345
- {
332
+ if (alg != PSA_ALG_ECDSA (PSA_ALG_SHA_256 ) && alg != PSA_ALG_ECDSA_ANY ) {
346
333
return PSA_ERROR_NOT_SUPPORTED ;
347
334
}
348
335
349
- if (hash_length != PSA_HASH_SIZE (PSA_ALG_SHA_256 ))
350
- {
336
+ if (hash_length != PSA_HASH_SIZE (PSA_ALG_SHA_256 )) {
351
337
/* The driver only supports hashes of length 32. */
352
338
return PSA_ERROR_NOT_SUPPORTED ;
353
339
}
354
340
355
- if (signature_length != ATCA_SIG_SIZE )
356
- {
341
+ if (signature_length != ATCA_SIG_SIZE ) {
357
342
/* The driver only supports signatures of length 64. */
358
343
return PSA_ERROR_INVALID_SIGNATURE ;
359
344
}
@@ -372,8 +357,7 @@ psa_status_t atecc608a_write(uint16_t slot, size_t offset, const uint8_t *data,
372
357
psa_status_t status = PSA_ERROR_GENERIC_ERROR ;
373
358
374
359
/* The hardware has slots 0-15 */
375
- if (slot > 15 )
376
- {
360
+ if (slot > 15 ) {
377
361
return PSA_ERROR_INVALID_ARGUMENT ;
378
362
}
379
363
@@ -390,8 +374,7 @@ psa_status_t atecc608a_read(uint16_t slot, size_t offset, uint8_t *data, size_t
390
374
psa_status_t status = PSA_ERROR_GENERIC_ERROR ;
391
375
392
376
/* The hardware has slots 0-15 */
393
- if (slot > 15 )
394
- {
377
+ if (slot > 15 ) {
395
378
return PSA_ERROR_INVALID_ARGUMENT ;
396
379
}
397
380
@@ -403,35 +386,44 @@ psa_status_t atecc608a_read(uint16_t slot, size_t offset, uint8_t *data, size_t
403
386
return status ;
404
387
}
405
388
406
- #define PSA_ATECC608A_LIFETIME 0xdeadbeefU
407
-
408
- static psa_drv_se_asymmetric_t atecc608a_asymmetric =
389
+ psa_status_t atecc608a_check_slot ( psa_drv_se_context_t * drv_context ,
390
+ const psa_key_attributes_t * attributes ,
391
+ psa_key_slot_number_t key_slot )
409
392
{
393
+ if (PSA_KEY_TYPE_IS_ECC_KEY_PAIR (attributes -> type )) {
394
+ if (key_slot <= 15 ) {
395
+ return PSA_SUCCESS ;
396
+ }
397
+ } else if (PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY (attributes -> type )) {
398
+ if (key_slot >= 8 && key_slot <= 15 ) {
399
+ return PSA_SUCCESS ;
400
+ }
401
+ }
402
+ return PSA_ERROR_NOT_SUPPORTED ;
403
+ }
404
+
405
+ static psa_drv_se_asymmetric_t atecc608a_asymmetric = {
410
406
.p_sign = atecc608a_asymmetric_sign ,
411
407
.p_verify = atecc608a_asymmetric_verify ,
412
408
.p_encrypt = 0 ,
413
409
.p_decrypt = 0 ,
414
410
};
415
411
416
- static psa_drv_se_key_management_t atecc608a_key_management =
417
- {
412
+ static psa_drv_se_key_management_t atecc608a_key_management = {
418
413
/* So far there is no public key import function in the API, so use this instead */
419
414
.p_import = atecc608a_import_public_key ,
420
415
.p_generate = atecc608a_generate_key ,
421
416
.p_destroy = 0 ,
422
- /* So far there is no public key export function in the API, so use this instead */
423
- .p_export = atecc608a_export_public_key ,
417
+ . p_export_public = atecc608a_export_public_key ,
418
+ .p_check_slot = atecc608a_check_slot ,
424
419
};
425
420
426
- psa_drv_se_info_t atecc608a_drv_info =
427
- {
428
- .lifetime = PSA_ATECC608A_LIFETIME ,
429
- .p_key_management = & atecc608a_key_management ,
430
- .p_mac = 0 ,
431
- .p_cipher = 0 ,
432
- .p_asym = & atecc608a_asymmetric ,
433
- .p_aead = 0 ,
434
- .p_derive = 0 ,
435
- .slot_min = 0 ,
436
- .slot_max = 0 ,
421
+ psa_drv_se_t atecc608a_drv_info = {
422
+ .key_management = & atecc608a_key_management ,
423
+ .mac = 0 ,
424
+ .cipher = 0 ,
425
+ .asymmetric = & atecc608a_asymmetric ,
426
+ .aead = 0 ,
427
+ .derivation = 0 ,
428
+ .hal_version = PSA_DRV_SE_HAL_VERSION
437
429
};
0 commit comments