summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/asn1_lib.c
diff options
context:
space:
mode:
authorryker <>1998-10-05 20:13:14 +0000
committerryker <>1998-10-05 20:13:14 +0000
commitaeeae06a79815dc190061534d47236cec09f9e32 (patch)
tree851692b9c2f9c04f077666855641900f19fdb217 /src/lib/libcrypto/asn1/asn1_lib.c
parenta4f79641824cbf9f60ca9d1168d1fcc46717a82a (diff)
downloadopenbsd-aeeae06a79815dc190061534d47236cec09f9e32.tar.gz
openbsd-aeeae06a79815dc190061534d47236cec09f9e32.tar.bz2
openbsd-aeeae06a79815dc190061534d47236cec09f9e32.zip
Import of SSLeay-0.9.0b with RSA and IDEA stubbed + OpenBSD build
functionality for shared libs. Note that routines such as sslv2_init and friends that use RSA will not work due to lack of RSA in this library. Needs documentation and help from ports for easy upgrade to full functionality where legally possible.
Diffstat (limited to 'src/lib/libcrypto/asn1/asn1_lib.c')
-rw-r--r--src/lib/libcrypto/asn1/asn1_lib.c444
1 files changed, 444 insertions, 0 deletions
diff --git a/src/lib/libcrypto/asn1/asn1_lib.c b/src/lib/libcrypto/asn1/asn1_lib.c
new file mode 100644
index 0000000000..ff30b25836
--- /dev/null
+++ b/src/lib/libcrypto/asn1/asn1_lib.c
@@ -0,0 +1,444 @@
1/* crypto/asn1/asn1_lib.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
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
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
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.
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.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
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:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
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
51 * SUCH DAMAGE.
52 *
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
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include "cryptlib.h"
61#include "asn1.h"
62#include "asn1_mac.h"
63
64#ifndef NOPROTO
65static int asn1_get_length(unsigned char **pp,int *inf,long *rl,int max);
66static void asn1_put_length(unsigned char **pp, int length);
67#else
68static int asn1_get_length();
69static void asn1_put_length();
70#endif
71
72char *ASN1_version="ASN1 part of SSLeay 0.9.0b 29-Jun-1998";
73
74int ASN1_check_infinite_end(p,len)
75unsigned char **p;
76long len;
77 {
78 /* If there is 0 or 1 byte left, the length check should pick
79 * things up */
80 if (len <= 0)
81 return(1);
82 else if ((len >= 2) && ((*p)[0] == 0) && ((*p)[1] == 0))
83 {
84 (*p)+=2;
85 return(1);
86 }
87 return(0);
88 }
89
90
91int ASN1_get_object(pp, plength, ptag, pclass, omax)
92unsigned char **pp;
93long *plength;
94int *ptag;
95int *pclass;
96long omax;
97 {
98 int i,ret;
99 long l;
100 unsigned char *p= *pp;
101 int tag,xclass,inf;
102 long max=omax;
103
104 if (!max) goto err;
105 ret=(*p&V_ASN1_CONSTRUCTED);
106 xclass=(*p&V_ASN1_PRIVATE);
107 i= *p&V_ASN1_PRIMATIVE_TAG;
108 if (i == V_ASN1_PRIMATIVE_TAG)
109 { /* high-tag */
110 p++;
111 if (--max == 0) goto err;
112 l=0;
113 while (*p&0x80)
114 {
115 l<<=7L;
116 l|= *(p++)&0x7f;
117 if (--max == 0) goto err;
118 }
119 l<<=7L;
120 l|= *(p++)&0x7f;
121 tag=(int)l;
122 }
123 else
124 {
125 tag=i;
126 p++;
127 if (--max == 0) goto err;
128 }
129 *ptag=tag;
130 *pclass=xclass;
131 if (!asn1_get_length(&p,&inf,plength,(int)max)) goto err;
132
133#ifdef undef
134 fprintf(stderr,"p=%d + *plength=%d > omax=%d + *pp=%d (%d > %d)\n",
135 p,*plength,omax,*pp,(p+ *plength),omax+ *pp);
136
137#endif
138 if ((p+ *plength) > (omax+ *pp))
139 {
140 ASN1err(ASN1_F_ASN1_GET_OBJECT,ASN1_R_TOO_LONG);
141 /* Set this so that even if things are not long enough
142 * the values are set correctly */
143 ret|=0x80;
144 }
145 *pp=p;
146 return(ret+inf);
147err:
148 ASN1err(ASN1_F_ASN1_GET_OBJECT,ASN1_R_HEADER_TOO_LONG);
149 return(0x80);
150 }
151
152static int asn1_get_length(pp,inf,rl,max)
153unsigned char **pp;
154int *inf;
155long *rl;
156int max;
157 {
158 unsigned char *p= *pp;
159 long ret=0;
160 int i;
161
162 if (max-- < 1) return(0);
163 if (*p == 0x80)
164 {
165 *inf=1;
166 ret=0;
167 p++;
168 }
169 else
170 {
171 *inf=0;
172 i= *p&0x7f;
173 if (*(p++) & 0x80)
174 {
175 if (max-- == 0) return(0);
176 while (i-- > 0)
177 {
178 ret<<=8L;
179 ret|= *(p++);
180 if (max-- == 0) return(0);
181 }
182 }
183 else
184 ret=i;
185 }
186 *pp=p;
187 *rl=ret;
188 return(1);
189 }
190
191/* class 0 is constructed
192 * constructed == 2 for indefinitle length constructed */
193void ASN1_put_object(pp,constructed,length,tag,xclass)
194unsigned char **pp;
195int constructed;
196int length;
197int tag;
198int xclass;
199 {
200 unsigned char *p= *pp;
201 int i;
202
203 i=(constructed)?V_ASN1_CONSTRUCTED:0;
204 i|=(xclass&V_ASN1_PRIVATE);
205 if (tag < 31)
206 *(p++)=i|(tag&V_ASN1_PRIMATIVE_TAG);
207 else
208 {
209 *(p++)=i|V_ASN1_PRIMATIVE_TAG;
210 while (tag > 0x7f)
211 {
212 *(p++)=(tag&0x7f)|0x80;
213 tag>>=7;
214 }
215 *(p++)=(tag&0x7f);
216 }
217 if ((constructed == 2) && (length == 0))
218 *(p++)=0x80; /* der_put_length would output 0 instead */
219 else
220 asn1_put_length(&p,length);
221 *pp=p;
222 }
223
224static void asn1_put_length(pp, length)
225unsigned char **pp;
226int length;
227 {
228 unsigned char *p= *pp;
229 int i,l;
230 if (length <= 127)
231 *(p++)=(unsigned char)length;
232 else
233 {
234 l=length;
235 for (i=0; l > 0; i++)
236 l>>=8;
237 *(p++)=i|0x80;
238 l=i;
239 while (i-- > 0)
240 {
241 p[i]=length&0xff;
242 length>>=8;
243 }
244 p+=l;
245 }
246 *pp=p;
247 }
248
249int ASN1_object_size(constructed, length, tag)
250int constructed;
251int length;
252int tag;
253 {
254 int ret;
255
256 ret=length;
257 ret++;
258 if (tag >= 31)
259 {
260 while (tag > 0)
261 {
262 tag>>=7;
263 ret++;
264 }
265 }
266 if ((length == 0) && (constructed == 2))
267 ret+=2;
268 ret++;
269 if (length > 127)
270 {
271 while (length > 0)
272 {
273 length>>=8;
274 ret++;
275 }
276 }
277 return(ret);
278 }
279
280int asn1_Finish(c)
281ASN1_CTX *c;
282 {
283 if ((c->inf == (1|V_ASN1_CONSTRUCTED)) && (!c->eos))
284 {
285 if (!ASN1_check_infinite_end(&c->p,c->slen))
286 {
287 c->error=ASN1_R_MISSING_EOS;
288 return(0);
289 }
290 }
291 if ( ((c->slen != 0) && !(c->inf & 1)) ||
292 ((c->slen < 0) && (c->inf & 1)))
293 {
294 c->error=ASN1_R_LENGTH_MISMATCH;
295 return(0);
296 }
297 return(1);
298 }
299
300int asn1_GetSequence(c,length)
301ASN1_CTX *c;
302long *length;
303 {
304 unsigned char *q;
305
306 q=c->p;
307 c->inf=ASN1_get_object(&(c->p),&(c->slen),&(c->tag),&(c->xclass),
308 *length);
309 if (c->inf & 0x80)
310 {
311 c->error=ASN1_R_BAD_GET_OBJECT;
312 return(0);
313 }
314 if (c->tag != V_ASN1_SEQUENCE)
315 {
316 c->error=ASN1_R_EXPECTING_A_SEQUENCE;
317 return(0);
318 }
319 (*length)-=(c->p-q);
320 if (c->max && (*length < 0))
321 {
322 c->error=ASN1_R_LENGTH_MISMATCH;
323 return(0);
324 }
325 if (c->inf == (1|V_ASN1_CONSTRUCTED))
326 c->slen= *length+ *(c->pp)-c->p;
327 c->eos=0;
328 return(1);
329 }
330
331ASN1_STRING *ASN1_STRING_dup(str)
332ASN1_STRING *str;
333 {
334 ASN1_STRING *ret;
335
336 if (str == NULL) return(NULL);
337 if ((ret=ASN1_STRING_type_new(str->type)) == NULL)
338 return(NULL);
339 if (!ASN1_STRING_set(ret,str->data,str->length))
340 {
341 ASN1_STRING_free(ret);
342 return(NULL);
343 }
344 return(ret);
345 }
346
347int ASN1_STRING_set(str,data,len)
348ASN1_STRING *str;
349unsigned char *data;
350int len;
351 {
352 char *c;
353
354 if (len < 0)
355 {
356 if (data == NULL)
357 return(0);
358 else
359 len=strlen((char *)data);
360 }
361 if ((str->length < len) || (str->data == NULL))
362 {
363 c=(char *)str->data;
364 if (c == NULL)
365 str->data=(unsigned char *)Malloc(len+1);
366 else
367 str->data=(unsigned char *)Realloc(c,len+1);
368
369 if (str->data == NULL)
370 {
371 str->data=(unsigned char *)c;
372 return(0);
373 }
374 }
375 str->length=len;
376 if (data != NULL)
377 {
378 memcpy(str->data,data,len);
379 /* an alowance for strings :-) */
380 str->data[len]='\0';
381 }
382 return(1);
383 }
384
385ASN1_STRING *ASN1_STRING_new()
386 {
387 return(ASN1_STRING_type_new(V_ASN1_OCTET_STRING));
388 }
389
390
391ASN1_STRING *ASN1_STRING_type_new(type)
392int type;
393 {
394 ASN1_STRING *ret;
395
396 ret=(ASN1_STRING *)Malloc(sizeof(ASN1_STRING));
397 if (ret == NULL)
398 {
399 ASN1err(ASN1_F_ASN1_STRING_TYPE_NEW,ERR_R_MALLOC_FAILURE);
400 return(NULL);
401 }
402 ret->length=0;
403 ret->type=type;
404 ret->data=NULL;
405 return(ret);
406 }
407
408void ASN1_STRING_free(a)
409ASN1_STRING *a;
410 {
411 if (a == NULL) return;
412 if (a->data != NULL) Free((char *)a->data);
413 Free((char *)a);
414 }
415
416int ASN1_STRING_cmp(a,b)
417ASN1_STRING *a,*b;
418 {
419 int i;
420
421 i=(a->length-b->length);
422 if (i == 0)
423 {
424 i=memcmp(a->data,b->data,a->length);
425 if (i == 0)
426 return(a->type-b->type);
427 else
428 return(i);
429 }
430 else
431 return(i);
432 }
433
434void asn1_add_error(address,offset)
435unsigned char *address;
436int offset;
437 {
438 char buf1[16],buf2[16];
439
440 sprintf(buf1,"%lu",(unsigned long)address);
441 sprintf(buf2,"%d",offset);
442 ERR_add_error_data(4,"address=",buf1," offset=",buf2);
443 }
444