let's use an empty list element to signal an empty sequence
This commit is contained in:
parent
39b2a8daca
commit
27722734b2
@ -53,6 +53,25 @@ static unsigned long fetch_length(const unsigned char *in, unsigned long inlen,
|
|||||||
return z+*data_offset;
|
return z+*data_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int new_element(ltc_asn1_list **l)
|
||||||
|
{
|
||||||
|
/* alloc new link */
|
||||||
|
if (*l == NULL) {
|
||||||
|
*l = XCALLOC(1, sizeof(ltc_asn1_list));
|
||||||
|
if (*l == NULL) {
|
||||||
|
return CRYPT_MEM;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
(*l)->next = XCALLOC(1, sizeof(ltc_asn1_list));
|
||||||
|
if ((*l)->next == NULL) {
|
||||||
|
return CRYPT_MEM;
|
||||||
|
}
|
||||||
|
(*l)->next->prev = *l;
|
||||||
|
*l = (*l)->next;
|
||||||
|
}
|
||||||
|
return CRYPT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
ASN.1 DER Flexi(ble) decoder will decode arbitrary DER packets and create a linked list of the decoded elements.
|
ASN.1 DER Flexi(ble) decoder will decode arbitrary DER packets and create a linked list of the decoded elements.
|
||||||
@param in The input buffer
|
@param in The input buffer
|
||||||
@ -73,6 +92,13 @@ int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc
|
|||||||
l = NULL;
|
l = NULL;
|
||||||
totlen = 0;
|
totlen = 0;
|
||||||
|
|
||||||
|
if (*inlen == 0) {
|
||||||
|
/* alloc new link */
|
||||||
|
if ((err = new_element(&l)) != CRYPT_OK) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* scan the input and and get lengths and what not */
|
/* scan the input and and get lengths and what not */
|
||||||
while (*inlen) {
|
while (*inlen) {
|
||||||
/* read the type byte */
|
/* read the type byte */
|
||||||
@ -86,20 +112,8 @@ int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* alloc new link */
|
/* alloc new link */
|
||||||
if (l == NULL) {
|
if ((err = new_element(&l)) != CRYPT_OK) {
|
||||||
l = XCALLOC(1, sizeof(*l));
|
goto error;
|
||||||
if (l == NULL) {
|
|
||||||
err = CRYPT_MEM;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
l->next = XCALLOC(1, sizeof(*l));
|
|
||||||
if (l->next == NULL) {
|
|
||||||
err = CRYPT_MEM;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
l->next->prev = l;
|
|
||||||
l = l->next;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((type & 0x20) && (type != 0x30) && (type != 0x31)) {
|
if ((type & 0x20) && (type != 0x30) && (type != 0x31)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user