]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Added gnutls_privkey_import_ext2()
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Tue, 3 Jul 2012 18:42:33 +0000 (20:42 +0200)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Tue, 3 Jul 2012 18:42:33 +0000 (20:42 +0200)
This function allows to specify a deinitialization function.

NEWS
lib/gnutls_privkey.c
lib/includes/gnutls/abstract.h
lib/libgnutls.map

diff --git a/NEWS b/NEWS
index 40e3b00bc4e0b2beb0fa516b48beba543bc60611..ada7b42896a1e3d00d125619e2031fed565fad2b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -47,6 +47,7 @@ GNUTLS_CAMELLIA_192_CBC: Added
 gnutls_privkey_import_pkcs11_url: Added
 gnutls_privkey_import_openpgp_raw: Added
 gnutls_privkey_import_x509_raw: Added
+gnutls_privkey_import_ext2: Added
 gnutls_x509_privkey_import2: Added
 gnutls_x509_privkey_import_openssl: Added
 gnutls_load_file: Added
index 346118dbd98b2d1db09f0b4af9f7777daf892fab..e87f1ab69fdfba10e1a5f75b1405581c9c346e01 100644 (file)
@@ -50,6 +50,7 @@ struct gnutls_privkey_st
     struct {
       gnutls_privkey_sign_func sign_func;
       gnutls_privkey_decrypt_func decrypt_func;
+      gnutls_privkey_deinit_func deinit_func;
       void* userdata;
     } ext;
   } key;
@@ -305,6 +306,10 @@ gnutls_privkey_deinit (gnutls_privkey_t key)
       case GNUTLS_PRIVKEY_X509:
         gnutls_x509_privkey_deinit (key->key.x509);
         break;
+      case GNUTLS_PRIVKEY_EXT:
+        if (key->key.ext.deinit_func != NULL)
+          key->key.ext.deinit_func(key, key->key.ext.userdata);
+        break;
       default:
         break;
       }
@@ -409,6 +414,58 @@ int ret;
 
   pkey->key.ext.sign_func = sign_func;
   pkey->key.ext.decrypt_func = decrypt_func;
+  pkey->key.ext.deinit_func = NULL;
+  pkey->key.ext.userdata = userdata;
+  pkey->type = GNUTLS_PRIVKEY_EXT;
+  pkey->pk_algorithm = pk;
+  pkey->flags = flags;
+
+  return 0;
+}
+
+/**
+ * gnutls_privkey_import_ext2:
+ * @pkey: The private key
+ * @pk: The public key algorithm
+ * @userdata: private data to be provided to the callbacks
+ * @sign_func: callback for signature operations
+ * @decrypt_func: callback for decryption operations
+ * @deinit_func: a deinitialization function
+ * @flags: Flags for the import
+ *
+ * This function will associate the given callbacks with the
+ * #gnutls_privkey_t structure. At least one of the two callbacks
+ * must be non-null.
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a
+ *   negative error value.
+ *
+ * Since: 3.1
+ **/
+int
+gnutls_privkey_import_ext2 (gnutls_privkey_t pkey,
+                           gnutls_pk_algorithm_t pk,
+                           void* userdata,
+                           gnutls_privkey_sign_func sign_func,
+                           gnutls_privkey_decrypt_func decrypt_func,
+                           gnutls_privkey_deinit_func deinit_func,
+                           unsigned int flags)
+{
+int ret;
+
+  ret = check_if_clean(pkey);
+  if (ret < 0)
+    {
+      gnutls_assert();
+      return ret;
+    }
+  
+  if (sign_func == NULL && decrypt_func == NULL)
+    return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
+  pkey->key.ext.sign_func = sign_func;
+  pkey->key.ext.decrypt_func = decrypt_func;
+  pkey->key.ext.deinit_func = deinit_func;
   pkey->key.ext.userdata = userdata;
   pkey->type = GNUTLS_PRIVKEY_EXT;
   pkey->pk_algorithm = pk;
index 26a3d140f5dc88154febc13a0dbf5b5f95fa16fc..af798f97301f2ad87774770e3cd9570b26d6cf95 100644 (file)
@@ -50,6 +50,9 @@ typedef int (*gnutls_privkey_decrypt_func) (gnutls_privkey_t key,
                                             const gnutls_datum_t * ciphertext,
                                             gnutls_datum_t * plaintext);
 
+typedef int (*gnutls_privkey_deinit_func) (gnutls_privkey_t key,
+                                           void *userdata);
+
 int gnutls_pubkey_init (gnutls_pubkey_t * key);
 void gnutls_pubkey_deinit (gnutls_pubkey_t key);
 int gnutls_pubkey_get_pk_algorithm (gnutls_pubkey_t key, unsigned int *bits);
@@ -196,6 +199,15 @@ gnutls_privkey_import_ext (gnutls_privkey_t pkey,
                            gnutls_privkey_decrypt_func decrypt_func,
                            unsigned int flags);
 
+int
+gnutls_privkey_import_ext2 (gnutls_privkey_t pkey,
+                           gnutls_pk_algorithm_t pk,
+                           void* userdata,
+                           gnutls_privkey_sign_func sign_func,
+                           gnutls_privkey_decrypt_func decrypt_func,
+                           gnutls_privkey_deinit_func deinit_func,
+                           unsigned int flags);
+
 int gnutls_privkey_sign_data (gnutls_privkey_t signer,
                               gnutls_digest_algorithm_t hash,
                               unsigned int flags,
index bd8f5f00096f48ba0304fb23ab658dcbbc16f7a7..746281395f376198c8233e8f0a1bc7df42d5b490 100644 (file)
@@ -805,6 +805,7 @@ GNUTLS_3_1_0 {
        gnutls_load_file;
        gnutls_x509_privkey_import_openssl;
        gnutls_x509_privkey_import2;
+       gnutls_privkey_import_ext2;
 } GNUTLS_3_0_0;
 
 GNUTLS_PRIVATE {