Branch data Line data Source code
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 <openssl/buffer.h>
62 : : #include <openssl/bn.h>
63 : : #ifndef OPENSSL_NO_RSA
64 : : #include <openssl/rsa.h>
65 : : #endif
66 : : #ifndef OPENSSL_NO_DSA
67 : : #include <openssl/dsa.h>
68 : : #endif
69 : : #ifndef OPENSSL_NO_EC
70 : : #include <openssl/ec.h>
71 : : #endif
72 : : #include <openssl/objects.h>
73 : : #include <openssl/x509.h>
74 : : #include <openssl/x509v3.h>
75 : : #include "asn1_locl.h"
76 : :
77 : : #ifndef OPENSSL_NO_FP_API
78 : 0 : int X509_print_fp(FILE *fp, X509 *x)
79 : : {
80 : 0 : return X509_print_ex_fp(fp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
81 : : }
82 : :
83 : 0 : int X509_print_ex_fp(FILE *fp, X509 *x, unsigned long nmflag, unsigned long cflag)
84 : : {
85 : : BIO *b;
86 : : int ret;
87 : :
88 [ # # ]: 0 : if ((b=BIO_new(BIO_s_file())) == NULL)
89 : : {
90 : 0 : X509err(X509_F_X509_PRINT_EX_FP,ERR_R_BUF_LIB);
91 : 0 : return(0);
92 : : }
93 : 0 : BIO_set_fp(b,fp,BIO_NOCLOSE);
94 : 0 : ret=X509_print_ex(b, x, nmflag, cflag);
95 : 0 : BIO_free(b);
96 : 0 : return(ret);
97 : : }
98 : : #endif
99 : :
100 : 4 : int X509_print(BIO *bp, X509 *x)
101 : : {
102 : 4 : return X509_print_ex(bp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
103 : : }
104 : :
105 : 39 : int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, unsigned long cflag)
106 : : {
107 : : long l;
108 : 39 : int ret=0,i;
109 : 39 : char *m=NULL,mlch = ' ';
110 : 39 : int nmindent = 0;
111 : : X509_CINF *ci;
112 : : ASN1_INTEGER *bs;
113 : 39 : EVP_PKEY *pkey=NULL;
114 : : const char *neg;
115 : :
116 [ + + ]: 39 : if((nmflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
117 : 2 : mlch = '\n';
118 : 2 : nmindent = 12;
119 : : }
120 : :
121 [ + + ]: 39 : if(nmflags == X509_FLAG_COMPAT)
122 : 37 : nmindent = 16;
123 : :
124 : 39 : ci=x->cert_info;
125 [ + + ]: 39 : if(!(cflag & X509_FLAG_NO_HEADER))
126 : : {
127 [ + - ]: 37 : if (BIO_write(bp,"Certificate:\n",13) <= 0) goto err;
128 [ + - ]: 37 : if (BIO_write(bp," Data:\n",10) <= 0) goto err;
129 : : }
130 [ + + ]: 39 : if(!(cflag & X509_FLAG_NO_VERSION))
131 : : {
132 : 37 : l=X509_get_version(x);
133 [ + - ]: 37 : if (BIO_printf(bp,"%8sVersion: %lu (0x%lx)\n","",l+1,l) <= 0) goto err;
134 : : }
135 [ + - ]: 39 : if(!(cflag & X509_FLAG_NO_SERIAL))
136 : : {
137 : :
138 [ + - ]: 39 : if (BIO_write(bp," Serial Number:",22) <= 0) goto err;
139 : :
140 : 39 : bs=X509_get_serialNumber(x);
141 [ + - ]: 39 : if (bs->length <= (int)sizeof(long))
142 : : {
143 : 39 : l=ASN1_INTEGER_get(bs);
144 [ - + ]: 39 : if (bs->type == V_ASN1_NEG_INTEGER)
145 : : {
146 : 0 : l= -l;
147 : 0 : neg="-";
148 : : }
149 : : else
150 : : neg="";
151 [ + - ]: 39 : if (BIO_printf(bp," %s%lu (%s0x%lx)\n",neg,l,neg,l) <= 0)
152 : : goto err;
153 : : }
154 : : else
155 : : {
156 [ # # ]: 0 : neg=(bs->type == V_ASN1_NEG_INTEGER)?" (Negative)":"";
157 [ # # ]: 0 : if (BIO_printf(bp,"\n%12s%s","",neg) <= 0) goto err;
158 : :
159 [ # # ]: 0 : for (i=0; i<bs->length; i++)
160 : : {
161 [ # # ][ # # ]: 0 : if (BIO_printf(bp,"%02x%c",bs->data[i],
162 : 0 : ((i+1 == bs->length)?'\n':':')) <= 0)
163 : : goto err;
164 : : }
165 : : }
166 : :
167 : : }
168 : :
169 [ + + ]: 39 : if(!(cflag & X509_FLAG_NO_SIGNAME))
170 : : {
171 [ + - ]: 37 : if(X509_signature_print(bp, x->sig_alg, NULL) <= 0)
172 : : goto err;
173 : : #if 0
174 : : if (BIO_printf(bp,"%8sSignature Algorithm: ","") <= 0)
175 : : goto err;
176 : : if (i2a_ASN1_OBJECT(bp, ci->signature->algorithm) <= 0)
177 : : goto err;
178 : : if (BIO_puts(bp, "\n") <= 0)
179 : : goto err;
180 : : #endif
181 : : }
182 : :
183 [ + + ]: 39 : if(!(cflag & X509_FLAG_NO_ISSUER))
184 : : {
185 [ + - ]: 37 : if (BIO_printf(bp," Issuer:%c",mlch) <= 0) goto err;
186 [ + - ]: 37 : if (X509_NAME_print_ex(bp,X509_get_issuer_name(x),nmindent, nmflags) < 0) goto err;
187 [ + - ]: 37 : if (BIO_write(bp,"\n",1) <= 0) goto err;
188 : : }
189 [ + - ]: 39 : if(!(cflag & X509_FLAG_NO_VALIDITY))
190 : : {
191 [ + - ]: 39 : if (BIO_write(bp," Validity\n",17) <= 0) goto err;
192 [ + - ]: 39 : if (BIO_write(bp," Not Before: ",24) <= 0) goto err;
193 [ + - ]: 39 : if (!ASN1_TIME_print(bp,X509_get_notBefore(x))) goto err;
194 [ + - ]: 39 : if (BIO_write(bp,"\n Not After : ",25) <= 0) goto err;
195 [ + - ]: 39 : if (!ASN1_TIME_print(bp,X509_get_notAfter(x))) goto err;
196 [ + - ]: 39 : if (BIO_write(bp,"\n",1) <= 0) goto err;
197 : : }
198 [ + - ]: 39 : if(!(cflag & X509_FLAG_NO_SUBJECT))
199 : : {
200 [ + - ]: 39 : if (BIO_printf(bp," Subject:%c",mlch) <= 0) goto err;
201 [ + - ]: 39 : if (X509_NAME_print_ex(bp,X509_get_subject_name(x),nmindent, nmflags) < 0) goto err;
202 [ + - ]: 39 : if (BIO_write(bp,"\n",1) <= 0) goto err;
203 : : }
204 [ + + ]: 39 : if(!(cflag & X509_FLAG_NO_PUBKEY))
205 : : {
206 [ + - ]: 37 : if (BIO_write(bp," Subject Public Key Info:\n",33) <= 0)
207 : : goto err;
208 [ + - ]: 37 : if (BIO_printf(bp,"%12sPublic Key Algorithm: ","") <= 0)
209 : : goto err;
210 [ + - ]: 37 : if (i2a_ASN1_OBJECT(bp, ci->key->algor->algorithm) <= 0)
211 : : goto err;
212 [ + - ]: 37 : if (BIO_puts(bp, "\n") <= 0)
213 : : goto err;
214 : :
215 : 37 : pkey=X509_get_pubkey(x);
216 [ - + ]: 37 : if (pkey == NULL)
217 : : {
218 : 0 : BIO_printf(bp,"%12sUnable to load Public Key\n","");
219 : 0 : ERR_print_errors(bp);
220 : : }
221 : : else
222 : : {
223 : 37 : EVP_PKEY_print_public(bp, pkey, 16, NULL);
224 : 37 : EVP_PKEY_free(pkey);
225 : : }
226 : : }
227 : :
228 [ + - ]: 39 : if(!(cflag & X509_FLAG_NO_IDS))
229 : : {
230 [ - + ]: 39 : if (ci->issuerUID)
231 : : {
232 [ # # ]: 0 : if (BIO_printf(bp,"%8sIssuer Unique ID: ","") <= 0)
233 : : goto err;
234 [ # # ]: 0 : if (!X509_signature_dump(bp, ci->issuerUID, 12))
235 : : goto err;
236 : : }
237 [ - + ]: 39 : if (ci->subjectUID)
238 : : {
239 [ # # ]: 0 : if (BIO_printf(bp,"%8sSubject Unique ID: ","") <= 0)
240 : : goto err;
241 [ # # ]: 0 : if (!X509_signature_dump(bp, ci->subjectUID, 12))
242 : : goto err;
243 : : }
244 : : }
245 : :
246 [ + - ]: 39 : if (!(cflag & X509_FLAG_NO_EXTENSIONS))
247 : 39 : X509V3_extensions_print(bp, "X509v3 extensions",
248 : : ci->extensions, cflag, 8);
249 : :
250 [ + + ]: 39 : if(!(cflag & X509_FLAG_NO_SIGDUMP))
251 : : {
252 [ + - ]: 37 : if(X509_signature_print(bp, x->sig_alg, x->signature) <= 0) goto err;
253 : : }
254 [ + - ]: 39 : if(!(cflag & X509_FLAG_NO_AUX))
255 : : {
256 [ + - ]: 39 : if (!X509_CERT_AUX_print(bp, x->aux, 0)) goto err;
257 : : }
258 : : ret=1;
259 : : err:
260 : : if (m != NULL) OPENSSL_free(m);
261 : 39 : return(ret);
262 : : }
263 : :
264 : 0 : int X509_ocspid_print (BIO *bp, X509 *x)
265 : : {
266 : 0 : unsigned char *der=NULL ;
267 : : unsigned char *dertmp;
268 : : int derlen;
269 : : int i;
270 : : unsigned char SHA1md[SHA_DIGEST_LENGTH];
271 : :
272 : : /* display the hash of the subject as it would appear
273 : : in OCSP requests */
274 [ # # ]: 0 : if (BIO_printf(bp," Subject OCSP hash: ") <= 0)
275 : : goto err;
276 : 0 : derlen = i2d_X509_NAME(x->cert_info->subject, NULL);
277 [ # # ]: 0 : if ((der = dertmp = (unsigned char *)OPENSSL_malloc (derlen)) == NULL)
278 : : goto err;
279 : 0 : i2d_X509_NAME(x->cert_info->subject, &dertmp);
280 : :
281 [ # # ]: 0 : if (!EVP_Digest(der, derlen, SHA1md, NULL, EVP_sha1(), NULL))
282 : : goto err;
283 [ # # ]: 0 : for (i=0; i < SHA_DIGEST_LENGTH; i++)
284 : : {
285 [ # # ]: 0 : if (BIO_printf(bp,"%02X",SHA1md[i]) <= 0) goto err;
286 : : }
287 : 0 : OPENSSL_free (der);
288 : 0 : der=NULL;
289 : :
290 : : /* display the hash of the public key as it would appear
291 : : in OCSP requests */
292 [ # # ]: 0 : if (BIO_printf(bp,"\n Public key OCSP hash: ") <= 0)
293 : : goto err;
294 : :
295 [ # # ]: 0 : if (!EVP_Digest(x->cert_info->key->public_key->data,
296 : 0 : x->cert_info->key->public_key->length,
297 : : SHA1md, NULL, EVP_sha1(), NULL))
298 : : goto err;
299 [ # # ]: 0 : for (i=0; i < SHA_DIGEST_LENGTH; i++)
300 : : {
301 [ # # ]: 0 : if (BIO_printf(bp,"%02X",SHA1md[i]) <= 0)
302 : : goto err;
303 : : }
304 : 0 : BIO_printf(bp,"\n");
305 : :
306 : 0 : return (1);
307 : : err:
308 [ # # ]: 0 : if (der != NULL) OPENSSL_free(der);
309 : : return(0);
310 : : }
311 : :
312 : 40 : int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent)
313 : : {
314 : : const unsigned char *s;
315 : : int i, n;
316 : :
317 : 40 : n=sig->length;
318 : 40 : s=sig->data;
319 [ + + ]: 5096 : for (i=0; i<n; i++)
320 : : {
321 [ + + ]: 5056 : if ((i%18) == 0)
322 : : {
323 [ + - ]: 316 : if (BIO_write(bp,"\n",1) <= 0) return 0;
324 [ + - ]: 316 : if (BIO_indent(bp, indent, indent) <= 0) return 0;
325 : : }
326 [ + + ][ + - ]: 5056 : if (BIO_printf(bp,"%02x%s",s[i],
327 : 5056 : ((i+1) == n)?"":":") <= 0) return 0;
328 : : }
329 [ + - ]: 40 : if (BIO_write(bp,"\n",1) != 1) return 0;
330 : :
331 : 40 : return 1;
332 : : }
333 : :
334 : 77 : int X509_signature_print(BIO *bp, X509_ALGOR *sigalg, ASN1_STRING *sig)
335 : : {
336 : : int sig_nid;
337 [ + - ]: 77 : if (BIO_puts(bp," Signature Algorithm: ") <= 0) return 0;
338 [ + - ]: 77 : if (i2a_ASN1_OBJECT(bp, sigalg->algorithm) <= 0) return 0;
339 : :
340 : 77 : sig_nid = OBJ_obj2nid(sigalg->algorithm);
341 [ + - ]: 77 : if (sig_nid != NID_undef)
342 : : {
343 : : int pkey_nid, dig_nid;
344 : : const EVP_PKEY_ASN1_METHOD *ameth;
345 [ + - ]: 77 : if (OBJ_find_sigid_algs(sig_nid, &dig_nid, &pkey_nid))
346 : : {
347 : 77 : ameth = EVP_PKEY_asn1_find(NULL, pkey_nid);
348 [ + - ][ + - ]: 77 : if (ameth && ameth->sig_print)
349 : 77 : return ameth->sig_print(bp, sigalg, sig, 9, 0);
350 : : }
351 : : }
352 [ # # ]: 0 : if (sig)
353 : 0 : return X509_signature_dump(bp, sig, 9);
354 [ # # ]: 0 : else if (BIO_puts(bp, "\n") <= 0)
355 : : return 0;
356 : 0 : return 1;
357 : : }
358 : :
359 : 0 : int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v)
360 : : {
361 : : int i,n;
362 : : char buf[80];
363 : : const char *p;
364 : :
365 [ # # ]: 0 : if (v == NULL) return(0);
366 : 0 : n=0;
367 : 0 : p=(const char *)v->data;
368 [ # # ]: 0 : for (i=0; i<v->length; i++)
369 : : {
370 [ # # ][ # # ]: 0 : if ((p[i] > '~') || ((p[i] < ' ') &&
371 [ # # ]: 0 : (p[i] != '\n') && (p[i] != '\r')))
372 : 0 : buf[n]='.';
373 : : else
374 : 0 : buf[n]=p[i];
375 : 0 : n++;
376 [ # # ]: 0 : if (n >= 80)
377 : : {
378 [ # # ]: 0 : if (BIO_write(bp,buf,n) <= 0)
379 : : return(0);
380 : : n=0;
381 : : }
382 : : }
383 [ # # ]: 0 : if (n > 0)
384 [ # # ]: 0 : if (BIO_write(bp,buf,n) <= 0)
385 : : return(0);
386 : : return(1);
387 : : }
388 : :
389 : 86 : int ASN1_TIME_print(BIO *bp, const ASN1_TIME *tm)
390 : : {
391 [ + - ]: 86 : if(tm->type == V_ASN1_UTCTIME) return ASN1_UTCTIME_print(bp, tm);
392 [ # # ]: 0 : if(tm->type == V_ASN1_GENERALIZEDTIME)
393 : 0 : return ASN1_GENERALIZEDTIME_print(bp, tm);
394 : 0 : BIO_write(bp,"Bad time value",14);
395 : 0 : return(0);
396 : : }
397 : :
398 : : static const char *mon[12]=
399 : : {
400 : : "Jan","Feb","Mar","Apr","May","Jun",
401 : : "Jul","Aug","Sep","Oct","Nov","Dec"
402 : : };
403 : :
404 : 5 : int ASN1_GENERALIZEDTIME_print(BIO *bp, const ASN1_GENERALIZEDTIME *tm)
405 : : {
406 : : char *v;
407 : 5 : int gmt=0;
408 : : int i;
409 : 5 : int y=0,M=0,d=0,h=0,m=0,s=0;
410 : 5 : char *f = NULL;
411 : 5 : int f_len = 0;
412 : :
413 : 5 : i=tm->length;
414 : 5 : v=(char *)tm->data;
415 : :
416 [ + - ]: 5 : if (i < 12) goto err;
417 [ + - ]: 5 : if (v[i-1] == 'Z') gmt=1;
418 [ + + ]: 65 : for (i=0; i<12; i++)
419 [ + - ]: 60 : if ((v[i] > '9') || (v[i] < '0')) goto err;
420 : 5 : y= (v[0]-'0')*1000+(v[1]-'0')*100 + (v[2]-'0')*10+(v[3]-'0');
421 : 5 : M= (v[4]-'0')*10+(v[5]-'0');
422 [ + - ]: 5 : if ((M > 12) || (M < 1)) goto err;
423 : 5 : d= (v[6]-'0')*10+(v[7]-'0');
424 : 5 : h= (v[8]-'0')*10+(v[9]-'0');
425 : 5 : m= (v[10]-'0')*10+(v[11]-'0');
426 [ + - ][ + - ]: 5 : if (tm->length >= 14 &&
427 [ + - ][ + - ]: 5 : (v[12] >= '0') && (v[12] <= '9') &&
428 [ + - ]: 5 : (v[13] >= '0') && (v[13] <= '9'))
429 : : {
430 : 5 : s= (v[12]-'0')*10+(v[13]-'0');
431 : : /* Check for fractions of seconds. */
432 [ + - ][ - + ]: 5 : if (tm->length >= 15 && v[14] == '.')
433 : : {
434 : 0 : int l = tm->length;
435 : 0 : f = &v[14]; /* The decimal point. */
436 : 0 : f_len = 1;
437 [ # # ][ # # ]: 0 : while (14 + f_len < l && f[f_len] >= '0' && f[f_len] <= '9')
[ # # ]
438 : 0 : ++f_len;
439 : : }
440 : : }
441 : :
442 [ - + ][ + - ]: 5 : if (BIO_printf(bp,"%s %2d %02d:%02d:%02d%.*s %d%s",
443 : 5 : mon[M-1],d,h,m,s,f_len,f,y,(gmt)?" GMT":"") <= 0)
444 : : return(0);
445 : : else
446 : 5 : return(1);
447 : : err:
448 : 0 : BIO_write(bp,"Bad time value",14);
449 : 0 : return(0);
450 : : }
451 : :
452 : 86 : int ASN1_UTCTIME_print(BIO *bp, const ASN1_UTCTIME *tm)
453 : : {
454 : : const char *v;
455 : 86 : int gmt=0;
456 : : int i;
457 : 86 : int y=0,M=0,d=0,h=0,m=0,s=0;
458 : :
459 : 86 : i=tm->length;
460 : 86 : v=(const char *)tm->data;
461 : :
462 [ + - ]: 86 : if (i < 10) goto err;
463 [ + - ]: 86 : if (v[i-1] == 'Z') gmt=1;
464 [ + + ]: 946 : for (i=0; i<10; i++)
465 [ + - ]: 860 : if ((v[i] > '9') || (v[i] < '0')) goto err;
466 : 86 : y= (v[0]-'0')*10+(v[1]-'0');
467 [ + - ]: 86 : if (y < 50) y+=100;
468 : 86 : M= (v[2]-'0')*10+(v[3]-'0');
469 [ + - ]: 86 : if ((M > 12) || (M < 1)) goto err;
470 : 86 : d= (v[4]-'0')*10+(v[5]-'0');
471 : 86 : h= (v[6]-'0')*10+(v[7]-'0');
472 : 86 : m= (v[8]-'0')*10+(v[9]-'0');
473 [ + - ][ + - ]: 86 : if (tm->length >=12 &&
474 [ + - ][ + - ]: 86 : (v[10] >= '0') && (v[10] <= '9') &&
475 [ + - ]: 86 : (v[11] >= '0') && (v[11] <= '9'))
476 : 86 : s= (v[10]-'0')*10+(v[11]-'0');
477 : :
478 [ - + ][ + - ]: 86 : if (BIO_printf(bp,"%s %2d %02d:%02d:%02d %d%s",
479 : 86 : mon[M-1],d,h,m,s,y+1900,(gmt)?" GMT":"") <= 0)
480 : : return(0);
481 : : else
482 : 86 : return(1);
483 : : err:
484 : 0 : BIO_write(bp,"Bad time value",14);
485 : 0 : return(0);
486 : : }
487 : :
488 : 77 : int X509_NAME_print(BIO *bp, X509_NAME *name, int obase)
489 : : {
490 : : char *s,*c,*b;
491 : 77 : int ret=0,l,i;
492 : :
493 : 77 : l=80-2-obase;
494 : :
495 : 77 : b=X509_NAME_oneline(name,NULL,0);
496 [ + - ]: 77 : if (!b)
497 : : return 0;
498 [ - + ]: 77 : if (!*b)
499 : : {
500 : 0 : OPENSSL_free(b);
501 : 0 : return 1;
502 : : }
503 : 77 : s=b+1; /* skip the first slash */
504 : :
505 : 77 : c=s;
506 : : for (;;)
507 : : {
508 : : #ifndef CHARSET_EBCDIC
509 [ + + ][ + + ]: 4293 : if ( ((*s == '/') &&
510 [ + + ]: 285 : ((s[1] >= 'A') && (s[1] <= 'Z') && (
511 [ + - ]: 208 : (s[2] == '=') ||
512 [ - + ]: 208 : ((s[2] >= 'A') && (s[2] <= 'Z') &&
513 : 208 : (s[3] == '='))
514 [ + + ]: 4008 : ))) ||
515 : : (*s == '\0'))
516 : : #else
517 : : if ( ((*s == '/') &&
518 : : (isupper(s[1]) && (
519 : : (s[2] == '=') ||
520 : : (isupper(s[2]) &&
521 : : (s[3] == '='))
522 : : ))) ||
523 : : (*s == '\0'))
524 : : #endif
525 : : {
526 : 362 : i=s-c;
527 [ + - ]: 362 : if (BIO_write(bp,c,i) != i) goto err;
528 : 362 : c=s+1; /* skip following slash */
529 [ + + ]: 362 : if (*s != '\0')
530 : : {
531 [ + - ]: 285 : if (BIO_write(bp,", ",2) != 2) goto err;
532 : : }
533 : 362 : l--;
534 : : }
535 [ + + ]: 4293 : if (*s == '\0') break;
536 : 4216 : s++;
537 : 4216 : l--;
538 : 4216 : }
539 : :
540 : : ret=1;
541 : : if (0)
542 : : {
543 : : err:
544 : 0 : X509err(X509_F_X509_NAME_PRINT,ERR_R_BUF_LIB);
545 : : }
546 : 77 : OPENSSL_free(b);
547 : 77 : return(ret);
548 : : }
|