From 4098e89cbf1212e2fb796d64725f259ac680cb56 Mon Sep 17 00:00:00 2001 From: Ben Laurie Date: Tue, 29 Dec 1998 21:43:55 +0000 Subject: Fix incorrect DER encoding of SETs and all knock-ons from that. --- crypto/asn1/a_set.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 75 insertions(+), 6 deletions(-) (limited to 'crypto/asn1/a_set.c') diff --git a/crypto/asn1/a_set.c b/crypto/asn1/a_set.c index 7fd4807e52..a140cc14ad 100644 --- a/crypto/asn1/a_set.c +++ b/crypto/asn1/a_set.c @@ -62,17 +62,43 @@ /* ASN1err(ASN1_F_ASN1_TYPE_NEW,ERR_R_MALLOC_FAILURE); */ +typedef struct + { + unsigned char *pbData; + int cbData; + } MYBLOB; -int i2d_ASN1_SET(a,pp,func,ex_tag,ex_class) +/* SetBlobCmp + * This function compares two elements of SET_OF block + */ +static int SetBlobCmp(const void *elem1, const void *elem2 ) + { + MYBLOB *b1 = (MYBLOB *)elem1; + MYBLOB *b2 = (MYBLOB *)elem2; + int r; + + r = memcmp(b1->pbData, b2->pbData, + b1->cbData < b2->cbData ? b1->cbData : b2->cbData); + if(r != 0) + return r; + return b1->cbData-b2->cbData; + } + +int i2d_ASN1_SET(a,pp,func,ex_tag,ex_class,is_set) STACK *a; unsigned char **pp; int (*func)(); int ex_tag; int ex_class; +int is_set; /* if TRUE, then sort the contents (i.e. it isn't a SEQUENCE) */ + { int ret=0,r; int i; unsigned char *p; + unsigned char *pStart, *pTempMem; + MYBLOB *rgSetBlob; + int totSize; if (a == NULL) return(0); for (i=sk_num(a)-1; i>=0; i--) @@ -82,12 +108,55 @@ int ex_class; p= *pp; ASN1_put_object(&p,1,ret,ex_tag,ex_class); - for (i=0; i