summaryrefslogtreecommitdiff
path: root/src/pkcs11.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2015-04-01 18:29:08 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2015-04-01 18:37:40 +0200
commit683f834cc840a9cd4472efe665169be7dda13c7a (patch)
tree58c8df63f113d94543f13e89228cf913c908cb07 /src/pkcs11.c
parent0ac2dbb43cdc545d5d9078aa1998df6539a9d102 (diff)
downloadgnutls-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.c99
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)