diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2003-10-31 12:45:07 +0000 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2003-10-31 12:45:07 +0000 |
commit | cba31e5ec40da3076f9e103e62ab97f0d2e1d1e3 (patch) | |
tree | 2399c16dc912376a9152acc63c8382f23ac10ceb /libextra | |
parent | dad64bd4be80aa216aa0d8f4946408a7e183be1f (diff) | |
download | gnutls-cba31e5ec40da3076f9e103e62ab97f0d2e1d1e3.tar.gz |
more openpgp related changes.
Diffstat (limited to 'libextra')
-rw-r--r-- | libextra/gnutls_openpgp.c | 98 |
1 files changed, 78 insertions, 20 deletions
diff --git a/libextra/gnutls_openpgp.c b/libextra/gnutls_openpgp.c index dc10891bfd..016200ef7c 100644 --- a/libextra/gnutls_openpgp.c +++ b/libextra/gnutls_openpgp.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2002 Timo Schulz <twoaday@freakmail.de> + * Copyright (C) 2002,2003 Timo Schulz <twoaday@freakmail.de> * * This file is part of GNUTLS. * @@ -482,6 +482,33 @@ leave: return rc; } +static int +stream_to_datum( cdk_stream_t inp, gnutls_datum *raw ) +{ + uint8 buf[4096]; + int rc = 0, nread, nbytes = 0; + + if( !buf || !raw ) { + gnutls_assert( ); + return GNUTLS_E_INVALID_REQUEST; + } + + cdk_stream_seek( inp, 0 ); + while( !cdk_stream_eof( inp ) ) { + nread = cdk_stream_read( inp, buf, sizeof buf-1 ); + if( nread == EOF ) + break; + datum_append( raw, buf, nread ); + nbytes += nread; + } + cdk_stream_seek( inp, 0 ); + if( !nbytes ) + rc = GNUTLS_E_INTERNAL_ERROR; + + return rc; +} + + /** * gnutls_certificate_set_openpgp_key_mem - Used to set OpenPGP keys @@ -503,17 +530,21 @@ gnutls_certificate_set_openpgp_key_mem( gnutls_certificate_credentials res, CDK_PACKET *pkt; int i = 0; int rc = 0; + cdk_stream_t inp = NULL; if ( !res || !key || !cert ) { gnutls_assert( ); return GNUTLS_E_INVALID_REQUEST; } - rc = cdk_kbnode_read_from_mem( &knode, cert->data, cert->size ); - if( (rc = _gnutls_map_cdk_rc( rc )) ) { - gnutls_assert(); - goto leave; + inp = cdk_stream_tmp_from_mem( cert->data, cert->size); + if (inp == NULL) { + gnutls_assert(); + return GNUTLS_E_INTERNAL_ERROR; } + + if( cdk_armor_filter_use( inp ) ) + cdk_stream_set_armor_flag( inp, 0 ); res->cert_list = gnutls_realloc_fast(res->cert_list, (1+res->ncerts)*sizeof(gnutls_cert*)); @@ -536,25 +567,41 @@ gnutls_certificate_set_openpgp_key_mem( gnutls_certificate_credentials res, } i = 1; - while( (p = cdk_kbnode_walk( knode, &ctx, 0 )) ) { - pkt = cdk_kbnode_get_packet( p ); + rc = cdk_keydb_get_keyblock( inp, &knode ); +#warning FIX THIS + + while( knode && (p = cdk_kbnode_walk( knode, &ctx, 0 )) ) { + pkt = cdk_kbnode_get_packet( p ); if( i > MAX_PUBLIC_PARAMS_SIZE ) { gnutls_assert(); break; } - if( pkt->pkttype == CDK_PKT_PUBLIC_KEY ) { + if( pkt->pkttype == CDK_PKT_PUBLIC_KEY ) { int n = res->ncerts; + cdk_pkt_pubkey_t pk = pkt->pkt.public_key; res->cert_list_length[n] = 1; - if (_gnutls_set_datum( &res->cert_list[n][0].raw, - cert->data, cert->size ) < 0) { - gnutls_assert(); - return GNUTLS_E_MEMORY_ERROR; + + if (stream_to_datum( inp, &res->cert_list[n][0].raw )) { + gnutls_assert(); + return GNUTLS_E_MEMORY_ERROR; } openpgp_pk_to_gnutls_cert( &res->cert_list[n][0], pk ); i++; } } + + if( rc == CDK_EOF && i > 1) + rc = 0; + + cdk_stream_close( inp ); + + if (rc) { + cdk_kbnode_release( knode ); + gnutls_assert(); + rc = _gnutls_map_cdk_rc( rc ); + goto leave; + } res->ncerts++; res->pkey = gnutls_realloc_fast(res->pkey, @@ -563,12 +610,26 @@ gnutls_certificate_set_openpgp_key_mem( gnutls_certificate_credentials res, gnutls_assert(); return GNUTLS_E_MEMORY_ERROR; } + /* ncerts has been incremented before */ - rc = _gnutls_set_datum( &raw, key->data, key->size ); - if (rc < 0) { + + inp = cdk_stream_tmp_from_mem( key->data, key->size); + if (inp == NULL) { gnutls_assert(); - return rc; + return GNUTLS_E_INTERNAL_ERROR; + } + + if( cdk_armor_filter_use( inp ) ) + cdk_stream_set_armor_flag( inp, 0 ); + + memset( &raw, 0, sizeof raw ); + + if (stream_to_datum( inp, &raw )) { + gnutls_assert(); + return GNUTLS_E_INTERNAL_ERROR; } + cdk_stream_close( inp ); + rc = _gnutls_openpgp_key2gnutls_key( &res->pkey[res->ncerts-1], &raw ); if (rc) { gnutls_assert(); @@ -599,11 +660,6 @@ gnutls_certificate_set_openpgp_key_file( gnutls_certificate_credentials res, char* keyfile ) { struct stat statbuf; - cdk_stream_t inp = NULL; - cdk_kbnode_t knode = NULL, ctx = NULL, p; - CDK_PACKET *pkt = NULL; - gnutls_datum raw; - int i = 0, n; int rc = 0; gnutls_datum key, cert; strfile xcert, xkey; @@ -647,6 +703,8 @@ gnutls_certificate_set_openpgp_key_file( gnutls_certificate_credentials res, gnutls_assert(); return rc; } + + return 0; } |