54
54
55
55
#include "atcacert/atcacert_client.h"
56
56
57
-
58
57
/* OpenSSL Engine API demands this list be in cmd number order otherwise it'll
59
58
throw an invalid cmd number error*/
60
59
const ENGINE_CMD_DEFN eccx08_cmd_defns [] = {
61
60
{ ECCX08_CMD_GET_VERSION , "VERSION" ,
62
61
"Get engine version" , ENGINE_CMD_FLAG_NO_INPUT },
62
+ { ECCX08_CMD_GET_KEY , "GET_DEVICE_KEY" ,
63
+ "Get engine key structure for DEVICE_KEY_SLOT and stores in the provided file" , ENGINE_CMD_FLAG_STRING },
64
+ { ECCX08_CMD_GET_DEVICE_CERT , "GET_DEVICE_CERT" ,
65
+ "Get device certificate from hardware and stores in the provided filename" , ENGINE_CMD_FLAG_STRING },
63
66
{ ECCX08_CMD_GET_SIGNER_CERT , "GET_SIGNER_CERT" ,
64
- "Get signer certificate from hardware" , ENGINE_CMD_FLAG_STRING },
65
- // { ECCX08_CMD_GET_PUB_KEY, "GET_DEVICE_PUBKEY",
66
- // "Get device public key from hardware", ENGINE_CMD_FLAG_STRING },
67
- { ECCX08_CMD_GET_DEVICE_CERT , "GET_DEVICE_CERT" ,
68
- "Get device certificate from hardware" , ENGINE_CMD_FLAG_STRING },
69
- { ECCX08_CMD_GET_DEVICE_CSR , "GET_DEVICE_CSR" ,
70
- "Generate a device CSR and save it" , ENGINE_CMD_FLAG_STRING },
67
+ "Get signer certificate from hardware and stores in the provided filename" , ENGINE_CMD_FLAG_STRING },
71
68
{ ECCX08_CMD_LOAD_CERT_CTRL , "LOAD_CERT_CTRL" ,
72
69
"Load the device certificate into an OpenSSL cert" , ENGINE_CMD_FLAG_INTERNAL },
73
- { ECCX08_CMD_DEVICE_KEY_SLOT , "device_key_slot" ,
74
- "Where to find the device private key" , ENGINE_CMD_FLAG_NUMERIC | ENGINE_CMD_FLAG_INTERNAL },
75
- { ECCX08_CMD_ECDH_SLOT , "ecdh_key_slot" ,
70
+ { ECCX08_CMD_KEY_SLOT , "SET_KEY_SLOT" ,
71
+ "Where to find the device private key" , ENGINE_CMD_FLAG_NUMERIC },
72
+ { ECCX08_CMD_TRANSPORT_KEY , "set_transport_key" ,
73
+ "Binary blob with the transport key secret (32 bytes)" , ENGINE_CMD_FLAG_STRING | ENGINE_CMD_FLAG_INTERNAL },
74
+ { ECCX08_CMD_ECDH_SLOT , "set_ecdh_slot" ,
76
75
"Base slot for ecdh key(s)" , ENGINE_CMD_FLAG_NUMERIC | ENGINE_CMD_FLAG_INTERNAL },
77
- { ECCX08_CMD_ECDH_SLOTS , "ecdh_slot_count " ,
76
+ { ECCX08_CMD_ECDH_SLOTS , "set_ecdh_count " ,
78
77
"Number of sequential slots to use for ecdh key(s) - e.g. ecdh_key_slot...ecdh_key_slot+ecdh_slot_count-1" ,
79
78
ENGINE_CMD_FLAG_NUMERIC | ENGINE_CMD_FLAG_INTERNAL },
80
- { ECCX08_CMD_DEVICE_CERT , "device_cert " ,
79
+ { ECCX08_CMD_DEVICE_CERT , "set_device_cert_def " ,
81
80
"Device Cert Configuration Section" , ENGINE_CMD_FLAG_STRING | ENGINE_CMD_FLAG_INTERNAL },
82
- { ECCX08_CMD_SIGNER_CERT , "signer_cert " ,
81
+ { ECCX08_CMD_SIGNER_CERT , "set_signer_cert_def " ,
83
82
"Signer Cert Configuration Section" , ENGINE_CMD_FLAG_STRING | ENGINE_CMD_FLAG_INTERNAL },
84
83
85
84
/* Structure has to end with a null element */
@@ -186,7 +185,6 @@ static int get_cert(char *filename, atcacert_def_t * pCertDef, atcacert_def_t *
186
185
return status ;
187
186
}
188
187
189
-
190
188
/**
191
189
*
192
190
* \brief Retrieves pre-programmed certificates from ATECCX08
@@ -202,26 +200,48 @@ static int get_device_cert(char *filename)
202
200
return get_cert (filename , g_cert_def_2_device_ptr , g_cert_def_1_signer_ptr );
203
201
}
204
202
205
- // /**
206
- // * \brief Retrieves the signer public key from ATECCX08 chip and
207
- // * saves them into a global signerPubkey buffer.
208
- // *
209
- // * \return ATCA_SUCCESS for success
210
- // */
211
- // static int get_public_key(void)
212
- // {
213
- // ATCA_STATUS status = ATCA_GEN_FAIL;
214
-
215
- // DEBUG_ENGINE("eccx08_cmd_ctrl(ECCX08_CMD_GET_PUB_KEY)\n");
216
- // // Get the signer public key from the signer certificate
217
- // status = atcacert_get_subj_public_key(g_cert_def_1_signer_ptr, signerCert, signerCertSize, signerPubkey);
218
- // if (status != ATCA_SUCCESS) {
219
- // DEBUG_ENGINE("eccx08_cmd_ctrl(): error in atcacert_get_subj_public_key\n");
220
- // goto err;
221
- // }
222
- // err:
223
- // return status;
224
- // }
203
+ /**
204
+ * \brief Retrieves key from ATECCX08 chip and builds a key structure and
205
+ * saves it as as a private key file in PEM format
206
+ *
207
+ * \return ATCA_SUCCESS for success
208
+ */
209
+ static int get_key (ENGINE * e , uint16_t keyid , char * filename )
210
+ {
211
+ ATCA_STATUS status = ATCA_GEN_FAIL ;
212
+ char * key_str [32 ];
213
+ EVP_PKEY * pkey ;
214
+
215
+ DEBUG_ENGINE ("Entered\n" );
216
+
217
+ snprintf (key_str , 32 , "ATECCx08:%02x:%02x:%02x:%02x" , pCfg -> iface_type ,
218
+ pCfg -> atcai2c .bus , pCfg -> atcai2c .slave_address , keyid );
219
+ key_str [31 ] = '\0' ;
220
+
221
+ pkey = eccx08_load_pubkey (e , key_str , NULL , NULL );
222
+
223
+ if (pkey )
224
+ {
225
+ EC_KEY * ec = EVP_PKEY_get1_EC_KEY (pkey );
226
+ if (ec )
227
+ {
228
+ BIO * bio = BIO_new (BIO_s_file ());
229
+ BIO_write_filename (bio , filename );
230
+ if (bio )
231
+ {
232
+ if (PEM_write_bio_ECPrivateKey (bio , ec , NULL , NULL , 0 , NULL , NULL ))
233
+ {
234
+ status = ATCA_SUCCESS ;
235
+ }
236
+ BIO_free (bio );
237
+ }
238
+ EC_KEY_free (ec );
239
+ }
240
+ EVP_PKEY_free (pkey );
241
+ }
242
+
243
+ return status ;
244
+ }
225
245
226
246
/**
227
247
* \brief Retrieves pre-programmed signer certificate from
@@ -253,8 +273,7 @@ static int load_device_cert(cmd_load_cert_params* p)
253
273
}
254
274
}
255
275
256
-
257
- static ATCA_STATUS set_device_key_slot (i )
276
+ static ATCA_STATUS set_device_key_slot (uint32_t i )
258
277
{
259
278
if (16 > i )
260
279
{
@@ -264,7 +283,7 @@ static ATCA_STATUS set_device_key_slot(i)
264
283
return ATCA_BAD_PARAM ;
265
284
}
266
285
267
- static ATCA_STATUS set_ecdh_slot (i )
286
+ static ATCA_STATUS set_ecdh_slot (uint32_t i )
268
287
{
269
288
if (16 > i )
270
289
{
@@ -274,7 +293,7 @@ static ATCA_STATUS set_ecdh_slot(i)
274
293
return ATCA_BAD_PARAM ;
275
294
}
276
295
277
- static ATCA_STATUS set_ecdh_count (i )
296
+ static ATCA_STATUS set_ecdh_count (uint32_t i )
278
297
{
279
298
if (16 > i )
280
299
{
@@ -284,6 +303,16 @@ static ATCA_STATUS set_ecdh_count(i)
284
303
return ATCA_BAD_PARAM ;
285
304
}
286
305
306
+ static ATCA_STATUS set_transport_key (uint8_t * p )
307
+ {
308
+ if (p )
309
+ {
310
+ memcpy (g_eccx08_transport_key , p , sizeof (g_eccx08_transport_key ));
311
+ return ATCA_SUCCESS ;
312
+ }
313
+ return ATCA_BAD_PARAM ;
314
+ }
315
+
287
316
/**
288
317
* \brief Configure the device cert from the config file
289
318
* \param[in] pStr should contain the section name
@@ -338,27 +367,23 @@ int eccx08_cmd_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void))
338
367
339
368
switch (cmd ) {
340
369
case ECCX08_CMD_GET_VERSION :
341
- // if (cmd_buf) {
342
- //snprintf(cmd_buf, i, "The ateccx08 ENGINE version: %s", ECCX08_ENGINE_VERSION);
343
370
DEBUG_ENGINE ("ENGINE Version: %s\n" , ECCX08_ENGINE_VERSION );
344
- // } else {
345
- // ret = 0;
346
- // }
347
371
status = ATCA_SUCCESS ;
348
372
break ;
349
- case ECCX08_CMD_GET_SIGNER_CERT :
350
- status = get_signer_cert (p );
373
+
374
+ case ECCX08_CMD_GET_KEY :
375
+ status = get_key (e , eccx08_engine_config .device_key_slot , p );
351
376
break ;
352
- // case ECCX08_CMD_GET_PUB_KEY:
353
- // status = get_public_key();
354
- // break;
355
377
case ECCX08_CMD_GET_DEVICE_CERT :
356
378
status = get_device_cert (p );
357
379
break ;
380
+ case ECCX08_CMD_GET_SIGNER_CERT :
381
+ status = get_signer_cert (p );
382
+ break ;
358
383
case ECCX08_CMD_LOAD_CERT_CTRL :
359
384
status = load_device_cert (p );
360
385
break ;
361
- case ECCX08_CMD_DEVICE_KEY_SLOT :
386
+ case ECCX08_CMD_KEY_SLOT :
362
387
status = set_device_key_slot (i );
363
388
break ;
364
389
case ECCX08_CMD_ECDH_SLOT :
@@ -373,6 +398,9 @@ int eccx08_cmd_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void))
373
398
case ECCX08_CMD_SIGNER_CERT :
374
399
status = config_signer_cert (p );
375
400
break ;
401
+ case ECCX08_CMD_TRANSPORT_KEY :
402
+ status = set_transport_key (p );
403
+ break ;
376
404
default :
377
405
DEBUG_ENGINE ("Unknown command: %d with i=%d, p=%s\n" , cmd , i , p ?p :"" );
378
406
break ;
0 commit comments