@@ -21,10 +21,20 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "pico/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_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 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 const uint8_t *cvc_get_field(const 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 const uint8_t *cvc_get_car(const 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_chr(const uint8_t *data, size_t len, size_t *olen);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -148,11 +148,20 @@ void scan_all() {
|
|||||||
scan_files();
|
scan_files();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PUK_store puk_store[3];
|
||||||
|
|
||||||
void init_sc_hsm() {
|
void init_sc_hsm() {
|
||||||
scan_all();
|
scan_all();
|
||||||
has_session_pin = has_session_sopin = false;
|
has_session_pin = has_session_sopin = false;
|
||||||
isUserAuthenticated = false;
|
isUserAuthenticated = false;
|
||||||
cmd_select();
|
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() {
|
int sc_hsm_unload() {
|
||||||
@@ -1951,16 +1960,10 @@ static int cmd_mse() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
size_t dica_chr_len = 0, termca_chr_len = 0, cvca_chr_len = 0;
|
for (int i = 0; i < sizeof(puk_store)/sizeof(struct PUK_store); i++) {
|
||||||
uint8_t *dica_chr = cvc_get_chr((uint8_t *)dica+2, (dica[1] << 8) | dica[0], &dica_chr_len);
|
if (memcmp(puk_store[i].chr, tag_data, puk_store[i].chr_len) == 0)
|
||||||
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();
|
return SW_OK();
|
||||||
|
}
|
||||||
return SW_REFERENCE_NOT_FOUND();
|
return SW_REFERENCE_NOT_FOUND();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user