diff --git a/src/hsm/files.c b/src/hsm/files.c index 3879526..652a7f6 100644 --- a/src/hsm/files.c +++ b/src/hsm/files.c @@ -44,10 +44,11 @@ file_t file_entries[] = { /* 19 */ { .fid = EF_AODFS , .parent = 5, .name = NULL, .type = FILE_TYPE_WORKING_EF, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = {0} }, //EF.AODFs /* 20 */ { .fid = EF_DODFS , .parent = 5, .name = NULL, .type = FILE_TYPE_WORKING_EF, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = {0} }, //EF.DODFs /* 21 */ { .fid = EF_SKDFS , .parent = 5, .name = NULL, .type = FILE_TYPE_WORKING_EF, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = {0} }, //EF.SKDFs - /* 15 */ { .fid = EF_KEY_DOMAIN, .parent = 5, .name = NULL, .type = FILE_TYPE_INTERNAL_EF | FILE_DATA_FLASH, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = {0xff} }, //Key domain options + /* 22 */ { .fid = EF_KEY_DOMAIN, .parent = 5, .name = NULL, .type = FILE_TYPE_INTERNAL_EF | FILE_DATA_FLASH, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = {0xff} }, //Key domain options + /* 23 */ { .fid = EF_META , .parent = 5, .name = NULL, .type = FILE_TYPE_INTERNAL_EF | FILE_DATA_FLASH, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = {0xff} }, //EF.CDFs ///* 22 */ { .fid = 0x0000, .parent = 0, .name = openpgpcard_aid, .type = FILE_TYPE_WORKING_EF, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = {0} }, - /* 23 */ { .fid = 0x0000, .parent = 5, .name = sc_hsm_aid, .type = FILE_TYPE_WORKING_EF, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = {0} }, - /* 24 */ { .fid = 0x0000, .parent = 0xff, .name = NULL, .type = FILE_TYPE_UNKNOWN, .data = NULL, .ef_structure = 0, .acl = {0} } //end + /* 24 */ { .fid = 0x0000, .parent = 5, .name = sc_hsm_aid, .type = FILE_TYPE_WORKING_EF, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = {0} }, + /* 25 */ { .fid = 0x0000, .parent = 0xff, .name = NULL, .type = FILE_TYPE_UNKNOWN, .data = NULL, .ef_structure = 0, .acl = {0} } //end }; const file_t *MF = &file_entries[0]; diff --git a/src/hsm/sc_hsm.c b/src/hsm/sc_hsm.c index 77457f8..cab4e3d 100644 --- a/src/hsm/sc_hsm.c +++ b/src/hsm/sc_hsm.c @@ -1185,6 +1185,28 @@ static int cmd_keypair_gen() { free(cvcbin); return SW_EXEC_ERROR(); } + size_t lt[4] = { 0 }, meta_size = 0; + const uint8_t *pt[4] = { NULL }; + for (int t = 0; t < 4; t++) { + pt[t] = sc_asn1_find_tag(ctx, (const uint8_t *)apdu.cmd_apdu_data, apdu.cmd_apdu_data_len, 0x90+t, <[t]); + if (pt[t] != NULL && lt[t] > 0) + meta_size += 1+format_tlv_len(lt[t], NULL)+lt[t]; + } + if (meta_size) { + uint8_t *meta = (uint8_t *)calloc(1, meta_size), *m = meta; + for (int t = 0; t < 4; t++) { + if (lt[t] > 0 && pt[t] != NULL) { + *m++ = 0x90+t; + m += format_tlv_len(lt[t], m); + memcpy(m, pt[t], lt[t]); + } + } + DEBUG_PAYLOAD(meta,meta_size); + //ret = meta_add((KEY_PREFIX << 8) | key_id, meta, meta_size); + free(meta); + if (ret != 0) + return SW_EXEC_ERROR(); + } res_APDU[res_APDU_size++] = 0x67; int outer_len = 2+strlen(cvc.outer_car)+3+4; @@ -1209,6 +1231,7 @@ static int cmd_keypair_gen() { ret = flash_write_data_to_file(fpk, res_APDU, res_APDU_size); if (ret != 0) return SW_EXEC_ERROR(); + low_flash_available(); return SW_OK(); }