|
|
|
@ -552,7 +552,6 @@ static int asn1_get_x509(fmap_t *map, const void **asn1data, unsigned int *size, |
|
|
|
|
} |
|
|
|
|
while(exts.size) { |
|
|
|
|
struct cli_asn1 ext, id, value; |
|
|
|
|
int crit = 0; |
|
|
|
|
if(asn1_expect_objtype(map, exts.content, &exts.size, &ext, 0x30)) { |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
@ -567,17 +566,12 @@ static int asn1_get_x509(fmap_t *map, const void **asn1data, unsigned int *size, |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(value.type == 0x01) { |
|
|
|
|
/* critical flag */ |
|
|
|
|
if(value.size != 1) { |
|
|
|
|
cli_dbgmsg("asn1_get_x509: found boolean with wrong length\n"); |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(!fmap_need_ptr_once(map, value.content, 1)) { |
|
|
|
|
cli_dbgmsg("asn1_get_x509: cannot read critical flag\n"); |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
crit = ((uint8_t *)(value.content))[0]; |
|
|
|
|
if(asn1_get_obj(map, value.next, &ext.size, &value)) { |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
@ -593,76 +587,94 @@ static int asn1_get_x509(fmap_t *map, const void **asn1data, unsigned int *size, |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(!crit) |
|
|
|
|
if(id.size != 3) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
if(!fmap_need_ptr_once(map, id.content, 3)) { |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(!memcmp("\x55\x1d\x0f", id.content, 3)) { |
|
|
|
|
/* KeyUsage 2.5.29.15 */ |
|
|
|
|
const uint8_t *keyusage = value.content; |
|
|
|
|
uint8_t usage; |
|
|
|
|
if(value.size < 4 || value.size > 5) { |
|
|
|
|
cli_dbgmsg("asn1_get_x509: bad KeyUsage\n"); |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(!fmap_need_ptr_once(map, value.content, value.size)) { |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(keyusage[0] != 0x03 || keyusage[1] != value.size - 2 || keyusage[2] > 7) { |
|
|
|
|
cli_dbgmsg("asn1_get_x509: bad KeyUsage\n"); |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
usage = keyusage[3]; |
|
|
|
|
if(value.size == 4) |
|
|
|
|
usage &= ~((1 << keyusage[2])-1); |
|
|
|
|
x509.certSign = ((usage & 4) != 0); |
|
|
|
|
continue; |
|
|
|
|
if(id.size == 3) { |
|
|
|
|
if(!fmap_need_ptr_once(map, id.content, 3)) { |
|
|
|
|
} |
|
|
|
|
if(!memcmp("\x55\x1d\x25", id.content, 3)) { |
|
|
|
|
/* ExtKeyUsage 2.5.29.37 */ |
|
|
|
|
struct cli_asn1 keypurp; |
|
|
|
|
if(asn1_expect_objtype(map, value.content, &value.size, &keypurp, 0x30)) { |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(value.size) { |
|
|
|
|
cli_dbgmsg("asn1_get_x509: extra data in ExtKeyUsage\n"); |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(!memcmp("\x55\x1d\x0f", id.content, 3)) { |
|
|
|
|
/* KeyUsage 2.5.29.15 */ |
|
|
|
|
const uint8_t *keyusage = value.content; |
|
|
|
|
uint32_t usage; |
|
|
|
|
if(value.size < 4 || value.size > 5) { |
|
|
|
|
cli_dbgmsg("asn1_get_x509: bad KeyUsage\n"); |
|
|
|
|
ext.next = keypurp.content; |
|
|
|
|
while(keypurp.size) { |
|
|
|
|
if(asn1_expect_objtype(map, ext.next, &keypurp.size, &ext, 0x06)) { |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(!fmap_need_ptr_once(map, value.content, value.size)) { |
|
|
|
|
if(ext.size != 8) |
|
|
|
|
continue; |
|
|
|
|
if(!fmap_need_ptr_once(map, value.content, 8)) { |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(keyusage[0] != 0x03 || keyusage[1] != value.size - 2 || keyusage[2] > 7) { |
|
|
|
|
cli_dbgmsg("asn1_get_x509: bad KeyUsage\n"); |
|
|
|
|
if(!memcmp("\x2b\x06\x01\x05\x05\x07\x03\x03", value.content, 8)) /* id_kp_codeSigning */ |
|
|
|
|
x509.codeSign = 1; |
|
|
|
|
else if(!memcmp("\x2b\x06\x01\x05\x05\x07\x03\x08", value.content, 8)) /* id_kp_timeStamping */ |
|
|
|
|
x509.timeSign = 1; |
|
|
|
|
} |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if(!memcmp("\x55\x1d\x13", id.content, 3)) { |
|
|
|
|
/* Basic Constraints 2.5.29.19 */ |
|
|
|
|
struct cli_asn1 constr; |
|
|
|
|
if(asn1_expect_objtype(map, value.content, &value.size, &constr, 0x30)) { |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(!constr.size)
|
|
|
|
|
x509.certSign = 0; |
|
|
|
|
else { |
|
|
|
|
if(asn1_expect_objtype(map, constr.content, &constr.size, &ext, 0x01)) { |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
usage = keyusage[3]; |
|
|
|
|
if(value.size == 5) { |
|
|
|
|
usage <<= 8; |
|
|
|
|
usage |= keyusage[4]; |
|
|
|
|
} |
|
|
|
|
usage >>= keyusage[2]; |
|
|
|
|
x509.certSign = ((usage & (1<<5)) != 0); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if(!memcmp("\x55\x1d\x25", id.content, 3)) { |
|
|
|
|
/* ExtKeyUsage 2.5.29.37 */ |
|
|
|
|
struct cli_asn1 keypurp; |
|
|
|
|
if(asn1_expect_objtype(map, value.content, &value.size, &keypurp, 0x30)) { |
|
|
|
|
if(ext.size != 1) { |
|
|
|
|
cli_dbgmsg("asn1_get_x509: wrong bool size in basic constraint %u\n", ext.size); |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(value.size) { |
|
|
|
|
cli_dbgmsg("asn1_get_x509: extra data in ExtKeyUsage\n"); |
|
|
|
|
if(!fmap_need_ptr_once(map, ext.content, 1)) { |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
ext.next = keypurp.content; |
|
|
|
|
while(keypurp.size) { |
|
|
|
|
if(asn1_expect_objtype(map, ext.next, &keypurp.size, &ext, 0x06)) { |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(ext.size != 8) |
|
|
|
|
continue; |
|
|
|
|
if(!fmap_need_ptr_once(map, value.content, 8)) { |
|
|
|
|
exts.size = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(!memcmp("\x2b\x06\x01\x05\x05\x07\x03\x03", value.content, 8)) /* id_kp_codeSigning */ |
|
|
|
|
x509.codeSign = 1; |
|
|
|
|
else if(!memcmp("\x2b\x06\x01\x05\x05\x07\x03\x08", value.content, 8)) /* id_kp_timeStamping */ |
|
|
|
|
x509.timeSign = 1; |
|
|
|
|
} |
|
|
|
|
continue; |
|
|
|
|
x509.certSign = (((uint8_t *)(ext.content))[0] != 0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
/* { */ |
|
|
|
|
/* uint8_t *asd = id.content; */ |
|
|
|
|
/* cli_errmsg("ACAB: %u.%u.%u %u\n", asd[0], asd[1], asd[2], id.size); */ |
|
|
|
|
/* } */ |
|
|
|
|
} |
|
|
|
|
if(exts.size) { |
|
|
|
|
tbs.size = 1; |
|
|
|
|