static int s_der_read_tlv()

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;
}