LCOV - code coverage report
Current view: top level - asn1 - t_x509.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 158 234 67.5 %
Date: 2014-08-02 Functions: 8 12 66.7 %
Branches: 115 262 43.9 %

           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                 :            :         }

Generated by: LCOV version 1.9