]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Use gnutls_x509_crt_print.
authorSimon Josefsson <simon@josefsson.org>
Fri, 9 Feb 2007 13:19:39 +0000 (13:19 +0000)
committerSimon Josefsson <simon@josefsson.org>
Fri, 9 Feb 2007 13:19:39 +0000 (13:19 +0000)
src/certtool.c

index f563b7e759473de859b6cb429d9061f81ba809ed..c19518a7e259a384e9cff855105f16bb0afed1a4 100644 (file)
@@ -1220,483 +1220,19 @@ print_hex_datum (gnutls_datum * dat)
 static void
 print_certificate_info (gnutls_x509_crt crt, FILE *out, unsigned int all)
 {
+  gnutls_datum_t out;
   int ret;
-  unsigned int i, indx, j, version;
-  unsigned int critical, key_usage, bits;
-  time_t tim;
-  char serial[40];
-  size_t serial_size = sizeof (serial), dn_size, size;
-  const char *cprint;
-  char dn[256];
-  char oid[128] = "";
-  char old_oid[128] = "";
-  char *tmp;
-
-  fprintf (out, "\n\nX.509 certificate info:\n\n");
-
-  version = gnutls_x509_crt_get_version (crt);
-  fprintf (out, "Version: %d\n", version);
-
-  /* serial number
-   */
-  if (gnutls_x509_crt_get_serial (crt, serial, &serial_size) >= 0)
-    {
-      fprintf (out, "Serial Number (hex): %s\n",
-              raw_to_string (serial, serial_size));
-    }
-
-  /* Subject
-   */
-  dn_size = sizeof (dn);
-  ret = gnutls_x509_crt_get_dn (crt, dn, &dn_size);
-  if (ret >= 0)
-    fprintf (out, "Subject: %s\n", dn);
-  else
-    fprintf (stderr, "get_dn: %s\n", gnutls_strerror (ret));
-
-  /* Issuer
-   */
-  if (all)
-    {
-      dn_size = sizeof (dn);
-      ret = gnutls_x509_crt_get_issuer_dn (crt, dn, &dn_size);
-      if (ret >= 0)
-       fprintf (out, "Issuer: %s\n", dn);
-      else
-       fprintf (stderr, "get_issuer_dn: %s\n", gnutls_strerror (ret));
-
-
-      /* signature algorithm
-       */
-      fprintf (out, "Signature Algorithm: ");
-      ret = gnutls_x509_crt_get_signature_algorithm (crt);
-
-      cprint = gnutls_sign_algorithm_get_name (ret);
-      if (cprint == NULL)
-       cprint = UNKNOWN;
-      fprintf (out, "%s\n", cprint);
-      if (ret == GNUTLS_SIGN_RSA_MD5 || ret == GNUTLS_SIGN_RSA_MD2)
-       {
-         fprintf (stderr,
-                  "Warning: certificate uses a broken signature algorithm that can be forged.\n");
-       }
-    }
-
-  /* Validity
-   */
-  fprintf (out, "Validity:\n");
-
-  tim = gnutls_x509_crt_get_activation_time (crt);
-  tmp = asctime (gmtime (&tim));
-  tmp[strlen(tmp)-1] = '\0';
-  fprintf (out, "\tNot Before: %s UTC\n", tmp);
-
-  tim = gnutls_x509_crt_get_expiration_time (crt);
-  tmp = asctime (gmtime (&tim));
-  tmp[strlen(tmp)-1] = '\0';
-  fprintf (out, "\tNot After: %s UTC\n", tmp);
-
-  /* Public key algorithm
-   */
-  fprintf (out, "Subject Public Key Info:\n");
-  ret = gnutls_x509_crt_get_pk_algorithm (crt, &bits);
-  fprintf (out, "\tPublic Key Algorithm: ");
-
-  cprint = gnutls_pk_algorithm_get_name (ret);
-  if (cprint == NULL)
-    cprint = UNKNOWN;
-  fprintf (out, "%s", cprint);
-  if (ret >= 0 && bits)
-    fprintf (out, " (%u bits)", bits);
-  fprintf (out, "\n");
-
-  /* Print the raw public keys    
-   */
-  if (all)
-    {
-      if (ret == GNUTLS_PK_RSA)
-       {
-         gnutls_datum m, e;
-
-         ret = gnutls_x509_crt_get_pk_rsa_raw (crt, &m, &e);
-         if (ret < 0)
-           {
-             fprintf (stderr, "Error in key RSA data export: %s\n",
-                      gnutls_strerror (ret));
-           }
-
-         fprintf (outfile, "modulus:");
-         print_hex_datum (&m);
-         fprintf (outfile, "public exponent:");
-         print_hex_datum (&e);
-
-       }
-      else if (ret == GNUTLS_PK_DSA)
-       {
-         gnutls_datum p, q, g, y;
-
-         ret = gnutls_x509_crt_get_pk_dsa_raw (crt, &p, &q, &g, &y);
-         if (ret < 0)
-           {
-             fprintf (stderr, "Error in key DSA data export: %s\n",
-                      gnutls_strerror (ret));
-           }
-
-         fprintf (outfile, "public key:");
-         print_hex_datum (&y);
-         fprintf (outfile, "p:");
-         print_hex_datum (&p);
-         fprintf (outfile, "q:");
-         print_hex_datum (&q);
-         fprintf (outfile, "g:");
-         print_hex_datum (&g);
-       }
-    }
-
-  if (version >= 3)
-    fprintf (out, "\nX.509 Extensions:\n");
-
-  /* subject alternative name
-   */
-  for (i = 0; !(ret < 0); i++)
-    {
-      size = sizeof (buffer);
-      ret =
-       gnutls_x509_crt_get_subject_alt_name (crt, i, buffer, &size,
-                                             &critical);
-
-      if (i == 0 && ret != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
-       {
-         fprintf (out, "\tSubject Alternative name:");
-         if (critical)
-           fprintf (out, " (critical)");
-         fprintf (out, "\n");
-       }
-
-      if (ret < 0 && ret != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
-       {
-         fprintf (out, "\t\tFound unsupported alternative name.\n");
-       }
-      else
-       switch (ret)
-         {
-         case GNUTLS_SAN_DNSNAME:
-           fprintf (out, "\t\tDNSname: %s\n", buffer);
-           break;
-         case GNUTLS_SAN_RFC822NAME:
-           fprintf (out, "\t\tRFC822name: %s\n", buffer);
-           break;
-         case GNUTLS_SAN_URI:
-           fprintf (out, "\t\tURI: %s\n", buffer);
-           break;
-         case GNUTLS_SAN_IPADDRESS:
-           fprintf (out, "\t\tIPAddress: %s\n", buffer);
-           break;
-         case GNUTLS_SAN_OTHERNAME:
-           fprintf (out, "\t\totherName:\n\t\t\tDER: ");
-           for (j = 0; j < size; j++)
-             {
-               fprintf (out, "%.2x", (unsigned char) buffer[j]);
-             }
-           fprintf (out, "\n\t\t\tASCII: ");
-           for (j = 0; j < size; j++)
-             {
-               if (isprint (buffer[j]))
-                 fprintf (out, "%c", (unsigned char) buffer[j]);
-               else
-                 fprintf (out, ".");
-             }
-           fprintf (out, "\n");
-
-           size = sizeof (buffer);
-           ret = gnutls_x509_crt_get_subject_alt_othername_oid
-             (crt, i, buffer, &size);
-           if (ret < 0)
-             fprintf (out, "\t\t\tError decoding otherName OID: %s\n",
-                      gnutls_strerror (ret));
-           else
-             {
-               fprintf (out, "\t\t\tOID: %.*s", size, buffer);
-               if (ret == GNUTLS_SAN_OTHERNAME_XMPP)
-                 fprintf (out, " (id-on-xmppAddr)");
-               fprintf (out, "\n");
-             }
-           break;
-         }
-    }
-
-  /* CRL dist points.
-   */
-  ret = 0;
-  for (i = 0; !(ret < 0); i++)
-    {
-      size = sizeof (buffer);
-      ret =
-       gnutls_x509_crt_get_crl_dist_points (crt, i, buffer, &size,
-                                            NULL, &critical);
-
-      if (i == 0 && ret != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
-       {
-         fprintf (out, "\tCRL Distribution points:");
-         if (critical)
-           fprintf (out, " (critical)");
-         fprintf (out, "\n");
-       }
-
-      if (ret < 0 && ret != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
-       {
-         fprintf (out, "\t\tError decoding: %s\n", gnutls_strerror (ret));
-       }
-      else
-       switch (ret)
-         {
-         case GNUTLS_SAN_DNSNAME:
-           fprintf (out, "\t\tDNSname: %s\n", buffer);
-           break;
-         case GNUTLS_SAN_RFC822NAME:
-           fprintf (out, "\t\tRFC822name: %s\n", buffer);
-           break;
-         case GNUTLS_SAN_URI:
-           fprintf (out, "\t\tURI: %s\n", buffer);
-           break;
-         case GNUTLS_SAN_IPADDRESS:
-           fprintf (out, "\t\tIPAddress: %s\n", buffer);
-           break;
-         }
-    }
-
-  {
-    int pathlen;
-    char *policyLanguage;
-    char *policy;
-    size_t npolicy;
-    ret = gnutls_x509_crt_get_proxy (crt, &critical,
-                                    &pathlen, &policyLanguage,
-                                    &policy, &npolicy);
-    if (!ret)
-      {
-       fprintf (out, "\tProxy Certificate Information: ");
-       if (critical)
-         fprintf (out, "(critical)\n");
-       else
-         fprintf (out, "\n");
-       if (pathlen >= 0)
-         fprintf (out, "\t\tPath Length Constraint: %d\n", pathlen);
-       fprintf (out, "\t\tPolicy Language: ");
-       if (strcmp (policyLanguage, "1.3.6.1.5.5.7.21.1") == 0)
-         fprintf (out, "id-ppl-inheritALL\n");
-       else if (strcmp (policyLanguage, "1.3.6.1.5.5.7.21.2") == 0)
-         fprintf (out, "id-ppl-independent\n");
-       else
-         fprintf (out, "%s\n", policyLanguage);
-       if (npolicy)
-         fprintf (out, "\t\tPolicy Language: %.*s\n", npolicy, policy);
-      }
-  }
-
-  {
-    /* check for basicConstraints
-     */
-    int pathlen;
-    ret = gnutls_x509_crt_get_basic_constraints (crt, &critical, NULL,
-                                                &pathlen);
-    if (ret >= 0)
-      {
-       fprintf (out, "\tBasic Constraints:");
-       if (critical)
-         fprintf (out, " (critical)");
-       fprintf (out, "\n");
-
-       if (ret == 0)
-         fprintf (out, "\t\tCA:FALSE\n");
-       else
-         fprintf (out, "\t\tCA:TRUE\n");
-
-       if (pathlen >= 0)
-         fprintf (out, "\t\tpathLenConstraint: %d\n", pathlen);
-      }
-  }
-
-  /* Key Usage.
-   */
-  ret = gnutls_x509_crt_get_key_usage (crt, &key_usage, &critical);
-
-  if (ret >= 0)
-    {
-      fprintf (out, "\tKey usage: %s\n", critical ? "(critical)" : "");
-      print_key_usage (key_usage, out);
-    }
-
-  /* Key Purpose identifiers.
-   */
-  i = 0;
-
-  size = sizeof (buffer);
-  if ((ret =
-       gnutls_x509_crt_get_key_purpose_oid (crt, 0, buffer, &size,
-                                           &critical)) >= 0)
-    {
-      fprintf (out, "\tKey purpose OIDs: %s\n", critical ? "(critical)" : "");
-      do
-       {
-         size = sizeof (buffer);
-         ret =
-           gnutls_x509_crt_get_key_purpose_oid (crt, i, buffer, &size,
-                                                &critical);
-
-         if (ret >= 0)
-           {
-             print_key_purpose (buffer, out);
-           }
-         i++;
-       }
-      while (ret >= 0);
-    }
-
-  /* Subject Key ID 
-   */
-  size = sizeof (buffer);
-  ret = gnutls_x509_crt_get_subject_key_id (crt, buffer, &size, &critical);
-
-  if (ret < 0 && ret != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
-    {
-      fprintf (out, "Error getting subject key id: %s\n",
-              gnutls_strerror (ret));
-    }
-
-  if (ret >= 0)
-    {
-      fprintf (out, "\tSubject Key ID: %s\n\t\t%s\n",
-              critical ? "(critical)" : "", raw_to_string (buffer, size));
-    }
-
-  /* Authority Key ID 
-   */
-  size = sizeof (buffer);
-  ret = gnutls_x509_crt_get_authority_key_id (crt, buffer, &size, &critical);
-
-  if (ret < 0 && ret != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
-    {
-      fprintf (out, "Error getting authority key id: %s\n",
-              gnutls_strerror (ret));
-    }
-
-  if (ret >= 0)
-    {
-      fprintf (out, "\tAuthority Key ID: %s\n\t\t%s\n",
-              critical ? "(critical)" : "", raw_to_string (buffer, size));
-    }
-
-  /* other extensions:
-   */
-  indx = 0;
-  ret = 0;
-  for (i = 0; !(ret < 0); i++)
-    {
-
-      size = sizeof (oid);
-      ret = gnutls_x509_crt_get_extension_oid (crt, i, oid, &size);
 
-      if (ret >= 0)
-       {
-         if (known_oid (oid))
-           continue;
-
-         if (strcmp (oid, old_oid) == 0)
-           {
-             indx++;
-           }
-         else
-           {
-             indx = 0;
-           }
-
-         fprintf (out, "\t%s: ", oid);
-
-         size = sizeof (buffer);
-         ret =
-           gnutls_x509_crt_get_extension_by_oid (crt, oid, indx,
-                                                 buffer, &size, &critical);
-
-         if (ret >= 0)
-           {
-             if (critical)
-               fprintf (out, "(critical)\n");
-             else
-               fprintf (out, "\n");
-
-             fprintf (out, "\t\tDER Data: ");
-             for (j = 0; j < size; j++)
-               {
-                 fprintf (out, "%.2x", (unsigned char) buffer[j]);
-               }
-             fprintf (out, "\n");
-             fprintf (out, "\t\tASCII: ");
-             for (j = 0; j < size; j++)
-               {
-                 if (isprint (buffer[j]))
-                   fprintf (out, "%c", (unsigned char) buffer[j]);
-                 else
-                   fprintf (out, ".");
-               }
-             fprintf (out, "\n");
-           }
-
-         ret = 0;
-         strcpy (old_oid, oid);
-       }
-    }
-
-
-
-  /* fingerprint
-   */
-  fprintf (out, "\nOther information:\n");
   if (all)
-    {
-      size = sizeof (buffer);
-      if ((ret =
-          gnutls_x509_crt_get_fingerprint (crt, GNUTLS_DIG_MD5, buffer,
-                                           &size)) < 0)
-       {
-         fprintf (out, "Error in fingerprint calculation: %s\n",
-                  gnutls_strerror (ret));
-       }
-      else
-       {
-         fprintf (out, "\tMD5 Fingerprint: %s\n",
-                  raw_to_string (buffer, size));
-       }
-
-      size = sizeof (buffer);
-      if ((ret =
-          gnutls_x509_crt_get_fingerprint (crt, GNUTLS_DIG_SHA1, buffer,
-                                           &size)) < 0)
-       {
-         fprintf (out, "Error in fingerprint calculation: %s\n",
-                  gnutls_strerror (ret));
-       }
-      else
-       {
-         fprintf (out, "\tSHA1 Fingerprint: %s\n",
-                  raw_to_string (buffer, size));
-       }
-
-    }
-
-  size = sizeof (buffer);
-  if ((ret = gnutls_x509_crt_get_key_id (crt, 0, buffer, &size)) < 0)
-    {
-      fprintf (out, "Error in key id calculation: %s\n",
-              gnutls_strerror (ret));
-    }
+    ret = gnutls_x509_crt_print (crt, GNUTLS_X509_CRT_FULL, &out);
   else
+    ret = gnutls_x509_crt_print (crt, GNUTLS_X509_CRT_UNSIGNED_FULL, &out);
+  if (ret == 0)
     {
-      fprintf (out, "\tPublic Key ID: %s\n", raw_to_string (buffer, size));
+      fprintf (out, "%s\n", out.data);
+      gnutls_free (out.data);
     }
 
-  fprintf (out, "\n");
-
   if (out == stderr && batch == 0)     /* interactive */
     if (read_yesno ("Is the above information ok? (Y/N): ") == 0)
       {