summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/a_d2i_fp.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/asn1/a_d2i_fp.c280
1 files changed, 134 insertions, 146 deletions
diff --git a/src/lib/libcrypto/asn1/a_d2i_fp.c b/src/lib/libcrypto/asn1/a_d2i_fp.c
index 52b2ebdb63..af7a4bac30 100644
--- a/src/lib/libcrypto/asn1/a_d2i_fp.c
+++ b/src/lib/libcrypto/asn1/a_d2i_fp.c
@@ -5,21 +5,21 @@
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
11 * apply to all code found in this distribution, be it the RC4, RSA, 11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms 13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 * 15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in 16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed. 17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution 18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used. 19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or 20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package. 21 * in documentation (online or textual) provided with the package.
22 * 22 *
23 * Redistribution and use in source and binary forms, with or without 23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions 24 * modification, are permitted provided that the following conditions
25 * are met: 25 * are met:
@@ -34,10 +34,10 @@
34 * Eric Young (eay@cryptsoft.com)" 34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library 35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-). 36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from 37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement: 38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 * 40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -49,7 +49,7 @@
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE. 51 * SUCH DAMAGE.
52 * 52 *
53 * The licence and distribution terms for any publically available version or 53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be 54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
@@ -67,220 +67,208 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb);
67#ifndef NO_OLD_ASN1 67#ifndef NO_OLD_ASN1
68#ifndef OPENSSL_NO_FP_API 68#ifndef OPENSSL_NO_FP_API
69 69
70void *ASN1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x) 70void *
71 { 71ASN1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x)
72 BIO *b; 72{
73 void *ret; 73 BIO *b;
74 void *ret;
74 75
75 if ((b=BIO_new(BIO_s_file())) == NULL) 76 if ((b = BIO_new(BIO_s_file())) == NULL) {
76 { 77 ASN1err(ASN1_F_ASN1_D2I_FP, ERR_R_BUF_LIB);
77 ASN1err(ASN1_F_ASN1_D2I_FP,ERR_R_BUF_LIB); 78 return (NULL);
78 return(NULL); 79 }
79 } 80 BIO_set_fp(b, in, BIO_NOCLOSE);
80 BIO_set_fp(b,in,BIO_NOCLOSE); 81 ret = ASN1_d2i_bio(xnew, d2i, b, x);
81 ret=ASN1_d2i_bio(xnew,d2i,b,x); 82 BIO_free(b);
82 BIO_free(b); 83 return (ret);
83 return(ret); 84}
84 }
85#endif 85#endif
86 86
87void *ASN1_d2i_bio(void *(*xnew)(void), d2i_of_void *d2i, BIO *in, void **x) 87void *
88 { 88ASN1_d2i_bio(void *(*xnew)(void), d2i_of_void *d2i, BIO *in, void **x)
89{
89 BUF_MEM *b = NULL; 90 BUF_MEM *b = NULL;
90 const unsigned char *p; 91 const unsigned char *p;
91 void *ret=NULL; 92 void *ret = NULL;
92 int len; 93 int len;
93 94
94 len = asn1_d2i_read_bio(in, &b); 95 len = asn1_d2i_read_bio(in, &b);
95 if(len < 0) goto err; 96 if (len < 0)
97 goto err;
98
99 p = (unsigned char *)b->data;
100 ret = d2i(x, &p, len);
96 101
97 p=(unsigned char *)b->data;
98 ret=d2i(x,&p,len);
99err: 102err:
100 if (b != NULL) BUF_MEM_free(b); 103 if (b != NULL)
101 return(ret); 104 BUF_MEM_free(b);
102 } 105 return (ret);
106}
103 107
104#endif 108#endif
105 109
106void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x) 110void *
107 { 111ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x)
112{
108 BUF_MEM *b = NULL; 113 BUF_MEM *b = NULL;
109 const unsigned char *p; 114 const unsigned char *p;
110 void *ret=NULL; 115 void *ret = NULL;
111 int len; 116 int len;
112 117
113 len = asn1_d2i_read_bio(in, &b); 118 len = asn1_d2i_read_bio(in, &b);
114 if(len < 0) goto err; 119 if (len < 0)
120 goto err;
121
122 p = (const unsigned char *)b->data;
123 ret = ASN1_item_d2i(x, &p, len, it);
115 124
116 p=(const unsigned char *)b->data;
117 ret=ASN1_item_d2i(x,&p,len, it);
118err: 125err:
119 if (b != NULL) BUF_MEM_free(b); 126 if (b != NULL)
120 return(ret); 127 BUF_MEM_free(b);
121 } 128 return (ret);
129}
122 130
123#ifndef OPENSSL_NO_FP_API 131#ifndef OPENSSL_NO_FP_API
124void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x) 132void *
125 { 133ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x)
126 BIO *b; 134{
127 char *ret; 135 BIO *b;
136 char *ret;
128 137
129 if ((b=BIO_new(BIO_s_file())) == NULL) 138 if ((b = BIO_new(BIO_s_file())) == NULL) {
130 { 139 ASN1err(ASN1_F_ASN1_ITEM_D2I_FP, ERR_R_BUF_LIB);
131 ASN1err(ASN1_F_ASN1_ITEM_D2I_FP,ERR_R_BUF_LIB); 140 return (NULL);
132 return(NULL); 141 }
133 } 142 BIO_set_fp(b, in, BIO_NOCLOSE);
134 BIO_set_fp(b,in,BIO_NOCLOSE); 143 ret = ASN1_item_d2i_bio(it, b, x);
135 ret=ASN1_item_d2i_bio(it,b,x); 144 BIO_free(b);
136 BIO_free(b); 145 return (ret);
137 return(ret); 146}
138 }
139#endif 147#endif
140 148
141#define HEADER_SIZE 8 149#define HEADER_SIZE 8
142static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb) 150static int
143 { 151asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
152{
144 BUF_MEM *b; 153 BUF_MEM *b;
145 unsigned char *p; 154 unsigned char *p;
146 int i; 155 int i;
147 ASN1_const_CTX c; 156 ASN1_const_CTX c;
148 size_t want=HEADER_SIZE; 157 size_t want = HEADER_SIZE;
149 int eos=0; 158 int eos = 0;
150 size_t off=0; 159 size_t off = 0;
151 size_t len=0; 160 size_t len = 0;
152 161
153 b=BUF_MEM_new(); 162 b = BUF_MEM_new();
154 if (b == NULL) 163 if (b == NULL) {
155 { 164 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ERR_R_MALLOC_FAILURE);
156 ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ERR_R_MALLOC_FAILURE);
157 return -1; 165 return -1;
158 } 166 }
159 167
160 ERR_clear_error(); 168 ERR_clear_error();
161 for (;;) 169 for (;;) {
162 { 170 if (want >= (len - off)) {
163 if (want >= (len-off)) 171 want -= (len - off);
164 {
165 want-=(len-off);
166 172
167 if (len + want < len || !BUF_MEM_grow_clean(b,len+want)) 173 if (len + want < len || !BUF_MEM_grow_clean(b, len + want)) {
168 { 174 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ERR_R_MALLOC_FAILURE);
169 ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ERR_R_MALLOC_FAILURE);
170 goto err; 175 goto err;
171 } 176 }
172 i=BIO_read(in,&(b->data[len]),want); 177 i = BIO_read(in, &(b->data[len]), want);
173 if ((i < 0) && ((len-off) == 0)) 178 if ((i < 0) && ((len - off) == 0)) {
174 { 179 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ASN1_R_NOT_ENOUGH_DATA);
175 ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_NOT_ENOUGH_DATA);
176 goto err; 180 goto err;
177 } 181 }
178 if (i > 0) 182 if (i > 0) {
179 { 183 if (len + i < len) {
180 if (len+i < len) 184 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ASN1_R_TOO_LONG);
181 {
182 ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG);
183 goto err; 185 goto err;
184 }
185 len+=i;
186 } 186 }
187 len += i;
187 } 188 }
189 }
188 /* else data already loaded */ 190 /* else data already loaded */
189 191
190 p=(unsigned char *)&(b->data[off]); 192 p = (unsigned char *) & (b->data[off]);
191 c.p=p; 193 c.p = p;
192 c.inf=ASN1_get_object(&(c.p),&(c.slen),&(c.tag),&(c.xclass), 194 c.inf = ASN1_get_object(&(c.p), &(c.slen), &(c.tag),
193 len-off); 195 &(c.xclass), len - off);
194 if (c.inf & 0x80) 196 if (c.inf & 0x80) {
195 {
196 unsigned long e; 197 unsigned long e;
197 198
198 e=ERR_GET_REASON(ERR_peek_error()); 199 e = ERR_GET_REASON(ERR_peek_error());
199 if (e != ASN1_R_TOO_LONG) 200 if (e != ASN1_R_TOO_LONG)
200 goto err; 201 goto err;
201 else 202 else
202 ERR_clear_error(); /* clear error */ 203 ERR_clear_error(); /* clear error */
203 } 204 }
204 i=c.p-p;/* header length */ 205 i = c.p - p; /* header length */
205 off+=i; /* end of data */ 206 off += i; /* end of data */
206 207
207 if (c.inf & 1) 208 if (c.inf & 1) {
208 {
209 /* no data body so go round again */ 209 /* no data body so go round again */
210 eos++; 210 eos++;
211 if (eos < 0) 211 if (eos < 0) {
212 { 212 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ASN1_R_HEADER_TOO_LONG);
213 ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_HEADER_TOO_LONG);
214 goto err; 213 goto err;
215 }
216 want=HEADER_SIZE;
217 } 214 }
218 else if (eos && (c.slen == 0) && (c.tag == V_ASN1_EOC)) 215 want = HEADER_SIZE;
219 { 216 } else if (eos && (c.slen == 0) && (c.tag == V_ASN1_EOC)) {
220 /* eos value, so go back and read another header */ 217 /* eos value, so go back and read another header */
221 eos--; 218 eos--;
222 if (eos <= 0) 219 if (eos <= 0)
223 break; 220 break;
224 else 221 else
225 want=HEADER_SIZE; 222 want = HEADER_SIZE;
226 } 223 } else {
227 else
228 {
229 /* suck in c.slen bytes of data */ 224 /* suck in c.slen bytes of data */
230 want=c.slen; 225 want = c.slen;
231 if (want > (len-off)) 226 if (want > (len - off)) {
232 { 227 want -= (len - off);
233 want-=(len-off);
234 if (want > INT_MAX /* BIO_read takes an int length */ || 228 if (want > INT_MAX /* BIO_read takes an int length */ ||
235 len+want < len) 229 len+want < len) {
236 { 230 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ASN1_R_TOO_LONG);
237 ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG);
238 goto err;
239 }
240 if (!BUF_MEM_grow_clean(b,len+want))
241 {
242 ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ERR_R_MALLOC_FAILURE);
243 goto err; 231 goto err;
244 } 232 }
245 while (want > 0) 233 if (!BUF_MEM_grow_clean(b, len + want)) {
246 { 234 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ERR_R_MALLOC_FAILURE);
247 i=BIO_read(in,&(b->data[len]),want); 235 goto err;
248 if (i <= 0) 236 }
249 { 237 while (want > 0) {
238 i = BIO_read(in, &(b->data[len]), want);
239 if (i <= 0) {
250 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, 240 ASN1err(ASN1_F_ASN1_D2I_READ_BIO,
251 ASN1_R_NOT_ENOUGH_DATA); 241 ASN1_R_NOT_ENOUGH_DATA);
252 goto err; 242 goto err;
253 } 243 }
254 /* This can't overflow because 244 /* This can't overflow because
255 * |len+want| didn't overflow. */ 245 * |len+want| didn't overflow. */
256 len+=i; 246 len += i;
257 want-=i; 247 want -= i;
258 }
259 } 248 }
260 if (off + c.slen < off) 249 }
261 { 250 if (off + c.slen < off) {
262 ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG); 251 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ASN1_R_TOO_LONG);
263 goto err; 252 goto err;
264 }
265 off+=c.slen;
266 if (eos <= 0)
267 {
268 break;
269 }
270 else
271 want=HEADER_SIZE;
272 } 253 }
254 off += c.slen;
255 if (eos <= 0) {
256 break;
257 } else
258 want = HEADER_SIZE;
273 } 259 }
260 }
274 261
275 if (off > INT_MAX) 262 if (off > INT_MAX) {
276 { 263 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ASN1_R_TOO_LONG);
277 ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG);
278 goto err; 264 goto err;
279 } 265 }
280 266
281 *pb = b; 267 *pb = b;
282 return off; 268 return off;
269
283err: 270err:
284 if (b != NULL) BUF_MEM_free(b); 271 if (b != NULL)
272 BUF_MEM_free(b);
285 return -1; 273 return -1;
286 } 274}