OLD | NEW |
1 /* crypto/asn1/a_set.c */ | 1 /* crypto/asn1/a_set.c */ |
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * This package is an SSL implementation written | 5 * This package is an SSL implementation written |
6 * by Eric Young (eay@cryptsoft.com). | 6 * by Eric Young (eay@cryptsoft.com). |
7 * The implementation was written so as to conform with Netscapes SSL. | 7 * The implementation was written so as to conform with Netscapes SSL. |
8 * | 8 * |
9 * This library is free for commercial and non-commercial use as long as | 9 * This library is free for commercial and non-commercial use as long as |
10 * the following conditions are aheared to. The following conditions | 10 * the following conditions are aheared to. The following conditions |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 int r; | 78 int r; |
79 | 79 |
80 r = memcmp(b1->pbData, b2->pbData, | 80 r = memcmp(b1->pbData, b2->pbData, |
81 b1->cbData < b2->cbData ? b1->cbData : b2->cbData); | 81 b1->cbData < b2->cbData ? b1->cbData : b2->cbData); |
82 if(r != 0) | 82 if(r != 0) |
83 return r; | 83 return r; |
84 return b1->cbData-b2->cbData; | 84 return b1->cbData-b2->cbData; |
85 } | 85 } |
86 | 86 |
87 /* int is_set: if TRUE, then sort the contents (i.e. it isn't a SEQUENCE) */ | 87 /* int is_set: if TRUE, then sort the contents (i.e. it isn't a SEQUENCE) */ |
88 int i2d_ASN1_SET(STACK *a, unsigned char **pp, i2d_of_void *i2d, int ex_tag, | 88 int i2d_ASN1_SET(STACK_OF(OPENSSL_BLOCK) *a, unsigned char **pp, |
89 » » int ex_class, int is_set) | 89 » » i2d_of_void *i2d, int ex_tag, int ex_class, |
| 90 » » int is_set) |
90 { | 91 { |
91 int ret=0,r; | 92 int ret=0,r; |
92 int i; | 93 int i; |
93 unsigned char *p; | 94 unsigned char *p; |
94 unsigned char *pStart, *pTempMem; | 95 unsigned char *pStart, *pTempMem; |
95 MYBLOB *rgSetBlob; | 96 MYBLOB *rgSetBlob; |
96 int totSize; | 97 int totSize; |
97 | 98 |
98 if (a == NULL) return(0); | 99 if (a == NULL) return(0); |
99 » for (i=sk_num(a)-1; i>=0; i--) | 100 » for (i=sk_OPENSSL_BLOCK_num(a)-1; i>=0; i--) |
100 » » ret+=i2d(sk_value(a,i),NULL); | 101 » » ret+=i2d(sk_OPENSSL_BLOCK_value(a,i),NULL); |
101 r=ASN1_object_size(1,ret,ex_tag); | 102 r=ASN1_object_size(1,ret,ex_tag); |
102 if (pp == NULL) return(r); | 103 if (pp == NULL) return(r); |
103 | 104 |
104 p= *pp; | 105 p= *pp; |
105 ASN1_put_object(&p,1,ret,ex_tag,ex_class); | 106 ASN1_put_object(&p,1,ret,ex_tag,ex_class); |
106 | 107 |
107 /* Modified by gp@nsj.co.jp */ | 108 /* Modified by gp@nsj.co.jp */ |
108 /* And then again by Ben */ | 109 /* And then again by Ben */ |
109 /* And again by Steve */ | 110 /* And again by Steve */ |
110 | 111 |
111 » if(!is_set || (sk_num(a) < 2)) | 112 » if(!is_set || (sk_OPENSSL_BLOCK_num(a) < 2)) |
112 { | 113 { |
113 » » for (i=0; i<sk_num(a); i++) | 114 » » for (i=0; i<sk_OPENSSL_BLOCK_num(a); i++) |
114 » i2d(sk_value(a,i),&p); | 115 » i2d(sk_OPENSSL_BLOCK_value(a,i),&p); |
115 | 116 |
116 *pp=p; | 117 *pp=p; |
117 return(r); | 118 return(r); |
118 } | 119 } |
119 | 120 |
120 pStart = p; /* Catch the beg of Setblobs*/ | 121 pStart = p; /* Catch the beg of Setblobs*/ |
121 /* In this array we will store the SET blobs */ | 122 /* In this array we will store the SET blobs */ |
122 » » rgSetBlob = (MYBLOB *)OPENSSL_malloc(sk_num(a) * sizeof(MYBLOB))
; | 123 » » rgSetBlob = OPENSSL_malloc(sk_OPENSSL_BLOCK_num(a) * sizeof(MYBL
OB)); |
123 if (rgSetBlob == NULL) | 124 if (rgSetBlob == NULL) |
124 { | 125 { |
125 ASN1err(ASN1_F_I2D_ASN1_SET,ERR_R_MALLOC_FAILURE); | 126 ASN1err(ASN1_F_I2D_ASN1_SET,ERR_R_MALLOC_FAILURE); |
126 return(0); | 127 return(0); |
127 } | 128 } |
128 | 129 |
129 for (i=0; i<sk_num(a); i++) | 130 for (i=0; i<sk_OPENSSL_BLOCK_num(a); i++) |
130 { | 131 { |
131 rgSetBlob[i].pbData = p; /* catch each set encode blob */ | 132 rgSetBlob[i].pbData = p; /* catch each set encode blob */ |
132 i2d(sk_value(a,i),&p); | 133 i2d(sk_OPENSSL_BLOCK_value(a,i),&p); |
133 rgSetBlob[i].cbData = p - rgSetBlob[i].pbData; /* Length of this | 134 rgSetBlob[i].cbData = p - rgSetBlob[i].pbData; /* Length of this |
134 SetBlob | 135 SetBlob |
135 */ | 136 */ |
136 } | 137 } |
137 *pp=p; | 138 *pp=p; |
138 totSize = p - pStart; /* This is the total size of all set blobs */ | 139 totSize = p - pStart; /* This is the total size of all set blobs */ |
139 | 140 |
140 /* Now we have to sort the blobs. I am using a simple algo. | 141 /* Now we have to sort the blobs. I am using a simple algo. |
141 *Sort ptrs *Copy to temp-mem *Copy from temp-mem to user-mem*/ | 142 *Sort ptrs *Copy to temp-mem *Copy from temp-mem to user-mem*/ |
142 qsort( rgSetBlob, sk_num(a), sizeof(MYBLOB), SetBlobCmp); | 143 qsort( rgSetBlob, sk_OPENSSL_BLOCK_num(a), sizeof(MYBLOB), SetBlobCmp); |
143 if (!(pTempMem = OPENSSL_malloc(totSize))) | 144 if (!(pTempMem = OPENSSL_malloc(totSize))) |
144 { | 145 { |
145 ASN1err(ASN1_F_I2D_ASN1_SET,ERR_R_MALLOC_FAILURE); | 146 ASN1err(ASN1_F_I2D_ASN1_SET,ERR_R_MALLOC_FAILURE); |
146 return(0); | 147 return(0); |
147 } | 148 } |
148 | 149 |
149 /* Copy to temp mem */ | 150 /* Copy to temp mem */ |
150 p = pTempMem; | 151 p = pTempMem; |
151 for(i=0; i<sk_num(a); ++i) | 152 for(i=0; i<sk_OPENSSL_BLOCK_num(a); ++i) |
152 { | 153 { |
153 memcpy(p, rgSetBlob[i].pbData, rgSetBlob[i].cbData); | 154 memcpy(p, rgSetBlob[i].pbData, rgSetBlob[i].cbData); |
154 p += rgSetBlob[i].cbData; | 155 p += rgSetBlob[i].cbData; |
155 } | 156 } |
156 | 157 |
157 /* Copy back to user mem*/ | 158 /* Copy back to user mem*/ |
158 memcpy(pStart, pTempMem, totSize); | 159 memcpy(pStart, pTempMem, totSize); |
159 OPENSSL_free(pTempMem); | 160 OPENSSL_free(pTempMem); |
160 OPENSSL_free(rgSetBlob); | 161 OPENSSL_free(rgSetBlob); |
161 | 162 |
162 return(r); | 163 return(r); |
163 } | 164 } |
164 | 165 |
165 STACK *d2i_ASN1_SET(STACK **a, const unsigned char **pp, long length, | 166 STACK_OF(OPENSSL_BLOCK) *d2i_ASN1_SET(STACK_OF(OPENSSL_BLOCK) **a, |
166 » » d2i_of_void *d2i, void (*free_func)(void *), int ex_tag, | 167 » » » const unsigned char **pp, |
167 » » int ex_class) | 168 » » » long length, d2i_of_void *d2i, |
| 169 » » » void (*free_func)(OPENSSL_BLOCK), int ex_tag, |
| 170 » » » int ex_class) |
168 { | 171 { |
169 ASN1_const_CTX c; | 172 ASN1_const_CTX c; |
170 » STACK *ret=NULL; | 173 » STACK_OF(OPENSSL_BLOCK) *ret=NULL; |
171 | 174 |
172 if ((a == NULL) || ((*a) == NULL)) | 175 if ((a == NULL) || ((*a) == NULL)) |
173 { | 176 { |
174 » » if ((ret=sk_new_null()) == NULL) | 177 » » if ((ret=sk_OPENSSL_BLOCK_new_null()) == NULL) |
175 { | 178 { |
176 ASN1err(ASN1_F_D2I_ASN1_SET,ERR_R_MALLOC_FAILURE); | 179 ASN1err(ASN1_F_D2I_ASN1_SET,ERR_R_MALLOC_FAILURE); |
177 goto err; | 180 goto err; |
178 } | 181 } |
179 } | 182 } |
180 else | 183 else |
181 ret=(*a); | 184 ret=(*a); |
182 | 185 |
183 c.p= *pp; | 186 c.p= *pp; |
184 c.max=(length == 0)?0:(c.p+length); | 187 c.max=(length == 0)?0:(c.p+length); |
(...skipping 24 matching lines...) Expand all Loading... |
209 while (c.p < c.max) | 212 while (c.p < c.max) |
210 { | 213 { |
211 char *s; | 214 char *s; |
212 | 215 |
213 if (M_ASN1_D2I_end_sequence()) break; | 216 if (M_ASN1_D2I_end_sequence()) break; |
214 /* XXX: This was called with 4 arguments, incorrectly, it seems | 217 /* XXX: This was called with 4 arguments, incorrectly, it seems |
215 if ((s=func(NULL,&c.p,c.slen,c.max-c.p)) == NULL) */ | 218 if ((s=func(NULL,&c.p,c.slen,c.max-c.p)) == NULL) */ |
216 if ((s=d2i(NULL,&c.p,c.slen)) == NULL) | 219 if ((s=d2i(NULL,&c.p,c.slen)) == NULL) |
217 { | 220 { |
218 ASN1err(ASN1_F_D2I_ASN1_SET,ASN1_R_ERROR_PARSING_SET_ELE
MENT); | 221 ASN1err(ASN1_F_D2I_ASN1_SET,ASN1_R_ERROR_PARSING_SET_ELE
MENT); |
219 » » » asn1_add_error(*pp,(int)(c.q- *pp)); | 222 » » » asn1_add_error(*pp,(int)(c.p- *pp)); |
220 goto err; | 223 goto err; |
221 } | 224 } |
222 » » if (!sk_push(ret,s)) goto err; | 225 » » if (!sk_OPENSSL_BLOCK_push(ret,s)) goto err; |
223 } | 226 } |
224 if (a != NULL) (*a)=ret; | 227 if (a != NULL) (*a)=ret; |
225 *pp=c.p; | 228 *pp=c.p; |
226 return(ret); | 229 return(ret); |
227 err: | 230 err: |
228 if ((ret != NULL) && ((a == NULL) || (*a != ret))) | 231 if ((ret != NULL) && ((a == NULL) || (*a != ret))) |
229 { | 232 { |
230 if (free_func != NULL) | 233 if (free_func != NULL) |
231 » » » sk_pop_free(ret,free_func); | 234 » » » sk_OPENSSL_BLOCK_pop_free(ret,free_func); |
232 else | 235 else |
233 » » » sk_free(ret); | 236 » » » sk_OPENSSL_BLOCK_free(ret); |
234 } | 237 } |
235 return(NULL); | 238 return(NULL); |
236 } | 239 } |
237 | 240 |
238 #endif | 241 #endif |
OLD | NEW |