diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-08-27 20:17:45 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-08-27 20:28:23 +0200 |
commit | 5000ce37f9a21d9f51db5b964d4c965c10ede6eb (patch) | |
tree | f752ed99b7c98bb0ed7f72fd6496deb5824c1906 /lib/openpgp | |
parent | e5fdc955e8bcc1b3925c2e6569b28a53b6eea435 (diff) | |
download | gnutls-5000ce37f9a21d9f51db5b964d4c965c10ede6eb.tar.gz |
gnutls_certificate_set_x509_key() and gnutls_certificate_set_openpgp_key() operate as in gnutls 2.10.x and do not require to hold the structures.
Diffstat (limited to 'lib/openpgp')
-rw-r--r-- | lib/openpgp/gnutls_openpgp.c | 2 | ||||
-rw-r--r-- | lib/openpgp/gnutls_openpgp.h | 3 | ||||
-rw-r--r-- | lib/openpgp/privkey.c | 55 |
3 files changed, 59 insertions, 1 deletions
diff --git a/lib/openpgp/gnutls_openpgp.c b/lib/openpgp/gnutls_openpgp.c index 2d2afd5e10..dd2eaaca4c 100644 --- a/lib/openpgp/gnutls_openpgp.c +++ b/lib/openpgp/gnutls_openpgp.c @@ -107,7 +107,7 @@ gnutls_certificate_set_openpgp_key (gnutls_certificate_credentials_t res, ret = gnutls_privkey_import_openpgp (privkey, pkey, - GNUTLS_PRIVKEY_IMPORT_AUTO_RELEASE); + GNUTLS_PRIVKEY_IMPORT_COPY); if (ret < 0) { gnutls_assert (); diff --git a/lib/openpgp/gnutls_openpgp.h b/lib/openpgp/gnutls_openpgp.h index 70ba02ac9d..b5616b8a58 100644 --- a/lib/openpgp/gnutls_openpgp.h +++ b/lib/openpgp/gnutls_openpgp.h @@ -26,6 +26,9 @@ int gnutls_openpgp_get_key (gnutls_datum_t * key, /* internal */ int +_gnutls_openpgp_privkey_cpy (gnutls_openpgp_privkey_t dest, gnutls_openpgp_privkey_t src); + +int _gnutls_openpgp_request_key (gnutls_session_t, gnutls_datum_t * ret, const gnutls_certificate_credentials_t cred, diff --git a/lib/openpgp/privkey.c b/lib/openpgp/privkey.c index 54b5d755ad..8f43dff6fc 100644 --- a/lib/openpgp/privkey.c +++ b/lib/openpgp/privkey.c @@ -72,6 +72,61 @@ gnutls_openpgp_privkey_deinit (gnutls_openpgp_privkey_t key) gnutls_free (key); } +/*- + * _gnutls_openpgp_privkey_cpy - This function copies a gnutls_openpgp_privkey_t structure + * @dest: The structure where to copy + * @src: The structure to be copied + * + * This function will copy an X.509 certificate structure. + * + * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a + * negative error value. + -*/ +int +_gnutls_openpgp_privkey_cpy (gnutls_openpgp_privkey_t dest, gnutls_openpgp_privkey_t src) +{ + int ret; + size_t der_size; + opaque *der; + gnutls_datum_t tmp; + + ret = gnutls_openpgp_privkey_export (src, GNUTLS_OPENPGP_FMT_RAW, NULL, 0, NULL, &der_size); + if (ret != GNUTLS_E_SHORT_MEMORY_BUFFER) + { + gnutls_assert (); + return ret; + } + + der = gnutls_malloc (der_size); + if (der == NULL) + { + gnutls_assert (); + return GNUTLS_E_MEMORY_ERROR; + } + + ret = gnutls_openpgp_privkey_export (src, GNUTLS_OPENPGP_FMT_RAW, NULL, 0, der, &der_size); + if (ret < 0) + { + gnutls_assert (); + gnutls_free (der); + return ret; + } + + tmp.data = der; + tmp.size = der_size; + ret = gnutls_openpgp_privkey_import (dest, &tmp, GNUTLS_OPENPGP_FMT_RAW, NULL, 0); + + gnutls_free (der); + + if (ret < 0) + { + gnutls_assert (); + return ret; + } + + return 0; +} + /** * gnutls_openpgp_privkey_sec_param: * @key: a key structure |