]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Several updates in certificate/public key printing.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Tue, 20 Nov 2012 16:32:25 +0000 (17:32 +0100)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Tue, 20 Nov 2012 16:51:22 +0000 (17:51 +0100)
* Added GNUTLS_CRT_PRINT_FULL_NUMBERS to print bignumbers in an easier to parse format.
* Added gnutls_pubkey_import_x509_crq() to convert a certificate request to a public key.
* Added gnutls_pubkey_print() to simplify public key printing.
* certtool's pubkey-info can be combined with --load-request.
* Added --numbers option to certtool which prints big numbers in an easier to parser format.

17 files changed:
NEWS
doc/Makefile.am
doc/cha-gtls-app.texi
doc/invoke-certtool.texi
doc/manpages/Makefile.am
lib/gnutls_pubkey.c
lib/includes/gnutls/abstract.h
lib/includes/gnutls/gnutls.h.in
lib/libgnutls.map
lib/x509/output.c
src/certtool-args.c
src/certtool-args.def
src/certtool-args.h
src/certtool-common.c
src/certtool-common.h
src/certtool.c
src/tpmtool.c

diff --git a/NEWS b/NEWS
index dad8b2de07ab40d1610ce0f3bbd494bb0c252d28..2baf32b6d00beb89bc06b0b1e1ea26d435f9a196 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -22,6 +22,9 @@ key.
 
 ** certtool: It is able to set certificate policies via a template.
 
+** certtool: Added --numbers option which prints big numbers in an
+easier to parser format.
+
 ** p11tool: After key generation, outputs the public key (useful in
 tokens that do not store the public key).
 
@@ -30,6 +33,8 @@ gnutls_pkcs11_privkey_generate2: Added
 gnutls_x509_crt_get_policy: Added
 gnutls_x509_crt_set_policy: Added
 gnutls_x509_policy_release: Added
+gnutls_pubkey_import_x509_crq: Added
+gnutls_pubkey_print: Added
 
 
 * Version 3.1.4 (released 2012-11-10)
index f5d26d24c1c7c1de7968f05543b3ee91098da416..881b86fe1c7d5d51a10f3c2c0dd0e44334e44595 100644 (file)
@@ -1481,10 +1481,14 @@ FUNCS += functions/gnutls_pubkey_import_url
 FUNCS += functions/gnutls_pubkey_import_url.short
 FUNCS += functions/gnutls_pubkey_import_x509
 FUNCS += functions/gnutls_pubkey_import_x509.short
+FUNCS += functions/gnutls_pubkey_import_x509_crq
+FUNCS += functions/gnutls_pubkey_import_x509_crq.short
 FUNCS += functions/gnutls_pubkey_import_x509_raw
 FUNCS += functions/gnutls_pubkey_import_x509_raw.short
 FUNCS += functions/gnutls_pubkey_init
 FUNCS += functions/gnutls_pubkey_init.short
+FUNCS += functions/gnutls_pubkey_print
+FUNCS += functions/gnutls_pubkey_print.short
 FUNCS += functions/gnutls_pubkey_set_key_usage
 FUNCS += functions/gnutls_pubkey_set_key_usage.short
 FUNCS += functions/gnutls_pubkey_set_pin_function
@@ -2027,6 +2031,8 @@ FUNCS += functions/gnutls_x509_crt_set_key_usage
 FUNCS += functions/gnutls_x509_crt_set_key_usage.short
 FUNCS += functions/gnutls_x509_crt_set_pin_function
 FUNCS += functions/gnutls_x509_crt_set_pin_function.short
+FUNCS += functions/gnutls_x509_crt_set_policy
+FUNCS += functions/gnutls_x509_crt_set_policy.short
 FUNCS += functions/gnutls_x509_crt_set_private_key_usage_period
 FUNCS += functions/gnutls_x509_crt_set_private_key_usage_period.short
 FUNCS += functions/gnutls_x509_crt_set_proxy
index d2f84fda30f2757ec889d91c8854a972dba7791e..fc8b61bc40abe152cdaed97c329fc7df6fcb97ec 100644 (file)
@@ -106,8 +106,12 @@ See @ref{Error codes}, for a description of the available error codes.
 @node Common types
 @subsection Common types
 
-Several functions in @acronym{GnuTLS} use @code{gnutls_datum_t} which is
-convenient way to combine a pointer to data and data's size. Its definition is
+All strings that are to provided as input to @acronym{GnuTLS} functions
+should be in UTF-8 unless otherwise specified. Output strings are also
+in UTF-8 format unless otherwise specified.
+
+When data of a fixed size are provided to @acronym{GnuTLS} functions then
+the helper structure @code{gnutls_datum_t} is often used. Its definition is
 shown below.
 @verbatim
   typedef struct
index ed521186a8e17737bb449f45b5e20d138a781038..1ac06b673f31e2cfcb4838e4bd33e08ac756e7de 100644 (file)
@@ -6,7 +6,7 @@
 # 
 # DO NOT EDIT THIS FILE   (invoke-certtool.texi)
 # 
-# It has been AutoGen-ed  November 20, 2012 at 12:17:13 AM by AutoGen 5.16
+# It has been AutoGen-ed  November 20, 2012 at 05:51:14 PM by AutoGen 5.16
 # From the definitions    ../src/certtool-args.def
 # and the template file   agtexi-cmd.tpl
 @end ignore
@@ -71,6 +71,7 @@ USAGE:  certtool [ -<flag> [<val>] | --<name>[@{=| @}<val>] ]...
        --load-ca-privkey=str  Loads the certificate authority's private key file
        --load-ca-certificate=str Loads the certificate authority's certificate file
        --password=str         Password to use
+       --simple-numbers       Print big number in an easier format to parse
        --null-password        Enforce a NULL password
    -i, --certificate-info     Print information on the given certificate
        --certificate-pubkey   Print certificate's public key
@@ -208,7 +209,7 @@ This option enforces a NULL password. This may be different than the empty passw
 @subheading pubkey-info option
 
 This is the ``print information on a public key'' option.
-The option combined with --load-pubkey, --load-privkey and --load-certificate will extract the public key of the object in question.
+The option combined with --load-request, --load-pubkey, --load-privkey and --load-certificate will extract the public key of the object in question.
 @anchor{certtool to-p12}
 @subheading to-p12 option
 
@@ -544,11 +545,11 @@ signing_key
 # ca_issuers_uri = http://my.ca.issuer
 
 # Certificate policies
-# policy = 1.3.6.1.4.1.5484.1.10.99.1.0
+# policy1 = 1.3.6.1.4.1.5484.1.10.99.1.0
 # policy1_txt = "This is a long policy to summarize"
 # policy1_url = http://www.example.com/a-policy-to-read
 
-# policy = 1.3.6.1.4.1.5484.1.10.99.1.1
+# policy2 = 1.3.6.1.4.1.5484.1.10.99.1.1
 # policy2_txt = "This is a short policy"
 # policy2_url = http://www.example.com/another-policy-to-read
 
index f336d1d06da5ff0a516bfb1539aef470f02cb2e6..481af0f29a3e149e31ddc2e02adec8e67d9161e6 100644 (file)
@@ -550,8 +550,10 @@ APIMANS += gnutls_pubkey_import_tpm_raw.3
 APIMANS += gnutls_pubkey_import_tpm_url.3
 APIMANS += gnutls_pubkey_import_url.3
 APIMANS += gnutls_pubkey_import_x509.3
+APIMANS += gnutls_pubkey_import_x509_crq.3
 APIMANS += gnutls_pubkey_import_x509_raw.3
 APIMANS += gnutls_pubkey_init.3
+APIMANS += gnutls_pubkey_print.3
 APIMANS += gnutls_pubkey_set_key_usage.3
 APIMANS += gnutls_pubkey_set_pin_function.3
 APIMANS += gnutls_pubkey_verify_data.3
@@ -823,6 +825,7 @@ APIMANS += gnutls_x509_crt_set_key.3
 APIMANS += gnutls_x509_crt_set_key_purpose_oid.3
 APIMANS += gnutls_x509_crt_set_key_usage.3
 APIMANS += gnutls_x509_crt_set_pin_function.3
+APIMANS += gnutls_x509_crt_set_policy.3
 APIMANS += gnutls_x509_crt_set_private_key_usage_period.3
 APIMANS += gnutls_x509_crt_set_proxy.3
 APIMANS += gnutls_x509_crt_set_proxy_dn.3
index e9dbcbe9f1fdf856210cdfb6d34a3ab22de616a9..2c662c4d9544c2265519fba58f3b3ee63d4a0d6e 100644 (file)
@@ -178,6 +178,42 @@ gnutls_pubkey_import_x509 (gnutls_pubkey_t key, gnutls_x509_crt_t crt,
   return 0;
 }
 
+/**
+ * gnutls_pubkey_import_x509_crq:
+ * @key: The public key
+ * @crq: The certificate to be imported
+ * @flags: should be zero
+ *
+ * This function will import the given public key to the abstract
+ * #gnutls_pubkey_t structure.
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a
+ *   negative error value.
+ *
+ * Since: 3.1.5
+ **/
+int
+gnutls_pubkey_import_x509_crq (gnutls_pubkey_t key, gnutls_x509_crq_t crq,
+                           unsigned int flags)
+{
+  int ret;
+
+  key->pk_algorithm = gnutls_x509_crq_get_pk_algorithm (crq, &key->bits);
+
+  ret = gnutls_x509_crq_get_key_usage (crq, &key->key_usage, NULL);
+  if (ret < 0)
+    key->key_usage = 0;
+
+  ret = _gnutls_x509_crq_get_mpis (crq, &key->params);
+  if (ret < 0)
+    {
+      gnutls_assert ();
+      return ret;
+    }
+
+  return 0;
+}
+
 /**
  * gnutls_pubkey_import_privkey:
  * @key: The public key
index 36aa89cb74f0ac2038d17032247b0bc8d39c7b28..204e3296aba84d553286191e90cbe5b66408acea 100644 (file)
@@ -64,6 +64,8 @@ int gnutls_pubkey_get_pk_algorithm (gnutls_pubkey_t key, unsigned int *bits);
 
 int gnutls_pubkey_import_x509 (gnutls_pubkey_t key, gnutls_x509_crt_t crt,
                                unsigned int flags);
+int gnutls_pubkey_import_x509_crq (gnutls_pubkey_t key, gnutls_x509_crq_t crq,
+                                   unsigned int flags);
 int gnutls_pubkey_import_pkcs11 (gnutls_pubkey_t key,
                                  gnutls_pkcs11_obj_t obj, unsigned int flags);
 int gnutls_pubkey_import_openpgp (gnutls_pubkey_t key,
@@ -387,6 +389,11 @@ int gnutls_pubkey_verify_hash (gnutls_pubkey_t key, unsigned int flags,
                            const gnutls_datum_t * hash,
                            const gnutls_datum_t * signature) _GNUTLS_GCC_ATTR_DEPRECATED;
 
+int
+gnutls_pubkey_print (gnutls_pubkey_t pubkey,
+                     gnutls_certificate_print_formats_t format,
+                     gnutls_datum_t * out);
+
 #ifdef __cplusplus
 }
 #endif
index 0a07565fb2d0d5346e071560e7758f9f05b254e2..23bea88aee857c3228b95e9613dd85c8f8cb87b6 100644 (file)
@@ -572,6 +572,7 @@ extern "C"
 /**
  * gnutls_certificate_print_formats_t:
  * @GNUTLS_CRT_PRINT_FULL: Full information about certificate.
+ * @GNUTLS_CRT_PRINT_FULL_NUMBERS: Full information about certificate and include easy to parse public key parameters.
  * @GNUTLS_CRT_PRINT_COMPACT: Information about certificate name in one line, plus identification of the public key.
  * @GNUTLS_CRT_PRINT_ONELINE: Information about certificate in one line.
  * @GNUTLS_CRT_PRINT_UNSIGNED_FULL: All info for an unsigned certificate.
@@ -583,7 +584,8 @@ extern "C"
     GNUTLS_CRT_PRINT_FULL = 0,
     GNUTLS_CRT_PRINT_ONELINE = 1,
     GNUTLS_CRT_PRINT_UNSIGNED_FULL = 2,
-    GNUTLS_CRT_PRINT_COMPACT = 3
+    GNUTLS_CRT_PRINT_COMPACT = 3,
+    GNUTLS_CRT_PRINT_FULL_NUMBERS = 4,
   } gnutls_certificate_print_formats_t;
 
 #define GNUTLS_PK_ECC GNUTLS_PK_EC
index 6a53b8fbd7f4fa9cf82de2591b5b1c79e5bb6d4d..c19a3c1aecf75bcf78b15f05f2b394066ec0eabc 100644 (file)
@@ -874,6 +874,8 @@ GNUTLS_3_1_0 {
        gnutls_x509_crt_get_policy;
        gnutls_certificate_policy_release;
        gnutls_x509_crt_set_policy;
+       gnutls_pubkey_import_x509_crq;
+       gnutls_pubkey_print;
 } GNUTLS_3_0_0;
 
 GNUTLS_PRIVATE {
index 6ac7c47949ee3a09cc0cc4071418f985f9893e11..09f61500def58ff25ae0388abe506719044b827e 100644 (file)
@@ -63,66 +63,67 @@ ip_to_string (void *_ip, int ip_size, char *string, int string_size)
   switch (ip_size)
     {
     case 4:
-      snprintf (string, string_size, "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]);
+      snprintf (string, string_size, "%u.%u.%u.%u", ip[0], ip[1], ip[2],
+                ip[3]);
       break;
     case 16:
       snprintf (string, string_size, "%x:%x:%x:%x:%x:%x:%x:%x",
-               (ip[0] << 8) | ip[1], (ip[2] << 8) | ip[3],
-               (ip[4] << 8) | ip[5], (ip[6] << 8) | ip[7],
-               (ip[8] << 8) | ip[9], (ip[10] << 8) | ip[11],
-               (ip[12] << 8) | ip[13], (ip[14] << 8) | ip[15]);
+                (ip[0] << 8) | ip[1], (ip[2] << 8) | ip[3],
+                (ip[4] << 8) | ip[5], (ip[6] << 8) | ip[7],
+                (ip[8] << 8) | ip[9], (ip[10] << 8) | ip[11],
+                (ip[12] << 8) | ip[13], (ip[14] << 8) | ip[15]);
       break;
     }
 
   return string;
 }
 
-static void add_altname(gnutls_buffer_st * str, const char* prefix, unsigned int alt_type, 
-                        char* name, size_t name_size)
+static void
+add_altname (gnutls_buffer_st * str, const char *prefix,
+             unsigned int alt_type, char *name, size_t name_size)
 {
-char str_ip[64];
-char *p;
+  char str_ip[64];
+  char *p;
 
-      if ((alt_type == GNUTLS_SAN_DNSNAME
-           || alt_type == GNUTLS_SAN_RFC822NAME
-           || alt_type == GNUTLS_SAN_URI) && strlen (name) != name_size)
-        {
-          adds (str, _("warning: altname contains an embedded NUL, "
-                       "replacing with '!'\n"));
-          while (strlen (name) < name_size)
-            name[strlen (name)] = '!';
-        }
+  if ((alt_type == GNUTLS_SAN_DNSNAME
+       || alt_type == GNUTLS_SAN_RFC822NAME
+       || alt_type == GNUTLS_SAN_URI) && strlen (name) != name_size)
+    {
+      adds (str, _("warning: altname contains an embedded NUL, "
+                   "replacing with '!'\n"));
+      while (strlen (name) < name_size)
+        name[strlen (name)] = '!';
+    }
 
-      switch (alt_type)
-        {
-        case GNUTLS_SAN_DNSNAME:
-          addf (str, "%s\t\t\tDNSname: %.*s\n", prefix, (int) name_size, name);
-          break;
+  switch (alt_type)
+    {
+    case GNUTLS_SAN_DNSNAME:
+      addf (str, "%s\t\t\tDNSname: %.*s\n", prefix, (int) name_size, name);
+      break;
 
-        case GNUTLS_SAN_RFC822NAME:
-          addf (str, "%s\t\t\tRFC822name: %.*s\n", prefix, (int) name_size,
-                name);
-          break;
+    case GNUTLS_SAN_RFC822NAME:
+      addf (str, "%s\t\t\tRFC822name: %.*s\n", prefix, (int) name_size, name);
+      break;
 
-        case GNUTLS_SAN_URI:
-          addf (str, "%s\t\t\tURI: %.*s\n", prefix, (int) name_size, name);
-          break;
+    case GNUTLS_SAN_URI:
+      addf (str, "%s\t\t\tURI: %.*s\n", prefix, (int) name_size, name);
+      break;
 
-        case GNUTLS_SAN_IPADDRESS:
-          p = ip_to_string (name, name_size, str_ip, sizeof (str_ip));
-          if (p == NULL)
-            p = ERROR_STR;
-          addf (str, "%s\t\t\tIPAddress: %s\n", prefix, p);
-          break;
+    case GNUTLS_SAN_IPADDRESS:
+      p = ip_to_string (name, name_size, str_ip, sizeof (str_ip));
+      if (p == NULL)
+        p = ERROR_STR;
+      addf (str, "%s\t\t\tIPAddress: %s\n", prefix, p);
+      break;
 
-        case GNUTLS_SAN_DN:
-          addf (str, "%s\t\t\tdirectoryName: %.*s\n", prefix,
-                (int) name_size, name);
-          break;
-        default:
-          addf (str, "error: unknown altname\n");
-          break;
-        }
+    case GNUTLS_SAN_DN:
+      addf (str, "%s\t\t\tdirectoryName: %.*s\n", prefix,
+            (int) name_size, name);
+      break;
+    default:
+      addf (str, "error: unknown altname\n");
+      break;
+    }
 }
 
 static void
@@ -172,48 +173,48 @@ print_aia (gnutls_buffer_st * str, gnutls_x509_crt_t cert)
   for (;;)
     {
       err = gnutls_x509_crt_get_authority_info_access
-       (cert, seq, GNUTLS_IA_ACCESSMETHOD_OID, &data, NULL);
+        (cert, seq, GNUTLS_IA_ACCESSMETHOD_OID, &data, NULL);
       if (err == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
-       return;
+        return;
       if (err < 0)
-       {
-         addf (str, "error: get_aia: %s\n", gnutls_strerror (err));
-         return;
-       }
+        {
+          addf (str, "error: get_aia: %s\n", gnutls_strerror (err));
+          return;
+        }
 
       addf (str, _("\t\t\tAccess Method: %.*s"), data.size, data.data);
       if (data.size == sizeof (GNUTLS_OID_AD_OCSP) &&
-         memcmp (data.data, GNUTLS_OID_AD_OCSP, data.size) == 0)
-       adds (str, " (id-ad-ocsp)\n");
+          memcmp (data.data, GNUTLS_OID_AD_OCSP, data.size) == 0)
+        adds (str, " (id-ad-ocsp)\n");
       else if (data.size == sizeof (GNUTLS_OID_AD_CAISSUERS) &&
-              memcmp (data.data, GNUTLS_OID_AD_CAISSUERS, data.size) == 0)
-       adds (str, " (id-ad-caIssuers)\n");
+               memcmp (data.data, GNUTLS_OID_AD_CAISSUERS, data.size) == 0)
+        adds (str, " (id-ad-caIssuers)\n");
       else
-       adds (str, " (UNKNOWN)\n");
+        adds (str, " (UNKNOWN)\n");
 
       err = gnutls_x509_crt_get_authority_info_access
-       (cert, seq, GNUTLS_IA_ACCESSLOCATION_GENERALNAME_TYPE, &data, NULL);
+        (cert, seq, GNUTLS_IA_ACCESSLOCATION_GENERALNAME_TYPE, &data, NULL);
       if (err < 0)
-       {
-         addf (str, "error: get_aia type: %s\n", gnutls_strerror (err));
-         return;
-       }
+        {
+          addf (str, "error: get_aia type: %s\n", gnutls_strerror (err));
+          return;
+        }
 
       if (data.size == sizeof ("uniformResourceIdentifier") &&
-         memcmp (data.data, "uniformResourceIdentifier", data.size) == 0)
-       {
-         adds (str, "\t\t\tAccess Location URI: ");
-         err = gnutls_x509_crt_get_authority_info_access
-           (cert, seq, GNUTLS_IA_URI, &data, NULL);
-         if (err < 0)
-           {
-             addf (str, "error: get_aia uri: %s\n", gnutls_strerror (err));
-             return;
-           }
-         addf (str, "%.*s\n", data.size, data.data);
-       }
+          memcmp (data.data, "uniformResourceIdentifier", data.size) == 0)
+        {
+          adds (str, "\t\t\tAccess Location URI: ");
+          err = gnutls_x509_crt_get_authority_info_access
+            (cert, seq, GNUTLS_IA_URI, &data, NULL);
+          if (err < 0)
+            {
+              addf (str, "error: get_aia uri: %s\n", gnutls_strerror (err));
+              return;
+            }
+          addf (str, "%.*s\n", data.size, data.data);
+        }
       else
-       adds (str, "\t\t\tUnsupported accessLocation type\n");
+        adds (str, "\t\t\tUnsupported accessLocation type\n");
 
       seq++;
     }
@@ -259,6 +260,7 @@ print_ski (gnutls_buffer_st * str, gnutls_x509_crt_t cert)
 #define TYPE_CRL 1
 #define TYPE_CRT 2
 #define TYPE_CRQ 3
+#define TYPE_PUBKEY 4
 
 #define TYPE_CRT_SAN TYPE_CRT
 #define TYPE_CRQ_SAN TYPE_CRQ
@@ -269,6 +271,7 @@ typedef union
   gnutls_x509_crt_t crt;
   gnutls_x509_crq_t crq;
   gnutls_x509_crl_t crl;
+  gnutls_pubkey_t pubkey;
 } cert_type_t;
 
 static void
@@ -276,27 +279,30 @@ print_aki_gn_serial (gnutls_buffer_st * str, int type, cert_type_t cert)
 {
   char *buffer = NULL;
   char serial[128];
-  size_t size = 0, serial_size = sizeof(serial);
+  size_t size = 0, serial_size = sizeof (serial);
   unsigned int alt_type;
   int err;
 
   if (type == TYPE_CRT)
     err =
-      gnutls_x509_crt_get_authority_key_gn_serial(cert.crt, 0, NULL, &size, 
-                                                  &alt_type, serial, &serial_size, NULL);
+      gnutls_x509_crt_get_authority_key_gn_serial (cert.crt, 0, NULL, &size,
+                                                   &alt_type, serial,
+                                                   &serial_size, NULL);
   else if (type == TYPE_CRL)
     err =
-      gnutls_x509_crl_get_authority_key_gn_serial(cert.crl, 0, NULL, &size, 
-                                                  &alt_type, serial, &serial_size, NULL);
+      gnutls_x509_crl_get_authority_key_gn_serial (cert.crl, 0, NULL, &size,
+                                                   &alt_type, serial,
+                                                   &serial_size, NULL);
   else
     {
       gnutls_assert ();
       return;
     }
-  
+
   if (err != GNUTLS_E_SHORT_MEMORY_BUFFER)
     {
-      addf (str, "error: get_authority_key_gn_serial: %s\n", gnutls_strerror (err));
+      addf (str, "error: get_authority_key_gn_serial: %s\n",
+            gnutls_strerror (err));
       return;
     }
 
@@ -310,21 +316,24 @@ print_aki_gn_serial (gnutls_buffer_st * str, int type, cert_type_t cert)
 
   if (type == TYPE_CRT)
     err =
-      gnutls_x509_crt_get_authority_key_gn_serial(cert.crt, 0, buffer, &size, 
-                                                  &alt_type, serial, &serial_size, NULL);
+      gnutls_x509_crt_get_authority_key_gn_serial (cert.crt, 0, buffer, &size,
+                                                   &alt_type, serial,
+                                                   &serial_size, NULL);
   else
     err =
-      gnutls_x509_crl_get_authority_key_gn_serial(cert.crl, 0, buffer, &size, 
-                                                  &alt_type, serial, &serial_size, NULL);
+      gnutls_x509_crl_get_authority_key_gn_serial (cert.crl, 0, buffer, &size,
+                                                   &alt_type, serial,
+                                                   &serial_size, NULL);
 
   if (err < 0)
     {
       gnutls_free (buffer);
-      addf (str, "error: get_authority_key_gn_serial2: %s\n", gnutls_strerror (err));
+      addf (str, "error: get_authority_key_gn_serial2: %s\n",
+            gnutls_strerror (err));
       return;
     }
 
-  add_altname(str, "", alt_type, buffer, size);
+  add_altname (str, "", alt_type, buffer, size);
   adds (str, "\t\t\tserial: ");
   _gnutls_buffer_hexprint (str, serial, serial_size);
   adds (str, "\n");
@@ -350,11 +359,11 @@ print_aki (gnutls_buffer_st * str, int type, cert_type_t cert)
       gnutls_assert ();
       return;
     }
-  
+
   if (err == GNUTLS_E_X509_UNSUPPORTED_EXTENSION)
     {
       /* Check if an alternative name is there */
-      print_aki_gn_serial(str, type, cert);
+      print_aki_gn_serial (str, type, cert);
       return;
     }
 
@@ -404,6 +413,8 @@ print_key_usage (gnutls_buffer_st * str, const char *prefix, int type,
     err = gnutls_x509_crt_get_key_usage (cert.crt, &key_usage, NULL);
   else if (type == TYPE_CRQ)
     err = gnutls_x509_crq_get_key_usage (cert.crq, &key_usage, NULL);
+  else if (type == TYPE_PUBKEY)
+    err = gnutls_pubkey_get_key_usage (cert.pubkey, &key_usage);
   else
     return;
 
@@ -414,28 +425,28 @@ print_key_usage (gnutls_buffer_st * str, const char *prefix, int type,
     }
 
   if (key_usage & GNUTLS_KEY_DIGITAL_SIGNATURE)
-    addf (str, _("%s\t\t\tDigital signature.\n"), prefix);
+    addf (str, _("%sDigital signature.\n"), prefix);
   if (key_usage & GNUTLS_KEY_NON_REPUDIATION)
-    addf (str, _("%s\t\t\tNon repudiation.\n"), prefix);
+    addf (str, _("%sNon repudiation.\n"), prefix);
   if (key_usage & GNUTLS_KEY_KEY_ENCIPHERMENT)
-    addf (str, _("%s\t\t\tKey encipherment.\n"), prefix);
+    addf (str, _("%sKey encipherment.\n"), prefix);
   if (key_usage & GNUTLS_KEY_DATA_ENCIPHERMENT)
-    addf (str, _("%s\t\t\tData encipherment.\n"), prefix);
+    addf (str, _("%sData encipherment.\n"), prefix);
   if (key_usage & GNUTLS_KEY_KEY_AGREEMENT)
-    addf (str, _("%s\t\t\tKey agreement.\n"), prefix);
+    addf (str, _("%sKey agreement.\n"), prefix);
   if (key_usage & GNUTLS_KEY_KEY_CERT_SIGN)
-    addf (str, _("%s\t\t\tCertificate signing.\n"), prefix);
+    addf (str, _("%sCertificate signing.\n"), prefix);
   if (key_usage & GNUTLS_KEY_CRL_SIGN)
-    addf (str, _("%s\t\t\tCRL signing.\n"), prefix);
+    addf (str, _("%sCRL signing.\n"), prefix);
   if (key_usage & GNUTLS_KEY_ENCIPHER_ONLY)
-    addf (str, _("%s\t\t\tKey encipher only.\n"), prefix);
+    addf (str, _("%sKey encipher only.\n"), prefix);
   if (key_usage & GNUTLS_KEY_DECIPHER_ONLY)
-    addf (str, _("%s\t\t\tKey decipher only.\n"), prefix);
+    addf (str, _("%sKey decipher only.\n"), prefix);
 }
 
 static void
-print_private_key_usage_period (gnutls_buffer_st * str, const char *prefix, int type,
-                                cert_type_t cert)
+print_private_key_usage_period (gnutls_buffer_st * str, const char *prefix,
+                                int type, cert_type_t cert)
 {
   time_t activation, expiration;
   int err;
@@ -444,15 +455,20 @@ print_private_key_usage_period (gnutls_buffer_st * str, const char *prefix, int
   size_t max;
 
   if (type == TYPE_CRT)
-    err = gnutls_x509_crt_get_private_key_usage_period (cert.crt, &activation, &expiration, NULL);
+    err =
+      gnutls_x509_crt_get_private_key_usage_period (cert.crt, &activation,
+                                                    &expiration, NULL);
   else if (type == TYPE_CRQ)
-    err = gnutls_x509_crq_get_private_key_usage_period (cert.crq, &activation, &expiration, NULL);
+    err =
+      gnutls_x509_crq_get_private_key_usage_period (cert.crq, &activation,
+                                                    &expiration, NULL);
   else
     return;
 
   if (err < 0)
     {
-      addf (str, "error: get_private_key_usage_period: %s\n", gnutls_strerror (err));
+      addf (str, "error: get_private_key_usage_period: %s\n",
+            gnutls_strerror (err));
       return;
     }
 
@@ -668,8 +684,8 @@ print_basic (gnutls_buffer_st * str, const char *prefix, int type,
 
 
 static void
-print_altname (gnutls_buffer_st * str, const char *prefix, unsigned int altname_type,
-               cert_type_t cert)
+print_altname (gnutls_buffer_st * str, const char *prefix,
+               unsigned int altname_type, cert_type_t cert)
 {
   unsigned int altname_idx;
 
@@ -734,84 +750,84 @@ print_altname (gnutls_buffer_st * str, const char *prefix, unsigned int altname_
 
       if (err == GNUTLS_SAN_OTHERNAME)
         {
-            char *oid = NULL;
-            size_t oidsize;
-
-            oidsize = 0;
-            if (altname_type == TYPE_CRT_SAN)
-              err = gnutls_x509_crt_get_subject_alt_othername_oid
-                (cert.crt, altname_idx, oid, &oidsize);
-            else if (altname_type == TYPE_CRQ_SAN)
-              err = gnutls_x509_crq_get_subject_alt_othername_oid
-                (cert.crq, altname_idx, oid, &oidsize);
-            else if (altname_type == TYPE_CRT_IAN)
-              err = gnutls_x509_crt_get_issuer_alt_othername_oid
-                (cert.crt, altname_idx, oid, &oidsize);
-
-            if (err != GNUTLS_E_SHORT_MEMORY_BUFFER)
-              {
-                gnutls_free (buffer);
-                addf (str,
-                      "error: get_subject/issuer_alt_othername_oid: %s\n",
-                      gnutls_strerror (err));
-                return;
-              }
+          char *oid = NULL;
+          size_t oidsize;
+
+          oidsize = 0;
+          if (altname_type == TYPE_CRT_SAN)
+            err = gnutls_x509_crt_get_subject_alt_othername_oid
+              (cert.crt, altname_idx, oid, &oidsize);
+          else if (altname_type == TYPE_CRQ_SAN)
+            err = gnutls_x509_crq_get_subject_alt_othername_oid
+              (cert.crq, altname_idx, oid, &oidsize);
+          else if (altname_type == TYPE_CRT_IAN)
+            err = gnutls_x509_crt_get_issuer_alt_othername_oid
+              (cert.crt, altname_idx, oid, &oidsize);
+
+          if (err != GNUTLS_E_SHORT_MEMORY_BUFFER)
+            {
+              gnutls_free (buffer);
+              addf (str,
+                    "error: get_subject/issuer_alt_othername_oid: %s\n",
+                    gnutls_strerror (err));
+              return;
+            }
 
-            oid = gnutls_malloc (oidsize);
-            if (!oid)
-              {
-                gnutls_free (buffer);
-                addf (str, "error: malloc: %s\n",
-                      gnutls_strerror (GNUTLS_E_MEMORY_ERROR));
-                return;
-              }
+          oid = gnutls_malloc (oidsize);
+          if (!oid)
+            {
+              gnutls_free (buffer);
+              addf (str, "error: malloc: %s\n",
+                    gnutls_strerror (GNUTLS_E_MEMORY_ERROR));
+              return;
+            }
 
-            if (altname_type == TYPE_CRT_SAN)
-              err = gnutls_x509_crt_get_subject_alt_othername_oid
-                (cert.crt, altname_idx, oid, &oidsize);
-            else if (altname_type == TYPE_CRQ_SAN)
-              err = gnutls_x509_crq_get_subject_alt_othername_oid
-                (cert.crq, altname_idx, oid, &oidsize);
-            else if (altname_type == TYPE_CRT_IAN)
-              err = gnutls_x509_crt_get_issuer_alt_othername_oid
-                (cert.crt, altname_idx, oid, &oidsize);
+          if (altname_type == TYPE_CRT_SAN)
+            err = gnutls_x509_crt_get_subject_alt_othername_oid
+              (cert.crt, altname_idx, oid, &oidsize);
+          else if (altname_type == TYPE_CRQ_SAN)
+            err = gnutls_x509_crq_get_subject_alt_othername_oid
+              (cert.crq, altname_idx, oid, &oidsize);
+          else if (altname_type == TYPE_CRT_IAN)
+            err = gnutls_x509_crt_get_issuer_alt_othername_oid
+              (cert.crt, altname_idx, oid, &oidsize);
 
-            if (err < 0)
-              {
-                gnutls_free (buffer);
-                gnutls_free (oid);
-                addf (str, "error: get_subject_alt_othername_oid2: %s\n",
-                      gnutls_strerror (err));
-                return;
-              }
+          if (err < 0)
+            {
+              gnutls_free (buffer);
+              gnutls_free (oid);
+              addf (str, "error: get_subject_alt_othername_oid2: %s\n",
+                    gnutls_strerror (err));
+              return;
+            }
 
-            if (err == GNUTLS_SAN_OTHERNAME_XMPP)
-              {
-                if (strlen (buffer) != size)
-                  {
-                    adds (str, _("warning: altname contains an embedded NUL, "
-                                 "replacing with '!'\n"));
-                    while (strlen (buffer) < size)
-                      buffer[strlen (buffer)] = '!';
-                  }
-
-                addf (str, _("%s\t\t\tXMPP Address: %.*s\n"), prefix,
-                      (int) size, buffer);
-              }
-            else
-              {
-                addf (str, _("%s\t\t\totherName OID: %.*s\n"), prefix,
-                      (int) oidsize, oid);
-                addf (str, _("%s\t\t\totherName DER: "), prefix);
-                _gnutls_buffer_hexprint (str, buffer, size);
-                addf (str, _("\n%s\t\t\totherName ASCII: "), prefix);
-                _gnutls_buffer_asciiprint (str, buffer, size);
-                addf (str, "\n");
-              }
-            gnutls_free (oid);
-          }
+          if (err == GNUTLS_SAN_OTHERNAME_XMPP)
+            {
+              if (strlen (buffer) != size)
+                {
+                  adds (str, _("warning: altname contains an embedded NUL, "
+                               "replacing with '!'\n"));
+                  while (strlen (buffer) < size)
+                    buffer[strlen (buffer)] = '!';
+                }
+
+              addf (str, _("%s\t\t\tXMPP Address: %.*s\n"), prefix,
+                    (int) size, buffer);
+            }
+          else
+            {
+              addf (str, _("%s\t\t\totherName OID: %.*s\n"), prefix,
+                    (int) oidsize, oid);
+              addf (str, _("%s\t\t\totherName DER: "), prefix);
+              _gnutls_buffer_hexprint (str, buffer, size);
+              addf (str, _("\n%s\t\t\totherName ASCII: "), prefix);
+              _gnutls_buffer_asciiprint (str, buffer, size);
+              addf (str, "\n");
+            }
+          gnutls_free (oid);
+        }
       else
-        add_altname(str, prefix, err, buffer, size);
+        add_altname (str, prefix, err, buffer, size);
 
       gnutls_free (buffer);
     }
@@ -893,6 +909,7 @@ print_extensions (gnutls_buffer_st * str, const char *prefix, int type,
   int ski_idx = 0;
   int aki_idx = 0;
   int crldist_idx = 0, pkey_usage_period_idx = 0;
+  char pfx[16];
 
   for (i = 0;; i++)
     {
@@ -961,34 +978,41 @@ print_extensions (gnutls_buffer_st * str, const char *prefix, int type,
       else if (strcmp (oid, "2.5.29.32") == 0)
         {
           struct gnutls_x509_policy_st policy;
-          const charname;
+          const char *name;
           int x;
 
-          for (x=0;;x++)
+          for (x = 0;; x++)
             {
-              err = gnutls_x509_crt_get_policy (cert.crt, x, &policy, &critical);
+              err =
+                gnutls_x509_crt_get_policy (cert.crt, x, &policy, &critical);
               if (err == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
                 break;
-              
+
               if (err < 0)
                 {
-                  addf (str, "error: certificate policy: %s\n", gnutls_strerror(err));
+                  addf (str, "error: certificate policy: %s\n",
+                        gnutls_strerror (err));
                   break;
                 }
 
-              if (x==0) addf (str, "%s\t\tCertificate Policies (%s):\n", prefix, critical ? _("critical") : _("not critical"));
+              if (x == 0)
+                addf (str, "%s\t\tCertificate Policies (%s):\n", prefix,
+                      critical ? _("critical") : _("not critical"));
 
               addf (str, "%s\t\t\t%s\n", prefix, policy.oid);
-              for (j=0;j<policy.qualifiers;j++)
+              for (j = 0; j < policy.qualifiers; j++)
                 {
-                  if (policy.qualifier[j].type==GNUTLS_X509_QUALIFIER_URI)
+                  if (policy.qualifier[j].type == GNUTLS_X509_QUALIFIER_URI)
                     name = "URI";
-                  else if (policy.qualifier[j].type==GNUTLS_X509_QUALIFIER_NOTICE)
+                  else if (policy.qualifier[j].type ==
+                           GNUTLS_X509_QUALIFIER_NOTICE)
                     name = "Note";
-                  else name = "Unknown qualifier";
-                  addf (str, "%s\t\t\t\t%s: %s\n", prefix, name, policy.qualifier[j].data);
+                  else
+                    name = "Unknown qualifier";
+                  addf (str, "%s\t\t\t\t%s: %s\n", prefix, name,
+                        policy.qualifier[j].data);
                 }
-          
+
               gnutls_x509_policy_release (&policy);
             }
         }
@@ -1020,7 +1044,8 @@ print_extensions (gnutls_buffer_st * str, const char *prefix, int type,
           addf (str, _("%s\t\tKey Usage (%s):\n"), prefix,
                 critical ? _("critical") : _("not critical"));
 
-          print_key_usage (str, prefix, type, cert);
+          snprintf(pfx, sizeof(pfx), "%s\t\t\t", prefix);
+          print_key_usage (str, pfx, type, cert);
 
           keyusage_idx++;
         }
@@ -1028,7 +1053,8 @@ print_extensions (gnutls_buffer_st * str, const char *prefix, int type,
         {
           if (pkey_usage_period_idx)
             {
-              addf (str, "error: more than one private key usage period extension\n");
+              addf (str,
+                    "error: more than one private key usage period extension\n");
               continue;
             }
 
@@ -1117,7 +1143,7 @@ print_extensions (gnutls_buffer_st * str, const char *prefix, int type,
       else if (strcmp (oid, "1.3.6.1.5.5.7.1.1") == 0)
         {
           addf (str, _("%s\t\tAuthority Information "
-                      "Access (%s):\n"), prefix,
+                       "Access (%s):\n"), prefix,
                 critical ? _("critical") : _("not critical"));
 
           if (type == TYPE_CRT)
@@ -1189,7 +1215,173 @@ print_extensions (gnutls_buffer_st * str, const char *prefix, int type,
 }
 
 static void
-print_cert (gnutls_buffer_st * str, gnutls_x509_crt_t cert, int notsigned)
+print_pubkey (gnutls_buffer_st * str, const char* key_name, gnutls_pubkey_t pubkey, gnutls_certificate_print_formats_t format)
+{
+  int err, pk;
+  const char *name;
+  unsigned bits;
+
+  err = gnutls_pubkey_get_pk_algorithm (pubkey, &bits);
+  if (err < 0)
+    {
+      addf (str, "error: get_pk_algorithm: %s\n", gnutls_strerror (err));
+      return;
+    }
+
+  name = gnutls_pk_algorithm_get_name (err);
+  if (name == NULL)
+    name = _("unknown");
+
+  pk = err;
+
+  addf (str, _("\t%sPublic Key Algorithm: %s\n"), key_name, name);
+  addf (str, _("\tAlgorithm Security Level: %s (%d bits)\n"),
+        gnutls_sec_param_get_name (gnutls_pk_bits_to_sec_param
+                                   (err, bits)), bits);
+  switch (pk)
+    {
+    case GNUTLS_PK_RSA:
+      {
+        gnutls_datum_t m, e;
+
+        err = gnutls_pubkey_get_pk_rsa_raw (pubkey, &m, &e);
+        if (err < 0)
+          addf (str, "error: get_pk_rsa_raw: %s\n", gnutls_strerror (err));
+        else
+          {
+            if (format == GNUTLS_CRT_PRINT_FULL_NUMBERS)
+              {
+                addf (str, _("\t\tModulus (bits %d): "), bits);
+                _gnutls_buffer_hexprint (str, m.data, m.size);
+                adds (str, "\n");
+                addf (str, _("\t\tExponent (bits %d): "), e.size * 8);
+                _gnutls_buffer_hexprint (str, e.data, e.size);
+                adds (str, "\n");
+              }
+            else
+              {
+                addf (str, _("\t\tModulus (bits %d):\n"), bits);
+                _gnutls_buffer_hexdump (str, m.data, m.size, "\t\t\t");
+                addf (str, _("\t\tExponent (bits %d):\n"), e.size * 8);
+                _gnutls_buffer_hexdump (str, e.data, e.size, "\t\t\t");
+              }
+
+            gnutls_free (m.data);
+            gnutls_free (e.data);
+          }
+
+      }
+      break;
+
+    case GNUTLS_PK_EC:
+      {
+        gnutls_datum_t x, y;
+        gnutls_ecc_curve_t curve;
+
+        err = gnutls_pubkey_get_pk_ecc_raw (pubkey, &curve, &x, &y);
+        if (err < 0)
+          addf (str, "error: get_pk_ecc_raw: %s\n", gnutls_strerror (err));
+        else
+          {
+            addf (str, _("\t\tCurve:\t%s\n"),
+                  gnutls_ecc_curve_get_name (curve));
+            if (format == GNUTLS_CRT_PRINT_FULL_NUMBERS)
+              {
+                addf (str, _("\t\tX: "));
+                _gnutls_buffer_hexprint (str, x.data, x.size);
+                adds (str, "\n");
+                addf (str, _("\t\tY: "));
+                _gnutls_buffer_hexprint (str, y.data, y.size);
+                adds (str, "\n");
+              }
+            else
+              {
+                addf (str, _("\t\tX:\n"));
+                _gnutls_buffer_hexdump (str, x.data, x.size, "\t\t\t");
+                adds (str, _("\t\tY:\n"));
+                _gnutls_buffer_hexdump (str, y.data, y.size, "\t\t\t");
+              }
+
+            gnutls_free (x.data);
+            gnutls_free (y.data);
+
+          }
+      }
+      break;
+    case GNUTLS_PK_DSA:
+      {
+        gnutls_datum_t p, q, g, y;
+
+        err = gnutls_pubkey_get_pk_dsa_raw (pubkey, &p, &q, &g, &y);
+        if (err < 0)
+          addf (str, "error: get_pk_dsa_raw: %s\n", gnutls_strerror (err));
+        else
+          {
+            if (format == GNUTLS_CRT_PRINT_FULL_NUMBERS)
+              {
+                addf (str, _("\t\tPublic key (bits %d): "), bits);
+                _gnutls_buffer_hexprint (str, y.data, y.size);
+                adds (str, "\n");
+                addf (str, _("\t\tP: "));
+                _gnutls_buffer_hexprint (str, p.data, p.size);
+                adds (str, "\n");
+                addf (str, _("\t\tQ: "));
+                _gnutls_buffer_hexprint (str, q.data, q.size);
+                adds (str, "\n");
+                addf (str, _("\t\tG: "));
+                _gnutls_buffer_hexprint (str, g.data, g.size);
+                adds (str, "\n");
+              }
+            else
+              {
+                addf (str, _("\t\tPublic key (bits %d):\n"), bits);
+                _gnutls_buffer_hexdump (str, y.data, y.size, "\t\t\t");
+                adds (str, _("\t\tP:\n"));
+                _gnutls_buffer_hexdump (str, p.data, p.size, "\t\t\t");
+                adds (str, _("\t\tQ:\n"));
+                _gnutls_buffer_hexdump (str, q.data, q.size, "\t\t\t");
+                adds (str, _("\t\tG:\n"));
+                _gnutls_buffer_hexdump (str, g.data, g.size, "\t\t\t");
+              }
+
+            gnutls_free (p.data);
+            gnutls_free (q.data);
+            gnutls_free (g.data);
+            gnutls_free (y.data);
+
+          }
+      }
+      break;
+
+    default:
+      break;
+    }
+}
+
+static void
+print_crt_pubkey (gnutls_buffer_st * str, gnutls_x509_crt_t crt, gnutls_certificate_print_formats_t format)
+{
+  gnutls_pubkey_t pubkey;
+  int ret;
+
+  ret = gnutls_pubkey_init (&pubkey);
+  if (ret < 0)
+    return;
+
+  ret = gnutls_pubkey_import_x509 (pubkey, crt, 0);
+  if (ret < 0)
+    goto cleanup;
+
+  print_pubkey (str, _("Subject "), pubkey, format);
+
+cleanup:
+  gnutls_pubkey_deinit (pubkey);
+  return;
+}
+
+static void
+print_cert (gnutls_buffer_st * str, gnutls_x509_crt_t cert,
+            gnutls_certificate_print_formats_t format)
 {
   /* Version. */
   {
@@ -1218,7 +1410,7 @@ print_cert (gnutls_buffer_st * str, gnutls_x509_crt_t cert, int notsigned)
   }
 
   /* Issuer. */
-  if (!notsigned)
+  if (format != GNUTLS_CRT_PRINT_UNSIGNED_FULL)
     {
       char *dn;
       size_t dn_size = 0;
@@ -1309,122 +1501,7 @@ print_cert (gnutls_buffer_st * str, gnutls_x509_crt_t cert, int notsigned)
   }
 
   /* SubjectPublicKeyInfo. */
-  {
-    int err, pk;
-    unsigned int bits;
-
-    err = gnutls_x509_crt_get_pk_algorithm (cert, &bits);
-    if (err < 0)
-      addf (str, "error: get_pk_algorithm: %s\n", gnutls_strerror (err));
-    else
-      {
-        gnutls_pubkey_t pubkey;
-        const char *name = gnutls_pk_algorithm_get_name (err);
-        if (name == NULL)
-          name = _("unknown");
-          
-        pk = err;
-
-        addf (str, _("\tSubject Public Key Algorithm: %s\n"), name);
-        addf (str, _("\tCertificate Security Level: %s (%d bits)\n"),
-              gnutls_sec_param_get_name (gnutls_pk_bits_to_sec_param
-                                         (err, bits)), bits);
-        err = gnutls_pubkey_init(&pubkey);
-        if (err < 0)
-         {
-            addf (str, "error: gnutls_pubkey_init: %s\n", gnutls_strerror (err));
-            return;
-          }
-
-        err = gnutls_pubkey_import_x509(pubkey, cert, 0);
-        if (err < 0)
-          {
-            addf (str, "error: gnutls_pubkey_import_x509: %s\n", gnutls_strerror (err));
-            return;
-          }
-
-        switch (pk)
-          {
-          case GNUTLS_PK_RSA:
-            {
-              gnutls_datum_t m, e;
-
-              err = gnutls_pubkey_get_pk_rsa_raw (pubkey, &m, &e);
-              if (err < 0)
-                addf (str, "error: get_pk_rsa_raw: %s\n",
-                      gnutls_strerror (err));
-              else
-                {
-                  addf (str, _("\t\tModulus (bits %d):\n"), bits);
-                  _gnutls_buffer_hexdump (str, m.data, m.size, "\t\t\t");
-                  addf (str, _("\t\tExponent (bits %d):\n"), e.size * 8);
-                  _gnutls_buffer_hexdump (str, e.data, e.size, "\t\t\t");
-
-                  gnutls_free (m.data);
-                  gnutls_free (e.data);
-                }
-
-            }
-            break;
-
-          case GNUTLS_PK_EC:
-            {
-              gnutls_datum_t x, y;
-              gnutls_ecc_curve_t curve;
-
-              err = gnutls_pubkey_get_pk_ecc_raw (pubkey, &curve, &x, &y);
-              if (err < 0)
-                addf (str, "error: get_pk_ecc_raw: %s\n",
-                      gnutls_strerror (err));
-              else
-                {
-                  addf (str, _("\t\tCurve:\t%s\n"), gnutls_ecc_curve_get_name(curve));
-                  addf (str, _("\t\tX:\n"));
-                  _gnutls_buffer_hexdump (str, x.data, x.size, "\t\t\t");
-                  adds (str, _("\t\tY:\n"));
-                  _gnutls_buffer_hexdump (str, y.data, y.size, "\t\t\t");
-
-                  gnutls_free (x.data);
-                  gnutls_free (y.data);
-
-                }
-            }
-            break;
-          case GNUTLS_PK_DSA:
-            {
-              gnutls_datum_t p, q, g, y;
-
-              err = gnutls_pubkey_get_pk_dsa_raw (pubkey, &p, &q, &g, &y);
-              if (err < 0)
-                addf (str, "error: get_pk_dsa_raw: %s\n",
-                      gnutls_strerror (err));
-              else
-                {
-                  addf (str, _("\t\tPublic key (bits %d):\n"), bits);
-                  _gnutls_buffer_hexdump (str, y.data, y.size, "\t\t\t");
-                  adds (str, _("\t\tP:\n"));
-                  _gnutls_buffer_hexdump (str, p.data, p.size, "\t\t\t");
-                  adds (str, _("\t\tQ:\n"));
-                  _gnutls_buffer_hexdump (str, q.data, q.size, "\t\t\t");
-                  adds (str, _("\t\tG:\n"));
-                  _gnutls_buffer_hexdump (str, g.data, g.size, "\t\t\t");
-
-                  gnutls_free (p.data);
-                  gnutls_free (q.data);
-                  gnutls_free (g.data);
-                  gnutls_free (y.data);
-
-                }
-            }
-            break;
-
-          default:
-            break;
-          }
-        
-        gnutls_pubkey_deinit(pubkey);
-      }
-  }
+  print_crt_pubkey(str, cert, format);
 
   print_unique_ids (str, cert);
 
@@ -1438,7 +1515,7 @@ print_cert (gnutls_buffer_st * str, gnutls_x509_crt_t cert, int notsigned)
     }
 
   /* Signature. */
-  if (!notsigned)
+  if (format != GNUTLS_CRT_PRINT_UNSIGNED_FULL)
     {
       int err;
       size_t size = 0;
@@ -1455,7 +1532,7 @@ print_cert (gnutls_buffer_st * str, gnutls_x509_crt_t cert, int notsigned)
             name = _("unknown");
           addf (str, _("\tSignature Algorithm: %s\n"), name);
         }
-      if (gnutls_sign_is_secure(err) == 0)
+      if (gnutls_sign_is_secure (err) == 0)
         {
           adds (str, _("warning: signed using a broken signature "
                        "algorithm that can be forged.\n"));
@@ -1498,7 +1575,7 @@ print_fingerprint (gnutls_buffer_st * str, gnutls_x509_crt_t cert,
   int err;
   char buffer[MAX_HASH_SIZE];
   size_t size = sizeof (buffer);
-  
+
   err = gnutls_x509_crt_get_fingerprint (cert, algo, buffer, &size);
   if (err < 0)
     {
@@ -1519,9 +1596,9 @@ print_keyid (gnutls_buffer_st * str, gnutls_x509_crt_t cert)
 {
   int err;
   unsigned char buffer[32];
-  size_t size = sizeof(buffer);
-  const charname;
-  charp;
+  size_t size = sizeof (buffer);
+  const char *name;
+  char *p;
   unsigned int bits;
 
   err = gnutls_x509_crt_get_key_id (cert, 0, buffer, &size);
@@ -1538,26 +1615,27 @@ print_keyid (gnutls_buffer_st * str, gnutls_x509_crt_t cert)
   err = gnutls_x509_crt_get_pk_algorithm (cert, &bits);
   if (err < 0)
     return;
-    
-  name = gnutls_pk_get_name(err);
+
+  name = gnutls_pk_get_name (err);
   if (name == NULL)
     return;
 
-  p = _gnutls_key_fingerprint_randomart(buffer, size, name, bits, "\t\t");
+  p = _gnutls_key_fingerprint_randomart (buffer, size, name, bits, "\t\t");
   if (p == NULL)
     return;
-  
+
   adds (str, _("\tPublic key's random art:\n"));
   adds (str, p);
   adds (str, "\n");
 
-  gnutls_free(p);
+  gnutls_free (p);
 }
 
 static void
-print_other (gnutls_buffer_st * str, gnutls_x509_crt_t cert, int notsigned)
+print_other (gnutls_buffer_st * str, gnutls_x509_crt_t cert,
+             gnutls_certificate_print_formats_t format)
 {
-  if (!notsigned)
+  if (format != GNUTLS_CRT_PRINT_UNSIGNED_FULL)
     {
       print_fingerprint (str, cert, GNUTLS_DIG_SHA1);
     }
@@ -1567,7 +1645,7 @@ print_other (gnutls_buffer_st * str, gnutls_x509_crt_t cert, int notsigned)
 static void
 print_oneline (gnutls_buffer_st * str, gnutls_x509_crt_t cert)
 {
-int err;
+  int err;
 
   /* Subject. */
   {
@@ -1641,7 +1719,7 @@ int err;
         const char *name = gnutls_sign_algorithm_get_name (err);
         if (name == NULL)
           name = _("unknown");
-        if (gnutls_sign_is_secure(err) == 0)
+        if (gnutls_sign_is_secure (err) == 0)
           addf (str, _("signed using %s (broken!), "), name);
         else
           addf (str, _("signed using %s, "), name);
@@ -1751,60 +1829,57 @@ gnutls_x509_crt_print (gnutls_x509_crt_t cert,
   gnutls_buffer_st str;
   int ret;
 
-  if (format == GNUTLS_CRT_PRINT_FULL
-      || format == GNUTLS_CRT_PRINT_UNSIGNED_FULL)
+  if (format == GNUTLS_CRT_PRINT_COMPACT)
     {
       _gnutls_buffer_init (&str);
 
-      _gnutls_buffer_append_str (&str, _("X.509 Certificate Information:\n"));
-
-      print_cert (&str, cert, format == GNUTLS_CRT_PRINT_UNSIGNED_FULL);
-
-      _gnutls_buffer_append_str (&str, _("Other Information:\n"));
+      print_oneline (&str, cert);
 
-      print_other (&str, cert, format == GNUTLS_CRT_PRINT_UNSIGNED_FULL);
+      _gnutls_buffer_append_data (&str, "\n", 1);
+      print_keyid (&str, cert);
 
       _gnutls_buffer_append_data (&str, "\0", 1);
 
-      ret = _gnutls_buffer_to_datum( &str, out);
-      if (out->size > 0) out->size--;
-      
+      ret = _gnutls_buffer_to_datum (&str, out);
+      if (out->size > 0)
+        out->size--;
+
       return ret;
     }
-  else if (format == GNUTLS_CRT_PRINT_COMPACT)
+  else if (format == GNUTLS_CRT_PRINT_ONELINE)
     {
       _gnutls_buffer_init (&str);
 
       print_oneline (&str, cert);
 
-      _gnutls_buffer_append_data (&str, "\n", 1);
-      print_keyid (&str, cert);
-
       _gnutls_buffer_append_data (&str, "\0", 1);
 
-      ret = _gnutls_buffer_to_datum( &str, out);
-      if (out->size > 0) out->size--;
-      
+      ret = _gnutls_buffer_to_datum (&str, out);
+      if (out->size > 0)
+        out->size--;
+
       return ret;
     }
-  else if (format == GNUTLS_CRT_PRINT_ONELINE)
+  else
     {
       _gnutls_buffer_init (&str);
 
-      print_oneline (&str, cert);
+      _gnutls_buffer_append_str (&str, _("X.509 Certificate Information:\n"));
+
+      print_cert (&str, cert, format);
+
+      _gnutls_buffer_append_str (&str, _("Other Information:\n"));
+
+      print_other (&str, cert, format);
 
       _gnutls_buffer_append_data (&str, "\0", 1);
 
-      ret = _gnutls_buffer_to_datum( &str, out);
-      if (out->size > 0) out->size--;
-      
+      ret = _gnutls_buffer_to_datum (&str, out);
+      if (out->size > 0)
+        out->size--;
+
       return ret;
     }
-  else
-    {
-      gnutls_assert ();
-      return GNUTLS_E_INVALID_REQUEST;
-    }
 }
 
 static void
@@ -2068,7 +2143,7 @@ print_crl (gnutls_buffer_st * str, gnutls_x509_crl_t crl, int notsigned)
             name = _("unknown");
           addf (str, _("\tSignature Algorithm: %s\n"), name);
         }
-      if (gnutls_sign_is_secure(err) == 0)
+      if (gnutls_sign_is_secure (err) == 0)
         {
           adds (str, _("warning: signed using a broken signature "
                        "algorithm that can be forged.\n"));
@@ -2134,15 +2209,37 @@ gnutls_x509_crl_print (gnutls_x509_crl_t crl,
   print_crl (&str, crl, format == GNUTLS_CRT_PRINT_UNSIGNED_FULL);
 
   _gnutls_buffer_append_data (&str, "\0", 1);
-  
-  ret = _gnutls_buffer_to_datum( &str, out);
-  if (out->size > 0) out->size--;
+
+  ret = _gnutls_buffer_to_datum (&str, out);
+  if (out->size > 0)
+    out->size--;
+
   return ret;
 }
 
 static void
-print_crq (gnutls_buffer_st * str, gnutls_x509_crq_t cert)
+print_crq_pubkey (gnutls_buffer_st * str, gnutls_x509_crq_t crq, gnutls_certificate_print_formats_t format)
+{
+  gnutls_pubkey_t pubkey;
+  int ret;
+
+  ret = gnutls_pubkey_init (&pubkey);
+  if (ret < 0)
+    return;
+
+  ret = gnutls_pubkey_import_x509_crq (pubkey, crq, 0);
+  if (ret < 0)
+    goto cleanup;
+
+  print_pubkey (str, _("Subject "), pubkey, format);
+
+cleanup:
+  gnutls_pubkey_deinit (pubkey);
+  return;
+}
+
+static void
+print_crq (gnutls_buffer_st * str, gnutls_x509_crq_t cert, gnutls_certificate_print_formats_t format)
 {
   /* Version. */
   {
@@ -2189,68 +2286,7 @@ print_crq (gnutls_buffer_st * str, gnutls_x509_crq_t cert)
     if (err < 0)
       addf (str, "error: get_pk_algorithm: %s\n", gnutls_strerror (err));
     else
-      {
-        const char *name = gnutls_pk_algorithm_get_name (err);
-        if (name == NULL)
-          name = _("unknown");
-
-        addf (str, _("\tSubject Public Key Algorithm: %s\n"), name);
-        switch (err)
-          {
-          case GNUTLS_PK_RSA:
-            {
-              gnutls_datum_t m, e;
-
-              err = gnutls_x509_crq_get_key_rsa_raw (cert, &m, &e);
-              if (err < 0)
-                addf (str, "error: get_pk_rsa_raw: %s\n",
-                      gnutls_strerror (err));
-              else
-                {
-                  addf (str, _("\t\tModulus (bits %d):\n"), bits);
-                  _gnutls_buffer_hexdump (str, m.data, m.size, "\t\t\t");
-                  adds (str, _("\t\tExponent:\n"));
-                  _gnutls_buffer_hexdump (str, e.data, e.size, "\t\t\t");
-
-                  gnutls_free (m.data);
-                  gnutls_free (e.data);
-                }
-
-            }
-            break;
-#if 0                           /* not implemented yet */
-          case GNUTLS_PK_DSA:
-            {
-              gnutls_datum_t p, q, g, y;
-
-              err = gnutls_x509_crq_get_key_dsa_raw (cert, &p, &q, &g, &y);
-              if (err < 0)
-                addf (str, "error: get_pk_dsa_raw: %s\n",
-                      gnutls_strerror (err));
-              else
-                {
-                  addf (str, _("\t\tPublic key (bits %d):\n"), bits);
-                  _gnutls_buffer_hexdump (str, y.data, y.size, "\t\t\t");
-                  addf (str, _("\t\tP:\n"));
-                  _gnutls_buffer_hexdump (str, p.data, p.size, "\t\t\t");
-                  addf (str, _("\t\tQ:\n"));
-                  _gnutls_buffer_hexdump (str, q.data, q.size, "\t\t\t");
-                  addf (str, _("\t\tG:\n"));
-                  _gnutls_buffer_hexdump (str, g.data, g.size, "\t\t\t");
-
-                  gnutls_free (p.data);
-                  gnutls_free (q.data);
-                  gnutls_free (g.data);
-                  gnutls_free (y.data);
-
-                }
-            }
-            break;
-#endif
-          default:
-            break;
-          }
-      }
+      print_crq_pubkey (str, cert, format);
   }
 
   /* parse attributes */
@@ -2447,7 +2483,7 @@ gnutls_x509_crq_print (gnutls_x509_crq_t crq,
   _gnutls_buffer_append_str
     (&str, _("PKCS #10 Certificate Request Information:\n"));
 
-  print_crq (&str, crq);
+  print_crq (&str, crq, format);
 
   _gnutls_buffer_append_str (&str, _("Other Information:\n"));
 
@@ -2455,9 +2491,85 @@ gnutls_x509_crq_print (gnutls_x509_crq_t crq,
 
   _gnutls_buffer_append_data (&str, "\0", 1);
 
-  ret = _gnutls_buffer_to_datum( &str, out);
-  if (out->size > 0) out->size--;
+  ret = _gnutls_buffer_to_datum (&str, out);
+  if (out->size > 0)
+    out->size--;
+
   return ret;
 }
 
+static void
+print_pubkey_other (gnutls_buffer_st * str, gnutls_pubkey_t pubkey, gnutls_certificate_print_formats_t format)
+{
+  uint8_t buffer[MAX_HASH_SIZE];
+  size_t size = sizeof(buffer);
+  int ret;
+  unsigned int usage;
+  cert_type_t ccert;
+
+  ccert.pubkey = pubkey;
+
+  ret = gnutls_pubkey_get_key_usage (pubkey, &usage);
+  if (ret < 0)
+    {
+      addf (str, "error: get_key_usage: %s\n", gnutls_strerror (ret));
+      return;
+    }
+    
+  adds (str, "\n");
+  adds (str, _("Public Key Usage:\n"));
+  print_key_usage (str, "\t", TYPE_PUBKEY, ccert);
+
+  ret = gnutls_pubkey_get_key_id (pubkey, 0, buffer, &size);
+  if (ret < 0)
+    {
+      addf (str, "error: get_key_id: %s\n", gnutls_strerror (ret));
+      return;
+    }
+    
+  adds (str, "\n");
+  adds (str, _("Public Key ID: "));
+  _gnutls_buffer_hexprint (str, buffer, size);
+  adds (str, "\n");
+}
+
+/**
+ * gnutls_pubkey_print:
+ * @pubkey: The structure to be printed
+ * @format: Indicate the format to use
+ * @out: Newly allocated datum with (0) terminated string.
+ *
+ * This function will pretty print public key information, suitable for
+ * display to a human.
+ *
+ * Only %GNUTLS_CRT_PRINT_FULL and %GNUTLS_CRT_PRINT_FULL_NUMBERS
+ * are implemented.
+ *
+ * The output @out needs to be deallocated using gnutls_free().
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a
+ *   negative error value.
+ **/
+int
+gnutls_pubkey_print (gnutls_pubkey_t pubkey,
+                     gnutls_certificate_print_formats_t format,
+                     gnutls_datum_t * out)
+{
+  gnutls_buffer_st str;
+  int ret;
+
+  _gnutls_buffer_init (&str);
+
+  _gnutls_buffer_append_str (&str, _("Public Key Information:\n"));
+
+  print_pubkey (&str, "", pubkey, format);
+  print_pubkey_other (&str, pubkey, format);
+
+  _gnutls_buffer_append_data (&str, "\0", 1);
+
+  ret = _gnutls_buffer_to_datum (&str, out);
+  if (out->size > 0)
+    out->size--;
+
+  return ret;
+}
index 261f2d89e7a3a78dad75b087b7eab445f2eab11f..9eee3b9120b29c4770b44fcb484a26765d22cd17 100644 (file)
@@ -2,7 +2,7 @@
  *  
  *  DO NOT EDIT THIS FILE   (certtool-args.c)
  *  
- *  It has been AutoGen-ed  November 20, 2012 at 12:55:34 AM by AutoGen 5.16
+ *  It has been AutoGen-ed  November 20, 2012 at 05:51:05 PM by AutoGen 5.16
  *  From the definitions    certtool-args.def
  *  and the template file   options
  *
@@ -67,7 +67,7 @@ extern FILE * option_usage_fp;
 /*
  *  certtool option static const strings
  */
-static char const certtool_opt_strs[4691] =
+static char const certtool_opt_strs[4767] =
 /*     0 */ "certtool @VERSION@\n"
             "Copyright (C) 2000-2012 Free Software Foundation, all rights reserved.\n"
             "This is free software. It is licensed for use, modification and\n"
@@ -156,115 +156,118 @@ static char const certtool_opt_strs[4691] =
 /*  2293 */ "Password to use\0"
 /*  2309 */ "PASSWORD\0"
 /*  2318 */ "password\0"
-/*  2327 */ "Enforce a NULL password\0"
-/*  2351 */ "NULL_PASSWORD\0"
-/*  2365 */ "null-password\0"
-/*  2379 */ "Print information on the given certificate\0"
-/*  2422 */ "CERTIFICATE_INFO\0"
-/*  2439 */ "certificate-info\0"
-/*  2456 */ "Print certificate's public key\0"
-/*  2487 */ "CERTIFICATE_PUBKEY\0"
-/*  2506 */ "certificate-pubkey\0"
-/*  2525 */ "Print information on the given OpenPGP certificate\0"
-/*  2576 */ "PGP_CERTIFICATE_INFO\0"
-/*  2597 */ "pgp-certificate-info\0"
-/*  2618 */ "Print information on the given OpenPGP keyring structure\0"
-/*  2675 */ "PGP_RING_INFO\0"
-/*  2689 */ "pgp-ring-info\0"
-/*  2703 */ "Print information on the given CRL structure\0"
-/*  2748 */ "CRL_INFO\0"
-/*  2757 */ "crl-info\0"
-/*  2766 */ "Print information on the given certificate request\0"
-/*  2817 */ "CRQ_INFO\0"
-/*  2826 */ "crq-info\0"
-/*  2835 */ "Do not use extensions in certificate requests\0"
-/*  2881 */ "NO_CRQ_EXTENSIONS\0"
-/*  2899 */ "no-crq-extensions\0"
-/*  2917 */ "Print information on a PKCS #12 structure\0"
-/*  2959 */ "P12_INFO\0"
-/*  2968 */ "p12-info\0"
-/*  2977 */ "Print information on a PKCS #7 structure\0"
-/*  3018 */ "P7_INFO\0"
-/*  3026 */ "p7-info\0"
-/*  3034 */ "Convert S/MIME to PKCS #7 structure\0"
-/*  3070 */ "SMIME_TO_P7\0"
-/*  3082 */ "smime-to-p7\0"
-/*  3094 */ "Print information on a private key\0"
-/*  3129 */ "KEY_INFO\0"
-/*  3138 */ "key-info\0"
-/*  3147 */ "Print information on an OpenPGP private key\0"
-/*  3191 */ "PGP_KEY_INFO\0"
-/*  3204 */ "pgp-key-info\0"
-/*  3217 */ "Print information on a public key\0"
-/*  3251 */ "PUBKEY_INFO\0"
-/*  3263 */ "pubkey-info\0"
-/*  3275 */ "Generate an X.509 version 1 certificate (with no extensions)\0"
-/*  3336 */ "V1\0"
-/*  3339 */ "v1\0"
-/*  3342 */ "Generate a PKCS #12 structure\0"
-/*  3372 */ "TO_P12\0"
-/*  3379 */ "to-p12\0"
-/*  3386 */ "Generate a PKCS #8 structure\0"
-/*  3415 */ "TO_P8\0"
-/*  3421 */ "to-p8\0"
-/*  3427 */ "Use PKCS #8 format for private keys\0"
-/*  3463 */ "PKCS8\0"
-/*  3469 */ "pkcs8\0"
-/*  3475 */ "Generate RSA key\0"
-/*  3492 */ "RSA\0"
-/*  3496 */ "rsa\0"
-/*  3500 */ "Generate DSA key\0"
-/*  3517 */ "DSA\0"
-/*  3521 */ "dsa\0"
-/*  3525 */ "Generate ECC (ECDSA) key\0"
-/*  3550 */ "ECC\0"
-/*  3554 */ "ecc\0"
-/*  3558 */ "Hash algorithm to use for signing.\0"
-/*  3593 */ "HASH\0"
-/*  3598 */ "hash\0"
-/*  3603 */ "Use DER format for input certificates and private keys.\0"
-/*  3659 */ "INDER\0"
-/*  3665 */ "no-inder\0"
-/*  3674 */ "no\0"
-/*  3677 */ "This is an alias for 'inder'\0"
-/*  3706 */ "inraw\0"
-/*  3712 */ "Use DER format for output certificates and private keys\0"
-/*  3768 */ "OUTDER\0"
-/*  3775 */ "no-outder\0"
-/*  3785 */ "This is an alias for 'outder'\0"
-/*  3815 */ "outraw\0"
-/*  3822 */ "Specify the number of bits for key generate\0"
-/*  3866 */ "BITS\0"
-/*  3871 */ "bits\0"
-/*  3876 */ "Specify the security level [low, legacy, normal, high, ultra].\0"
-/*  3939 */ "SEC_PARAM\0"
-/*  3949 */ "sec-param\0"
-/*  3959 */ "No effect\0"
-/*  3969 */ "DISABLE_QUICK_RANDOM\0"
-/*  3990 */ "disable-quick-random\0"
-/*  4011 */ "Template file to use for non-interactive operation\0"
-/*  4062 */ "TEMPLATE\0"
-/*  4071 */ "template\0"
-/*  4080 */ "Cipher to use for PKCS #8 and #12 operations\0"
-/*  4125 */ "PKCS_CIPHER\0"
-/*  4137 */ "pkcs-cipher\0"
-/*  4149 */ "Display extended usage information and exit\0"
-/*  4193 */ "help\0"
-/*  4198 */ "Extended usage information passed thru pager\0"
-/*  4243 */ "more-help\0"
-/*  4253 */ "Output version information and exit\0"
-/*  4289 */ "version\0"
-/*  4297 */ "CERTTOOL\0"
-/*  4306 */ "certtool - GnuTLS certificate tool - Ver. @VERSION@\n"
+/*  2327 */ "Print big number in an easier format to parse\0"
+/*  2373 */ "SIMPLE_NUMBERS\0"
+/*  2388 */ "simple-numbers\0"
+/*  2403 */ "Enforce a NULL password\0"
+/*  2427 */ "NULL_PASSWORD\0"
+/*  2441 */ "null-password\0"
+/*  2455 */ "Print information on the given certificate\0"
+/*  2498 */ "CERTIFICATE_INFO\0"
+/*  2515 */ "certificate-info\0"
+/*  2532 */ "Print certificate's public key\0"
+/*  2563 */ "CERTIFICATE_PUBKEY\0"
+/*  2582 */ "certificate-pubkey\0"
+/*  2601 */ "Print information on the given OpenPGP certificate\0"
+/*  2652 */ "PGP_CERTIFICATE_INFO\0"
+/*  2673 */ "pgp-certificate-info\0"
+/*  2694 */ "Print information on the given OpenPGP keyring structure\0"
+/*  2751 */ "PGP_RING_INFO\0"
+/*  2765 */ "pgp-ring-info\0"
+/*  2779 */ "Print information on the given CRL structure\0"
+/*  2824 */ "CRL_INFO\0"
+/*  2833 */ "crl-info\0"
+/*  2842 */ "Print information on the given certificate request\0"
+/*  2893 */ "CRQ_INFO\0"
+/*  2902 */ "crq-info\0"
+/*  2911 */ "Do not use extensions in certificate requests\0"
+/*  2957 */ "NO_CRQ_EXTENSIONS\0"
+/*  2975 */ "no-crq-extensions\0"
+/*  2993 */ "Print information on a PKCS #12 structure\0"
+/*  3035 */ "P12_INFO\0"
+/*  3044 */ "p12-info\0"
+/*  3053 */ "Print information on a PKCS #7 structure\0"
+/*  3094 */ "P7_INFO\0"
+/*  3102 */ "p7-info\0"
+/*  3110 */ "Convert S/MIME to PKCS #7 structure\0"
+/*  3146 */ "SMIME_TO_P7\0"
+/*  3158 */ "smime-to-p7\0"
+/*  3170 */ "Print information on a private key\0"
+/*  3205 */ "KEY_INFO\0"
+/*  3214 */ "key-info\0"
+/*  3223 */ "Print information on an OpenPGP private key\0"
+/*  3267 */ "PGP_KEY_INFO\0"
+/*  3280 */ "pgp-key-info\0"
+/*  3293 */ "Print information on a public key\0"
+/*  3327 */ "PUBKEY_INFO\0"
+/*  3339 */ "pubkey-info\0"
+/*  3351 */ "Generate an X.509 version 1 certificate (with no extensions)\0"
+/*  3412 */ "V1\0"
+/*  3415 */ "v1\0"
+/*  3418 */ "Generate a PKCS #12 structure\0"
+/*  3448 */ "TO_P12\0"
+/*  3455 */ "to-p12\0"
+/*  3462 */ "Generate a PKCS #8 structure\0"
+/*  3491 */ "TO_P8\0"
+/*  3497 */ "to-p8\0"
+/*  3503 */ "Use PKCS #8 format for private keys\0"
+/*  3539 */ "PKCS8\0"
+/*  3545 */ "pkcs8\0"
+/*  3551 */ "Generate RSA key\0"
+/*  3568 */ "RSA\0"
+/*  3572 */ "rsa\0"
+/*  3576 */ "Generate DSA key\0"
+/*  3593 */ "DSA\0"
+/*  3597 */ "dsa\0"
+/*  3601 */ "Generate ECC (ECDSA) key\0"
+/*  3626 */ "ECC\0"
+/*  3630 */ "ecc\0"
+/*  3634 */ "Hash algorithm to use for signing.\0"
+/*  3669 */ "HASH\0"
+/*  3674 */ "hash\0"
+/*  3679 */ "Use DER format for input certificates and private keys.\0"
+/*  3735 */ "INDER\0"
+/*  3741 */ "no-inder\0"
+/*  3750 */ "no\0"
+/*  3753 */ "This is an alias for 'inder'\0"
+/*  3782 */ "inraw\0"
+/*  3788 */ "Use DER format for output certificates and private keys\0"
+/*  3844 */ "OUTDER\0"
+/*  3851 */ "no-outder\0"
+/*  3861 */ "This is an alias for 'outder'\0"
+/*  3891 */ "outraw\0"
+/*  3898 */ "Specify the number of bits for key generate\0"
+/*  3942 */ "BITS\0"
+/*  3947 */ "bits\0"
+/*  3952 */ "Specify the security level [low, legacy, normal, high, ultra].\0"
+/*  4015 */ "SEC_PARAM\0"
+/*  4025 */ "sec-param\0"
+/*  4035 */ "No effect\0"
+/*  4045 */ "DISABLE_QUICK_RANDOM\0"
+/*  4066 */ "disable-quick-random\0"
+/*  4087 */ "Template file to use for non-interactive operation\0"
+/*  4138 */ "TEMPLATE\0"
+/*  4147 */ "template\0"
+/*  4156 */ "Cipher to use for PKCS #8 and #12 operations\0"
+/*  4201 */ "PKCS_CIPHER\0"
+/*  4213 */ "pkcs-cipher\0"
+/*  4225 */ "Display extended usage information and exit\0"
+/*  4269 */ "help\0"
+/*  4274 */ "Extended usage information passed thru pager\0"
+/*  4319 */ "more-help\0"
+/*  4329 */ "Output version information and exit\0"
+/*  4365 */ "version\0"
+/*  4373 */ "CERTTOOL\0"
+/*  4382 */ "certtool - GnuTLS certificate tool - Ver. @VERSION@\n"
             "USAGE:  %s [ -<flag> [<val>] | --<name>[{=| }<val>] ]...\n\0"
-/*  4416 */ "bug-gnutls@gnu.org\0"
-/*  4435 */ "\n\n\0"
-/*  4438 */ "\n"
+/*  4492 */ "bug-gnutls@gnu.org\0"
+/*  4511 */ "\n\n\0"
+/*  4514 */ "\n"
             "Tool to parse and generate X.509 certificates, requests and private keys.\n"
             "It can be used interactively or non interactively by specifying the\n"
             "template command line option.\n\0"
-/*  4612 */ "certtool @VERSION@\0"
-/*  4631 */ "certtool [options]\n"
+/*  4688 */ "certtool @VERSION@\0"
+/*  4707 */ "certtool [options]\n"
             "certtool --help for usage instructions.\n";
 
 /*
@@ -475,133 +478,141 @@ static int const aVerify_CrlMustList[] = {
 #define PASSWORD_FLAGS     (OPTST_DISABLED \
         | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
 
+/*
+ *  simple-numbers option description:
+ */
+#define SIMPLE_NUMBERS_DESC      (certtool_opt_strs+2327)
+#define SIMPLE_NUMBERS_NAME      (certtool_opt_strs+2373)
+#define SIMPLE_NUMBERS_name      (certtool_opt_strs+2388)
+#define SIMPLE_NUMBERS_FLAGS     (OPTST_DISABLED)
+
 /*
  *  null-password option description:
  */
-#define NULL_PASSWORD_DESC      (certtool_opt_strs+2327)
-#define NULL_PASSWORD_NAME      (certtool_opt_strs+2351)
-#define NULL_PASSWORD_name      (certtool_opt_strs+2365)
+#define NULL_PASSWORD_DESC      (certtool_opt_strs+2403)
+#define NULL_PASSWORD_NAME      (certtool_opt_strs+2427)
+#define NULL_PASSWORD_name      (certtool_opt_strs+2441)
 #define NULL_PASSWORD_FLAGS     (OPTST_DISABLED)
 
 /*
  *  certificate-info option description:
  */
-#define CERTIFICATE_INFO_DESC      (certtool_opt_strs+2379)
-#define CERTIFICATE_INFO_NAME      (certtool_opt_strs+2422)
-#define CERTIFICATE_INFO_name      (certtool_opt_strs+2439)
+#define CERTIFICATE_INFO_DESC      (certtool_opt_strs+2455)
+#define CERTIFICATE_INFO_NAME      (certtool_opt_strs+2498)
+#define CERTIFICATE_INFO_name      (certtool_opt_strs+2515)
 #define CERTIFICATE_INFO_FLAGS     (OPTST_DISABLED)
 
 /*
  *  certificate-pubkey option description:
  */
-#define CERTIFICATE_PUBKEY_DESC      (certtool_opt_strs+2456)
-#define CERTIFICATE_PUBKEY_NAME      (certtool_opt_strs+2487)
-#define CERTIFICATE_PUBKEY_name      (certtool_opt_strs+2506)
+#define CERTIFICATE_PUBKEY_DESC      (certtool_opt_strs+2532)
+#define CERTIFICATE_PUBKEY_NAME      (certtool_opt_strs+2563)
+#define CERTIFICATE_PUBKEY_name      (certtool_opt_strs+2582)
 #define CERTIFICATE_PUBKEY_FLAGS     (OPTST_DISABLED)
 
 /*
  *  pgp-certificate-info option description:
  */
-#define PGP_CERTIFICATE_INFO_DESC      (certtool_opt_strs+2525)
-#define PGP_CERTIFICATE_INFO_NAME      (certtool_opt_strs+2576)
-#define PGP_CERTIFICATE_INFO_name      (certtool_opt_strs+2597)
+#define PGP_CERTIFICATE_INFO_DESC      (certtool_opt_strs+2601)
+#define PGP_CERTIFICATE_INFO_NAME      (certtool_opt_strs+2652)
+#define PGP_CERTIFICATE_INFO_name      (certtool_opt_strs+2673)
 #define PGP_CERTIFICATE_INFO_FLAGS     (OPTST_DISABLED)
 
 /*
  *  pgp-ring-info option description:
  */
-#define PGP_RING_INFO_DESC      (certtool_opt_strs+2618)
-#define PGP_RING_INFO_NAME      (certtool_opt_strs+2675)
-#define PGP_RING_INFO_name      (certtool_opt_strs+2689)
+#define PGP_RING_INFO_DESC      (certtool_opt_strs+2694)
+#define PGP_RING_INFO_NAME      (certtool_opt_strs+2751)
+#define PGP_RING_INFO_name      (certtool_opt_strs+2765)
 #define PGP_RING_INFO_FLAGS     (OPTST_DISABLED)
 
 /*
  *  crl-info option description:
  */
-#define CRL_INFO_DESC      (certtool_opt_strs+2703)
-#define CRL_INFO_NAME      (certtool_opt_strs+2748)
-#define CRL_INFO_name      (certtool_opt_strs+2757)
+#define CRL_INFO_DESC      (certtool_opt_strs+2779)
+#define CRL_INFO_NAME      (certtool_opt_strs+2824)
+#define CRL_INFO_name      (certtool_opt_strs+2833)
 #define CRL_INFO_FLAGS     (OPTST_DISABLED)
 
 /*
  *  crq-info option description:
  */
-#define CRQ_INFO_DESC      (certtool_opt_strs+2766)
-#define CRQ_INFO_NAME      (certtool_opt_strs+2817)
-#define CRQ_INFO_name      (certtool_opt_strs+2826)
+#define CRQ_INFO_DESC      (certtool_opt_strs+2842)
+#define CRQ_INFO_NAME      (certtool_opt_strs+2893)
+#define CRQ_INFO_name      (certtool_opt_strs+2902)
 #define CRQ_INFO_FLAGS     (OPTST_DISABLED)
 
 /*
  *  no-crq-extensions option description:
  */
-#define NO_CRQ_EXTENSIONS_DESC      (certtool_opt_strs+2835)
-#define NO_CRQ_EXTENSIONS_NAME      (certtool_opt_strs+2881)
-#define NO_CRQ_EXTENSIONS_name      (certtool_opt_strs+2899)
+#define NO_CRQ_EXTENSIONS_DESC      (certtool_opt_strs+2911)
+#define NO_CRQ_EXTENSIONS_NAME      (certtool_opt_strs+2957)
+#define NO_CRQ_EXTENSIONS_name      (certtool_opt_strs+2975)
 #define NO_CRQ_EXTENSIONS_FLAGS     (OPTST_DISABLED)
 
 /*
  *  p12-info option description:
  */
-#define P12_INFO_DESC      (certtool_opt_strs+2917)
-#define P12_INFO_NAME      (certtool_opt_strs+2959)
-#define P12_INFO_name      (certtool_opt_strs+2968)
+#define P12_INFO_DESC      (certtool_opt_strs+2993)
+#define P12_INFO_NAME      (certtool_opt_strs+3035)
+#define P12_INFO_name      (certtool_opt_strs+3044)
 #define P12_INFO_FLAGS     (OPTST_DISABLED)
 
 /*
  *  p7-info option description:
  */
-#define P7_INFO_DESC      (certtool_opt_strs+2977)
-#define P7_INFO_NAME      (certtool_opt_strs+3018)
-#define P7_INFO_name      (certtool_opt_strs+3026)
+#define P7_INFO_DESC      (certtool_opt_strs+3053)
+#define P7_INFO_NAME      (certtool_opt_strs+3094)
+#define P7_INFO_name      (certtool_opt_strs+3102)
 #define P7_INFO_FLAGS     (OPTST_DISABLED)
 
 /*
  *  smime-to-p7 option description:
  */
-#define SMIME_TO_P7_DESC      (certtool_opt_strs+3034)
-#define SMIME_TO_P7_NAME      (certtool_opt_strs+3070)
-#define SMIME_TO_P7_name      (certtool_opt_strs+3082)
+#define SMIME_TO_P7_DESC      (certtool_opt_strs+3110)
+#define SMIME_TO_P7_NAME      (certtool_opt_strs+3146)
+#define SMIME_TO_P7_name      (certtool_opt_strs+3158)
 #define SMIME_TO_P7_FLAGS     (OPTST_DISABLED)
 
 /*
  *  key-info option description:
  */
-#define KEY_INFO_DESC      (certtool_opt_strs+3094)
-#define KEY_INFO_NAME      (certtool_opt_strs+3129)
-#define KEY_INFO_name      (certtool_opt_strs+3138)
+#define KEY_INFO_DESC      (certtool_opt_strs+3170)
+#define KEY_INFO_NAME      (certtool_opt_strs+3205)
+#define KEY_INFO_name      (certtool_opt_strs+3214)
 #define KEY_INFO_FLAGS     (OPTST_DISABLED)
 
 /*
  *  pgp-key-info option description:
  */
-#define PGP_KEY_INFO_DESC      (certtool_opt_strs+3147)
-#define PGP_KEY_INFO_NAME      (certtool_opt_strs+3191)
-#define PGP_KEY_INFO_name      (certtool_opt_strs+3204)
+#define PGP_KEY_INFO_DESC      (certtool_opt_strs+3223)
+#define PGP_KEY_INFO_NAME      (certtool_opt_strs+3267)
+#define PGP_KEY_INFO_name      (certtool_opt_strs+3280)
 #define PGP_KEY_INFO_FLAGS     (OPTST_DISABLED)
 
 /*
  *  pubkey-info option description:
  */
-#define PUBKEY_INFO_DESC      (certtool_opt_strs+3217)
-#define PUBKEY_INFO_NAME      (certtool_opt_strs+3251)
-#define PUBKEY_INFO_name      (certtool_opt_strs+3263)
+#define PUBKEY_INFO_DESC      (certtool_opt_strs+3293)
+#define PUBKEY_INFO_NAME      (certtool_opt_strs+3327)
+#define PUBKEY_INFO_name      (certtool_opt_strs+3339)
 #define PUBKEY_INFO_FLAGS     (OPTST_DISABLED)
 
 /*
  *  v1 option description:
  */
-#define V1_DESC      (certtool_opt_strs+3275)
-#define V1_NAME      (certtool_opt_strs+3336)
-#define V1_name      (certtool_opt_strs+3339)
+#define V1_DESC      (certtool_opt_strs+3351)
+#define V1_NAME      (certtool_opt_strs+3412)
+#define V1_name      (certtool_opt_strs+3415)
 #define V1_FLAGS     (OPTST_DISABLED)
 
 /*
  *  to-p12 option description with
  *  "Must also have options" and "Incompatible options":
  */
-#define TO_P12_DESC      (certtool_opt_strs+3342)
-#define TO_P12_NAME      (certtool_opt_strs+3372)
-#define TO_P12_name      (certtool_opt_strs+3379)
+#define TO_P12_DESC      (certtool_opt_strs+3418)
+#define TO_P12_NAME      (certtool_opt_strs+3448)
+#define TO_P12_name      (certtool_opt_strs+3455)
 static int const aTo_P12MustList[] = {
     INDEX_OPT_LOAD_CERTIFICATE, NO_EQUIVALENT };
 #define TO_P12_FLAGS     (OPTST_DISABLED)
@@ -609,140 +620,140 @@ static int const aTo_P12MustList[] = {
 /*
  *  to-p8 option description:
  */
-#define TO_P8_DESC      (certtool_opt_strs+3386)
-#define TO_P8_NAME      (certtool_opt_strs+3415)
-#define TO_P8_name      (certtool_opt_strs+3421)
+#define TO_P8_DESC      (certtool_opt_strs+3462)
+#define TO_P8_NAME      (certtool_opt_strs+3491)
+#define TO_P8_name      (certtool_opt_strs+3497)
 #define TO_P8_FLAGS     (OPTST_DISABLED)
 
 /*
  *  pkcs8 option description:
  */
-#define PKCS8_DESC      (certtool_opt_strs+3427)
-#define PKCS8_NAME      (certtool_opt_strs+3463)
-#define PKCS8_name      (certtool_opt_strs+3469)
+#define PKCS8_DESC      (certtool_opt_strs+3503)
+#define PKCS8_NAME      (certtool_opt_strs+3539)
+#define PKCS8_name      (certtool_opt_strs+3545)
 #define PKCS8_FLAGS     (OPTST_DISABLED)
 
 /*
  *  rsa option description:
  */
-#define RSA_DESC      (certtool_opt_strs+3475)
-#define RSA_NAME      (certtool_opt_strs+3492)
-#define RSA_name      (certtool_opt_strs+3496)
+#define RSA_DESC      (certtool_opt_strs+3551)
+#define RSA_NAME      (certtool_opt_strs+3568)
+#define RSA_name      (certtool_opt_strs+3572)
 #define RSA_FLAGS     (OPTST_DISABLED)
 
 /*
  *  dsa option description:
  */
-#define DSA_DESC      (certtool_opt_strs+3500)
-#define DSA_NAME      (certtool_opt_strs+3517)
-#define DSA_name      (certtool_opt_strs+3521)
+#define DSA_DESC      (certtool_opt_strs+3576)
+#define DSA_NAME      (certtool_opt_strs+3593)
+#define DSA_name      (certtool_opt_strs+3597)
 #define DSA_FLAGS     (OPTST_DISABLED)
 
 /*
  *  ecc option description:
  */
-#define ECC_DESC      (certtool_opt_strs+3525)
-#define ECC_NAME      (certtool_opt_strs+3550)
-#define ECC_name      (certtool_opt_strs+3554)
+#define ECC_DESC      (certtool_opt_strs+3601)
+#define ECC_NAME      (certtool_opt_strs+3626)
+#define ECC_name      (certtool_opt_strs+3630)
 #define ECC_FLAGS     (OPTST_DISABLED)
 
 /*
  *  hash option description:
  */
-#define HASH_DESC      (certtool_opt_strs+3558)
-#define HASH_NAME      (certtool_opt_strs+3593)
-#define HASH_name      (certtool_opt_strs+3598)
+#define HASH_DESC      (certtool_opt_strs+3634)
+#define HASH_NAME      (certtool_opt_strs+3669)
+#define HASH_name      (certtool_opt_strs+3674)
 #define HASH_FLAGS     (OPTST_DISABLED \
         | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
 
 /*
  *  inder option description:
  */
-#define INDER_DESC      (certtool_opt_strs+3603)
-#define INDER_NAME      (certtool_opt_strs+3659)
-#define NOT_INDER_name  (certtool_opt_strs+3665)
-#define NOT_INDER_PFX   (certtool_opt_strs+3674)
+#define INDER_DESC      (certtool_opt_strs+3679)
+#define INDER_NAME      (certtool_opt_strs+3735)
+#define NOT_INDER_name  (certtool_opt_strs+3741)
+#define NOT_INDER_PFX   (certtool_opt_strs+3750)
 #define INDER_name      (NOT_INDER_name + 3)
 #define INDER_FLAGS     (OPTST_DISABLED)
 
 /*
  *  inraw option description:
  */
-#define INRAW_DESC    (certtool_opt_strs+3677)
+#define INRAW_DESC    (certtool_opt_strs+3753)
 #define INRAW_NAME    NULL
-#define INRAW_name    (certtool_opt_strs+3706)
+#define INRAW_name    (certtool_opt_strs+3782)
 #define INRAW_FLAGS     (INDER_FLAGS | OPTST_ALIAS)
 
 /*
  *  outder option description:
  */
-#define OUTDER_DESC      (certtool_opt_strs+3712)
-#define OUTDER_NAME      (certtool_opt_strs+3768)
-#define NOT_OUTDER_name  (certtool_opt_strs+3775)
-#define NOT_OUTDER_PFX   (certtool_opt_strs+3674)
+#define OUTDER_DESC      (certtool_opt_strs+3788)
+#define OUTDER_NAME      (certtool_opt_strs+3844)
+#define NOT_OUTDER_name  (certtool_opt_strs+3851)
+#define NOT_OUTDER_PFX   (certtool_opt_strs+3750)
 #define OUTDER_name      (NOT_OUTDER_name + 3)
 #define OUTDER_FLAGS     (OPTST_DISABLED)
 
 /*
  *  outraw option description:
  */
-#define OUTRAW_DESC    (certtool_opt_strs+3785)
+#define OUTRAW_DESC    (certtool_opt_strs+3861)
 #define OUTRAW_NAME    NULL
-#define OUTRAW_name    (certtool_opt_strs+3815)
+#define OUTRAW_name    (certtool_opt_strs+3891)
 #define OUTRAW_FLAGS     (OUTDER_FLAGS | OPTST_ALIAS)
 
 /*
  *  bits option description:
  */
-#define BITS_DESC      (certtool_opt_strs+3822)
-#define BITS_NAME      (certtool_opt_strs+3866)
-#define BITS_name      (certtool_opt_strs+3871)
+#define BITS_DESC      (certtool_opt_strs+3898)
+#define BITS_NAME      (certtool_opt_strs+3942)
+#define BITS_name      (certtool_opt_strs+3947)
 #define BITS_FLAGS     (OPTST_DISABLED \
         | OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
 
 /*
  *  sec-param option description:
  */
-#define SEC_PARAM_DESC      (certtool_opt_strs+3876)
-#define SEC_PARAM_NAME      (certtool_opt_strs+3939)
-#define SEC_PARAM_name      (certtool_opt_strs+3949)
+#define SEC_PARAM_DESC      (certtool_opt_strs+3952)
+#define SEC_PARAM_NAME      (certtool_opt_strs+4015)
+#define SEC_PARAM_name      (certtool_opt_strs+4025)
 #define SEC_PARAM_FLAGS     (OPTST_DISABLED \
         | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
 
 /*
  *  disable-quick-random option description:
  */
-#define DISABLE_QUICK_RANDOM_DESC      (certtool_opt_strs+3959)
-#define DISABLE_QUICK_RANDOM_NAME      (certtool_opt_strs+3969)
-#define DISABLE_QUICK_RANDOM_name      (certtool_opt_strs+3990)
+#define DISABLE_QUICK_RANDOM_DESC      (certtool_opt_strs+4035)
+#define DISABLE_QUICK_RANDOM_NAME      (certtool_opt_strs+4045)
+#define DISABLE_QUICK_RANDOM_name      (certtool_opt_strs+4066)
 #define DISABLE_QUICK_RANDOM_FLAGS     (OPTST_DISABLED)
 
 /*
  *  template option description:
  */
-#define TEMPLATE_DESC      (certtool_opt_strs+4011)
-#define TEMPLATE_NAME      (certtool_opt_strs+4062)
-#define TEMPLATE_name      (certtool_opt_strs+4071)
+#define TEMPLATE_DESC      (certtool_opt_strs+4087)
+#define TEMPLATE_NAME      (certtool_opt_strs+4138)
+#define TEMPLATE_name      (certtool_opt_strs+4147)
 #define TEMPLATE_FLAGS     (OPTST_DISABLED \
         | OPTST_SET_ARGTYPE(OPARG_TYPE_FILE))
 
 /*
  *  pkcs-cipher option description:
  */
-#define PKCS_CIPHER_DESC      (certtool_opt_strs+4080)
-#define PKCS_CIPHER_NAME      (certtool_opt_strs+4125)
-#define PKCS_CIPHER_name      (certtool_opt_strs+4137)
+#define PKCS_CIPHER_DESC      (certtool_opt_strs+4156)
+#define PKCS_CIPHER_NAME      (certtool_opt_strs+4201)
+#define PKCS_CIPHER_name      (certtool_opt_strs+4213)
 #define PKCS_CIPHER_FLAGS     (OPTST_DISABLED \
         | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
 
 /*
  *  Help/More_Help/Version option descriptions:
  */
-#define HELP_DESC       (certtool_opt_strs+4149)
-#define HELP_name       (certtool_opt_strs+4193)
+#define HELP_DESC       (certtool_opt_strs+4225)
+#define HELP_name       (certtool_opt_strs+4269)
 #ifdef HAVE_WORKING_FORK
-#define MORE_HELP_DESC  (certtool_opt_strs+4198)
-#define MORE_HELP_name  (certtool_opt_strs+4243)
+#define MORE_HELP_DESC  (certtool_opt_strs+4274)
+#define MORE_HELP_name  (certtool_opt_strs+4319)
 #define MORE_HELP_FLAGS (OPTST_IMM | OPTST_NO_INIT)
 #else
 #define MORE_HELP_DESC  NULL
@@ -755,8 +766,8 @@ static int const aTo_P12MustList[] = {
 #  define VER_FLAGS     (OPTST_SET_ARGTYPE(OPARG_TYPE_STRING) | \
                          OPTST_ARG_OPTIONAL | OPTST_IMM | OPTST_NO_INIT)
 #endif
-#define VER_DESC        (certtool_opt_strs+4253)
-#define VER_name        (certtool_opt_strs+4289)
+#define VER_DESC        (certtool_opt_strs+4329)
+#define VER_name        (certtool_opt_strs+4365)
 /*
  *  Declare option callback procedures
  */
@@ -1066,8 +1077,20 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ PASSWORD_DESC, PASSWORD_NAME, PASSWORD_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 24, VALUE_OPT_NULL_PASSWORD,
-     /* equiv idx, value */ 24, VALUE_OPT_NULL_PASSWORD,
+  {  /* entry idx, value */ 24, VALUE_OPT_SIMPLE_NUMBERS,
+     /* equiv idx, value */ 24, VALUE_OPT_SIMPLE_NUMBERS,
+     /* equivalenced to  */ NO_EQUIVALENT,
+     /* min, max, act ct */ 0, 1, 0,
+     /* opt state flags  */ SIMPLE_NUMBERS_FLAGS, 0,
+     /* last opt argumnt */ { NULL }, /* --simple-numbers */
+     /* arg list/cookie  */ NULL,
+     /* must/cannot opts */ NULL, NULL,
+     /* option proc      */ NULL,
+     /* desc, NAME, name */ SIMPLE_NUMBERS_DESC, SIMPLE_NUMBERS_NAME, SIMPLE_NUMBERS_name,
+     /* disablement strs */ NULL, NULL },
+
+  {  /* entry idx, value */ 25, VALUE_OPT_NULL_PASSWORD,
+     /* equiv idx, value */ 25, VALUE_OPT_NULL_PASSWORD,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ NULL_PASSWORD_FLAGS, 0,
@@ -1078,8 +1101,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ NULL_PASSWORD_DESC, NULL_PASSWORD_NAME, NULL_PASSWORD_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 25, VALUE_OPT_CERTIFICATE_INFO,
-     /* equiv idx, value */ 25, VALUE_OPT_CERTIFICATE_INFO,
+  {  /* entry idx, value */ 26, VALUE_OPT_CERTIFICATE_INFO,
+     /* equiv idx, value */ 26, VALUE_OPT_CERTIFICATE_INFO,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ CERTIFICATE_INFO_FLAGS, 0,
@@ -1090,8 +1113,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ CERTIFICATE_INFO_DESC, CERTIFICATE_INFO_NAME, CERTIFICATE_INFO_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 26, VALUE_OPT_CERTIFICATE_PUBKEY,
-     /* equiv idx, value */ 26, VALUE_OPT_CERTIFICATE_PUBKEY,
+  {  /* entry idx, value */ 27, VALUE_OPT_CERTIFICATE_PUBKEY,
+     /* equiv idx, value */ 27, VALUE_OPT_CERTIFICATE_PUBKEY,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ CERTIFICATE_PUBKEY_FLAGS, 0,
@@ -1102,8 +1125,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ CERTIFICATE_PUBKEY_DESC, CERTIFICATE_PUBKEY_NAME, CERTIFICATE_PUBKEY_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 27, VALUE_OPT_PGP_CERTIFICATE_INFO,
-     /* equiv idx, value */ 27, VALUE_OPT_PGP_CERTIFICATE_INFO,
+  {  /* entry idx, value */ 28, VALUE_OPT_PGP_CERTIFICATE_INFO,
+     /* equiv idx, value */ 28, VALUE_OPT_PGP_CERTIFICATE_INFO,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ PGP_CERTIFICATE_INFO_FLAGS, 0,
@@ -1114,8 +1137,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ PGP_CERTIFICATE_INFO_DESC, PGP_CERTIFICATE_INFO_NAME, PGP_CERTIFICATE_INFO_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 28, VALUE_OPT_PGP_RING_INFO,
-     /* equiv idx, value */ 28, VALUE_OPT_PGP_RING_INFO,
+  {  /* entry idx, value */ 29, VALUE_OPT_PGP_RING_INFO,
+     /* equiv idx, value */ 29, VALUE_OPT_PGP_RING_INFO,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ PGP_RING_INFO_FLAGS, 0,
@@ -1126,8 +1149,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ PGP_RING_INFO_DESC, PGP_RING_INFO_NAME, PGP_RING_INFO_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 29, VALUE_OPT_CRL_INFO,
-     /* equiv idx, value */ 29, VALUE_OPT_CRL_INFO,
+  {  /* entry idx, value */ 30, VALUE_OPT_CRL_INFO,
+     /* equiv idx, value */ 30, VALUE_OPT_CRL_INFO,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ CRL_INFO_FLAGS, 0,
@@ -1138,8 +1161,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ CRL_INFO_DESC, CRL_INFO_NAME, CRL_INFO_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 30, VALUE_OPT_CRQ_INFO,
-     /* equiv idx, value */ 30, VALUE_OPT_CRQ_INFO,
+  {  /* entry idx, value */ 31, VALUE_OPT_CRQ_INFO,
+     /* equiv idx, value */ 31, VALUE_OPT_CRQ_INFO,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ CRQ_INFO_FLAGS, 0,
@@ -1150,8 +1173,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ CRQ_INFO_DESC, CRQ_INFO_NAME, CRQ_INFO_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 31, VALUE_OPT_NO_CRQ_EXTENSIONS,
-     /* equiv idx, value */ 31, VALUE_OPT_NO_CRQ_EXTENSIONS,
+  {  /* entry idx, value */ 32, VALUE_OPT_NO_CRQ_EXTENSIONS,
+     /* equiv idx, value */ 32, VALUE_OPT_NO_CRQ_EXTENSIONS,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ NO_CRQ_EXTENSIONS_FLAGS, 0,
@@ -1162,8 +1185,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ NO_CRQ_EXTENSIONS_DESC, NO_CRQ_EXTENSIONS_NAME, NO_CRQ_EXTENSIONS_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 32, VALUE_OPT_P12_INFO,
-     /* equiv idx, value */ 32, VALUE_OPT_P12_INFO,
+  {  /* entry idx, value */ 33, VALUE_OPT_P12_INFO,
+     /* equiv idx, value */ 33, VALUE_OPT_P12_INFO,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ P12_INFO_FLAGS, 0,
@@ -1174,8 +1197,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ P12_INFO_DESC, P12_INFO_NAME, P12_INFO_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 33, VALUE_OPT_P7_INFO,
-     /* equiv idx, value */ 33, VALUE_OPT_P7_INFO,
+  {  /* entry idx, value */ 34, VALUE_OPT_P7_INFO,
+     /* equiv idx, value */ 34, VALUE_OPT_P7_INFO,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ P7_INFO_FLAGS, 0,
@@ -1186,8 +1209,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ P7_INFO_DESC, P7_INFO_NAME, P7_INFO_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 34, VALUE_OPT_SMIME_TO_P7,
-     /* equiv idx, value */ 34, VALUE_OPT_SMIME_TO_P7,
+  {  /* entry idx, value */ 35, VALUE_OPT_SMIME_TO_P7,
+     /* equiv idx, value */ 35, VALUE_OPT_SMIME_TO_P7,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ SMIME_TO_P7_FLAGS, 0,
@@ -1198,8 +1221,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ SMIME_TO_P7_DESC, SMIME_TO_P7_NAME, SMIME_TO_P7_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 35, VALUE_OPT_KEY_INFO,
-     /* equiv idx, value */ 35, VALUE_OPT_KEY_INFO,
+  {  /* entry idx, value */ 36, VALUE_OPT_KEY_INFO,
+     /* equiv idx, value */ 36, VALUE_OPT_KEY_INFO,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ KEY_INFO_FLAGS, 0,
@@ -1210,8 +1233,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ KEY_INFO_DESC, KEY_INFO_NAME, KEY_INFO_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 36, VALUE_OPT_PGP_KEY_INFO,
-     /* equiv idx, value */ 36, VALUE_OPT_PGP_KEY_INFO,
+  {  /* entry idx, value */ 37, VALUE_OPT_PGP_KEY_INFO,
+     /* equiv idx, value */ 37, VALUE_OPT_PGP_KEY_INFO,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ PGP_KEY_INFO_FLAGS, 0,
@@ -1222,8 +1245,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ PGP_KEY_INFO_DESC, PGP_KEY_INFO_NAME, PGP_KEY_INFO_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 37, VALUE_OPT_PUBKEY_INFO,
-     /* equiv idx, value */ 37, VALUE_OPT_PUBKEY_INFO,
+  {  /* entry idx, value */ 38, VALUE_OPT_PUBKEY_INFO,
+     /* equiv idx, value */ 38, VALUE_OPT_PUBKEY_INFO,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ PUBKEY_INFO_FLAGS, 0,
@@ -1234,8 +1257,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ PUBKEY_INFO_DESC, PUBKEY_INFO_NAME, PUBKEY_INFO_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 38, VALUE_OPT_V1,
-     /* equiv idx, value */ 38, VALUE_OPT_V1,
+  {  /* entry idx, value */ 39, VALUE_OPT_V1,
+     /* equiv idx, value */ 39, VALUE_OPT_V1,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ V1_FLAGS, 0,
@@ -1246,8 +1269,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ V1_DESC, V1_NAME, V1_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 39, VALUE_OPT_TO_P12,
-     /* equiv idx, value */ 39, VALUE_OPT_TO_P12,
+  {  /* entry idx, value */ 40, VALUE_OPT_TO_P12,
+     /* equiv idx, value */ 40, VALUE_OPT_TO_P12,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ TO_P12_FLAGS, 0,
@@ -1258,8 +1281,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ TO_P12_DESC, TO_P12_NAME, TO_P12_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 40, VALUE_OPT_TO_P8,
-     /* equiv idx, value */ 40, VALUE_OPT_TO_P8,
+  {  /* entry idx, value */ 41, VALUE_OPT_TO_P8,
+     /* equiv idx, value */ 41, VALUE_OPT_TO_P8,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ TO_P8_FLAGS, 0,
@@ -1270,8 +1293,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ TO_P8_DESC, TO_P8_NAME, TO_P8_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 41, VALUE_OPT_PKCS8,
-     /* equiv idx, value */ 41, VALUE_OPT_PKCS8,
+  {  /* entry idx, value */ 42, VALUE_OPT_PKCS8,
+     /* equiv idx, value */ 42, VALUE_OPT_PKCS8,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ PKCS8_FLAGS, 0,
@@ -1282,8 +1305,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ PKCS8_DESC, PKCS8_NAME, PKCS8_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 42, VALUE_OPT_RSA,
-     /* equiv idx, value */ 42, VALUE_OPT_RSA,
+  {  /* entry idx, value */ 43, VALUE_OPT_RSA,
+     /* equiv idx, value */ 43, VALUE_OPT_RSA,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ RSA_FLAGS, 0,
@@ -1294,8 +1317,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ RSA_DESC, RSA_NAME, RSA_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 43, VALUE_OPT_DSA,
-     /* equiv idx, value */ 43, VALUE_OPT_DSA,
+  {  /* entry idx, value */ 44, VALUE_OPT_DSA,
+     /* equiv idx, value */ 44, VALUE_OPT_DSA,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ DSA_FLAGS, 0,
@@ -1306,8 +1329,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ DSA_DESC, DSA_NAME, DSA_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 44, VALUE_OPT_ECC,
-     /* equiv idx, value */ 44, VALUE_OPT_ECC,
+  {  /* entry idx, value */ 45, VALUE_OPT_ECC,
+     /* equiv idx, value */ 45, VALUE_OPT_ECC,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ ECC_FLAGS, 0,
@@ -1318,8 +1341,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ ECC_DESC, ECC_NAME, ECC_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 45, VALUE_OPT_HASH,
-     /* equiv idx, value */ 45, VALUE_OPT_HASH,
+  {  /* entry idx, value */ 46, VALUE_OPT_HASH,
+     /* equiv idx, value */ 46, VALUE_OPT_HASH,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ HASH_FLAGS, 0,
@@ -1330,8 +1353,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ HASH_DESC, HASH_NAME, HASH_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 46, VALUE_OPT_INDER,
-     /* equiv idx, value */ 46, VALUE_OPT_INDER,
+  {  /* entry idx, value */ 47, VALUE_OPT_INDER,
+     /* equiv idx, value */ 47, VALUE_OPT_INDER,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ INDER_FLAGS, 0,
@@ -1342,8 +1365,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ INDER_DESC, INDER_NAME, INDER_name,
      /* disablement strs */ NOT_INDER_name, NOT_INDER_PFX },
 
-  {  /* entry idx, value */ 47, VALUE_OPT_INRAW,
-     /* equiv idx, value */ 47, VALUE_OPT_INRAW,
+  {  /* entry idx, value */ 48, VALUE_OPT_INRAW,
+     /* equiv idx, value */ 48, VALUE_OPT_INRAW,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ INRAW_FLAGS, 0,
@@ -1354,8 +1377,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ INRAW_DESC, INRAW_NAME, INRAW_name,
      /* disablement strs */ 0, 0 },
 
-  {  /* entry idx, value */ 48, VALUE_OPT_OUTDER,
-     /* equiv idx, value */ 48, VALUE_OPT_OUTDER,
+  {  /* entry idx, value */ 49, VALUE_OPT_OUTDER,
+     /* equiv idx, value */ 49, VALUE_OPT_OUTDER,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ OUTDER_FLAGS, 0,
@@ -1366,8 +1389,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ OUTDER_DESC, OUTDER_NAME, OUTDER_name,
      /* disablement strs */ NOT_OUTDER_name, NOT_OUTDER_PFX },
 
-  {  /* entry idx, value */ 49, VALUE_OPT_OUTRAW,
-     /* equiv idx, value */ 49, VALUE_OPT_OUTRAW,
+  {  /* entry idx, value */ 50, VALUE_OPT_OUTRAW,
+     /* equiv idx, value */ 50, VALUE_OPT_OUTRAW,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ OUTRAW_FLAGS, 0,
@@ -1378,8 +1401,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ OUTRAW_DESC, OUTRAW_NAME, OUTRAW_name,
      /* disablement strs */ 0, 0 },
 
-  {  /* entry idx, value */ 50, VALUE_OPT_BITS,
-     /* equiv idx, value */ 50, VALUE_OPT_BITS,
+  {  /* entry idx, value */ 51, VALUE_OPT_BITS,
+     /* equiv idx, value */ 51, VALUE_OPT_BITS,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ BITS_FLAGS, 0,
@@ -1390,8 +1413,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ BITS_DESC, BITS_NAME, BITS_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 51, VALUE_OPT_SEC_PARAM,
-     /* equiv idx, value */ 51, VALUE_OPT_SEC_PARAM,
+  {  /* entry idx, value */ 52, VALUE_OPT_SEC_PARAM,
+     /* equiv idx, value */ 52, VALUE_OPT_SEC_PARAM,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ SEC_PARAM_FLAGS, 0,
@@ -1402,8 +1425,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ SEC_PARAM_DESC, SEC_PARAM_NAME, SEC_PARAM_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 52, VALUE_OPT_DISABLE_QUICK_RANDOM,
-     /* equiv idx, value */ 52, VALUE_OPT_DISABLE_QUICK_RANDOM,
+  {  /* entry idx, value */ 53, VALUE_OPT_DISABLE_QUICK_RANDOM,
+     /* equiv idx, value */ 53, VALUE_OPT_DISABLE_QUICK_RANDOM,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ DISABLE_QUICK_RANDOM_FLAGS, 0,
@@ -1414,8 +1437,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ DISABLE_QUICK_RANDOM_DESC, DISABLE_QUICK_RANDOM_NAME, DISABLE_QUICK_RANDOM_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 53, VALUE_OPT_TEMPLATE,
-     /* equiv idx, value */ 53, VALUE_OPT_TEMPLATE,
+  {  /* entry idx, value */ 54, VALUE_OPT_TEMPLATE,
+     /* equiv idx, value */ 54, VALUE_OPT_TEMPLATE,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ TEMPLATE_FLAGS, 0,
@@ -1426,8 +1449,8 @@ static tOptDesc optDesc[OPTION_CT] = {
      /* desc, NAME, name */ TEMPLATE_DESC, TEMPLATE_NAME, TEMPLATE_name,
      /* disablement strs */ NULL, NULL },
 
-  {  /* entry idx, value */ 54, VALUE_OPT_PKCS_CIPHER,
-     /* equiv idx, value */ 54, VALUE_OPT_PKCS_CIPHER,
+  {  /* entry idx, value */ 55, VALUE_OPT_PKCS_CIPHER,
+     /* equiv idx, value */ 55, VALUE_OPT_PKCS_CIPHER,
      /* equivalenced to  */ NO_EQUIVALENT,
      /* min, max, act ct */ 0, 1, 0,
      /* opt state flags  */ PKCS_CIPHER_FLAGS, 0,
@@ -1482,14 +1505,14 @@ static tOptDesc optDesc[OPTION_CT] = {
  *
  *  Define the certtool Option Environment
  */
-#define zPROGNAME       (certtool_opt_strs+4297)
-#define zUsageTitle     (certtool_opt_strs+4306)
+#define zPROGNAME       (certtool_opt_strs+4373)
+#define zUsageTitle     (certtool_opt_strs+4382)
 #define zRcName         NULL
 #define apzHomeList     NULL
-#define zBugsAddr       (certtool_opt_strs+4416)
-#define zExplain        (certtool_opt_strs+4435)
-#define zDetail         (certtool_opt_strs+4438)
-#define zFullVersion    (certtool_opt_strs+4612)
+#define zBugsAddr       (certtool_opt_strs+4492)
+#define zExplain        (certtool_opt_strs+4511)
+#define zDetail         (certtool_opt_strs+4514)
+#define zFullVersion    (certtool_opt_strs+4688)
 /* extracted from optcode.tlib near line 350 */
 
 #if defined(ENABLE_NLS)
@@ -1503,7 +1526,7 @@ static tOptDesc optDesc[OPTION_CT] = {
 
 #define certtool_full_usage (NULL)
 
-#define certtool_short_usage (certtool_opt_strs+4631)
+#define certtool_short_usage (certtool_opt_strs+4707)
 
 #endif /* not defined __doxygen__ */
 
@@ -1720,7 +1743,7 @@ tOptions certtoolOptions = {
       NO_EQUIVALENT, /* '-#' option index */
       NO_EQUIVALENT /* index of default opt */
     },
-    58 /* full option count */, 55 /* user option count */,
+    59 /* full option count */, 56 /* user option count */,
     certtool_full_usage, certtool_short_usage,
     NULL, NULL,
     PKGDATADIR, certtool_packager_info
index 5e22325df922281b9f1e508d13f592bab63ff5e4..0cd94b5fcd60f8a99d7c87da29b4820496cc9642 100644 (file)
@@ -150,6 +150,12 @@ flag = {
     doc   = "";
 };
 
+flag = {
+    name      = simple-numbers;
+    descrip   = "Print big number in an easier format to parse";
+    doc   = "";
+};
+
 flag = {
     name      = null-password;
     descrip   = "Enforce a NULL password";
@@ -235,7 +241,7 @@ flag = {
 flag = {
     name      = pubkey-info;
     descrip   = "Print information on a public key";
-    doc = "The option combined with --load-pubkey, --load-privkey and --load-certificate will extract the public key of the object in question.";
+    doc = "The option combined with --load-request, --load-pubkey, --load-privkey and --load-certificate will extract the public key of the object in question.";
 };
 
 flag = {
index a3c43b39594cecbfad0642d955b5b116e2638db2..68166521e291e1165a13989a7a9b72a24d38feaa 100644 (file)
@@ -2,7 +2,7 @@
  *  
  *  DO NOT EDIT THIS FILE   (certtool-args.h)
  *  
- *  It has been AutoGen-ed  November 20, 2012 at 12:55:34 AM by AutoGen 5.16
+ *  It has been AutoGen-ed  November 20, 2012 at 05:51:05 PM by AutoGen 5.16
  *  From the definitions    certtool-args.def
  *  and the template file   options
  *
@@ -91,43 +91,44 @@ typedef enum {
     INDEX_OPT_LOAD_CA_PRIVKEY       = 21,
     INDEX_OPT_LOAD_CA_CERTIFICATE   = 22,
     INDEX_OPT_PASSWORD              = 23,
-    INDEX_OPT_NULL_PASSWORD         = 24,
-    INDEX_OPT_CERTIFICATE_INFO      = 25,
-    INDEX_OPT_CERTIFICATE_PUBKEY    = 26,
-    INDEX_OPT_PGP_CERTIFICATE_INFO  = 27,
-    INDEX_OPT_PGP_RING_INFO         = 28,
-    INDEX_OPT_CRL_INFO              = 29,
-    INDEX_OPT_CRQ_INFO              = 30,
-    INDEX_OPT_NO_CRQ_EXTENSIONS     = 31,
-    INDEX_OPT_P12_INFO              = 32,
-    INDEX_OPT_P7_INFO               = 33,
-    INDEX_OPT_SMIME_TO_P7           = 34,
-    INDEX_OPT_KEY_INFO              = 35,
-    INDEX_OPT_PGP_KEY_INFO          = 36,
-    INDEX_OPT_PUBKEY_INFO           = 37,
-    INDEX_OPT_V1                    = 38,
-    INDEX_OPT_TO_P12                = 39,
-    INDEX_OPT_TO_P8                 = 40,
-    INDEX_OPT_PKCS8                 = 41,
-    INDEX_OPT_RSA                   = 42,
-    INDEX_OPT_DSA                   = 43,
-    INDEX_OPT_ECC                   = 44,
-    INDEX_OPT_HASH                  = 45,
-    INDEX_OPT_INDER                 = 46,
-    INDEX_OPT_INRAW                 = 47,
-    INDEX_OPT_OUTDER                = 48,
-    INDEX_OPT_OUTRAW                = 49,
-    INDEX_OPT_BITS                  = 50,
-    INDEX_OPT_SEC_PARAM             = 51,
-    INDEX_OPT_DISABLE_QUICK_RANDOM  = 52,
-    INDEX_OPT_TEMPLATE              = 53,
-    INDEX_OPT_PKCS_CIPHER           = 54,
-    INDEX_OPT_VERSION               = 55,
-    INDEX_OPT_HELP                  = 56,
-    INDEX_OPT_MORE_HELP             = 57
+    INDEX_OPT_SIMPLE_NUMBERS        = 24,
+    INDEX_OPT_NULL_PASSWORD         = 25,
+    INDEX_OPT_CERTIFICATE_INFO      = 26,
+    INDEX_OPT_CERTIFICATE_PUBKEY    = 27,
+    INDEX_OPT_PGP_CERTIFICATE_INFO  = 28,
+    INDEX_OPT_PGP_RING_INFO         = 29,
+    INDEX_OPT_CRL_INFO              = 30,
+    INDEX_OPT_CRQ_INFO              = 31,
+    INDEX_OPT_NO_CRQ_EXTENSIONS     = 32,
+    INDEX_OPT_P12_INFO              = 33,
+    INDEX_OPT_P7_INFO               = 34,
+    INDEX_OPT_SMIME_TO_P7           = 35,
+    INDEX_OPT_KEY_INFO              = 36,
+    INDEX_OPT_PGP_KEY_INFO          = 37,
+    INDEX_OPT_PUBKEY_INFO           = 38,
+    INDEX_OPT_V1                    = 39,
+    INDEX_OPT_TO_P12                = 40,
+    INDEX_OPT_TO_P8                 = 41,
+    INDEX_OPT_PKCS8                 = 42,
+    INDEX_OPT_RSA                   = 43,
+    INDEX_OPT_DSA                   = 44,
+    INDEX_OPT_ECC                   = 45,
+    INDEX_OPT_HASH                  = 46,
+    INDEX_OPT_INDER                 = 47,
+    INDEX_OPT_INRAW                 = 48,
+    INDEX_OPT_OUTDER                = 49,
+    INDEX_OPT_OUTRAW                = 50,
+    INDEX_OPT_BITS                  = 51,
+    INDEX_OPT_SEC_PARAM             = 52,
+    INDEX_OPT_DISABLE_QUICK_RANDOM  = 53,
+    INDEX_OPT_TEMPLATE              = 54,
+    INDEX_OPT_PKCS_CIPHER           = 55,
+    INDEX_OPT_VERSION               = 56,
+    INDEX_OPT_HELP                  = 57,
+    INDEX_OPT_MORE_HELP             = 58
 } teOptIndex;
 
-#define OPTION_CT    58
+#define OPTION_CT    59
 #define CERTTOOL_VERSION       "@VERSION@"
 #define CERTTOOL_FULL_VERSION  "certtool @VERSION@"
 
@@ -191,39 +192,40 @@ typedef enum {
 #define VALUE_OPT_LOAD_CA_PRIVKEY 21
 #define VALUE_OPT_LOAD_CA_CERTIFICATE 22
 #define VALUE_OPT_PASSWORD       23
-#define VALUE_OPT_NULL_PASSWORD  24
+#define VALUE_OPT_SIMPLE_NUMBERS 24
+#define VALUE_OPT_NULL_PASSWORD  25
 #define VALUE_OPT_CERTIFICATE_INFO 'i'
-#define VALUE_OPT_CERTIFICATE_PUBKEY 26
-#define VALUE_OPT_PGP_CERTIFICATE_INFO 27
-#define VALUE_OPT_PGP_RING_INFO  28
+#define VALUE_OPT_CERTIFICATE_PUBKEY 27
+#define VALUE_OPT_PGP_CERTIFICATE_INFO 28
+#define VALUE_OPT_PGP_RING_INFO  29
 #define VALUE_OPT_CRL_INFO       'l'
-#define VALUE_OPT_CRQ_INFO       30
-#define VALUE_OPT_NO_CRQ_EXTENSIONS 31
-#define VALUE_OPT_P12_INFO       32
-#define VALUE_OPT_P7_INFO        129
-#define VALUE_OPT_SMIME_TO_P7    130
+#define VALUE_OPT_CRQ_INFO       31
+#define VALUE_OPT_NO_CRQ_EXTENSIONS 32
+#define VALUE_OPT_P12_INFO       129
+#define VALUE_OPT_P7_INFO        130
+#define VALUE_OPT_SMIME_TO_P7    131
 #define VALUE_OPT_KEY_INFO       'k'
-#define VALUE_OPT_PGP_KEY_INFO   132
-#define VALUE_OPT_PUBKEY_INFO    133
-#define VALUE_OPT_V1             134
-#define VALUE_OPT_TO_P12         135
-#define VALUE_OPT_TO_P8          136
+#define VALUE_OPT_PGP_KEY_INFO   133
+#define VALUE_OPT_PUBKEY_INFO    134
+#define VALUE_OPT_V1             135
+#define VALUE_OPT_TO_P12         136
+#define VALUE_OPT_TO_P8          137
 #define VALUE_OPT_PKCS8          '8'
-#define VALUE_OPT_RSA            138
-#define VALUE_OPT_DSA            139
-#define VALUE_OPT_ECC            140
-#define VALUE_OPT_HASH           141
-#define VALUE_OPT_INDER          142
-#define VALUE_OPT_INRAW          143
-#define VALUE_OPT_OUTDER         144
-#define VALUE_OPT_OUTRAW         145
-#define VALUE_OPT_BITS           146
+#define VALUE_OPT_RSA            139
+#define VALUE_OPT_DSA            140
+#define VALUE_OPT_ECC            141
+#define VALUE_OPT_HASH           142
+#define VALUE_OPT_INDER          143
+#define VALUE_OPT_INRAW          144
+#define VALUE_OPT_OUTDER         145
+#define VALUE_OPT_OUTRAW         146
+#define VALUE_OPT_BITS           147
 
 #define OPT_VALUE_BITS           (DESC(BITS).optArg.argInt)
-#define VALUE_OPT_SEC_PARAM      147
-#define VALUE_OPT_DISABLE_QUICK_RANDOM 148
-#define VALUE_OPT_TEMPLATE       149
-#define VALUE_OPT_PKCS_CIPHER    150
+#define VALUE_OPT_SEC_PARAM      148
+#define VALUE_OPT_DISABLE_QUICK_RANDOM 149
+#define VALUE_OPT_TEMPLATE       150
+#define VALUE_OPT_PKCS_CIPHER    151
 #define VALUE_OPT_HELP          'h'
 #define VALUE_OPT_MORE_HELP     '!'
 #define VALUE_OPT_VERSION       'v'
index 518367d4af1ac79c7fabf748eaa6cbf79da65db8..a24f035d18bbdb7e47eb7586a3882a1612936b9a 100644 (file)
@@ -691,142 +691,18 @@ print_rsa_pkey (FILE* outfile, gnutls_datum_t * m, gnutls_datum_t * e, gnutls_da
     }
 }
 
-static void
-print_key_usage (FILE * outfile, unsigned int usage)
-{
-  if (usage & GNUTLS_KEY_DIGITAL_SIGNATURE)
-    {
-      fprintf (outfile, "\tDigital signature.\n");
-    }
-
-  if (usage & GNUTLS_KEY_NON_REPUDIATION)
-    {
-      fprintf (outfile, "\tNon repudiation.\n");
-    }
-
-  if (usage & GNUTLS_KEY_KEY_ENCIPHERMENT)
-    {
-      fprintf (outfile, "\tKey encipherment.\n");
-    }
-
-  if (usage & GNUTLS_KEY_DATA_ENCIPHERMENT)
-    {
-      fprintf (outfile, "\tData encipherment.\n");
-    }
-
-  if (usage & GNUTLS_KEY_KEY_AGREEMENT)
-    {
-      fprintf (outfile, "\tKey agreement.\n");
-    }
-
-  if (usage & GNUTLS_KEY_KEY_CERT_SIGN)
-    {
-      fprintf (outfile, "\tCertificate signing.\n");
-    }
-
-  if (usage & GNUTLS_KEY_NON_REPUDIATION)
-    {
-      fprintf (outfile, "\tCRL signing.\n");
-    }
-
-  if (usage & GNUTLS_KEY_ENCIPHER_ONLY)
-    {
-      fprintf (outfile, "\tKey encipher only.\n");
-    }
-
-  if (usage & GNUTLS_KEY_DECIPHER_ONLY)
-    {
-      fprintf (outfile, "\tKey decipher only.\n");
-    }
-}
-
-void _pubkey_info(FILE* outfile, gnutls_pubkey_t pubkey)
+void _pubkey_info(FILE* outfile, gnutls_certificate_print_formats_t format, gnutls_pubkey_t pubkey)
 {
-unsigned int usage;
+gnutls_datum_t data;
 int ret;
 size_t size;
-unsigned int bits;
-const char *cprint;
-
-  fprintf (outfile, "Public Key Info:\n\n");
-  ret = gnutls_pubkey_get_pk_algorithm (pubkey, &bits);
-  fprintf (outfile, "Public Key Algorithm: ");
-  cprint = gnutls_pk_algorithm_get_name (ret);
-  fprintf (outfile, "%s (%u bits)\n", cprint ? cprint : "Unknown", bits);
-
-  /* Print the raw public and private keys
-   */
-  if (ret == GNUTLS_PK_RSA)
-    {
-      gnutls_datum_t m, e;
 
-      ret = gnutls_pubkey_get_pk_rsa_raw (pubkey, &m, &e);
-      if (ret < 0)
-        fprintf (stderr, "Error in key RSA data export: %s\n",
-                 gnutls_strerror (ret));
-      else
-        {
-          print_rsa_pkey (outfile, &m, &e, NULL, NULL, NULL, NULL, NULL, NULL);
-          gnutls_free (m.data);
-          gnutls_free (e.data);
-        }
-    }
-  else if (ret == GNUTLS_PK_DSA)
-    {
-      gnutls_datum_t p, q, g, y;
-
-      ret = gnutls_pubkey_get_pk_dsa_raw (pubkey, &p, &q, &g, &y);
-      if (ret < 0)
-        fprintf (stderr, "Error in key DSA data export: %s\n",
-                 gnutls_strerror (ret));
-      else
-        {
-          print_dsa_pkey (outfile, NULL, &y, &p, &q, &g);
-          gnutls_free (y.data);
-          gnutls_free (p.data);
-          gnutls_free (q.data);
-          gnutls_free (g.data);
-        }
-    }
-  else if (ret == GNUTLS_PK_EC)
-    {
-      gnutls_datum_t x, y;
-      gnutls_ecc_curve_t curve;
-
-      ret = gnutls_pubkey_get_pk_ecc_raw (pubkey, &curve, &x, &y);
-      if (ret < 0)
-        fprintf (stderr, "Error in key ECC data export: %s\n",
-                 gnutls_strerror (ret));
-      else
-        {
-          print_ecc_pkey (outfile, curve, NULL, &y, &x);
-          gnutls_free (y.data);
-          gnutls_free (x.data);
-        }
-    }
-
-  ret = gnutls_pubkey_get_key_usage (pubkey, &usage);
+  ret = gnutls_pubkey_print(pubkey, format, &data);
   if (ret < 0)
-    {
-      error (EXIT_FAILURE, 0, "pubkey_get_key_usage: %s",
-             gnutls_strerror (ret));
-    }
-
-  fprintf (outfile, "Public Key Usage:\n");
-  print_key_usage (outfile, usage);
-
-  fprintf (outfile, "\n");
+    error (EXIT_FAILURE, 0, "pubkey_print error: %s", gnutls_strerror (ret));
 
-  size = buffer_size;
-  if ((ret = gnutls_pubkey_get_key_id (pubkey, 0, buffer, &size)) < 0)
-    {
-      fprintf (stderr, "Error in key id calculation: %s\n",
-               gnutls_strerror (ret));
-    }
-  else
-    {
-      fprintf (outfile, "Public Key ID: %s\n", raw_to_string (buffer, size));
-    }
+  fprintf (outfile, "%s\n", data.data);
+  gnutls_free (data.data);
 
   size = buffer_size;
   ret = gnutls_pubkey_export (pubkey, GNUTLS_X509_FMT_PEM, buffer, &size);
index dcaed449d5e3d5c75dcafd247d385da13c15da15..ea296d5957b1116e1365936859824831b575c3bc 100644 (file)
@@ -78,7 +78,7 @@ void dh_info (common_info_st * ci);
 
 gnutls_x509_privkey_t * load_privkey_list (int mand, size_t * privkey_size, common_info_st * info);
 
-void _pubkey_info(FILE* outfile, gnutls_pubkey_t pubkey);
+void _pubkey_info(FILE* outfile, gnutls_certificate_print_formats_t, gnutls_pubkey_t pubkey);
 void
 print_ecc_pkey (FILE* outfile, gnutls_ecc_curve_t curve, gnutls_datum_t* k, gnutls_datum_t * x, gnutls_datum_t * y);
 void
index dd34e3ac29fd90f7d84fee2b043ef4a35bfb05b4..d858be2412591bb4a33a15f92605fff990b0081d 100644 (file)
@@ -79,6 +79,7 @@ FILE *infile;
 static gnutls_digest_algorithm_t default_dig;
 static unsigned int incert_format, outcert_format;
 static unsigned int req_key_type;
+gnutls_certificate_print_formats_t full_format = GNUTLS_CRT_PRINT_FULL;
 
 /* non interactive operation if set
  */
@@ -885,6 +886,9 @@ cmd_parser (int argc, char **argv)
   if (HAVE_OPT(GENERATE_PRIVKEY) || HAVE_OPT(GENERATE_REQUEST) ||
       HAVE_OPT(KEY_INFO) || HAVE_OPT(PGP_KEY_INFO))
     privkey_op = 1;
+    
+  if (HAVE_OPT(SIMPLE_NUMBERS))
+    full_format = GNUTLS_CRT_PRINT_FULL_NUMBERS;
 
   if (HAVE_OPT(OUTFILE))
     {
@@ -1436,7 +1440,7 @@ print_certificate_info (gnutls_x509_crt_t crt, FILE * out, unsigned int all)
   int ret;
 
   if (all)
-    ret = gnutls_x509_crt_print (crt, GNUTLS_CRT_PRINT_FULL, &data);
+    ret = gnutls_x509_crt_print (crt, full_format, &data);
   else
     ret = gnutls_x509_crt_print (crt, GNUTLS_CRT_PRINT_UNSIGNED_FULL, &data);
   if (ret == 0)
@@ -1459,7 +1463,7 @@ print_crl_info (gnutls_x509_crl_t crl, FILE * out)
   int ret;
   size_t size;
 
-  ret = gnutls_x509_crl_print (crl, GNUTLS_CRT_PRINT_FULL, &data);
+  ret = gnutls_x509_crl_print (crl, full_format, &data);
   if (ret < 0)
     error (EXIT_FAILURE, 0, "crl_print: %s", gnutls_strerror (ret));
 
@@ -1514,7 +1518,7 @@ print_crq_info (gnutls_x509_crq_t crq, FILE * out)
 
   if (outcert_format == GNUTLS_X509_FMT_PEM)
     {
-      ret = gnutls_x509_crq_print (crq, GNUTLS_CRT_PRINT_FULL, &data);
+      ret = gnutls_x509_crq_print (crq, full_format, &data);
       if (ret < 0)
         error (EXIT_FAILURE, 0, "crq_print: %s", gnutls_strerror (ret));
 
@@ -2706,7 +2710,8 @@ void
 pubkey_info (gnutls_x509_crt_t crt, common_info_st * cinfo)
 {
   gnutls_pubkey_t pubkey;
-  gnutls_privkey_t privkey;
+  gnutls_privkey_t privkey = NULL;
+  gnutls_x509_crq_t crq = NULL;
   int ret;
   size_t size;
 
@@ -2721,6 +2726,11 @@ pubkey_info (gnutls_x509_crt_t crt, common_info_st * cinfo)
       crt = load_cert (0, cinfo);
     }
 
+  if (crq == NULL)
+    {
+      crq = load_request (cinfo);
+    }
+
   if (crt != NULL)
     {
       ret = gnutls_pubkey_import_x509 (pubkey, crt, 0);
@@ -2728,6 +2738,13 @@ pubkey_info (gnutls_x509_crt_t crt, common_info_st * cinfo)
         error (EXIT_FAILURE, 0, "pubkey_import_x509: %s",
                gnutls_strerror (ret));
     }
+  else if (crq != NULL)
+    {
+      ret = gnutls_pubkey_import_x509_crq (pubkey, crq, 0);
+      if (ret < 0)
+        error (EXIT_FAILURE, 0, "pubkey_import_x509_crq: %s",
+               gnutls_strerror (ret));
+    }
   else
     {
       privkey = load_private_key (0, cinfo);
@@ -2762,6 +2779,6 @@ pubkey_info (gnutls_x509_crt_t crt, common_info_st * cinfo)
     
   /* PEM */
 
-  _pubkey_info(outfile, pubkey);
+  _pubkey_info(outfile, full_format, pubkey);
   gnutls_pubkey_deinit (pubkey);
 }
index 9f21d06d06fb464f64efe4bb867b55e30369cbad..b4a0253b738261128656734680d5fcb96db8233a 100644 (file)
@@ -284,7 +284,7 @@ static void tpm_pubkey(const char* url, FILE* outfile)
   if (ret < 0)
     error (EXIT_FAILURE, 0, "gnutls_pubkey_import_tpm_url: %s", gnutls_strerror (ret));
 
-  _pubkey_info(outfile, pubkey);
+  _pubkey_info(outfile, GNUTLS_CRT_PRINT_FULL, pubkey);
 
   gnutls_pubkey_deinit(pubkey);
 }