From: Nikos Mavrogiannopoulos Date: Tue, 3 Jul 2012 18:42:33 +0000 (+0200) Subject: Added gnutls_privkey_import_ext2() X-Git-Tag: gnutls_3_1_0pre0~92 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ae312d9b32361e88b6b522cf3478f06ea4392bbf;p=thirdparty%2Fgnutls.git Added gnutls_privkey_import_ext2() This function allows to specify a deinitialization function. --- diff --git a/NEWS b/NEWS index 40e3b00bc4..ada7b42896 100644 --- 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 diff --git a/lib/gnutls_privkey.c b/lib/gnutls_privkey.c index 346118dbd9..e87f1ab69f 100644 --- a/lib/gnutls_privkey.c +++ b/lib/gnutls_privkey.c @@ -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; diff --git a/lib/includes/gnutls/abstract.h b/lib/includes/gnutls/abstract.h index 26a3d140f5..af798f9730 100644 --- a/lib/includes/gnutls/abstract.h +++ b/lib/includes/gnutls/abstract.h @@ -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, diff --git a/lib/libgnutls.map b/lib/libgnutls.map index bd8f5f0009..746281395f 100644 --- a/lib/libgnutls.map +++ b/lib/libgnutls.map @@ -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 {