Added support for PUT DATA.
Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
@@ -344,6 +344,9 @@ static int cmd_get_data() {
|
|||||||
memcpy(res_APDU + res_APDU_size, file_get_data(ef), data_len);
|
memcpy(res_APDU + res_APDU_size, file_get_data(ef), data_len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (data_len == 0) {
|
||||||
|
return SW_FILE_NOT_FOUND();
|
||||||
|
}
|
||||||
if (data_len > 255) {
|
if (data_len > 255) {
|
||||||
memmove(res_APDU + res_APDU_size + 2, res_APDU + res_APDU_size, data_len);
|
memmove(res_APDU + res_APDU_size + 2, res_APDU + res_APDU_size, data_len);
|
||||||
}
|
}
|
||||||
@@ -353,6 +356,9 @@ static int cmd_get_data() {
|
|||||||
res_APDU[0] = 0x53;
|
res_APDU[0] = 0x53;
|
||||||
res_APDU_size = 1 + format_tlv_len(data_len, res_APDU + 1) + data_len;
|
res_APDU_size = 1 + format_tlv_len(data_len, res_APDU + 1) + data_len;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
return SW_FILE_NOT_FOUND();
|
||||||
|
}
|
||||||
return SW_OK();
|
return SW_OK();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -596,6 +602,12 @@ static int cmd_asym_keygen() {
|
|||||||
if (!has_mgm) {
|
if (!has_mgm) {
|
||||||
return SW_SECURITY_STATUS_NOT_SATISFIED();
|
return SW_SECURITY_STATUS_NOT_SATISFIED();
|
||||||
}
|
}
|
||||||
|
if (key_ref == 0x9E) {
|
||||||
|
key_ref = EF_PIV_KEY_RETIRED18;
|
||||||
|
}
|
||||||
|
else if (key_ref == 0xF9) {
|
||||||
|
key_ref = EF_PIV_KEY_ATTESTATION;
|
||||||
|
}
|
||||||
asn1_ctx_t ctxi, aac = {0};
|
asn1_ctx_t ctxi, aac = {0};
|
||||||
asn1_ctx_init(apdu.data, (uint16_t)apdu.nc, &ctxi);
|
asn1_ctx_init(apdu.data, (uint16_t)apdu.nc, &ctxi);
|
||||||
if (!asn1_find_tag(&ctxi, 0xAC, &aac) || asn1_len(&aac) == 0) {
|
if (!asn1_find_tag(&ctxi, 0xAC, &aac) || asn1_len(&aac) == 0) {
|
||||||
@@ -651,6 +663,35 @@ static int cmd_asym_keygen() {
|
|||||||
return SW_OK();
|
return SW_OK();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cmd_put_data() {
|
||||||
|
if (P1(apdu) != 0x3F || P2(apdu) != 0xFF) {
|
||||||
|
return SW_INCORRECT_P1P2();
|
||||||
|
}
|
||||||
|
asn1_ctx_t ctxi, a5c = {0}, a53 = {0};
|
||||||
|
asn1_ctx_init(apdu.data, (uint16_t)apdu.nc, &ctxi);
|
||||||
|
if (apdu.data[0] != 0x7E && apdu.data[0] != 0x7F && (!asn1_find_tag(&ctxi, 0x5C, &a5c) || !asn1_find_tag(&ctxi, 0x53, &a53))) {
|
||||||
|
return SW_WRONG_DATA();
|
||||||
|
}
|
||||||
|
if (a5c.data && a53.data) {
|
||||||
|
if (a5c.len != 3 || a5c.data[0] != 0x5F || a5c.data[1] != 0xC1) {
|
||||||
|
return SW_WRONG_DATA();
|
||||||
|
}
|
||||||
|
uint16_t fid = (a5c.data[1] << 8 | a5c.data[2]);
|
||||||
|
file_t *ef = search_by_fid(fid, NULL, SPECIFY_EF);
|
||||||
|
if (!ef) {
|
||||||
|
return SW_MEMORY_FAILURE();
|
||||||
|
}
|
||||||
|
if (a53.len > 0) {
|
||||||
|
flash_write_data_to_file(ef, a53.data, a53.len);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
flash_clear_file(ef);
|
||||||
|
}
|
||||||
|
low_flash_available();
|
||||||
|
}
|
||||||
|
return SW_OK();
|
||||||
|
}
|
||||||
|
|
||||||
#define INS_VERIFY 0x20
|
#define INS_VERIFY 0x20
|
||||||
#define INS_VERSION 0xFD
|
#define INS_VERSION 0xFD
|
||||||
#define INS_SELECT 0xA4
|
#define INS_SELECT 0xA4
|
||||||
@@ -660,6 +701,7 @@ static int cmd_asym_keygen() {
|
|||||||
#define INS_GET_METADATA 0xF7
|
#define INS_GET_METADATA 0xF7
|
||||||
#define INS_AUTHENTICATE 0x87
|
#define INS_AUTHENTICATE 0x87
|
||||||
#define INS_ASYM_KEYGEN 0x47
|
#define INS_ASYM_KEYGEN 0x47
|
||||||
|
#define INS_PUT_DATA 0xDB
|
||||||
|
|
||||||
static const cmd_t cmds[] = {
|
static const cmd_t cmds[] = {
|
||||||
{ INS_VERSION, cmd_version },
|
{ INS_VERSION, cmd_version },
|
||||||
@@ -670,6 +712,7 @@ static const cmd_t cmds[] = {
|
|||||||
{ INS_GET_METADATA, cmd_get_metadata },
|
{ INS_GET_METADATA, cmd_get_metadata },
|
||||||
{ INS_AUTHENTICATE, cmd_authenticate },
|
{ INS_AUTHENTICATE, cmd_authenticate },
|
||||||
{ INS_ASYM_KEYGEN, cmd_asym_keygen },
|
{ INS_ASYM_KEYGEN, cmd_asym_keygen },
|
||||||
|
{ INS_PUT_DATA, cmd_put_data },
|
||||||
{ 0x00, 0x0 }
|
{ 0x00, 0x0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user