The other log message should have read "Note the DSA change".
[openssl.git] / crypto / asn1 / t_x509.c
index 9a8c8bf0ca7354c35d1c717226dfd2c038c964b5..314bdfb1c713d7cd218cefe1665c6668d8bd5c55 100644 (file)
 
 #include <stdio.h>
 #include "cryptlib.h"
-#include "buffer.h"
-#include "bn.h"
+#include <openssl/buffer.h>
+#include <openssl/bn.h>
 #ifndef NO_RSA
-#include "rsa.h"
+#include <openssl/rsa.h>
 #endif
 #ifndef NO_DSA
-#include "dsa.h"
+#include <openssl/dsa.h>
 #endif
-#include "objects.h"
-#include "x509.h"
+#include <openssl/objects.h>
+#include <openssl/x509.h>
+#include <openssl/x509v3.h>
 
 #ifndef NO_FP_API
-int X509_print_fp(fp,x)
-FILE *fp;
-X509 *x;
+int X509_print_fp(FILE *fp, X509 *x)
         {
         BIO *b;
         int ret;
@@ -89,9 +88,7 @@ X509 *x;
         }
 #endif
 
-int X509_print(bp,x)
-BIO *bp;
-X509 *x;
+int X509_print(BIO *bp, X509 *x)
        {
        long l;
        int ret=0,i,j,n;
@@ -99,7 +96,7 @@ X509 *x;
        X509_CINF *ci;
        ASN1_INTEGER *bs;
        EVP_PKEY *pkey=NULL;
-       char *neg;
+       const char *neg;
        X509_EXTENSION *ex;
        ASN1_STRING *str=NULL;
 
@@ -146,9 +143,9 @@ X509 *x;
        if (!X509_NAME_print(bp,X509_get_issuer_name(x),16)) goto err;
        if (BIO_write(bp,"\n        Validity\n",18) <= 0) goto err;
        if (BIO_write(bp,"            Not Before: ",24) <= 0) goto err;
-       if (!ASN1_UTCTIME_print(bp,X509_get_notBefore(x))) goto err;
+       if (!ASN1_TIME_print(bp,X509_get_notBefore(x))) goto err;
        if (BIO_write(bp,"\n            Not After : ",25) <= 0) goto err;
-       if (!ASN1_UTCTIME_print(bp,X509_get_notAfter(x))) goto err;
+       if (!ASN1_TIME_print(bp,X509_get_notAfter(x))) goto err;
        if (BIO_write(bp,"\n        Subject: ",18) <= 0) goto err;
        if (!X509_NAME_print(bp,X509_get_subject_name(x),16)) goto err;
        if (BIO_write(bp,"\n        Subject Public Key Info:\n",34) <= 0)
@@ -161,6 +158,7 @@ X509 *x;
        if (pkey == NULL)
                {
                BIO_printf(bp,"%12sUnable to load Public Key\n","");
+               ERR_print_errors(bp);
                }
        else
 #ifndef NO_RSA
@@ -182,56 +180,26 @@ X509 *x;
 #endif
                BIO_printf(bp,"%12sUnknown Public Key:\n","");
 
+       EVP_PKEY_free(pkey);
+
        n=X509_get_ext_count(x);
        if (n > 0)
                {
                BIO_printf(bp,"%8sX509v3 extensions:\n","");
                for (i=0; i<n; i++)
                        {
-                       int data_type,pack_type;
                        ASN1_OBJECT *obj;
-
                        ex=X509_get_ext(x,i);
                        if (BIO_printf(bp,"%12s","") <= 0) goto err;
                        obj=X509_EXTENSION_get_object(ex);
                        i2a_ASN1_OBJECT(bp,obj);
                        j=X509_EXTENSION_get_critical(ex);
-                       if (BIO_printf(bp,": %s\n%16s",j?"critical":"","") <= 0)
+                       if (BIO_printf(bp,": %s\n",j?"critical":"","") <= 0)
                                goto err;
-
-                       pack_type=X509v3_pack_type_by_OBJ(obj);
-                       data_type=X509v3_data_type_by_OBJ(obj);
-                       
-                       if (pack_type == X509_EXT_PACK_STRING)
-                               {
-                               if (X509v3_unpack_string(
-                                       &str,data_type,
-                                       X509_EXTENSION_get_data(ex)) == NULL)
-                                       {
-                                       /* hmm... */
-                                       goto err;
-                                       }
-                               if (    (data_type == V_ASN1_IA5STRING) ||
-                                       (data_type == V_ASN1_PRINTABLESTRING) ||
-                                       (data_type == V_ASN1_T61STRING))
-                                       {
-                                       if (BIO_write(bp,(char *)str->data,
-                                                       str->length) <= 0)
-                                               goto err;
-                                       }
-                               else if (data_type == V_ASN1_BIT_STRING)
-                                       {
-                                       BIO_printf(bp,"0x");
-                                       for (j=0; j<str->length; j++)
-                                               {
-                                               BIO_printf(bp,"%02X",
-                                                       str->data[j]);
-                                               }
-                                       }
-                               }
-                       else
+                       if(!X509V3_EXT_print(bp, ex, 0, 16))
                                {
-                               ASN1_OCTET_STRING_print(bp,ex->value);
+                               BIO_printf(bp, "%16s", "");
+                               M_ASN1_OCTET_STRING_print(bp,ex->value);
                                }
                        if (BIO_write(bp,"\n",1) <= 0) goto err;
                        }
@@ -251,16 +219,15 @@ X509 *x;
                        ((i+1) == n)?"":":") <= 0) goto err;
                }
        if (BIO_write(bp,"\n",1) != 1) goto err;
+       if (!X509_CERT_AUX_print(bp, x->aux, 0)) goto err;
        ret=1;
 err:
        if (str != NULL) ASN1_STRING_free(str);
-       if (m != NULL) Free((char *)m);
+       if (m != NULL) OPENSSL_free(m);
        return(ret);
        }
 
-int ASN1_STRING_print(bp,v)
-BIO *bp;
-ASN1_STRING *v;
+int ASN1_STRING_print(BIO *bp, ASN1_STRING *v)
        {
        int i,n;
        char buf[80],*p;;
@@ -289,15 +256,59 @@ ASN1_STRING *v;
        return(1);
        }
 
-int ASN1_UTCTIME_print(bp,tm)
-BIO *bp;
-ASN1_UTCTIME *tm;
+int ASN1_TIME_print(BIO *bp, ASN1_TIME *tm)
+{
+       if(tm->type == V_ASN1_UTCTIME) return ASN1_UTCTIME_print(bp, tm);
+       if(tm->type == V_ASN1_GENERALIZEDTIME)
+                               return ASN1_GENERALIZEDTIME_print(bp, tm);
+       BIO_write(bp,"Bad time value",14);
+       return(0);
+}
+
+static const char *mon[12]=
+    {
+    "Jan","Feb","Mar","Apr","May","Jun",
+    "Jul","Aug","Sep","Oct","Nov","Dec"
+    };
+
+int ASN1_GENERALIZEDTIME_print(BIO *bp, ASN1_GENERALIZEDTIME *tm)
+       {
+       char *v;
+       int gmt=0;
+       int i;
+       int y=0,M=0,d=0,h=0,m=0,s=0;
+
+       i=tm->length;
+       v=(char *)tm->data;
+
+       if (i < 12) goto err;
+       if (v[i-1] == 'Z') gmt=1;
+       for (i=0; i<12; i++)
+               if ((v[i] > '9') || (v[i] < '0')) goto err;
+       y= (v[0]-'0')*1000+(v[1]-'0')*100 + (v[2]-'0')*10+(v[3]-'0');
+       M= (v[4]-'0')*10+(v[5]-'0');
+       if ((M > 12) || (M < 1)) goto err;
+       d= (v[6]-'0')*10+(v[7]-'0');
+       h= (v[8]-'0')*10+(v[9]-'0');
+       m=  (v[10]-'0')*10+(v[11]-'0');
+       if (    (v[12] >= '0') && (v[12] <= '9') &&
+               (v[13] >= '0') && (v[13] <= '9'))
+               s=  (v[12]-'0')*10+(v[13]-'0');
+
+       if (BIO_printf(bp,"%s %2d %02d:%02d:%02d %d%s",
+               mon[M-1],d,h,m,s,y,(gmt)?" GMT":"") <= 0)
+               return(0);
+       else
+               return(1);
+err:
+       BIO_write(bp,"Bad time value",14);
+       return(0);
+       }
+
+int ASN1_UTCTIME_print(BIO *bp, ASN1_UTCTIME *tm)
        {
        char *v;
        int gmt=0;
-       static char *mon[12]={
-               "Jan","Feb","Mar","Apr","May","Jun",
-               "Jul","Aug","Sep","Oct","Nov","Dec"};
        int i;
        int y=0,M=0,d=0,h=0,m=0,s=0;
 
@@ -329,10 +340,7 @@ err:
        return(0);
        }
 
-int X509_NAME_print(bp,name,obase)
-BIO *bp;
-X509_NAME *name;
-int obase;
+int X509_NAME_print(BIO *bp, X509_NAME *name, int obase)
        {
        char *s,*c;
        int ret=0,l,ll,i,first=1;
@@ -347,6 +355,7 @@ int obase;
        c=s;
        for (;;)
                {
+#ifndef CHARSET_EBCDIC
                if (    ((*s == '/') &&
                                ((s[1] >= 'A') && (s[1] <= 'Z') && (
                                        (s[2] == '=') ||
@@ -354,6 +363,15 @@ int obase;
                                        (s[3] == '='))
                                 ))) ||
                        (*s == '\0'))
+#else
+               if (    ((*s == '/') &&
+                               (isupper(s[1]) && (
+                                       (s[2] == '=') ||
+                                       (isupper(s[2]) &&
+                                       (s[3] == '='))
+                                ))) ||
+                       (*s == '\0'))
+#endif
                        {
                        if ((l <= 0) && !first)
                                {