mirror of
https://github.com/polhenarejos/pico-hsm.git
synced 2026-02-07 19:18:23 +00:00
Adding PUK store.
Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
parent
d96d7a533e
commit
4f58cd255b
2 changed files with 26 additions and 13 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue