diff --git a/src/hsm/cvc.h b/src/hsm/cvc.h index 3519e59..1959cfd 100644 --- a/src/hsm/cvc.h +++ b/src/hsm/cvc.h @@ -94,4 +94,12 @@ extern size_t asn1_build_prkd_aes(const uint8_t *label, size_t keysize, uint8_t *buf, size_t buf_len); +extern size_t asn1_build_prkd_generic(const uint8_t *label, + size_t label_len, + const uint8_t *keyid, + size_t keyid_len, + size_t keysize, + int key_tpe, + uint8_t *buf, + size_t buf_len); #endif diff --git a/src/hsm/sc_hsm.c b/src/hsm/sc_hsm.c index 2380839..f4450f2 100644 --- a/src/hsm/sc_hsm.c +++ b/src/hsm/sc_hsm.c @@ -539,6 +539,19 @@ int store_keys(void *key_ctx, int type, uint8_t key_id) { if (r != CCID_OK) { return r; } + char key_id_str[4] = {0}; + sprintf(key_id_str, "%u", key_id); + if (type & PICO_KEYS_KEY_EC) { + key_size--; + } + size_t prkd_len = asn1_build_prkd_generic(NULL, 0, (uint8_t *)key_id_str, strlen(key_id_str), key_size * 8, type, kdata, sizeof(kdata)); + if (prkd_len > 0) { + fpk = file_new((PRKD_PREFIX << 8) | key_id); + r = flash_write_data_to_file(fpk, kdata, prkd_len); + if (r != 0) { + return SW_EXEC_ERROR(); + } + } low_flash_available(); return CCID_OK; }