]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Add functions to export X.509 and OpenPGP private keys from the abstract type
authorArmin Burgmeier <armin@arbur.net>
Wed, 17 Sep 2014 21:33:40 +0000 (17:33 -0400)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Wed, 24 Sep 2014 08:02:27 +0000 (10:02 +0200)
Signed-off-by: Armin Burgmeier <armin@arbur.net>
lib/gnutls_privkey.c
lib/includes/gnutls/abstract.h
lib/libgnutls.map

index 150482778f792d6727e2a91894307ce0eb432d52..229797ce7e41a4109c42f659c5f102ac35aea03c 100644 (file)
@@ -419,6 +419,51 @@ int gnutls_privkey_import_pkcs11_url(gnutls_privkey_t key, const char *url)
        return ret;
 }
 
+/* This is currently disabled because there is no routine to copy a
+ * PKCS#11 private key. */
+#if 0
+/**
+ * gnutls_privkey_export_pkcs11:
+ * @pkey: The private key
+ * @key: Location for the key to be exported.
+ *
+ * Converts the given abstract private key to a #gnutls_pkcs11_privkey_t
+ * structure. The key must be of type %GNUTLS_PRIVKEY_PKCS11. The key
+ * returned in @key must be deinitialized with
+ * gnutls_pkcs11_privkey_deinit().
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a
+ *   negative error value.
+ *
+ * Since: 3.4.0
+ */
+int
+gnutls_privkey_export_pkcs11(gnutls_privkey_t pkey,
+                             gnutls_pkcs11_privkey_t *key)
+{
+       int ret;
+
+       if (pkey->type != GNUTLS_PRIVKEY_PKCS11) {
+               gnutls_assert();
+               return GNUTLS_E_INVALID_REQUEST;
+       }
+
+       ret = gnutls_pkcs11_privkey_init(key);
+       if (ret < 0)
+               return gnutls_assert_val(ret);
+
+       ret = _gnutls_pkcs11_privkey_cpy(*key, pkey->key.openpgp); /* TODO */
+       if (ret < 0) {
+               gnutls_pkcs11_privkey_deinit(*key);
+               *key = NULL;
+
+               return gnutls_assert_val(ret);
+       }
+
+       return 0;
+}
+#endif
+
 #endif                         /* ENABLE_PKCS11 */
 
 /**
@@ -633,6 +678,46 @@ gnutls_privkey_import_x509(gnutls_privkey_t pkey,
        return 0;
 }
 
+/**
+ * gnutls_privkey_export_x509:
+ * @pkey: The private key
+ * @key: Location for the key to be exported.
+ *
+ * Converts the given abstract private key to a #gnutls_x509_privkey_t
+ * structure. The key must be of type %GNUTLS_PRIVKEY_X509. The key returned
+ * in @key must be deinitialized with gnutls_x509_privkey_deinit().
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a
+ *   negative error value.
+ *
+ * Since: 3.4.0
+ */
+int
+gnutls_privkey_export_x509(gnutls_privkey_t pkey,
+                           gnutls_x509_privkey_t *key)
+{
+       int ret;
+
+       if (pkey->type != GNUTLS_PRIVKEY_X509) {
+               gnutls_assert();
+               return GNUTLS_E_INVALID_REQUEST;
+       }
+
+       ret = gnutls_x509_privkey_init(key);
+       if (ret < 0)
+               return gnutls_assert_val(ret);
+
+       ret = gnutls_x509_privkey_cpy(*key, pkey->key.x509);
+       if (ret < 0) {
+               gnutls_x509_privkey_deinit(*key);
+               *key = NULL;
+
+               return gnutls_assert_val(ret);
+       }
+
+       return 0;
+}
+
 /**
  * gnutls_privkey_generate:
  * @pkey: The private key
@@ -807,6 +892,47 @@ int gnutls_privkey_import_openpgp_raw(gnutls_privkey_t pkey,
 
        return ret;
 }
+
+/**
+ * gnutls_privkey_export_openpgp:
+ * @pkey: The private key
+ * @key: Location for the key to be exported.
+ *
+ * Converts the given abstract private key to a #gnutls_openpgp_privkey_t
+ * structure. The key must be of type %GNUTLS_PRIVKEY_OPENPGP. The key
+ * returned in @key must be deinitialized with
+ * gnutls_openpgp_privkey_deinit().
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a
+ *   negative error value.
+ *
+ * Since: 3.4.0
+ */
+int
+gnutls_privkey_export_openpgp(gnutls_privkey_t pkey,
+                              gnutls_openpgp_privkey_t *key)
+{
+       int ret;
+
+       if (pkey->type != GNUTLS_PRIVKEY_OPENPGP) {
+               gnutls_assert();
+               return GNUTLS_E_INVALID_REQUEST;
+       }
+
+       ret = gnutls_openpgp_privkey_init(key);
+       if (ret < 0)
+               return gnutls_assert_val(ret);
+
+       ret = _gnutls_openpgp_privkey_cpy(*key, pkey->key.openpgp);
+       if (ret < 0) {
+               gnutls_openpgp_privkey_deinit(*key);
+               *key = NULL;
+
+               return gnutls_assert_val(ret);
+       }
+
+       return 0;
+}
 #endif
 
 /**
index 11af9dcffb717f3f6cbf3867f5d01e2dc0a51ad8..b581ca107eec99f590610a144719386f2f3359c0 100644 (file)
@@ -290,6 +290,11 @@ int gnutls_privkey_import_openpgp(gnutls_privkey_t pkey,
                                  gnutls_openpgp_privkey_t key,
                                  unsigned int flags);
 
+int gnutls_privkey_export_x509(gnutls_privkey_t pkey,
+                               gnutls_x509_privkey_t * key);
+int gnutls_privkey_export_openpgp(gnutls_privkey_t pkey,
+                                  gnutls_openpgp_privkey_t * key);
+
 int gnutls_privkey_import_openpgp_raw(gnutls_privkey_t pkey,
                                      const gnutls_datum_t * data,
                                      gnutls_openpgp_crt_fmt_t
index 65280b1b7b8c5849aede7fff5c13fd1d1195bf5c..59478b9e93fb2661b34bef5c6a08fab3ce38892a 100644 (file)
@@ -925,6 +925,8 @@ GNUTLS_3_1_0 {
        gnutls_x509_crl_get_raw_issuer_dn;
        gnutls_certificate_get_crt_raw;
        gnutls_privkey_generate;
+       gnutls_privkey_export_x509;
+       gnutls_privkey_export_openpgp;
        gnutls_fips140_mode_enabled;
        gnutls_record_check_corked;
        gnutls_pkcs11_crt_is_known;