summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/t_x509.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/t_x509.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/t_x509.c')
-rw-r--r--src/lib/libcrypto/asn1/t_x509.c386
1 files changed, 386 insertions, 0 deletions
diff --git a/src/lib/libcrypto/asn1/t_x509.c b/src/lib/libcrypto/asn1/t_x509.c
new file mode 100644
index 0000000000..b10fbbb992
--- /dev/null
+++ b/src/lib/libcrypto/asn1/t_x509.c
@@ -0,0 +1,386 @@
1/* crypto/asn1/t_x509.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 "buffer.h"
62#include "bn.h"
63#ifndef NO_RSA
64#include "rsa.h"
65#endif
66#ifndef NO_DSA
67#include "dsa.h"
68#endif
69#include "objects.h"
70#include "x509.h"
71
72#ifndef NO_FP_API
73int X509_print_fp(fp,x)
74FILE *fp;
75X509 *x;
76 {
77 BIO *b;
78 int ret;
79
80 if ((b=BIO_new(BIO_s_file())) == NULL)
81 {
82 X509err(X509_F_X509_PRINT_FP,ERR_R_BUF_LIB);
83 return(0);
84 }
85 BIO_set_fp(b,fp,BIO_NOCLOSE);
86 ret=X509_print(b, x);
87 BIO_free(b);
88 return(ret);
89 }
90#endif
91
92int X509_print(bp,x)
93BIO *bp;
94X509 *x;
95 {
96 long l;
97 int ret=0,i,j,n;
98 char *m=NULL,*s;
99 X509_CINF *ci;
100 ASN1_INTEGER *bs;
101 EVP_PKEY *pkey=NULL;
102 char *neg;
103 X509_EXTENSION *ex;
104 ASN1_STRING *str=NULL;
105
106 ci=x->cert_info;
107 if (BIO_write(bp,"Certificate:\n",13) <= 0) goto err;
108 if (BIO_write(bp," Data:\n",10) <= 0) goto err;
109 l=X509_get_version(x);
110 if (BIO_printf(bp,"%8sVersion: %lu (0x%lx)\n","",l+1,l) <= 0) goto err;
111 if (BIO_write(bp," Serial Number:",22) <= 0) goto err;
112
113 bs=X509_get_serialNumber(x);
114 if (bs->length <= 4)
115 {
116 l=ASN1_INTEGER_get(bs);
117 if (l < 0)
118 {
119 l= -l;
120 neg="-";
121 }
122 else
123 neg="";
124 if (BIO_printf(bp," %s%lu (%s0x%lx)\n",neg,l,neg,l) <= 0)
125 goto err;
126 }
127 else
128 {
129 neg=(bs->type == V_ASN1_NEG_INTEGER)?" (Negative)":"";
130 if (BIO_printf(bp,"\n%12s%s","",neg) <= 0) goto err;
131
132 for (i=0; i<bs->length; i++)
133 {
134 if (BIO_printf(bp,"%02x%c",bs->data[i],
135 ((i+1 == bs->length)?'\n':':')) <= 0)
136 goto err;
137 }
138 }
139
140 i=OBJ_obj2nid(ci->signature->algorithm);
141 if (BIO_printf(bp,"%8sSignature Algorithm: %s\n","",
142 (i == NID_undef)?"UNKNOWN":OBJ_nid2ln(i)) <= 0)
143 goto err;
144
145 if (BIO_write(bp," Issuer: ",16) <= 0) goto err;
146 if (!X509_NAME_print(bp,X509_get_issuer_name(x),16)) goto err;
147 if (BIO_write(bp,"\n Validity\n",18) <= 0) goto err;
148 if (BIO_write(bp," Not Before: ",24) <= 0) goto err;
149 if (!ASN1_UTCTIME_print(bp,X509_get_notBefore(x))) goto err;
150 if (BIO_write(bp,"\n Not After : ",25) <= 0) goto err;
151 if (!ASN1_UTCTIME_print(bp,X509_get_notAfter(x))) goto err;
152 if (BIO_write(bp,"\n Subject: ",18) <= 0) goto err;
153 if (!X509_NAME_print(bp,X509_get_subject_name(x),16)) goto err;
154 if (BIO_write(bp,"\n Subject Public Key Info:\n",34) <= 0)
155 goto err;
156 i=OBJ_obj2nid(ci->key->algor->algorithm);
157 if (BIO_printf(bp,"%12sPublic Key Algorithm: %s\n","",
158 (i == NID_undef)?"UNKNOWN":OBJ_nid2ln(i)) <= 0) goto err;
159
160 pkey=X509_get_pubkey(x);
161#ifndef NO_RSA
162 if (pkey->type == EVP_PKEY_RSA)
163 {
164 BIO_printf(bp,"%12sRSA Public Key: (%d bit)\n","",
165 BN_num_bits(pkey->pkey.rsa->n));
166 RSA_print(bp,pkey->pkey.rsa,16);
167 }
168 else
169#endif
170#ifndef NO_DSA
171 if (pkey->type == EVP_PKEY_DSA)
172 {
173 BIO_printf(bp,"%12sDSA Public Key:\n","");
174 DSA_print(bp,pkey->pkey.dsa,16);
175 }
176 else
177#endif
178 BIO_printf(bp,"%12sDSA Public Key:\n","");
179
180 n=X509_get_ext_count(x);
181 if (n > 0)
182 {
183 BIO_printf(bp,"%8sX509v3 extensions:\n","");
184 for (i=0; i<n; i++)
185 {
186 int data_type,pack_type;
187 ASN1_OBJECT *obj;
188
189 ex=X509_get_ext(x,i);
190 if (BIO_printf(bp,"%12s","") <= 0) goto err;
191 obj=X509_EXTENSION_get_object(ex);
192 i2a_ASN1_OBJECT(bp,obj);
193 j=X509_EXTENSION_get_critical(ex);
194 if (BIO_printf(bp,": %s\n%16s",j?"critical":"","") <= 0)
195 goto err;
196
197 pack_type=X509v3_pack_type_by_OBJ(obj);
198 data_type=X509v3_data_type_by_OBJ(obj);
199
200 if (pack_type == X509_EXT_PACK_STRING)
201 {
202 if (X509v3_unpack_string(
203 &str,data_type,
204 X509_EXTENSION_get_data(ex)) == NULL)
205 {
206 /* hmm... */
207 goto err;
208 }
209 if ( (data_type == V_ASN1_IA5STRING) ||
210 (data_type == V_ASN1_PRINTABLESTRING) ||
211 (data_type == V_ASN1_T61STRING))
212 {
213 if (BIO_write(bp,(char *)str->data,
214 str->length) <= 0)
215 goto err;
216 }
217 else if (data_type == V_ASN1_BIT_STRING)
218 {
219 BIO_printf(bp,"0x");
220 for (j=0; j<str->length; j++)
221 {
222 BIO_printf(bp,"%02X",
223 str->data[j]);
224 }
225 }
226 }
227 else
228 {
229 ASN1_OCTET_STRING_print(bp,ex->value);
230 }
231 if (BIO_write(bp,"\n",1) <= 0) goto err;
232 }
233 }
234
235 i=OBJ_obj2nid(x->sig_alg->algorithm);
236 if (BIO_printf(bp,"%4sSignature Algorithm: %s","",
237 (i == NID_undef)?"UNKNOWN":OBJ_nid2ln(i)) <= 0) goto err;
238
239 n=x->signature->length;
240 s=(char *)x->signature->data;
241 for (i=0; i<n; i++)
242 {
243 if ((i%18) == 0)
244 if (BIO_write(bp,"\n ",9) <= 0) goto err;
245 if (BIO_printf(bp,"%02x%s",(unsigned char)s[i],
246 ((i+1) == n)?"":":") <= 0) goto err;
247 }
248 if (BIO_write(bp,"\n",1) != 1) goto err;
249 ret=1;
250err:
251 if (str != NULL) ASN1_STRING_free(str);
252 if (m != NULL) Free((char *)m);
253 return(ret);
254 }
255
256int ASN1_STRING_print(bp,v)
257BIO *bp;
258ASN1_STRING *v;
259 {
260 int i,n;
261 char buf[80],*p;;
262
263 if (v == NULL) return(0);
264 n=0;
265 p=(char *)v->data;
266 for (i=0; i<v->length; i++)
267 {
268 if ((p[i] > '~') || ((p[i] < ' ') &&
269 (p[i] != '\n') && (p[i] != '\r')))
270 buf[n]='.';
271 else
272 buf[n]=p[i];
273 n++;
274 if (n >= 80)
275 {
276 if (BIO_write(bp,buf,n) <= 0)
277 return(0);
278 n=0;
279 }
280 }
281 if (n > 0)
282 if (BIO_write(bp,buf,n) <= 0)
283 return(0);
284 return(1);
285 }
286
287int ASN1_UTCTIME_print(bp,tm)
288BIO *bp;
289ASN1_UTCTIME *tm;
290 {
291 char *v;
292 int gmt=0;
293 static char *mon[12]={
294 "Jan","Feb","Mar","Apr","May","Jun",
295 "Jul","Aug","Sep","Oct","Nov","Dec"};
296 int i;
297 int y=0,M=0,d=0,h=0,m=0,s=0;
298
299 i=tm->length;
300 v=(char *)tm->data;
301
302 if (i < 10) goto err;
303 if (v[i-1] == 'Z') gmt=1;
304 for (i=0; i<10; i++)
305 if ((v[i] > '9') || (v[i] < '0')) goto err;
306 y= (v[0]-'0')*10+(v[1]-'0');
307 if (y < 50) y+=100;
308 M= (v[2]-'0')*10+(v[3]-'0');
309 if ((M > 12) || (M < 1)) goto err;
310 d= (v[4]-'0')*10+(v[5]-'0');
311 h= (v[6]-'0')*10+(v[7]-'0');
312 m= (v[8]-'0')*10+(v[9]-'0');
313 if ( (v[10] >= '0') && (v[10] <= '9') &&
314 (v[11] >= '0') && (v[11] <= '9'))
315 s= (v[10]-'0')*10+(v[11]-'0');
316
317 if (BIO_printf(bp,"%s %2d %02d:%02d:%02d %d%s",
318 mon[M-1],d,h,m,s,y+1900,(gmt)?" GMT":"") <= 0)
319 return(0);
320 else
321 return(1);
322err:
323 BIO_write(bp,"Bad time value",14);
324 return(0);
325 }
326
327int X509_NAME_print(bp,name,obase)
328BIO *bp;
329X509_NAME *name;
330int obase;
331 {
332 char *s,*c;
333 int ret=0,l,ll,i,first=1;
334 char buf[256];
335
336 ll=80-2-obase;
337
338 s=X509_NAME_oneline(name,buf,256);
339 s++; /* skip the first slash */
340
341 l=ll;
342 c=s;
343 for (;;)
344 {
345 if ( ((*s == '/') &&
346 ((s[1] >= 'A') && (s[1] <= 'Z') && (
347 (s[2] == '=') ||
348 ((s[2] >= 'A') && (s[2] <= 'Z') &&
349 (s[3] == '='))
350 ))) ||
351 (*s == '\0'))
352 {
353 if ((l <= 0) && !first)
354 {
355 first=0;
356 if (BIO_write(bp,"\n",1) != 1) goto err;
357 for (i=0; i<obase; i++)
358 {
359 if (BIO_write(bp," ",1) != 1) goto err;
360 }
361 l=ll;
362 }
363 i=s-c;
364 if (BIO_write(bp,c,i) != i) goto err;
365 c+=i;
366 c++;
367 if (*s != '\0')
368 {
369 if (BIO_write(bp,", ",2) != 2) goto err;
370 }
371 l--;
372 }
373 if (*s == '\0') break;
374 s++;
375 l--;
376 }
377
378 ret=1;
379 if (0)
380 {
381err:
382 X509err(X509_F_X509_NAME_PRINT,ERR_R_BUF_LIB);
383 }
384 return(ret);
385 }
386