in source/der.c [54:98]
static int s_der_read_tlv(struct aws_byte_cursor *cur, struct der_tlv *tlv) {
uint8_t tag = 0;
uint8_t len_bytes = 0;
uint32_t len = 0;
if (!aws_byte_cursor_read_u8(cur, &tag)) {
return AWS_OP_ERR;
}
if (!aws_byte_cursor_read_u8(cur, &len_bytes)) {
return AWS_OP_ERR;
}
/* if the sign bit is set, then the first byte is the number of bytes required to store
* the length */
if (len_bytes & 0x80) {
len_bytes &= 0x7f;
switch (len_bytes) {
case 1:
if (!aws_byte_cursor_read_u8(cur, (uint8_t *)&len)) {
return aws_raise_error(AWS_ERROR_CAL_MALFORMED_ASN1_ENCOUNTERED);
}
break;
case 2:
if (!aws_byte_cursor_read_be16(cur, (uint16_t *)&len)) {
return aws_raise_error(AWS_ERROR_CAL_MALFORMED_ASN1_ENCOUNTERED);
}
break;
case 4:
if (!aws_byte_cursor_read_be32(cur, &len)) {
return aws_raise_error(AWS_ERROR_CAL_MALFORMED_ASN1_ENCOUNTERED);
}
break;
default:
return aws_raise_error(AWS_ERROR_CAL_MALFORMED_ASN1_ENCOUNTERED);
}
} else {
len = len_bytes;
}
tlv->tag = tag;
tlv->length = len;
tlv->value = (tag == AWS_DER_NULL) ? NULL : cur->ptr;
s_decode_tlv(tlv);
aws_byte_cursor_advance(cur, len);
return AWS_OP_SUCCESS;
}