diff options
Diffstat (limited to 'lib/openpgp/extras.c')
-rw-r--r-- | lib/openpgp/extras.c | 365 |
1 files changed, 177 insertions, 188 deletions
diff --git a/lib/openpgp/extras.c b/lib/openpgp/extras.c index d7b342c017..65bb488172 100644 --- a/lib/openpgp/extras.c +++ b/lib/openpgp/extras.c @@ -42,14 +42,13 @@ * * Returns: %GNUTLS_E_SUCCESS on success, or an error code. **/ -int -gnutls_openpgp_keyring_init (gnutls_openpgp_keyring_t * keyring) +int gnutls_openpgp_keyring_init(gnutls_openpgp_keyring_t * keyring) { - *keyring = gnutls_calloc (1, sizeof (gnutls_openpgp_keyring_int)); + *keyring = gnutls_calloc(1, sizeof(gnutls_openpgp_keyring_int)); - if (*keyring) - return 0; /* success */ - return GNUTLS_E_MEMORY_ERROR; + if (*keyring) + return 0; /* success */ + return GNUTLS_E_MEMORY_ERROR; } @@ -59,19 +58,17 @@ gnutls_openpgp_keyring_init (gnutls_openpgp_keyring_t * keyring) * * This function will deinitialize a keyring structure. **/ -void -gnutls_openpgp_keyring_deinit (gnutls_openpgp_keyring_t keyring) +void gnutls_openpgp_keyring_deinit(gnutls_openpgp_keyring_t keyring) { - if (!keyring) - return; + if (!keyring) + return; - if (keyring->db) - { - cdk_keydb_free (keyring->db); - keyring->db = NULL; - } + if (keyring->db) { + cdk_keydb_free(keyring->db); + keyring->db = NULL; + } - gnutls_free (keyring); + gnutls_free(keyring); } /** @@ -86,24 +83,24 @@ gnutls_openpgp_keyring_deinit (gnutls_openpgp_keyring_t keyring) * negative error code on failure. **/ int -gnutls_openpgp_keyring_check_id (gnutls_openpgp_keyring_t ring, - const gnutls_openpgp_keyid_t keyid, - unsigned int flags) +gnutls_openpgp_keyring_check_id(gnutls_openpgp_keyring_t ring, + const gnutls_openpgp_keyid_t keyid, + unsigned int flags) { - cdk_pkt_pubkey_t pk; - uint32_t id[2]; + cdk_pkt_pubkey_t pk; + uint32_t id[2]; - id[0] = _gnutls_read_uint32 (keyid); - id[1] = _gnutls_read_uint32 (&keyid[4]); + id[0] = _gnutls_read_uint32(keyid); + id[1] = _gnutls_read_uint32(&keyid[4]); - if (!cdk_keydb_get_pk (ring->db, id, &pk)) - { - cdk_pk_release (pk); - return 0; - } + if (!cdk_keydb_get_pk(ring->db, id, &pk)) { + cdk_pk_release(pk); + return 0; + } - _gnutls_debug_log ("PGP: key not found %08lX\n", (unsigned long) id[1]); - return GNUTLS_E_NO_CERTIFICATE_FOUND; + _gnutls_debug_log("PGP: key not found %08lX\n", + (unsigned long) id[1]); + return GNUTLS_E_NO_CERTIFICATE_FOUND; } /** @@ -119,87 +116,84 @@ gnutls_openpgp_keyring_check_id (gnutls_openpgp_keyring_t ring, * Returns: %GNUTLS_E_SUCCESS on success, or an error code. **/ int -gnutls_openpgp_keyring_import (gnutls_openpgp_keyring_t keyring, - const gnutls_datum_t * data, - gnutls_openpgp_crt_fmt_t format) +gnutls_openpgp_keyring_import(gnutls_openpgp_keyring_t keyring, + const gnutls_datum_t * data, + gnutls_openpgp_crt_fmt_t format) { - cdk_error_t err; - cdk_stream_t input = NULL; - size_t raw_len = 0; - uint8_t *raw_data = NULL; - - if (data->data == NULL || data->size == 0) - { - gnutls_assert (); - return GNUTLS_E_OPENPGP_GETKEY_FAILED; - } - - _gnutls_debug_log ("PGP: keyring import format '%s'\n", - format == GNUTLS_OPENPGP_FMT_RAW ? "raw" : "base64"); - - /* Create a new stream from the given data, decode it, and import - * the raw database. This to avoid using opencdk streams which are - * not thread safe. - */ - if (format == GNUTLS_OPENPGP_FMT_BASE64) - { - size_t written = 0; - - err = cdk_stream_tmp_from_mem (data->data, data->size, &input); - if (err == 0) - err = cdk_stream_set_armor_flag (input, 0); - if (err) - { - gnutls_assert (); - err = _gnutls_map_cdk_rc (err); - goto error; - } - - raw_len = cdk_stream_get_length (input); - if (raw_len == 0) - { - gnutls_assert (); - err = GNUTLS_E_BASE64_DECODING_ERROR; - goto error; - } - - raw_data = gnutls_malloc (raw_len); - if (raw_data == NULL) - { - gnutls_assert (); - err = GNUTLS_E_MEMORY_ERROR; - goto error; - } - - do - { - err = - cdk_stream_read (input, raw_data + written, raw_len - written); - - if (err > 0) - written += err; - } - while (written < raw_len && err != EOF && err > 0); - - raw_len = written; - } - else - { /* RAW */ - raw_len = data->size; - raw_data = data->data; - } - - err = cdk_keydb_new_from_mem (&keyring->db, 0, 0, raw_data, raw_len); - if (err) - gnutls_assert (); - - return _gnutls_map_cdk_rc (err); - -error: - gnutls_free (raw_data); - cdk_stream_close (input); - - return err; + cdk_error_t err; + cdk_stream_t input = NULL; + size_t raw_len = 0; + uint8_t *raw_data = NULL; + + if (data->data == NULL || data->size == 0) { + gnutls_assert(); + return GNUTLS_E_OPENPGP_GETKEY_FAILED; + } + + _gnutls_debug_log("PGP: keyring import format '%s'\n", + format == + GNUTLS_OPENPGP_FMT_RAW ? "raw" : "base64"); + + /* Create a new stream from the given data, decode it, and import + * the raw database. This to avoid using opencdk streams which are + * not thread safe. + */ + if (format == GNUTLS_OPENPGP_FMT_BASE64) { + size_t written = 0; + + err = + cdk_stream_tmp_from_mem(data->data, data->size, + &input); + if (err == 0) + err = cdk_stream_set_armor_flag(input, 0); + if (err) { + gnutls_assert(); + err = _gnutls_map_cdk_rc(err); + goto error; + } + + raw_len = cdk_stream_get_length(input); + if (raw_len == 0) { + gnutls_assert(); + err = GNUTLS_E_BASE64_DECODING_ERROR; + goto error; + } + + raw_data = gnutls_malloc(raw_len); + if (raw_data == NULL) { + gnutls_assert(); + err = GNUTLS_E_MEMORY_ERROR; + goto error; + } + + do { + err = + cdk_stream_read(input, raw_data + written, + raw_len - written); + + if (err > 0) + written += err; + } + while (written < raw_len && err != EOF && err > 0); + + raw_len = written; + } else { /* RAW */ + raw_len = data->size; + raw_data = data->data; + } + + err = + cdk_keydb_new_from_mem(&keyring->db, 0, 0, raw_data, raw_len); + if (err) + gnutls_assert(); + + return _gnutls_map_cdk_rc(err); + + error: + gnutls_free(raw_data); + cdk_stream_close(input); + + return err; } #define knode_is_pkey(node) \ @@ -214,41 +208,38 @@ error: * * Returns: the number of subkeys, or a negative error code on error. **/ -int -gnutls_openpgp_keyring_get_crt_count (gnutls_openpgp_keyring_t ring) +int gnutls_openpgp_keyring_get_crt_count(gnutls_openpgp_keyring_t ring) { - cdk_kbnode_t knode; - cdk_error_t err; - cdk_keydb_search_t st; - int ret = 0; - - err = cdk_keydb_search_start (&st, ring->db, CDK_DBSEARCH_NEXT, NULL); - if (err != CDK_Success) - { - gnutls_assert (); - return _gnutls_map_cdk_rc (err); - } - - do - { - err = cdk_keydb_search (st, ring->db, &knode); - if (err != CDK_Error_No_Key && err != CDK_Success) - { - gnutls_assert (); - cdk_keydb_search_release (st); - return _gnutls_map_cdk_rc (err); - } - - if (knode_is_pkey (knode)) - ret++; - - cdk_kbnode_release (knode); - - } - while (err != CDK_Error_No_Key); - - cdk_keydb_search_release (st); - return ret; + cdk_kbnode_t knode; + cdk_error_t err; + cdk_keydb_search_t st; + int ret = 0; + + err = + cdk_keydb_search_start(&st, ring->db, CDK_DBSEARCH_NEXT, NULL); + if (err != CDK_Success) { + gnutls_assert(); + return _gnutls_map_cdk_rc(err); + } + + do { + err = cdk_keydb_search(st, ring->db, &knode); + if (err != CDK_Error_No_Key && err != CDK_Success) { + gnutls_assert(); + cdk_keydb_search_release(st); + return _gnutls_map_cdk_rc(err); + } + + if (knode_is_pkey(knode)) + ret++; + + cdk_kbnode_release(knode); + + } + while (err != CDK_Error_No_Key); + + cdk_keydb_search_release(st); + return ret; } /** @@ -265,49 +256,47 @@ gnutls_openpgp_keyring_get_crt_count (gnutls_openpgp_keyring_t ring) * Returns: %GNUTLS_E_SUCCESS on success, or an error code. **/ int -gnutls_openpgp_keyring_get_crt (gnutls_openpgp_keyring_t ring, - unsigned int idx, gnutls_openpgp_crt_t * cert) +gnutls_openpgp_keyring_get_crt(gnutls_openpgp_keyring_t ring, + unsigned int idx, + gnutls_openpgp_crt_t * cert) { - cdk_kbnode_t knode; - cdk_error_t err; - int ret = 0; - unsigned int count = 0; - cdk_keydb_search_t st; - - err = cdk_keydb_search_start (&st, ring->db, CDK_DBSEARCH_NEXT, NULL); - if (err != CDK_Success) - { - gnutls_assert (); - return _gnutls_map_cdk_rc (err); - } - - do - { - err = cdk_keydb_search (st, ring->db, &knode); - if (err != CDK_EOF && err != CDK_Success) - { - gnutls_assert (); - cdk_keydb_search_release (st); - return _gnutls_map_cdk_rc (err); - } - - if (idx == count && err == CDK_Success) - { - ret = gnutls_openpgp_crt_init (cert); - if (ret == 0) - (*cert)->knode = knode; - cdk_keydb_search_release (st); - return ret; - } - - if (knode_is_pkey (knode)) - count++; - - cdk_kbnode_release (knode); - - } - while (err != CDK_EOF); - - cdk_keydb_search_release (st); - return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE; + cdk_kbnode_t knode; + cdk_error_t err; + int ret = 0; + unsigned int count = 0; + cdk_keydb_search_t st; + + err = + cdk_keydb_search_start(&st, ring->db, CDK_DBSEARCH_NEXT, NULL); + if (err != CDK_Success) { + gnutls_assert(); + return _gnutls_map_cdk_rc(err); + } + + do { + err = cdk_keydb_search(st, ring->db, &knode); + if (err != CDK_EOF && err != CDK_Success) { + gnutls_assert(); + cdk_keydb_search_release(st); + return _gnutls_map_cdk_rc(err); + } + + if (idx == count && err == CDK_Success) { + ret = gnutls_openpgp_crt_init(cert); + if (ret == 0) + (*cert)->knode = knode; + cdk_keydb_search_release(st); + return ret; + } + + if (knode_is_pkey(knode)) + count++; + + cdk_kbnode_release(knode); + + } + while (err != CDK_EOF); + + cdk_keydb_search_release(st); + return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE; } |