From e96e1d0097e9903f805920d7dad12de43172e40d Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 13 Nov 2023 15:33:27 +0100 Subject: [PATCH] When a key is generated and stored, it creates its PRKD. Signed-off-by: Pol Henarejos --- src/hsm/cvc.h | 8 ++++++++ src/hsm/sc_hsm.c | 13 +++++++++++++ 2 files changed, 21 insertions(+) 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; }