Switching to new style.

Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
Pol Henarejos
2023-02-15 00:10:35 +01:00
parent e7495d11f2
commit cd6e280f4f
33 changed files with 1067 additions and 642 deletions

View File

@@ -21,8 +21,7 @@
#include "kek.h"
#include "files.h"
uint8_t get_key_domain(file_t *fkey)
{
uint8_t get_key_domain(file_t *fkey) {
size_t tag_len = 0;
const uint8_t *meta_tag = get_meta_tag(fkey, 0x92, &tag_len);
if (meta_tag) {
@@ -31,8 +30,7 @@ uint8_t get_key_domain(file_t *fkey)
return 0xff;
}
int cmd_key_domain()
{
int cmd_key_domain() {
//if (dkeks == 0)
// return SW_COMMAND_NOT_ALLOWED();
uint8_t p1 = P1(apdu), p2 = P2(apdu);
@@ -51,11 +49,11 @@ int cmd_key_domain()
if (tf_kd_size == 0) {
return SW_WRONG_P1P2();
}
uint8_t *kdata = file_get_data(tf_kd), dkeks = kdata ? kdata[2*p2] : 0,
current_dkeks = kdata ? kdata[2*p2+1] : 0;
uint8_t *kdata = file_get_data(tf_kd), dkeks = kdata ? kdata[2 * p2] : 0,
current_dkeks = kdata ? kdata[2 * p2 + 1] : 0;
if (p1 == 0x0) { //dkek import
if (apdu.nc > 0) {
file_t *tf = file_new(EF_DKEK+p2);
file_t *tf = file_new(EF_DKEK + p2);
if (!tf) {
return SW_MEMORY_FAILURE();
}
@@ -73,23 +71,25 @@ int cmd_key_domain()
return SW_FILE_NOT_FOUND();
}
}
uint8_t t[MAX_KEY_DOMAINS*2];
uint8_t t[MAX_KEY_DOMAINS * 2];
memcpy(t, kdata, tf_kd_size);
t[2*p2+1] = current_dkeks;
t[2 * p2 + 1] = current_dkeks;
if (flash_write_data_to_file(tf_kd, t, tf_kd_size) != CCID_OK) {
return SW_EXEC_ERROR();
}
low_flash_available();
} else {
file_t *tf = search_dynamic_file(EF_XKEK+p2);
if (2*p2 >= tf_kd_size) {
}
else {
file_t *tf = search_dynamic_file(EF_XKEK + p2);
if (2 * p2 >= tf_kd_size) {
return SW_INCORRECT_P1P2();
}
if (current_dkeks == 0xff && !tf) { //XKEK have always 0xff
return SW_REFERENCE_NOT_FOUND();
}
}
} else if (p1 == 0x1 || p1 == 0x3 || p1 == 0x4) { //key domain setup
}
else if (p1 == 0x1 || p1 == 0x3 || p1 == 0x4) { //key domain setup
if (p1 == 0x1 && apdu.nc != 1) {
return SW_WRONG_LENGTH();
}
@@ -100,27 +100,29 @@ int cmd_key_domain()
}
}
}
uint8_t t[MAX_KEY_DOMAINS*2];
uint8_t t[MAX_KEY_DOMAINS * 2];
memcpy(t, kdata, tf_kd_size);
if (p1 == 0x1) {
t[2*p2] = dkeks = apdu.data[0];
t[2*p2+1] = current_dkeks = 0;
} else if (p1 == 0x3) {
t[2*p2] = dkeks = 0xff;
t[2*p2+1] = 0xff;
} else if (p1 == 0x4) {
t[2*p2+1] = current_dkeks = 0;
t[2 * p2] = dkeks = apdu.data[0];
t[2 * p2 + 1] = current_dkeks = 0;
}
else if (p1 == 0x3) {
t[2 * p2] = dkeks = 0xff;
t[2 * p2 + 1] = 0xff;
}
else if (p1 == 0x4) {
t[2 * p2 + 1] = current_dkeks = 0;
}
if (flash_write_data_to_file(tf_kd, t, tf_kd_size) != CCID_OK) {
return SW_EXEC_ERROR();
}
file_t *tf = NULL;
if ((tf = search_dynamic_file(EF_DKEK+p2))) {
if ((tf = search_dynamic_file(EF_DKEK + p2))) {
if (delete_file(tf) != CCID_OK) {
return SW_EXEC_ERROR();
}
}
if (p1 == 0x3 && (tf = search_dynamic_file(EF_XKEK+p2))) {
if (p1 == 0x3 && (tf = search_dynamic_file(EF_XKEK + p2))) {
if (delete_file(tf) != CCID_OK) {
return SW_EXEC_ERROR();
}
@@ -129,7 +131,8 @@ int cmd_key_domain()
if (p1 == 0x3) {
return SW_REFERENCE_NOT_FOUND();
}
} else if (p1 == 0x2) { //XKEK Key Domain creation
}
else if (p1 == 0x2) { //XKEK Key Domain creation
if (apdu.nc > 0) {
size_t pub_len = 0;
file_t *fterm = search_by_fid(EF_TERMCA, NULL, SPECIFY_EF);
@@ -150,16 +153,16 @@ int cmd_key_domain()
if (!t54) {
return SW_WRONG_DATA();
}
uint8_t hash[32], *input = (uint8_t *) calloc(1, (t86_len-1)/2+1);
uint8_t hash[32], *input = (uint8_t *) calloc(1, (t86_len - 1) / 2 + 1);
input[0] = 0x54;
memcpy(input+1, t86+1, (t86_len-1)/2);
hash256(input, (t86_len-1)/2+1, hash);
memcpy(input + 1, t86 + 1, (t86_len - 1) / 2);
hash256(input, (t86_len - 1) / 2 + 1, hash);
free(input);
int r = puk_verify(t54, t54_len, hash, 32, apdu.data, apdu.nc);
if (r != 0) {
return SW_CONDITIONS_NOT_SATISFIED();
}
file_t *tf = file_new(EF_XKEK+p2);
file_t *tf = file_new(EF_XKEK + p2);
if (!tf) {
return SW_MEMORY_FAILURE();
}
@@ -170,22 +173,23 @@ int cmd_key_domain()
size_t t86_len = 0;
const uint8_t *t86 = cvc_get_field(pub, pub_len, &t86_len, 0x86);
if (t86) {
flash_write_data_to_file(tf, t86+1, t86_len-1);
flash_write_data_to_file(tf, t86 + 1, t86_len - 1);
low_flash_available();
}
}
}
} else {
}
else {
return SW_INCORRECT_P1P2();
}
memset(res_APDU, 0, 10);
res_APDU[0] = dkeks;
res_APDU[1] = dkeks > current_dkeks ? dkeks-current_dkeks : 0;
dkek_kcv(p2, res_APDU+2);
res_APDU_size = 2+8;
file_t *tf = search_dynamic_file(EF_XKEK+p2);
res_APDU[1] = dkeks > current_dkeks ? dkeks - current_dkeks : 0;
dkek_kcv(p2, res_APDU + 2);
res_APDU_size = 2 + 8;
file_t *tf = search_dynamic_file(EF_XKEK + p2);
if (tf) {
memcpy(res_APDU+10, file_get_data(tf), file_get_size(tf));
memcpy(res_APDU + 10, file_get_data(tf), file_get_size(tf));
res_APDU_size += file_get_size(tf);
}
return SW_OK();