Adding PUK store.

Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
Pol Henarejos 2022-06-08 20:01:37 +02:00
parent d96d7a533e
commit 4f58cd255b
No known key found for this signature in database
GPG key ID: C0095B7870A4CCD3
2 changed files with 26 additions and 13 deletions

View file

@ -21,10 +21,20 @@
#include <stdlib.h>
#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

View file

@ -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();
}
}