diff options
author | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2015-04-01 18:29:08 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2015-04-01 18:37:40 +0200 |
commit | 683f834cc840a9cd4472efe665169be7dda13c7a (patch) | |
tree | 58c8df63f113d94543f13e89228cf913c908cb07 /src/pkcs11.c | |
parent | 0ac2dbb43cdc545d5d9078aa1998df6539a9d102 (diff) | |
download | gnutls-683f834cc840a9cd4472efe665169be7dda13c7a.tar.gz |
p11tool: added the --test-sign parameter
That allows to check an existing key for signing/verification.
Diffstat (limited to 'src/pkcs11.c')
-rw-r--r-- | src/pkcs11.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/pkcs11.c b/src/pkcs11.c index b9758874c1..d6cd7440fb 100644 --- a/src/pkcs11.c +++ b/src/pkcs11.c @@ -232,6 +232,105 @@ pkcs11_list(FILE * outfile, const char *url, int type, unsigned int flags, return; } +#define TEST_DATA "Test data to sign" + +void +pkcs11_test_sign(FILE * outfile, const char *url, unsigned int flags, + common_info_st * info) +{ + gnutls_privkey_t privkey; + gnutls_pubkey_t pubkey; + int ret; + gnutls_datum_t data, sig = {NULL, 0}; + int pk; + + pkcs11_common(info); + + FIX(url, outfile, 0, info); + + data.data = (void*)TEST_DATA; + data.size = sizeof(TEST_DATA)-1; + + ret = gnutls_privkey_init(&privkey); + if (ret < 0) { + fprintf(stderr, "Error in %s:%d: %s\n", __func__, + __LINE__, gnutls_strerror(ret)); + exit(1); + } + + ret = gnutls_pubkey_init(&pubkey); + if (ret < 0) { + fprintf(stderr, "Error in %s:%d: %s\n", __func__, + __LINE__, gnutls_strerror(ret)); + exit(1); + } + + ret = gnutls_privkey_import_url(privkey, url, flags); + if (ret < 0) { + fprintf(stderr, "Cannot import private key: %s\n", + gnutls_strerror(ret)); + exit(1); + } + + ret = gnutls_pubkey_import_privkey(pubkey, privkey, GNUTLS_KEY_DIGITAL_SIGNATURE, flags); + if (ret < 0) { + fprintf(stderr, "Cannot import public key: %s\n", + gnutls_strerror(ret)); + exit(1); + } + + ret = gnutls_privkey_sign_data(privkey, GNUTLS_DIG_SHA1, 0, &data, &sig); + if (ret < 0) { + fprintf(stderr, "Cannot sign data: %s\n", + gnutls_strerror(ret)); + exit(1); + } + + pk = gnutls_pubkey_get_pk_algorithm(pubkey, NULL); + + fprintf(stderr, "Verifying against private key... "); + ret = gnutls_pubkey_verify_data2(pubkey, gnutls_pk_to_sign(pk, GNUTLS_DIG_SHA1), + 0, &data, &sig); + if (ret < 0) { + fprintf(stderr, "Cannot verify signed data: %s\n", + gnutls_strerror(ret)); + exit(1); + } + + fprintf(stderr, "ok\n"); + + /* now try to verify against a public key within the token */ + gnutls_pubkey_deinit(pubkey); + ret = gnutls_pubkey_init(&pubkey); + if (ret < 0) { + fprintf(stderr, "Error in %s:%d: %s\n", __func__, + __LINE__, gnutls_strerror(ret)); + exit(1); + } + + ret = gnutls_pubkey_import_url(pubkey, url, flags); + if (ret < 0) { + fprintf(stderr, "Cannot import public key: %s\n", + gnutls_strerror(ret)); + exit(1); + } + + fprintf(stderr, "Verifying against public key in the token... "); + ret = gnutls_pubkey_verify_data2(pubkey, gnutls_pk_to_sign(pk, GNUTLS_DIG_SHA1), + 0, &data, &sig); + if (ret < 0) { + fprintf(stderr, "Cannot verify signed data: %s\n", + gnutls_strerror(ret)); + exit(1); + } + + fprintf(stderr, "ok\n"); + + gnutls_free(sig.data); + gnutls_pubkey_deinit(pubkey); + gnutls_privkey_deinit(privkey); +} + void pkcs11_export(FILE * outfile, const char *url, unsigned int flags, common_info_st * info) |