gnutls-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU gnutls branch, master, updated. gnutls_2_9_10-231-g664098d


From: Nikos Mavrogiannopoulos
Subject: [SCM] GNU gnutls branch, master, updated. gnutls_2_9_10-231-g664098d
Date: Thu, 17 Jun 2010 23:16:34 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU gnutls".

http://git.savannah.gnu.org/cgit/gnutls.git/commit/?id=664098d0bf95dd1990fe2a9a16052634be64c3e8

The branch, master has been updated
       via  664098d0bf95dd1990fe2a9a16052634be64c3e8 (commit)
       via  eb3dc6ff292de8f40427e8ebb702aa7c2e5bdee8 (commit)
       via  6d112bcd452001274e2df7662d1c7aa30ee60d9e (commit)
      from  61857adefc8e03dcaa1458519d402c47c7d50400 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 664098d0bf95dd1990fe2a9a16052634be64c3e8
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Fri Jun 18 01:15:50 2010 +0200

    Allow listing of private keys only. Certtool has now the 
--pkcs11-list-privkeya option.

commit eb3dc6ff292de8f40427e8ebb702aa7c2e5bdee8
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Fri Jun 18 01:09:12 2010 +0200

    Send correct token name to callback.

commit 6d112bcd452001274e2df7662d1c7aa30ee60d9e
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Fri Jun 18 01:04:16 2010 +0200

    Added more gnutls errors to map closer to PKCS11 actual errors.

-----------------------------------------------------------------------

Summary of changes:
 lib/gnutls_errors.c             |   27 +++++++-
 lib/includes/gnutls/gnutls.h.in |   14 ++++
 lib/includes/gnutls/pkcs11.h    |    1 +
 lib/pkcs11.c                    |  109 ++++++++++++++++++++++++++--
 lib/pkcs11_int.h                |    2 +-
 lib/pkcs11_privkey.c            |   17 +++--
 lib/pkcs11_write.c              |   19 +++---
 src/certtool-common.h           |    1 +
 src/certtool-gaa.c              |  149 +++++++++++++++++++++------------------
 src/certtool-gaa.h              |    6 +-
 src/certtool.gaa                |    1 +
 src/pkcs11.c                    |    4 +-
 12 files changed, 249 insertions(+), 101 deletions(-)

diff --git a/lib/gnutls_errors.c b/lib/gnutls_errors.c
index 3a27da8..97d5386 100644
--- a/lib/gnutls_errors.c
+++ b/lib/gnutls_errors.c
@@ -286,7 +286,32 @@ static const gnutls_error_entry error_algorithms[] = {
               GNUTLS_E_PKCS11_PIN_SAVE, 1),
   ERROR_ENTRY (N_("PKCS #11 error"),
               GNUTLS_E_PKCS11_ERROR, 1),
-
+  ERROR_ENTRY (N_("PKCS #11 error in slot"),
+       GNUTLS_E_PKCS11_SLOT_ERROR, 1),
+  ERROR_ENTRY (N_("PKCS #11 locking error"),
+       GNUTLS_E_PKCS11_LOCKING_ERROR, 1),
+  ERROR_ENTRY (N_("PKCS #11 error in attribute"),
+    GNUTLS_E_PKCS11_ATTRIBUTE_ERROR, 1),
+  ERROR_ENTRY (N_("PKCS #11 error in device"),
+       GNUTLS_E_PKCS11_DEVICE_ERROR, 1),
+  ERROR_ENTRY (N_("PKCS #11 error in data"),
+       GNUTLS_E_PKCS11_DATA_ERROR, 1),
+  ERROR_ENTRY (N_("PKCS #11 unsupported feature"),
+       GNUTLS_E_PKCS11_UNSUPPORTED_FEATURE_ERROR, 1),
+  ERROR_ENTRY (N_("PKCS #11 error in key"),
+       GNUTLS_E_PKCS11_KEY_ERROR, 1),
+  ERROR_ENTRY (N_("PKCS #11 PIN expired"),
+       GNUTLS_E_PKCS11_PIN_EXPIRED, 1),
+  ERROR_ENTRY (N_("PKCS #11 PIN locked"),
+       GNUTLS_E_PKCS11_PIN_LOCKED, 1),
+  ERROR_ENTRY (N_("PKCS #11 error in session"),
+       GNUTLS_E_PKCS11_SESSION_ERROR, 1),
+  ERROR_ENTRY (N_("PKCS #11 error in signature"),
+       GNUTLS_E_PKCS11_SIGNATURE_ERROR, 1),
+  ERROR_ENTRY (N_("PKCS #11 error in token"),
+       GNUTLS_E_PKCS11_TOKEN_ERROR, 1),
+  ERROR_ENTRY (N_("PKCS #11 user error"),
+       GNUTLS_E_PKCS11_USER_ERROR, 1),
   {NULL, NULL, 0, 0}
 };
 
diff --git a/lib/includes/gnutls/gnutls.h.in b/lib/includes/gnutls/gnutls.h.in
index e03e7b3..37b91e9 100644
--- a/lib/includes/gnutls/gnutls.h.in
+++ b/lib/includes/gnutls/gnutls.h.in
@@ -1757,6 +1757,20 @@ extern "C"
 #define GNUTLS_E_PKCS11_PIN_ERROR -303
 #define GNUTLS_E_PKCS11_PIN_SAVE -304
 
+#define GNUTLS_E_PKCS11_SLOT_ERROR -305
+#define GNUTLS_E_PKCS11_LOCKING_ERROR -306
+#define GNUTLS_E_PKCS11_ATTRIBUTE_ERROR -307
+#define GNUTLS_E_PKCS11_DEVICE_ERROR -308
+#define GNUTLS_E_PKCS11_DATA_ERROR -309
+#define GNUTLS_E_PKCS11_UNSUPPORTED_FEATURE_ERROR -310
+#define GNUTLS_E_PKCS11_KEY_ERROR -311
+#define GNUTLS_E_PKCS11_PIN_EXPIRED -312
+#define GNUTLS_E_PKCS11_PIN_LOCKED -313
+#define GNUTLS_E_PKCS11_SESSION_ERROR -314
+#define GNUTLS_E_PKCS11_SIGNATURE_ERROR -315
+#define GNUTLS_E_PKCS11_TOKEN_ERROR -316
+#define GNUTLS_E_PKCS11_USER_ERROR -317
+
 #define GNUTLS_E_UNIMPLEMENTED_FEATURE -1250
 
 
diff --git a/lib/includes/gnutls/pkcs11.h b/lib/includes/gnutls/pkcs11.h
index da30b48..80e4b42 100644
--- a/lib/includes/gnutls/pkcs11.h
+++ b/lib/includes/gnutls/pkcs11.h
@@ -80,6 +80,7 @@ typedef enum {
        GNUTLS_PKCS11_OBJ_ATTR_CRT_TRUSTED, /* certificates marked as trusted */
        GNUTLS_PKCS11_OBJ_ATTR_CRT_WITH_PRIVKEY, /* certificates with 
corresponding private key */
        GNUTLS_PKCS11_OBJ_ATTR_PUBKEY, /* public keys */
+       GNUTLS_PKCS11_OBJ_ATTR_PRIVKEY, /* private keys */
        GNUTLS_PKCS11_OBJ_ATTR_ALL, /* everything! */
 } gnutls_pkcs11_obj_attr_t;
 
diff --git a/lib/pkcs11.c b/lib/pkcs11.c
index 590db80..51d7f2f 100644
--- a/lib/pkcs11.c
+++ b/lib/pkcs11.c
@@ -5,7 +5,7 @@
  * Author: Nikos Mavrogiannopoulos
  *
  * Inspired and some parts based on neon PKCS #11 support by Joe Orton.
- * More ideas came from the pkcs11-helper library.
+ * More ideas came from the pkcs11-helper library by Alon Bar-Lev.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -69,6 +69,91 @@ static void* pin_data;
 gnutls_pkcs11_token_callback_t token_func;
 void* token_data;
 
+int pkcs11_rv_to_err(ck_rv_t rv)
+{
+    switch(rv) {
+        case CKR_OK:
+            return 0;
+        case CKR_HOST_MEMORY:
+            return GNUTLS_E_MEMORY_ERROR;
+        case CKR_SLOT_ID_INVALID:
+            return GNUTLS_E_PKCS11_SLOT_ERROR;
+        case CKR_ARGUMENTS_BAD:
+        case CKR_MECHANISM_PARAM_INVALID:
+            return GNUTLS_E_INVALID_REQUEST;
+        case CKR_NEED_TO_CREATE_THREADS:
+        case CKR_CANT_LOCK:
+        case CKR_FUNCTION_NOT_PARALLEL:
+        case CKR_MUTEX_BAD:
+        case CKR_MUTEX_NOT_LOCKED:
+            return GNUTLS_E_PKCS11_LOCKING_ERROR;
+        case CKR_ATTRIBUTE_READ_ONLY:
+        case CKR_ATTRIBUTE_SENSITIVE:
+        case CKR_ATTRIBUTE_TYPE_INVALID:
+        case CKR_ATTRIBUTE_VALUE_INVALID:
+            return GNUTLS_E_PKCS11_ATTRIBUTE_ERROR;
+        case CKR_DEVICE_ERROR:
+        case CKR_DEVICE_MEMORY:
+        case CKR_DEVICE_REMOVED:
+            return GNUTLS_E_PKCS11_DEVICE_ERROR;
+        case CKR_DATA_INVALID:
+        case CKR_DATA_LEN_RANGE:
+        case CKR_ENCRYPTED_DATA_INVALID:
+        case CKR_ENCRYPTED_DATA_LEN_RANGE:
+        case CKR_OBJECT_HANDLE_INVALID:
+            return GNUTLS_E_PKCS11_DATA_ERROR;
+        case CKR_FUNCTION_NOT_SUPPORTED:
+        case CKR_MECHANISM_INVALID:
+            return GNUTLS_E_PKCS11_UNSUPPORTED_FEATURE_ERROR;
+        case CKR_KEY_HANDLE_INVALID:
+        case CKR_KEY_SIZE_RANGE:
+        case CKR_KEY_TYPE_INCONSISTENT:
+        case CKR_KEY_NOT_NEEDED:
+        case CKR_KEY_CHANGED:
+        case CKR_KEY_NEEDED:
+        case CKR_KEY_INDIGESTIBLE:
+        case CKR_KEY_FUNCTION_NOT_PERMITTED:
+        case CKR_KEY_NOT_WRAPPABLE:
+        case CKR_KEY_UNEXTRACTABLE:
+            return GNUTLS_E_PKCS11_KEY_ERROR;
+        case CKR_PIN_INCORRECT:
+        case CKR_PIN_INVALID:
+        case CKR_PIN_LEN_RANGE:
+            return GNUTLS_E_PKCS11_PIN_ERROR;
+        case CKR_PIN_EXPIRED:
+            return GNUTLS_E_PKCS11_PIN_EXPIRED;
+        case CKR_PIN_LOCKED:
+            return GNUTLS_E_PKCS11_PIN_LOCKED;
+        case CKR_SESSION_CLOSED:
+        case CKR_SESSION_COUNT:
+        case CKR_SESSION_HANDLE_INVALID:
+        case CKR_SESSION_PARALLEL_NOT_SUPPORTED:
+        case CKR_SESSION_READ_ONLY:
+        case CKR_SESSION_EXISTS:
+        case CKR_SESSION_READ_ONLY_EXISTS:
+        case CKR_SESSION_READ_WRITE_SO_EXISTS:
+            return GNUTLS_E_PKCS11_SESSION_ERROR;
+        case CKR_SIGNATURE_INVALID:
+        case CKR_SIGNATURE_LEN_RANGE:
+            return GNUTLS_E_PKCS11_SIGNATURE_ERROR;
+        case CKR_TOKEN_NOT_PRESENT:
+        case CKR_TOKEN_NOT_RECOGNIZED:
+        case CKR_TOKEN_WRITE_PROTECTED:
+            return GNUTLS_E_PKCS11_TOKEN_ERROR;
+        case CKR_USER_ALREADY_LOGGED_IN:
+        case CKR_USER_NOT_LOGGED_IN:
+        case CKR_USER_PIN_NOT_INITIALIZED:
+        case CKR_USER_TYPE_INVALID:
+        case CKR_USER_ANOTHER_ALREADY_LOGGED_IN:
+        case CKR_USER_TOO_MANY_TYPES:
+            return GNUTLS_E_PKCS11_USER_ERROR;
+        case CKR_BUFFER_TOO_SMALL:
+            return GNUTLS_E_SHORT_MEMORY_BUFFER;
+        default:
+            return GNUTLS_E_PKCS11_ERROR;
+    }
+}
+
 /* Fake scan */
 void pkcs11_rescan_slots(void)
 {
@@ -765,7 +850,7 @@ ck_rv_t rv;
        if (rv != CKR_OK) {
                gnutls_assert();
                _gnutls_debug_log("pk11: FindObjectsInit failed.\n");
-               ret = GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE;
+               ret = pkcs11_rv_to_err(rv);
                goto fail;
        }
 
@@ -1248,7 +1333,7 @@ static int find_obj_url(pakchois_session_t *pks, struct 
token_info *info, void*
     if (rv != CKR_OK) {
         gnutls_assert();
         _gnutls_debug_log("pk11: FindObjectsInit failed.\n");
-        ret = GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE;
+        ret = pkcs11_rv_to_err(rv);
         goto cleanup;
     }
 
@@ -1594,7 +1679,7 @@ int pkcs11_login(pakchois_session_t *pks, struct 
token_info *info, token_creds_s
 
     _gnutls_debug_log("pk11: Login result = %lu\n", rv);
 
-    return (rv == CKR_OK || rv == CKR_USER_ALREADY_LOGGED_IN) ? 0 : 
GNUTLS_E_PKCS11_ERROR;
+    return (rv == CKR_OK || rv == CKR_USER_ALREADY_LOGGED_IN) ? 0 : 
pkcs11_rv_to_err(rv);
 }
 
 static int find_privkeys(pakchois_session_t *pks, struct token_info* info, 
struct pkey_list *list)
@@ -1618,7 +1703,7 @@ static int find_privkeys(pakchois_session_t *pks, struct 
token_info* info, struc
     rv = pakchois_find_objects_init(pks, a, 1);
     if (rv != CKR_OK) {
         gnutls_assert();
-        return GNUTLS_E_PKCS11_ERROR;
+        return pkcs11_rv_to_err(rv);
     }
 
     list->key_ids_size = 0;
@@ -1648,7 +1733,7 @@ static int find_privkeys(pakchois_session_t *pks, struct 
token_info* info, struc
     rv = pakchois_find_objects_init(pks, a, 1);
     if (rv != CKR_OK) {
         gnutls_assert();
-        return GNUTLS_E_PKCS11_ERROR;
+        return pkcs11_rv_to_err(rv);
     }
 
     current = 0;
@@ -1748,7 +1833,8 @@ static int find_objs(pakchois_session_t *pks, struct 
token_info *info, void* inp
             gnutls_assert();
             return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE;
         }
-    } else if (find_data->flags==GNUTLS_PKCS11_OBJ_ATTR_ALL) {
+    } else if (find_data->flags==GNUTLS_PKCS11_OBJ_ATTR_ALL ||
+        find_data->flags == GNUTLS_PKCS11_OBJ_ATTR_PRIVKEY) {
         ret = pkcs11_login(pks, info, NULL);
         if (ret < 0) {
             gnutls_assert();
@@ -1803,6 +1889,13 @@ static int find_objs(pakchois_session_t *pks, struct 
token_info *info, void* inp
         a[tot_values].value = &class;
         a[tot_values].value_len = sizeof class;
         tot_values++;
+    } else if (find_data->flags == GNUTLS_PKCS11_OBJ_ATTR_PRIVKEY) {
+        class = CKO_PRIVATE_KEY;
+
+        a[tot_values].type = CKA_CLASS;
+        a[tot_values].value = &class;
+        a[tot_values].value_len = sizeof class;
+        tot_values++;
     } else if (find_data->flags == GNUTLS_PKCS11_OBJ_ATTR_ALL) {
         if (class != -1) {
             a[tot_values].type = CKA_CLASS;
@@ -1833,7 +1926,7 @@ static int find_objs(pakchois_session_t *pks, struct 
token_info *info, void* inp
     if (rv != CKR_OK) {
         gnutls_assert();
         _gnutls_debug_log("pk11: FindObjectsInit failed.\n");
-        return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE;
+        return pkcs11_rv_to_err(rv);
     }
 
     while (pakchois_find_objects(pks, &obj, 1, &count) == CKR_OK
diff --git a/lib/pkcs11_int.h b/lib/pkcs11_int.h
index 04da57a..324da34 100644
--- a/lib/pkcs11_int.h
+++ b/lib/pkcs11_int.h
@@ -51,7 +51,7 @@ struct gnutls_pkcs11_obj_st {
  */
 typedef int (*find_func_t)(pakchois_session_t *pks, struct token_info* tinfo, 
void* input);
 
-
+int pkcs11_rv_to_err(ck_rv_t rv);
 int pkcs11_url_to_info(const char* url, struct pkcs11_url_info* info);
 
 int pkcs11_get_info(struct pkcs11_url_info *info, gnutls_pkcs11_obj_info_t 
itype, 
diff --git a/lib/pkcs11_privkey.c b/lib/pkcs11_privkey.c
index 67eddd9..c0fe633 100644
--- a/lib/pkcs11_privkey.c
+++ b/lib/pkcs11_privkey.c
@@ -170,11 +170,12 @@ gnutls_pkcs11_privkey_sign_data(gnutls_pkcs11_privkey_t 
signer,
 #define FIND_OBJECT(pks, obj, key) \
        do { \
                int retries = 0; \
+               int rret; \
                ret = pkcs11_find_object (&pks, &obj, &key->info, &key->creds, \
                        SESSION_LOGIN); \
                if (ret < 0) { \
-                       rv = token_func(token_data, key->info.label, 
retries++); \
-                       if (rv == 0) continue; \
+                       rret = token_func(token_data, key->info.token, 
retries++); \
+                       if (rret == 0) continue; \
                        gnutls_assert(); \
                        return ret; \
                } \
@@ -216,7 +217,7 @@ int gnutls_pkcs11_privkey_sign_hash(gnutls_pkcs11_privkey_t 
key,
        rv = pakchois_sign_init(pks, &mech, obj);
        if (rv != CKR_OK) {
                gnutls_assert();
-               ret = GNUTLS_E_PK_SIGN_FAILED;
+               ret = pkcs11_rv_to_err(rv);
                goto cleanup;
        }
 
@@ -225,7 +226,7 @@ int gnutls_pkcs11_privkey_sign_hash(gnutls_pkcs11_privkey_t 
key,
                           &siglen);
        if (rv != CKR_OK) {
                gnutls_assert();
-               ret = GNUTLS_E_PK_SIGN_FAILED;
+               ret = pkcs11_rv_to_err(rv);
                goto cleanup;
        }
 
@@ -237,7 +238,7 @@ int gnutls_pkcs11_privkey_sign_hash(gnutls_pkcs11_privkey_t 
key,
        if (rv != CKR_OK) {
                gnutls_free(signature->data);
                gnutls_assert();
-               ret = GNUTLS_E_PK_SIGN_FAILED;
+               ret = pkcs11_rv_to_err(rv);
                goto cleanup;
        }
 
@@ -329,7 +330,7 @@ gnutls_pkcs11_privkey_decrypt_data(gnutls_pkcs11_privkey_t 
key,
        rv = pakchois_decrypt_init(pks, &mech, obj);
        if (rv != CKR_OK) {
                gnutls_assert();
-               ret = GNUTLS_E_PK_DECRYPTION_FAILED;
+               ret = pkcs11_rv_to_err(rv);
                goto cleanup;
        }
 
@@ -338,7 +339,7 @@ gnutls_pkcs11_privkey_decrypt_data(gnutls_pkcs11_privkey_t 
key,
                           &siglen);
        if (rv != CKR_OK) {
                gnutls_assert();
-               ret = GNUTLS_E_PK_DECRYPTION_FAILED;
+               ret = pkcs11_rv_to_err(rv);
                goto cleanup;
        }
 
@@ -350,7 +351,7 @@ gnutls_pkcs11_privkey_decrypt_data(gnutls_pkcs11_privkey_t 
key,
        if (rv != CKR_OK) {
                gnutls_free(plaintext->data);
                gnutls_assert();
-               ret = GNUTLS_E_PK_DECRYPTION_FAILED;
+               ret = pkcs11_rv_to_err(rv);
                goto cleanup;
        }
 
diff --git a/lib/pkcs11_write.c b/lib/pkcs11_write.c
index 3ab1b3a..b93623a 100644
--- a/lib/pkcs11_write.c
+++ b/lib/pkcs11_write.c
@@ -138,7 +138,7 @@ int gnutls_pkcs11_copy_x509_crt(const char* token_url, 
gnutls_x509_crt_t crt,
        if (rv != CKR_OK) {
                gnutls_assert();
                _gnutls_debug_log("pkcs11: %s\n", pakchois_error(rv));
-               ret = GNUTLS_E_PKCS11_ERROR;
+               ret = pkcs11_rv_to_err(rv);
                goto  cleanup;
        }
        
@@ -321,7 +321,7 @@ int gnutls_pkcs11_copy_x509_privkey(const char* token_url,
        if (rv != CKR_OK) {
                gnutls_assert();
                _gnutls_debug_log("pkcs11: %s\n", pakchois_error(rv));
-               ret = GNUTLS_E_PKCS11_ERROR;
+               ret = pkcs11_rv_to_err(rv);
                goto  cleanup;
        }
 
@@ -446,19 +446,18 @@ static int delete_obj_url(pakchois_session_t *pks, struct 
token_info *info, void
     if (rv != CKR_OK) {
         gnutls_assert();
         _gnutls_debug_log("pk11: FindObjectsInit failed.\n");
-        ret = GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE;
+        ret = pkcs11_rv_to_err(rv);
         goto cleanup;
     }
 
     while (pakchois_find_objects(pks, &obj, 1, &count) == CKR_OK
            && count == 1) {
-               
-               rv = pakchois_destroy_object(pks, obj);
-               if (rv != CKR_OK) {
-            _gnutls_debug_log("pkcs11: Cannot destroy object: %s\n", 
pakchois_error(rv));
-        } else {
-                       find_data->deleted++;
-               }
+       rv = pakchois_destroy_object(pks, obj);
+       if (rv != CKR_OK) {
+           _gnutls_debug_log("pkcs11: Cannot destroy object: %s\n", 
pakchois_error(rv));
+       } else {
+           find_data->deleted++;
+       }
         
         found = 1;
     }
diff --git a/src/certtool-common.h b/src/certtool-common.h
index f937f95..95ff5dc 100644
--- a/src/certtool-common.h
+++ b/src/certtool-common.h
@@ -48,6 +48,7 @@ void pkcs11_delete(FILE* outfile, const char *pkcs11_url, int 
batch);
 #define PKCS11_TYPE_TRUSTED 2
 #define PKCS11_TYPE_PK 3
 #define PKCS11_TYPE_ALL 4
+#define PKCS11_TYPE_PRIVKEY 5
 
 extern unsigned char buffer[];
 extern const int buffer_size;
diff --git a/src/certtool-gaa.c b/src/certtool-gaa.c
index c8c761c..535ac4c 100644
--- a/src/certtool-gaa.c
+++ b/src/certtool-gaa.c
@@ -181,6 +181,7 @@ void gaa_help(void)
        __gaa_helpsingle(0, "pkcs11-provider", "Library ", "Specify the pkcs11 
provider library");
        __gaa_helpsingle(0, "pkcs11-export-url", "URL ", "Export data specified 
a pkcs11 URL");
        __gaa_helpsingle(0, "pkcs11-list-certs", "", "List certificates that 
have a private key specified by a PKCS#11 URL");
+       __gaa_helpsingle(0, "pkcs11-list-privkeys", "", "List private keys 
specified by a PKCS#11 URL");
        __gaa_helpsingle(0, "pkcs11-list-trusted", "", "List certificates 
marked as trusted, specified by a PKCS#11 URL");
        __gaa_helpsingle(0, "pkcs11-list-all-certs", "", "List all certificates 
specified by a PKCS#11 URL");
        __gaa_helpsingle(0, "pkcs11-list-all", "", "List all objects specified 
by a PKCS#11 URL");
@@ -206,11 +207,11 @@ typedef struct _gaainfo gaainfo;
 
 struct _gaainfo
 {
-#line 159 "certtool.gaa"
+#line 160 "certtool.gaa"
        int debug;
-#line 154 "certtool.gaa"
+#line 155 "certtool.gaa"
        int pkcs11_trusted;
-#line 151 "certtool.gaa"
+#line 152 "certtool.gaa"
        char* pkcs11_label;
 #line 144 "certtool.gaa"
        int pkcs11_type;
@@ -322,7 +323,7 @@ static int gaa_error = 0;
 #define GAA_MULTIPLE_OPTION     3
 
 #define GAA_REST                0
-#define GAA_NB_OPTION           63
+#define GAA_NB_OPTION           64
 #define GAAOPTID_version       1
 #define GAAOPTID_help  2
 #define GAAOPTID_debug 3
@@ -334,58 +335,59 @@ static int gaa_error = 0;
 #define GAAOPTID_pkcs11_list_all       9
 #define GAAOPTID_pkcs11_list_all_certs 10
 #define GAAOPTID_pkcs11_list_trusted   11
-#define GAAOPTID_pkcs11_list_certs     12
-#define GAAOPTID_pkcs11_export_url     13
-#define GAAOPTID_pkcs11_provider       14
-#define GAAOPTID_pkcs_cipher   15
-#define GAAOPTID_template      16
-#define GAAOPTID_infile        17
-#define GAAOPTID_outfile       18
-#define GAAOPTID_disable_quick_random  19
-#define GAAOPTID_sec_param     20
-#define GAAOPTID_bits  21
-#define GAAOPTID_outraw        22
-#define GAAOPTID_outder        23
-#define GAAOPTID_inraw 24
-#define GAAOPTID_inder 25
-#define GAAOPTID_export_ciphers        26
-#define GAAOPTID_hash  27
-#define GAAOPTID_dsa   28
-#define GAAOPTID_pkcs8 29
-#define GAAOPTID_to_p8 30
-#define GAAOPTID_to_p12        31
-#define GAAOPTID_v1    32
-#define GAAOPTID_fix_key       33
-#define GAAOPTID_pubkey_info   34
-#define GAAOPTID_pgp_key_info  35
-#define GAAOPTID_key_info      36
-#define GAAOPTID_smime_to_p7   37
-#define GAAOPTID_p7_info       38
-#define GAAOPTID_p12_info      39
-#define GAAOPTID_no_crq_extensions     40
-#define GAAOPTID_crq_info      41
-#define GAAOPTID_crl_info      42
-#define GAAOPTID_pgp_ring_info 43
-#define GAAOPTID_pgp_certificate_info  44
-#define GAAOPTID_certificate_info      45
-#define GAAOPTID_password      46
-#define GAAOPTID_load_ca_certificate   47
-#define GAAOPTID_load_ca_privkey       48
-#define GAAOPTID_load_certificate      49
-#define GAAOPTID_load_request  50
-#define GAAOPTID_load_pubkey   51
-#define GAAOPTID_load_privkey  52
-#define GAAOPTID_get_dh_params 53
-#define GAAOPTID_generate_dh_params    54
-#define GAAOPTID_verify_crl    55
-#define GAAOPTID_verify_chain  56
-#define GAAOPTID_generate_request      57
-#define GAAOPTID_generate_privkey      58
-#define GAAOPTID_update_certificate    59
-#define GAAOPTID_generate_crl  60
-#define GAAOPTID_generate_proxy        61
-#define GAAOPTID_generate_certificate  62
-#define GAAOPTID_generate_self_signed  63
+#define GAAOPTID_pkcs11_list_privkeys  12
+#define GAAOPTID_pkcs11_list_certs     13
+#define GAAOPTID_pkcs11_export_url     14
+#define GAAOPTID_pkcs11_provider       15
+#define GAAOPTID_pkcs_cipher   16
+#define GAAOPTID_template      17
+#define GAAOPTID_infile        18
+#define GAAOPTID_outfile       19
+#define GAAOPTID_disable_quick_random  20
+#define GAAOPTID_sec_param     21
+#define GAAOPTID_bits  22
+#define GAAOPTID_outraw        23
+#define GAAOPTID_outder        24
+#define GAAOPTID_inraw 25
+#define GAAOPTID_inder 26
+#define GAAOPTID_export_ciphers        27
+#define GAAOPTID_hash  28
+#define GAAOPTID_dsa   29
+#define GAAOPTID_pkcs8 30
+#define GAAOPTID_to_p8 31
+#define GAAOPTID_to_p12        32
+#define GAAOPTID_v1    33
+#define GAAOPTID_fix_key       34
+#define GAAOPTID_pubkey_info   35
+#define GAAOPTID_pgp_key_info  36
+#define GAAOPTID_key_info      37
+#define GAAOPTID_smime_to_p7   38
+#define GAAOPTID_p7_info       39
+#define GAAOPTID_p12_info      40
+#define GAAOPTID_no_crq_extensions     41
+#define GAAOPTID_crq_info      42
+#define GAAOPTID_crl_info      43
+#define GAAOPTID_pgp_ring_info 44
+#define GAAOPTID_pgp_certificate_info  45
+#define GAAOPTID_certificate_info      46
+#define GAAOPTID_password      47
+#define GAAOPTID_load_ca_certificate   48
+#define GAAOPTID_load_ca_privkey       49
+#define GAAOPTID_load_certificate      50
+#define GAAOPTID_load_request  51
+#define GAAOPTID_load_pubkey   52
+#define GAAOPTID_load_privkey  53
+#define GAAOPTID_get_dh_params 54
+#define GAAOPTID_generate_dh_params    55
+#define GAAOPTID_verify_crl    56
+#define GAAOPTID_verify_chain  57
+#define GAAOPTID_generate_request      58
+#define GAAOPTID_generate_privkey      59
+#define GAAOPTID_update_certificate    60
+#define GAAOPTID_generate_crl  61
+#define GAAOPTID_generate_proxy        62
+#define GAAOPTID_generate_certificate  63
+#define GAAOPTID_generate_self_signed  64
 
 #line 168 "gaa.skel"
 
@@ -632,7 +634,7 @@ struct GAAOPTION_outfile
        int size1;
 };
 
-struct GAAOPTION_sec_param
+struct GAAOPTION_sec_param 
 {
        char* arg1;
        int size1;
@@ -750,6 +752,7 @@ static int gaa_get_option_num(char *str, int status)
                        GAA_CHECK1STR("", GAAOPTID_pkcs11_list_all);
                        GAA_CHECK1STR("", GAAOPTID_pkcs11_list_all_certs);
                        GAA_CHECK1STR("", GAAOPTID_pkcs11_list_trusted);
+                       GAA_CHECK1STR("", GAAOPTID_pkcs11_list_privkeys);
                        GAA_CHECK1STR("", GAAOPTID_pkcs11_list_certs);
                        GAA_CHECK1STR("", GAAOPTID_disable_quick_random);
                        GAA_CHECK1STR("", GAAOPTID_outraw);
@@ -801,6 +804,7 @@ static int gaa_get_option_num(char *str, int status)
                        GAA_CHECKSTR("pkcs11-list-all", 
GAAOPTID_pkcs11_list_all);
                        GAA_CHECKSTR("pkcs11-list-all-certs", 
GAAOPTID_pkcs11_list_all_certs);
                        GAA_CHECKSTR("pkcs11-list-trusted", 
GAAOPTID_pkcs11_list_trusted);
+                       GAA_CHECKSTR("pkcs11-list-privkeys", 
GAAOPTID_pkcs11_list_privkeys);
                        GAA_CHECKSTR("pkcs11-list-certs", 
GAAOPTID_pkcs11_list_certs);
                        GAA_CHECKSTR("pkcs11-export-url", 
GAAOPTID_pkcs11_export_url);
                        GAA_CHECKSTR("pkcs11-provider", 
GAAOPTID_pkcs11_provider);
@@ -907,14 +911,14 @@ static int gaa_try(int gaa_num, int gaa_index, gaainfo 
*gaaval, char *opt_list)
     {
        case GAAOPTID_version:
        OK = 0;
-#line 164 "certtool.gaa"
+#line 165 "certtool.gaa"
 { certtool_version(); exit(0); ;};
 
                return GAA_OK;
                break;
        case GAAOPTID_help:
        OK = 0;
-#line 162 "certtool.gaa"
+#line 163 "certtool.gaa"
 { gaa_help(); exit(0); ;};
 
                return GAA_OK;
@@ -924,7 +928,7 @@ static int gaa_try(int gaa_num, int gaa_index, gaainfo 
*gaaval, char *opt_list)
                GAA_TESTMOREARGS;
                GAA_FILL(GAATMP_debug.arg1, gaa_getint, GAATMP_debug.size1);
                gaa_index++;
-#line 160 "certtool.gaa"
+#line 161 "certtool.gaa"
 { gaaval->debug = GAATMP_debug.arg1 ;};
 
                return GAA_OK;
@@ -934,14 +938,14 @@ static int gaa_try(int gaa_num, int gaa_index, gaainfo 
*gaaval, char *opt_list)
                GAA_TESTMOREARGS;
                GAA_FILL(GAATMP_pkcs11_delete_url.arg1, gaa_getstr, 
GAATMP_pkcs11_delete_url.size1);
                gaa_index++;
-#line 157 "certtool.gaa"
+#line 158 "certtool.gaa"
 { gaaval->action = ACTION_PKCS11_DELETE_URL; gaaval->pkcs11_url = 
GAATMP_pkcs11_delete_url.arg1; ;};
 
                return GAA_OK;
                break;
        case GAAOPTID_pkcs11_write_trusted:
        OK = 0;
-#line 155 "certtool.gaa"
+#line 156 "certtool.gaa"
 { gaaval->pkcs11_trusted = 1; ;};
 
                return GAA_OK;
@@ -951,7 +955,7 @@ static int gaa_try(int gaa_num, int gaa_index, gaainfo 
*gaaval, char *opt_list)
                GAA_TESTMOREARGS;
                GAA_FILL(GAATMP_pkcs11_write_label.arg1, gaa_getstr, 
GAATMP_pkcs11_write_label.size1);
                gaa_index++;
-#line 153 "certtool.gaa"
+#line 154 "certtool.gaa"
 { gaaval->pkcs11_label = GAATMP_pkcs11_write_label.arg1; ;};
 
                return GAA_OK;
@@ -961,39 +965,46 @@ static int gaa_try(int gaa_num, int gaa_index, gaainfo 
*gaaval, char *opt_list)
                GAA_TESTMOREARGS;
                GAA_FILL(GAATMP_pkcs11_write.arg1, gaa_getstr, 
GAATMP_pkcs11_write.size1);
                gaa_index++;
-#line 152 "certtool.gaa"
+#line 153 "certtool.gaa"
 { gaaval->action = ACTION_PKCS11_WRITE_URL; gaaval->pkcs11_url = 
GAATMP_pkcs11_write.arg1; ;};
 
                return GAA_OK;
                break;
        case GAAOPTID_pkcs11_list_tokens:
        OK = 0;
-#line 149 "certtool.gaa"
+#line 150 "certtool.gaa"
 { gaaval->action = ACTION_PKCS11_TOKENS; ;};
 
                return GAA_OK;
                break;
        case GAAOPTID_pkcs11_list_all:
        OK = 0;
-#line 148 "certtool.gaa"
+#line 149 "certtool.gaa"
 { gaaval->action = ACTION_PKCS11_LIST; gaaval->pkcs11_type=PKCS11_TYPE_ALL; ;};
 
                return GAA_OK;
                break;
        case GAAOPTID_pkcs11_list_all_certs:
        OK = 0;
-#line 147 "certtool.gaa"
+#line 148 "certtool.gaa"
 { gaaval->action = ACTION_PKCS11_LIST; 
gaaval->pkcs11_type=PKCS11_TYPE_CRT_ALL; ;};
 
                return GAA_OK;
                break;
        case GAAOPTID_pkcs11_list_trusted:
        OK = 0;
-#line 146 "certtool.gaa"
+#line 147 "certtool.gaa"
 { gaaval->action = ACTION_PKCS11_LIST; 
gaaval->pkcs11_type=PKCS11_TYPE_TRUSTED; ;};
 
                return GAA_OK;
                break;
+       case GAAOPTID_pkcs11_list_privkeys:
+       OK = 0;
+#line 146 "certtool.gaa"
+{ gaaval->action = ACTION_PKCS11_LIST; 
gaaval->pkcs11_type=PKCS11_TYPE_PRIVKEY; ;};
+
+               return GAA_OK;
+               break;
        case GAAOPTID_pkcs11_list_certs:
        OK = 0;
 #line 145 "certtool.gaa"
@@ -1430,7 +1441,7 @@ int gaa(int argc, char **argv, gaainfo *gaaval)
     if(inited == 0)
     {
 
-#line 166 "certtool.gaa"
+#line 167 "certtool.gaa"
 { gaaval->bits = 0; gaaval->pkcs8 = 0; gaaval->privkey = NULL; 
gaaval->ca=NULL; gaaval->ca_privkey = NULL;
        gaaval->debug=1; gaaval->request = NULL; gaaval->infile = NULL; 
gaaval->outfile = NULL; gaaval->cert = NULL; 
        gaaval->incert_format = 0; gaaval->outcert_format = 0; 
gaaval->action=-1; gaaval->pass = NULL; gaaval->v1_cert = 0;
diff --git a/src/certtool-gaa.h b/src/certtool-gaa.h
index 647e512..8e9f2ff 100644
--- a/src/certtool-gaa.h
+++ b/src/certtool-gaa.h
@@ -8,11 +8,11 @@ typedef struct _gaainfo gaainfo;
 
 struct _gaainfo
 {
-#line 159 "certtool.gaa"
+#line 160 "certtool.gaa"
        int debug;
-#line 154 "certtool.gaa"
+#line 155 "certtool.gaa"
        int pkcs11_trusted;
-#line 151 "certtool.gaa"
+#line 152 "certtool.gaa"
        char* pkcs11_label;
 #line 144 "certtool.gaa"
        int pkcs11_type;
diff --git a/src/certtool.gaa b/src/certtool.gaa
index 9b77864..0f7be24 100644
--- a/src/certtool.gaa
+++ b/src/certtool.gaa
@@ -143,6 +143,7 @@ option (pkcs11-export-url) STR "URL" { $action = 
ACTION_PKCS11_EXPORT_URL; $pkcs
 
 #int pkcs11_type;
 option (pkcs11-list-certs) { $action = ACTION_PKCS11_LIST; 
$pkcs11_type=PKCS11_TYPE_PK; } "List certificates that have a private key 
specified by a PKCS#11 URL"
+option (pkcs11-list-privkeys) { $action = ACTION_PKCS11_LIST; 
$pkcs11_type=PKCS11_TYPE_PRIVKEY; } "List private keys specified by a PKCS#11 
URL"
 option (pkcs11-list-trusted) { $action = ACTION_PKCS11_LIST; 
$pkcs11_type=PKCS11_TYPE_TRUSTED; } "List certificates marked as trusted, 
specified by a PKCS#11 URL"
 option (pkcs11-list-all-certs) { $action = ACTION_PKCS11_LIST; 
$pkcs11_type=PKCS11_TYPE_CRT_ALL; } "List all certificates specified by a 
PKCS#11 URL"
 option (pkcs11-list-all) { $action = ACTION_PKCS11_LIST; 
$pkcs11_type=PKCS11_TYPE_ALL; } "List all objects specified by a PKCS#11 URL"
diff --git a/src/pkcs11.c b/src/pkcs11.c
index dc3e8a3..d092136 100644
--- a/src/pkcs11.c
+++ b/src/pkcs11.c
@@ -88,6 +88,8 @@ int i, flags;
                flags = GNUTLS_PKCS11_OBJ_ATTR_CRT_WITH_PRIVKEY;
        } else if (type == PKCS11_TYPE_CRT_ALL) {
                flags = GNUTLS_PKCS11_OBJ_ATTR_CRT_ALL;
+       } else if (type == PKCS11_TYPE_PRIVKEY) {
+               flags = GNUTLS_PKCS11_OBJ_ATTR_PRIVKEY;
        } else {
                flags = GNUTLS_PKCS11_OBJ_ATTR_ALL;
        }
@@ -158,7 +160,7 @@ int i, flags;
                
                
 
-               if (flags == GNUTLS_PKCS11_OBJ_ATTR_ALL)
+               if (flags == GNUTLS_PKCS11_OBJ_ATTR_ALL || flags == 
GNUTLS_PKCS11_OBJ_ATTR_PRIVKEY)
                        continue;
 
                ret = gnutls_x509_crt_init(&xcrt);


hooks/post-receive
-- 
GNU gnutls



reply via email to

[Prev in Thread] Current Thread [Next in Thread]