diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-19 20:10:26 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-19 20:10:26 +0200 |
commit | 56eb45f752baa978a9ea3573faee44857678597d (patch) | |
tree | 3c7da78ba84669d0f988b98450e4e55779dfcb41 /examples | |
parent | 035b7bf3544ab9927dc2d64cf1e3214237ff0f71 (diff) | |
download | cryptodev-linux-56eb45f752baa978a9ea3573faee44857678597d.tar.gz cryptodev-linux-56eb45f752baa978a9ea3573faee44857678597d.tar.xz cryptodev-linux-56eb45f752baa978a9ea3573faee44857678597d.zip |
Public Keys are being exported to SubjectPublicKeyInfo format, instead of custom formats. For RSA keys the PKCS #1 format can be used as well.
Diffstat (limited to 'examples')
-rw-r--r-- | examples/pk.c | 115 |
1 files changed, 100 insertions, 15 deletions
diff --git a/examples/pk.c b/examples/pk.c index d3445d4..0765638 100644 --- a/examples/pk.c +++ b/examples/pk.c @@ -16,6 +16,9 @@ #include <stdlib.h> #include <gnutls/gnutls.h> #include <gnutls/x509.h> +#if GNUTLS_VERSION_NUMBER >= 0x020b00 +# include <gnutls/abstract.h> +#endif #define DATA_SIZE 4096 @@ -107,7 +110,7 @@ int privkey_info (void* data, int data_size, int verbose) gnutls_x509_privkey_t key; size_t size; int ret; - gnutls_datum_t pem; + gnutls_datum_t der; unsigned char buffer[5*1024]; const char *cprint; @@ -117,10 +120,10 @@ int privkey_info (void* data, int data_size, int verbose) return 1; } - pem.data = data; - pem.size = data_size; + der.data = data; + der.size = data_size; - ret = gnutls_x509_privkey_import (key, &pem, GNUTLS_X509_FMT_DER); + ret = gnutls_x509_privkey_import (key, &der, GNUTLS_X509_FMT_DER); if (ret < 0) { fprintf(stderr, "unable to import privkey\n"); return 1; @@ -141,11 +144,11 @@ int privkey_info (void* data, int data_size, int verbose) if (ret == GNUTLS_PK_RSA) { gnutls_datum_t m, e, d, p, q, u, exp1={NULL,0}, exp2={NULL,0}; - #if GNUTLS_VERSION_NUMBER >= 0x020b00 +#if GNUTLS_VERSION_NUMBER >= 0x020b00 ret = gnutls_x509_privkey_export_rsa_raw2 (key, &m, &e, &d, &p, &q, &u, &exp1, &exp2); - #else +#else ret = gnutls_x509_privkey_export_rsa_raw (key, &m, &e, &d, &p, &q, &u); - #endif +#endif if (ret < 0) fprintf (stderr, "Error in key RSA data export: %s\n", gnutls_strerror (ret)); @@ -204,10 +207,92 @@ int privkey_info (void* data, int data_size, int verbose) -int pubkey_info(void* data, int data_size) +int pubkey_info(void* data, int data_size, int verbose) { #if GNUTLS_VERSION_NUMBER >= 0x020b00 - /* XXX: use pubkey_t */ + gnutls_pubkey_t key; + size_t size; + int ret; + gnutls_datum_t der; + unsigned char buffer[5*1024]; + const char *cprint; + + ret = gnutls_pubkey_init (&key); + if (ret < 0) { + fprintf(stderr, "error in pubkey_init\n"); + return 1; + } + + der.data = data; + der.size = data_size; + + ret = gnutls_pubkey_import (key, &der, GNUTLS_X509_FMT_DER); + if (ret < 0) { + fprintf(stderr, "unable to import pubkey\n"); + return 1; + } + + if (verbose > 0) { + /* Public key algorithm + */ + fprintf (stdout, "Public Key Info:\n"); + ret = gnutls_pubkey_get_pk_algorithm (key, NULL); + + fprintf (stdout, "\tPublic Key Algorithm: "); + cprint = gnutls_pk_algorithm_get_name (ret); + fprintf (stdout, "%s\n", cprint ? cprint : "Unknown"); + + /* Print the raw public and private keys + */ + if (ret == GNUTLS_PK_RSA) { + gnutls_datum_t m, e; + + ret = gnutls_pubkey_get_pk_rsa_raw (key, &m, &e); + if (ret < 0) + fprintf (stderr, "Error in key RSA data export: %s\n", + gnutls_strerror (ret)); + else { + print_rsa_pkey (&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 (key, &p, &q, &g, &y); + if (ret < 0) + fprintf (stderr, "Error in key DSA data export: %s\n", + gnutls_strerror (ret)); + else { + print_dsa_pkey (NULL, &y, &p, &q, &g); + gnutls_free (y.data); + gnutls_free (p.data); + gnutls_free (q.data); + gnutls_free (g.data); + } + } + + fprintf (stdout, "\n"); + + size = sizeof (buffer); + if ((ret = gnutls_pubkey_get_key_id (key, 0, buffer, &size)) < 0) { + fprintf (stderr, "Error in key id calculation: %s\n", + gnutls_strerror (ret)); + } else { + fprintf (stdout, "Public Key ID: %s\n", raw_to_string (buffer, size)); + } + + size = sizeof (buffer); + ret = gnutls_pubkey_export (key, GNUTLS_X509_FMT_PEM, buffer, &size); + if (ret < 0) { + fprintf(stderr, "Error in privkey_export\n"); + return 1; + } + + fprintf (stdout, "\n%s\n", buffer); + } + + gnutls_pubkey_deinit (key); #endif return 0; } @@ -599,8 +684,8 @@ static int test_ncr_rsa(int cfd) return 1; } - ret = pubkey_info(kdata.data, kdata.data_size); - if (ret < 0) { + ret = pubkey_info(kdata.data, kdata.data_size, 0); + if (ret != 0) { fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); return 1; } @@ -743,8 +828,8 @@ static int test_ncr_dsa(int cfd) return 1; } - ret = pubkey_info(kdata.data, kdata.data_size); - if (ret < 0) { + ret = pubkey_info(kdata.data, kdata.data_size, 0); + if (ret != 0) { fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); return 1; } @@ -778,10 +863,10 @@ main() return 1; } - if (test_ncr_dsa(fd)) + if (test_ncr_rsa(fd)) return 1; - if (test_ncr_rsa(fd)) + if (test_ncr_dsa(fd)) return 1; /* Close the original descriptor */ |