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

@@ -31,13 +31,12 @@
extern const uint8_t *dev_name;
extern size_t dev_name_len;
size_t asn1_cvc_public_key_rsa(mbedtls_rsa_context *rsa, uint8_t *buf, size_t buf_len)
{
size_t asn1_cvc_public_key_rsa(mbedtls_rsa_context *rsa, uint8_t *buf, size_t buf_len) {
const uint8_t oid_rsa[] = { 0x04, 0x00, 0x7F, 0x00, 0x07, 0x02, 0x02, 0x02, 0x01, 0x02 };
size_t n_size = mbedtls_mpi_size(&rsa->N), e_size = mbedtls_mpi_size(&rsa->E);
size_t ntot_size = asn1_len_tag(0x81, n_size), etot_size = asn1_len_tag(0x82, e_size);
size_t oid_len = asn1_len_tag(0x6, sizeof(oid_rsa));
size_t tot_len = asn1_len_tag(0x7f49, oid_len+ntot_size+etot_size);
size_t tot_len = asn1_len_tag(0x7f49, oid_len + ntot_size + etot_size);
if (buf == NULL || buf_len == 0) {
return tot_len;
}
@@ -46,7 +45,7 @@ size_t asn1_cvc_public_key_rsa(mbedtls_rsa_context *rsa, uint8_t *buf, size_t bu
}
uint8_t *p = buf;
memcpy(p, "\x7F\x49", 2); p += 2;
p += format_tlv_len(oid_len+ntot_size+etot_size, p);
p += format_tlv_len(oid_len + ntot_size + etot_size, p);
//oid
*p++ = 0x6; p += format_tlv_len(sizeof(oid_rsa), p); memcpy(p, oid_rsa, sizeof(oid_rsa));
p += sizeof(oid_rsa);
@@ -73,13 +72,12 @@ const uint8_t *pointA[] = {
"\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC",
};
size_t asn1_cvc_public_key_ecdsa(mbedtls_ecdsa_context *ecdsa, uint8_t *buf, size_t buf_len)
{
size_t asn1_cvc_public_key_ecdsa(mbedtls_ecdsa_context *ecdsa, uint8_t *buf, size_t buf_len) {
uint8_t Y_buf[MBEDTLS_ECP_MAX_PT_LEN];
const uint8_t oid_ecdsa[] = { 0x04, 0x00, 0x7F, 0x00, 0x07, 0x02, 0x02, 0x02, 0x02, 0x03 };
size_t p_size = mbedtls_mpi_size(&ecdsa->grp.P), a_size = mbedtls_mpi_size(&ecdsa->grp.A);
size_t b_size = mbedtls_mpi_size(&ecdsa->grp.B),
g_size = 1+mbedtls_mpi_size(&ecdsa->grp.G.X)+mbedtls_mpi_size(&ecdsa->grp.G.X);
g_size = 1 + mbedtls_mpi_size(&ecdsa->grp.G.X) + mbedtls_mpi_size(&ecdsa->grp.G.X);
size_t o_size = mbedtls_mpi_size(&ecdsa->grp.N), y_size = 0;
mbedtls_ecp_point_write_binary(&ecdsa->grp,
&ecdsa->Q,
@@ -99,7 +97,7 @@ size_t asn1_cvc_public_key_ecdsa(mbedtls_ecdsa_context *ecdsa, uint8_t *buf, siz
size_t ctot_size = asn1_len_tag(0x87, c_size);
size_t oid_len = asn1_len_tag(0x6, sizeof(oid_ecdsa));
size_t tot_len = asn1_len_tag(0x7f49,
oid_len+ptot_size+atot_size+btot_size+gtot_size+otot_size+ytot_size+
oid_len + ptot_size + atot_size + btot_size + gtot_size + otot_size + ytot_size +
ctot_size);
if (buf == NULL || buf_len == 0) {
return tot_len;
@@ -110,7 +108,7 @@ size_t asn1_cvc_public_key_ecdsa(mbedtls_ecdsa_context *ecdsa, uint8_t *buf, siz
uint8_t *p = buf;
memcpy(p, "\x7F\x49", 2); p += 2;
p += format_tlv_len(
oid_len+ptot_size+atot_size+btot_size+gtot_size+otot_size+ytot_size+ctot_size,
oid_len + ptot_size + atot_size + btot_size + gtot_size + otot_size + ytot_size + ctot_size,
p);
//oid
*p++ = 0x6; p += format_tlv_len(sizeof(oid_ecdsa), p); memcpy(p, oid_ecdsa, sizeof(oid_ecdsa));
@@ -123,11 +121,13 @@ size_t asn1_cvc_public_key_ecdsa(mbedtls_ecdsa_context *ecdsa, uint8_t *buf, siz
*p++ = 0x82; p += format_tlv_len(a_size, p); mbedtls_mpi_write_binary(&ecdsa->grp.A,
p,
a_size); p += a_size;
} else { //mbedtls does not set point A for some curves
}
else { //mbedtls does not set point A for some curves
if (pointA[ecdsa->grp.id] && ecdsa->grp.id < 6) {
*p++ = 0x82; p += format_tlv_len(p_size, p); memcpy(p, pointA[ecdsa->grp.id], p_size);
p += p_size;
} else {
}
else {
*p++ = 0x82; p += format_tlv_len(1, p);
*p++ = 0x0;
}
@@ -153,9 +153,11 @@ size_t asn1_cvc_public_key_ecdsa(mbedtls_ecdsa_context *ecdsa, uint8_t *buf, siz
*p++ = 0x87; p += format_tlv_len(c_size, p);
if (ecdsa->grp.id == MBEDTLS_ECP_DP_CURVE448) {
*p++ = 4;
} else if (ecdsa->grp.id == MBEDTLS_ECP_DP_CURVE25519) {
}
else if (ecdsa->grp.id == MBEDTLS_ECP_DP_CURVE25519) {
*p++ = 8;
} else {
}
else {
*p++ = 1;
}
return tot_len;
@@ -166,12 +168,12 @@ size_t asn1_cvc_cert_body(void *rsa_ecdsa,
uint8_t *buf,
size_t buf_len,
const uint8_t *ext,
size_t ext_len)
{
size_t ext_len) {
size_t pubkey_size = 0;
if (key_type == HSM_KEY_RSA) {
pubkey_size = asn1_cvc_public_key_rsa(rsa_ecdsa, NULL, 0);
} else if (key_type == HSM_KEY_EC) {
}
else if (key_type == HSM_KEY_EC) {
pubkey_size = asn1_cvc_public_key_ecdsa(rsa_ecdsa, NULL, 0);
}
size_t cpi_size = 4;
@@ -195,7 +197,7 @@ size_t asn1_cvc_cert_body(void *rsa_ecdsa,
}
size_t car_size = asn1_len_tag(0x42, lencar), chr_size = asn1_len_tag(0x5f20, lenchr);
size_t tot_len = asn1_len_tag(0x7f4e, cpi_size+car_size+pubkey_size+chr_size+ext_size);
size_t tot_len = asn1_len_tag(0x7f4e, cpi_size + car_size + pubkey_size + chr_size + ext_size);
if (buf_len == 0 || buf == NULL) {
return tot_len;
@@ -205,7 +207,7 @@ size_t asn1_cvc_cert_body(void *rsa_ecdsa,
}
uint8_t *p = buf;
memcpy(p, "\x7F\x4E", 2); p += 2;
p += format_tlv_len(cpi_size+car_size+pubkey_size+chr_size+ext_size, p);
p += format_tlv_len(cpi_size + car_size + pubkey_size + chr_size + ext_size, p);
//cpi
*p++ = 0x5f; *p++ = 0x29; *p++ = 1; *p++ = 0;
//car
@@ -213,7 +215,8 @@ size_t asn1_cvc_cert_body(void *rsa_ecdsa,
//pubkey
if (key_type == HSM_KEY_RSA) {
p += asn1_cvc_public_key_rsa(rsa_ecdsa, p, pubkey_size);
} else if (key_type == HSM_KEY_EC) {
}
else if (key_type == HSM_KEY_EC) {
p += asn1_cvc_public_key_ecdsa(rsa_ecdsa, p, pubkey_size);
}
//chr
@@ -232,20 +235,20 @@ size_t asn1_cvc_cert(void *rsa_ecdsa,
uint8_t *buf,
size_t buf_len,
const uint8_t *ext,
size_t ext_len)
{
size_t ext_len) {
size_t key_size = 0;
if (key_type == HSM_KEY_RSA) {
key_size = mbedtls_mpi_size(&((mbedtls_rsa_context *) rsa_ecdsa)->N);
} else if (key_type == HSM_KEY_EC) {
key_size = 2*
}
else if (key_type == HSM_KEY_EC) {
key_size = 2 *
(int) ((mbedtls_ecp_curve_info_from_grp_id(((mbedtls_ecdsa_context *) rsa_ecdsa)
->grp.id)->
bit_size + 7)/8);
bit_size + 7) / 8);
}
size_t body_size = asn1_cvc_cert_body(rsa_ecdsa, key_type, NULL, 0, ext, ext_len),
sig_size = asn1_len_tag(0x5f37, key_size);
size_t tot_len = asn1_len_tag(0x7f21, body_size+sig_size);
size_t tot_len = asn1_len_tag(0x7f21, body_size + sig_size);
if (buf_len == 0 || buf == NULL) {
return tot_len;
}
@@ -254,7 +257,7 @@ size_t asn1_cvc_cert(void *rsa_ecdsa,
}
uint8_t *p = buf, *body = NULL;
memcpy(p, "\x7F\x21", 2); p += 2;
p += format_tlv_len(body_size+sig_size, p);
p += format_tlv_len(body_size + sig_size, p);
body = p;
p += asn1_cvc_cert_body(rsa_ecdsa, key_type, p, body_size, ext, ext_len);
uint8_t hsh[32];
@@ -267,7 +270,8 @@ size_t asn1_cvc_cert(void *rsa_ecdsa,
memset(p, 0, key_size);
}
p += key_size;
} else if (key_type == HSM_KEY_EC) {
}
else if (key_type == HSM_KEY_EC) {
mbedtls_mpi r, s;
int ret = 0;
mbedtls_ecdsa_context *ecdsa = (mbedtls_ecdsa_context *) rsa_ecdsa;
@@ -276,16 +280,17 @@ size_t asn1_cvc_cert(void *rsa_ecdsa,
ret =
mbedtls_ecdsa_sign(&ecdsa->grp, &r, &s, &ecdsa->d, hsh, sizeof(hsh), random_gen, NULL);
if (ret == 0) {
mbedtls_mpi_write_binary(&r, p, key_size/2); p += key_size/2;
mbedtls_mpi_write_binary(&s, p, key_size/2); p += key_size/2;
} else {
mbedtls_mpi_write_binary(&r, p, key_size / 2); p += key_size / 2;
mbedtls_mpi_write_binary(&s, p, key_size / 2); p += key_size / 2;
}
else {
memset(p, 0, key_size);
p += key_size;
}
mbedtls_mpi_free(&r);
mbedtls_mpi_free(&s);
}
return p-buf;
return p - buf;
}
size_t asn1_cvc_aut(void *rsa_ecdsa,
@@ -293,8 +298,7 @@ size_t asn1_cvc_aut(void *rsa_ecdsa,
uint8_t *buf,
size_t buf_len,
const uint8_t *ext,
size_t ext_len)
{
size_t ext_len) {
size_t cvcert_size = asn1_cvc_cert(rsa_ecdsa, key_type, NULL, 0, ext, ext_len);
size_t outcar_len = dev_name_len;
const uint8_t *outcar = dev_name;
@@ -309,9 +313,9 @@ size_t asn1_cvc_aut(void *rsa_ecdsa,
mbedtls_ecdsa_free(&ectx);
return 0;
}
int ret = 0, key_size = 2*mbedtls_mpi_size(&ectx.d);
int ret = 0, key_size = 2 * mbedtls_mpi_size(&ectx.d);
size_t outsig_size = asn1_len_tag(0x5f37, key_size), tot_len = asn1_len_tag(0x67,
cvcert_size+outcar_size+
cvcert_size + outcar_size +
outsig_size);
if (buf_len == 0 || buf == NULL) {
return tot_len;
@@ -321,7 +325,7 @@ size_t asn1_cvc_aut(void *rsa_ecdsa,
}
uint8_t *p = buf;
*p++ = 0x67;
p += format_tlv_len(cvcert_size+outcar_size+outsig_size, p);
p += format_tlv_len(cvcert_size + outcar_size + outsig_size, p);
uint8_t *body = p;
//cvcert
p += asn1_cvc_cert(rsa_ecdsa, key_type, p, cvcert_size, ext, ext_len);
@@ -330,7 +334,7 @@ size_t asn1_cvc_aut(void *rsa_ecdsa,
uint8_t hsh[32];
memcpy(p, "\x5f\x37", 2); p += 2;
p += format_tlv_len(key_size, p);
hash256(body, cvcert_size+outcar_size, hsh);
hash256(body, cvcert_size + outcar_size, hsh);
mbedtls_mpi r, s;
mbedtls_mpi_init(&r);
mbedtls_mpi_init(&s);
@@ -345,7 +349,7 @@ size_t asn1_cvc_aut(void *rsa_ecdsa,
mbedtls_mpi_write_binary(&s, p, mbedtls_mpi_size(&s)); p += mbedtls_mpi_size(&s);
mbedtls_mpi_free(&r);
mbedtls_mpi_free(&s);
return p-buf;
return p - buf;
}
size_t asn1_build_cert_description(const uint8_t *label,
@@ -354,15 +358,15 @@ size_t asn1_build_cert_description(const uint8_t *label,
size_t puk_len,
uint16_t fid,
uint8_t *buf,
size_t buf_len)
{
size_t buf_len) {
size_t opt_len = 2;
size_t seq1_size = asn1_len_tag(0x30, asn1_len_tag(0xC, label_len)+asn1_len_tag(0x3, opt_len));
size_t seq1_size =
asn1_len_tag(0x30, asn1_len_tag(0xC, label_len) + asn1_len_tag(0x3, opt_len));
size_t seq2_size = asn1_len_tag(0x30, asn1_len_tag(0x4, 20)); /* SHA1 is 20 bytes length */
size_t seq3_size =
asn1_len_tag(0xA1,
asn1_len_tag(0x30, asn1_len_tag(0x30, asn1_len_tag(0x4, sizeof(uint16_t)))));
size_t tot_len = asn1_len_tag(0x30, seq1_size+seq2_size+seq3_size);
size_t tot_len = asn1_len_tag(0x30, seq1_size + seq2_size + seq3_size);
if (buf_len == 0 || buf == NULL) {
return tot_len;
}
@@ -371,10 +375,10 @@ size_t asn1_build_cert_description(const uint8_t *label,
}
uint8_t *p = buf;
*p++ = 0x30;
p += format_tlv_len(seq1_size+seq2_size+seq3_size, p);
p += format_tlv_len(seq1_size + seq2_size + seq3_size, p);
//Seq 1
*p++ = 0x30;
p += format_tlv_len(asn1_len_tag(0xC, label_len)+asn1_len_tag(0x3, opt_len), p);
p += format_tlv_len(asn1_len_tag(0xC, label_len) + asn1_len_tag(0x3, opt_len), p);
*p++ = 0xC;
p += format_tlv_len(label_len, p);
memcpy(p, label, label_len); p += label_len;
@@ -401,7 +405,7 @@ size_t asn1_build_cert_description(const uint8_t *label,
p += format_tlv_len(sizeof(uint16_t), p);
*p++ = fid >> 8;
*p++ = fid & 0xff;
return p-buf;
return p - buf;
}
size_t asn1_build_prkd_generic(const uint8_t *label,
@@ -412,15 +416,15 @@ size_t asn1_build_prkd_generic(const uint8_t *label,
const uint8_t *seq,
size_t seq_len,
uint8_t *buf,
size_t buf_len)
{
size_t buf_len) {
size_t seq1_size = asn1_len_tag(0x30, asn1_len_tag(0xC, label_len));
size_t seq2_size = asn1_len_tag(0x30, asn1_len_tag(0x4, keyid_len)+asn1_len_tag(0x3, seq_len));
size_t seq2_size =
asn1_len_tag(0x30, asn1_len_tag(0x4, keyid_len) + asn1_len_tag(0x3, seq_len));
size_t seq3_size =
asn1_len_tag(0xA1,
asn1_len_tag(0x30,
asn1_len_tag(0x30, asn1_len_tag(0x4, 0))+asn1_len_tag(0x2, 2)));
size_t tot_len = asn1_len_tag(0xA0, seq1_size+seq2_size+seq3_size);
asn1_len_tag(0x30, asn1_len_tag(0x4, 0)) + asn1_len_tag(0x2, 2)));
size_t tot_len = asn1_len_tag(0xA0, seq1_size + seq2_size + seq3_size);
if (buf_len == 0 || buf == NULL) {
return tot_len;
}
@@ -429,7 +433,7 @@ size_t asn1_build_prkd_generic(const uint8_t *label,
}
uint8_t *p = buf;
*p++ = 0xA0;
p += format_tlv_len(seq1_size+seq2_size+seq3_size, p);
p += format_tlv_len(seq1_size + seq2_size + seq3_size, p);
//Seq 1
*p++ = 0x30;
p += format_tlv_len(asn1_len_tag(0xC, label_len), p);
@@ -439,7 +443,7 @@ size_t asn1_build_prkd_generic(const uint8_t *label,
//Seq 2
*p++ = 0x30;
p += format_tlv_len(asn1_len_tag(0x4, keyid_len)+asn1_len_tag(0x3, seq_len), p);
p += format_tlv_len(asn1_len_tag(0x4, keyid_len) + asn1_len_tag(0x3, seq_len), p);
*p++ = 0x4;
p += format_tlv_len(keyid_len, p);
memcpy(p, keyid, keyid_len); p += keyid_len;
@@ -450,11 +454,12 @@ size_t asn1_build_prkd_generic(const uint8_t *label,
//Seq 3
*p++ = 0xA1;
p +=
format_tlv_len(asn1_len_tag(0x30, asn1_len_tag(0x30, asn1_len_tag(0x4, 0))+asn1_len_tag(0x2,
2)),
format_tlv_len(asn1_len_tag(0x30,
asn1_len_tag(0x30, asn1_len_tag(0x4, 0)) + asn1_len_tag(0x2,
2)),
p);
*p++ = 0x30;
p += format_tlv_len(asn1_len_tag(0x30, asn1_len_tag(0x4, 0))+asn1_len_tag(0x2, 2), p);
p += format_tlv_len(asn1_len_tag(0x30, asn1_len_tag(0x4, 0)) + asn1_len_tag(0x2, 2), p);
*p++ = 0x30;
p += format_tlv_len(asn1_len_tag(0x4, 0), p);
*p++ = 0x4;
@@ -463,7 +468,7 @@ size_t asn1_build_prkd_generic(const uint8_t *label,
p += format_tlv_len(2, p);
*p++ = (keysize >> 8) & 0xff;
*p++ = keysize & 0xff;
return p-buf;
return p - buf;
}
size_t asn1_build_prkd_ecc(const uint8_t *label,
@@ -472,8 +477,7 @@ size_t asn1_build_prkd_ecc(const uint8_t *label,
size_t keyid_len,
size_t keysize,
uint8_t *buf,
size_t buf_len)
{
size_t buf_len) {
return asn1_build_prkd_generic(label,
label_len,
keyid,
@@ -491,8 +495,7 @@ size_t asn1_build_prkd_rsa(const uint8_t *label,
size_t keyid_len,
size_t keysize,
uint8_t *buf,
size_t buf_len)
{
size_t buf_len) {
return asn1_build_prkd_generic(label,
label_len,
keyid,
@@ -504,8 +507,7 @@ size_t asn1_build_prkd_rsa(const uint8_t *label,
buf_len);
}
const uint8_t *cvc_get_field(const uint8_t *data, size_t len, size_t *olen, uint16_t tag)
{
const uint8_t *cvc_get_field(const uint8_t *data, size_t len, size_t *olen, uint16_t tag) {
uint8_t *rdata = NULL;
if (data == NULL || len == 0) {
return NULL;
@@ -516,8 +518,7 @@ const uint8_t *cvc_get_field(const uint8_t *data, size_t len, size_t *olen, uint
return rdata;
}
const uint8_t *cvc_get_body(const uint8_t *data, size_t len, size_t *olen)
{
const uint8_t *cvc_get_body(const uint8_t *data, size_t len, size_t *olen) {
const uint8_t *bkdata = data;
if ((data = cvc_get_field(data, len, olen, 0x67)) == NULL) { /* Check for CSR */
data = bkdata;
@@ -528,8 +529,7 @@ const uint8_t *cvc_get_body(const uint8_t *data, size_t len, size_t *olen)
return NULL;
}
const uint8_t *cvc_get_sig(const uint8_t *data, size_t len, size_t *olen)
{
const uint8_t *cvc_get_sig(const uint8_t *data, size_t len, size_t *olen) {
const uint8_t *bkdata = data;
if ((data = cvc_get_field(data, len, olen, 0x67)) == NULL) { /* Check for CSR */
data = bkdata;
@@ -540,32 +540,28 @@ const uint8_t *cvc_get_sig(const uint8_t *data, size_t len, size_t *olen)
return NULL;
}
const uint8_t *cvc_get_car(const uint8_t *data, size_t len, size_t *olen)
{
const uint8_t *cvc_get_car(const uint8_t *data, size_t len, size_t *olen) {
if ((data = cvc_get_body(data, len, olen)) != NULL) {
return cvc_get_field(data, len, olen, 0x42);
}
return NULL;
}
const uint8_t *cvc_get_chr(const uint8_t *data, size_t len, size_t *olen)
{
const uint8_t *cvc_get_chr(const uint8_t *data, size_t len, size_t *olen) {
if ((data = cvc_get_body(data, len, olen)) != NULL) {
return cvc_get_field(data, len, olen, 0x5F20);
}
return NULL;
}
const uint8_t *cvc_get_pub(const uint8_t *data, size_t len, size_t *olen)
{
const uint8_t *cvc_get_pub(const uint8_t *data, size_t len, size_t *olen) {
if ((data = cvc_get_body(data, len, olen)) != NULL) {
return cvc_get_field(data, len, olen, 0x7F49);
}
return NULL;
}
const uint8_t *cvc_get_ext(const uint8_t *data, size_t len, size_t *olen)
{
const uint8_t *cvc_get_ext(const uint8_t *data, size_t len, size_t *olen) {
if ((data = cvc_get_body(data, len, olen)) != NULL) {
return cvc_get_field(data, len, olen, 0x65);
}
@@ -575,8 +571,7 @@ const uint8_t *cvc_get_ext(const uint8_t *data, size_t len, size_t *olen)
extern PUK puk_store[MAX_PUK_STORE_ENTRIES];
extern int puk_store_entries;
int puk_store_index(const uint8_t *chr, size_t chr_len)
{
int puk_store_index(const uint8_t *chr, size_t chr_len) {
for (int i = 0; i < puk_store_entries; i++) {
if (memcmp(puk_store[i].chr, chr, chr_len) == 0) {
return i;
@@ -585,8 +580,7 @@ int puk_store_index(const uint8_t *chr, size_t chr_len)
return -1;
}
mbedtls_ecp_group_id cvc_inherite_ec_group(const uint8_t *ca, size_t ca_len)
{
mbedtls_ecp_group_id cvc_inherite_ec_group(const uint8_t *ca, size_t ca_len) {
size_t chr_len = 0, car_len = 0;
const uint8_t *chr = NULL, *car = NULL;
int eq = -1;
@@ -599,7 +593,8 @@ mbedtls_ecp_group_id cvc_inherite_ec_group(const uint8_t *ca, size_t ca_len)
if (idx != -1) {
ca = puk_store[idx].cvcert;
ca_len = puk_store[idx].cvcert_len;
} else {
}
else {
ca = NULL;
}
}
@@ -623,8 +618,7 @@ int puk_verify(const uint8_t *sig,
const uint8_t *hash,
size_t hash_len,
const uint8_t *ca,
size_t ca_len)
{
size_t ca_len) {
size_t puk_len = 0;
const uint8_t *puk = cvc_get_pub(ca, ca_len, &puk_len);
if (!puk) {
@@ -649,17 +643,22 @@ int puk_verify(const uint8_t *sig,
mbedtls_md_type_t md = MBEDTLS_MD_NONE;
if (memcmp(oid, OID_ID_TA_RSA_V1_5_SHA_1, oid_len) == 0) {
md = MBEDTLS_MD_SHA1;
} else if (memcmp(oid, OID_ID_TA_RSA_V1_5_SHA_256, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_RSA_V1_5_SHA_256, oid_len) == 0) {
md = MBEDTLS_MD_SHA256;
} else if (memcmp(oid, OID_ID_TA_RSA_V1_5_SHA_512, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_RSA_V1_5_SHA_512, oid_len) == 0) {
md = MBEDTLS_MD_SHA512;
} else if (memcmp(oid, OID_ID_TA_RSA_PSS_SHA_1, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_RSA_PSS_SHA_1, oid_len) == 0) {
md = MBEDTLS_MD_SHA1;
mbedtls_rsa_set_padding(&rsa, MBEDTLS_RSA_PKCS_V21, md);
} else if (memcmp(oid, OID_ID_TA_RSA_PSS_SHA_256, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_RSA_PSS_SHA_256, oid_len) == 0) {
md = MBEDTLS_MD_SHA256;
mbedtls_rsa_set_padding(&rsa, MBEDTLS_RSA_PKCS_V21, md);
} else if (memcmp(oid, OID_ID_TA_RSA_PSS_SHA_512, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_RSA_PSS_SHA_512, oid_len) == 0) {
md = MBEDTLS_MD_SHA512;
mbedtls_rsa_set_padding(&rsa, MBEDTLS_RSA_PKCS_V21, md);
}
@@ -692,17 +691,22 @@ int puk_verify(const uint8_t *sig,
if (r != 0) {
return CCID_WRONG_SIGNATURE;
}
} else if (memcmp(oid, OID_ID_TA_ECDSA, 9) == 0) { //ECC
}
else if (memcmp(oid, OID_ID_TA_ECDSA, 9) == 0) { //ECC
mbedtls_md_type_t md = MBEDTLS_MD_NONE;
if (memcmp(oid, OID_ID_TA_ECDSA_SHA_1, oid_len) == 0) {
md = MBEDTLS_MD_SHA1;
} else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_224, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_224, oid_len) == 0) {
md = MBEDTLS_MD_SHA224;
} else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_256, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_256, oid_len) == 0) {
md = MBEDTLS_MD_SHA256;
} else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_384, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_384, oid_len) == 0) {
md = MBEDTLS_MD_SHA384;
} else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_512, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_512, oid_len) == 0) {
md = MBEDTLS_MD_SHA512;
}
if (md == MBEDTLS_MD_NONE) {
@@ -738,14 +742,14 @@ int puk_verify(const uint8_t *sig,
mbedtls_mpi r, s;
mbedtls_mpi_init(&r);
mbedtls_mpi_init(&s);
ret = mbedtls_mpi_read_binary(&r, sig, sig_len/2);
ret = mbedtls_mpi_read_binary(&r, sig, sig_len / 2);
if (ret != 0) {
mbedtls_mpi_free(&r);
mbedtls_mpi_free(&s);
mbedtls_ecdsa_free(&ecdsa);
return CCID_EXEC_ERROR;
}
ret = mbedtls_mpi_read_binary(&s, sig+sig_len/2, sig_len/2);
ret = mbedtls_mpi_read_binary(&s, sig + sig_len / 2, sig_len / 2);
if (ret != 0) {
mbedtls_mpi_free(&r);
mbedtls_mpi_free(&s);
@@ -763,8 +767,7 @@ int puk_verify(const uint8_t *sig,
return CCID_OK;
}
int cvc_verify(const uint8_t *cert, size_t cert_len, const uint8_t *ca, size_t ca_len)
{
int cvc_verify(const uint8_t *cert, size_t cert_len, const uint8_t *ca, size_t ca_len) {
size_t puk_len = 0;
const uint8_t *puk = cvc_get_pub(ca, ca_len, &puk_len);
if (!puk) {
@@ -787,27 +790,37 @@ int cvc_verify(const uint8_t *cert, size_t cert_len, const uint8_t *ca, size_t c
if (memcmp(oid, OID_ID_TA_RSA, 9) == 0) { //RSA
if (memcmp(oid, OID_ID_TA_RSA_V1_5_SHA_1, oid_len) == 0) {
md = MBEDTLS_MD_SHA1;
} else if (memcmp(oid, OID_ID_TA_RSA_V1_5_SHA_256, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_RSA_V1_5_SHA_256, oid_len) == 0) {
md = MBEDTLS_MD_SHA256;
} else if (memcmp(oid, OID_ID_TA_RSA_V1_5_SHA_512, oid_len) == 0) {
md = MBEDTLS_MD_SHA512;
} else if (memcmp(oid, OID_ID_TA_RSA_PSS_SHA_1, oid_len) == 0) {
md = MBEDTLS_MD_SHA1;
} else if (memcmp(oid, OID_ID_TA_RSA_PSS_SHA_256, oid_len) == 0) {
md = MBEDTLS_MD_SHA256;
} else if (memcmp(oid, OID_ID_TA_RSA_PSS_SHA_512, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_RSA_V1_5_SHA_512, oid_len) == 0) {
md = MBEDTLS_MD_SHA512;
}
} else if (memcmp(oid, OID_ID_TA_ECDSA, 9) == 0) { //ECC
else if (memcmp(oid, OID_ID_TA_RSA_PSS_SHA_1, oid_len) == 0) {
md = MBEDTLS_MD_SHA1;
}
else if (memcmp(oid, OID_ID_TA_RSA_PSS_SHA_256, oid_len) == 0) {
md = MBEDTLS_MD_SHA256;
}
else if (memcmp(oid, OID_ID_TA_RSA_PSS_SHA_512, oid_len) == 0) {
md = MBEDTLS_MD_SHA512;
}
}
else if (memcmp(oid, OID_ID_TA_ECDSA, 9) == 0) { //ECC
if (memcmp(oid, OID_ID_TA_ECDSA_SHA_1, oid_len) == 0) {
md = MBEDTLS_MD_SHA1;
} else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_224, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_224, oid_len) == 0) {
md = MBEDTLS_MD_SHA224;
} else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_256, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_256, oid_len) == 0) {
md = MBEDTLS_MD_SHA256;
} else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_384, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_384, oid_len) == 0) {
md = MBEDTLS_MD_SHA384;
} else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_512, oid_len) == 0) {
}
else if (memcmp(oid, OID_ID_TA_ECDSA_SHA_512, oid_len) == 0) {
md = MBEDTLS_MD_SHA512;
}
}
@@ -816,8 +829,8 @@ int cvc_verify(const uint8_t *cert, size_t cert_len, const uint8_t *ca, size_t c
}
const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md);
uint8_t hash[64], hash_len = mbedtls_md_get_size(md_info);
uint8_t tlv_body = 2+format_tlv_len(cv_body_len, NULL);
int r = mbedtls_md(md_info, cv_body-tlv_body, cv_body_len+tlv_body, hash);
uint8_t tlv_body = 2 + format_tlv_len(cv_body_len, NULL);
int r = mbedtls_md(md_info, cv_body - tlv_body, cv_body_len + tlv_body, hash);
if (r != 0) {
return CCID_EXEC_ERROR;
}