From 4f58cd255bc6f5ee742d999dbc0ed0eb2180ee22 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Wed, 8 Jun 2022 20:01:37 +0200 Subject: [PATCH] Adding PUK store. Signed-off-by: Pol Henarejos --- src/hsm/cvc.h | 16 +++++++++++++--- src/hsm/sc_hsm.c | 23 +++++++++++++---------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/hsm/cvc.h b/src/hsm/cvc.h index 2f13c1c..93b90c2 100644 --- a/src/hsm/cvc.h +++ b/src/hsm/cvc.h @@ -21,10 +21,20 @@ #include #include "pico/stdlib.h" +typedef struct PUK_store { + const uint8_t *puk; + size_t puk_len; + const uint8_t *car; + size_t car_len; + const uint8_t *chr; + size_t chr_len; + uint8_t up; +} PUK_store; + extern size_t asn1_cvc_cert(void *rsa_ecdsa, uint8_t key_type, uint8_t *buf, size_t buf_len); extern size_t asn1_cvc_aut(void *rsa_ecdsa, uint8_t key_type, uint8_t *buf, size_t buf_len); -extern uint8_t *cvc_get_field(uint8_t *data, size_t len, size_t *olen, uint16_t tag); -extern uint8_t *cvc_get_car(uint8_t *data, size_t len, size_t *olen); -extern uint8_t *cvc_get_chr(uint8_t *data, size_t len, size_t *olen); +extern const uint8_t *cvc_get_field(const uint8_t *data, size_t len, size_t *olen, uint16_t tag); +extern const uint8_t *cvc_get_car(const uint8_t *data, size_t len, size_t *olen); +extern const uint8_t *cvc_get_chr(const uint8_t *data, size_t len, size_t *olen); #endif diff --git a/src/hsm/sc_hsm.c b/src/hsm/sc_hsm.c index b1b843e..3edad68 100644 --- a/src/hsm/sc_hsm.c +++ b/src/hsm/sc_hsm.c @@ -148,11 +148,20 @@ void scan_all() { scan_files(); } +PUK_store puk_store[3]; + void init_sc_hsm() { scan_all(); has_session_pin = has_session_sopin = false; isUserAuthenticated = false; cmd_select(); + const uint8_t *cvcerts[] = { cvca, dica, termca }; + for (int i = 0; i < sizeof(cvcerts)/sizeof(uint8_t *); i++) { + uint16_t cert_len = (cvcerts[i][1] << 8) | cvcerts[i][0]; + puk_store[i].chr = cvc_get_chr((uint8_t *)cvcerts[i]+2, cert_len, &puk_store[i].chr_len); + puk_store[i].car = cvc_get_chr((uint8_t *)cvcerts[i]+2, cert_len, &puk_store[i].car_len); + puk_store[i].up = i-1; + } } int sc_hsm_unload() { @@ -1951,16 +1960,10 @@ static int cmd_mse() { } else { - size_t dica_chr_len = 0, termca_chr_len = 0, cvca_chr_len = 0; - uint8_t *dica_chr = cvc_get_chr((uint8_t *)dica+2, (dica[1] << 8) | dica[0], &dica_chr_len); - uint8_t *termca_chr = cvc_get_chr((uint8_t *)termca+2, (termca[1] << 8) | termca[0], &termca_chr_len); - uint8_t *cvca_chr = cvc_get_chr((uint8_t *)cvca+2, (cvca[1] << 8) | cvca[0], &cvca_chr_len); - if (memcmp(dica_chr, tag_data, dica_chr_len) == 0) - return SW_OK(); - else if (memcmp(termca_chr, tag_data, termca_chr_len) == 0) - return SW_OK(); - else if (memcmp(cvca_chr, tag_data, cvca_chr_len) == 0) - return SW_OK(); + for (int i = 0; i < sizeof(puk_store)/sizeof(struct PUK_store); i++) { + if (memcmp(puk_store[i].chr, tag_data, puk_store[i].chr_len) == 0) + return SW_OK(); + } return SW_REFERENCE_NOT_FOUND(); } }