summaryrefslogtreecommitdiff
path: root/libextra/openpgp/openpgp.c
diff options
context:
space:
mode:
Diffstat (limited to 'libextra/openpgp/openpgp.c')
-rw-r--r--libextra/openpgp/openpgp.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/libextra/openpgp/openpgp.c b/libextra/openpgp/openpgp.c
index c15624fbea..440c6d4f7f 100644
--- a/libextra/openpgp/openpgp.c
+++ b/libextra/openpgp/openpgp.c
@@ -68,6 +68,7 @@ void gnutls_openpgp_key_deinit(gnutls_openpgp_key key)
cdk_kbnode_release( key->knode);
key->knode = NULL;
}
+ if (key->inp) cdk_stream_close( key->inp);
gnutls_free(key);
}
@@ -85,15 +86,32 @@ void gnutls_openpgp_key_deinit(gnutls_openpgp_key key)
*
**/
int gnutls_openpgp_key_import(gnutls_openpgp_key key,
- const gnutls_datum * data,
- gnutls_openpgp_key_fmt format)
+ const gnutls_datum * data, gnutls_openpgp_key_fmt format)
{
int rc;
- rc = cdk_kbnode_read_from_mem( &key->knode, data->data, data->size);
- if( (rc = _gnutls_map_cdk_rc( rc ))) {
- gnutls_assert();
- return rc;
+ if (format == GNUTLS_OPENPGP_FMT_RAW) {
+ rc = cdk_kbnode_read_from_mem( &key->knode, data->data, data->size);
+ if( rc) {
+ rc = _gnutls_map_cdk_rc( rc);
+ gnutls_assert();
+ return rc;
+ }
+ } else { /* base64 */
+ key->inp = cdk_stream_tmp_from_mem( data->data, data->size);
+ if (key->inp == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_INTERNAL_ERROR;
+ }
+
+ cdk_stream_set_armor_flag( key->inp, 0 );
+
+ rc = cdk_keydb_get_keyblock( key->inp, &key->knode );
+ if( rc) {
+ rc = _gnutls_map_cdk_rc( rc);
+ gnutls_assert();
+ return rc;
+ }
}
return 0;