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