From e2c88461fc42789c722bb7b26ff3e68aa0c51993 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 27 Mar 2001 09:23:14 +0000 Subject: [PATCH] Fixed a bugs; e.g. in --list-secret-keys --- g10/ChangeLog | 15 +++++++++++++++ g10/armor.c | 5 ++++- g10/getkey.c | 25 ++++++++++++++----------- g10/keylist.c | 4 ++++ g10/mainproc.c | 12 +++++++----- g10/misc.c | 2 +- g10/packet.h | 7 +++++++ g10/parse-packet.c | 3 +-- g10/pipemode.c | 2 +- 9 files changed, 54 insertions(+), 21 deletions(-) diff --git a/g10/ChangeLog b/g10/ChangeLog index adaabc9b9..abb9005ec 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,18 @@ +2001-03-27 Werner Koch + + * getkey.c (key_byname): Add new arg secmode and changed all + callers to request explicitly the mode. Deriving this information + from the other supplied parameters does not work if neither pk nor + sk are supplied. + +2001-03-25 Werner Koch + + * packet.h (ctrlpkttype_t): New. + * mainproc.c (add_gpg_control,proc_plaintext,proc_tree): Use the + new enum values. + * pipemode.c (make_control): Ditto. + * armor.c (armor_filter): Ditto. + 2001-03-24 Werner Koch * sign.c (do_sign): Verify the signature right after creation. diff --git a/g10/armor.c b/g10/armor.c index 03d52b1fe..e84fb3709 100644 --- a/g10/armor.c +++ b/g10/armor.c @@ -753,6 +753,9 @@ radix64_read( armor_filter_context_t *afx, IOBUF a, size_t *retn, } else { rc = 0; + /* FIXME: Here we should emit another control packet, + * so that we know in mainproc that we are processing + * a clearsign message */ #if 0 for(rc=0;!rc;) { rc = 0 /*check_trailer( &fhdr, c )*/; @@ -866,7 +869,7 @@ armor_filter( void *opaque, int control, buf[n++] = 0xff; /* new format, type 63, 1 length byte */ n++; /* see below */ memcpy(buf+n, sesmark, sesmarklen ); n+= sesmarklen; - buf[n++] = 1; /* control type */ + buf[n++] = CTRLPKT_CLEARSIGN_START; buf[n++] = afx->not_dash_escaped? 0:1; /* sigclass */ if( hashes & 1 ) buf[n++] = DIGEST_ALGO_RMD160; diff --git a/g10/getkey.c b/g10/getkey.c index 96dd8ee89..d0ec1e368 100644 --- a/g10/getkey.c +++ b/g10/getkey.c @@ -811,13 +811,14 @@ classify_user_id( const char *name, u32 *keyid, byte *fprint, * first pubkey certificate which has the given name in a user_id. * if pk/sk has the pubkey algo set, the function will only return * a pubkey with that algo. - * The caller must provide storage for either the pk or the sk. - * If ret_kb is not NULL the funtion will return the keyblock there. + * The caller should provide storage for either the pk or the sk. + * If ret_kb is not NULL the function will return the keyblock there. */ static int key_byname( GETKEY_CTX *retctx, STRLIST namelist, - PKT_public_key *pk, PKT_secret_key *sk, KBNODE *ret_kb ) + PKT_public_key *pk, PKT_secret_key *sk, int secmode, + KBNODE *ret_kb ) { int rc = 0; int n; @@ -862,9 +863,11 @@ key_byname( GETKEY_CTX *retctx, STRLIST namelist, if ( !ret_kb ) ret_kb = &help_kb; - if( sk ) { - ctx->req_algo = sk->req_algo; - ctx->req_usage = sk->req_usage; + if( secmode ) { + if (sk) { + ctx->req_algo = sk->req_algo; + ctx->req_usage = sk->req_usage; + } rc = lookup( ctx, ret_kb, 1 ); if ( !rc && sk ) { sk_from_block ( ctx, sk, *ret_kb ); @@ -905,7 +908,7 @@ get_pubkey_byname( GETKEY_CTX *retctx, PKT_public_key *pk, STRLIST namelist = NULL; add_to_strlist( &namelist, name ); - rc = key_byname( retctx, namelist, pk, NULL, ret_keyblock ); + rc = key_byname( retctx, namelist, pk, NULL, 0, ret_keyblock ); free_strlist( namelist ); return rc; } @@ -914,7 +917,7 @@ int get_pubkey_bynames( GETKEY_CTX *retctx, PKT_public_key *pk, STRLIST names, KBNODE *ret_keyblock ) { - return key_byname( retctx, names, pk, NULL, ret_keyblock ); + return key_byname( retctx, names, pk, NULL, 0, ret_keyblock ); } int @@ -1053,7 +1056,7 @@ get_seckey_byname2( GETKEY_CTX *retctx, if( !name && opt.def_secret_key && *opt.def_secret_key ) { add_to_strlist( &namelist, opt.def_secret_key ); - rc = key_byname( retctx, namelist, NULL, sk, retblock ); + rc = key_byname( retctx, namelist, NULL, sk, 1, retblock ); } else if( !name ) { /* use the first one as default key */ struct getkey_ctx_s ctx; @@ -1073,7 +1076,7 @@ get_seckey_byname2( GETKEY_CTX *retctx, } else { add_to_strlist( &namelist, name ); - rc = key_byname( retctx, namelist, NULL, sk, retblock ); + rc = key_byname( retctx, namelist, NULL, sk, 1, retblock ); } free_strlist( namelist ); @@ -1095,7 +1098,7 @@ int get_seckey_bynames( GETKEY_CTX *retctx, PKT_secret_key *sk, STRLIST names, KBNODE *ret_keyblock ) { - return key_byname( retctx, names, NULL, sk, ret_keyblock ); + return key_byname( retctx, names, NULL, sk, 1, ret_keyblock ); } diff --git a/g10/keylist.c b/g10/keylist.c index 4f26dc27d..22f578b0d 100644 --- a/g10/keylist.c +++ b/g10/keylist.c @@ -696,7 +696,11 @@ reorder_keyblock (KBNODE keyblock) static void list_keyblock( KBNODE keyblock, int secret ) { + log_debug ("before reorder:\n"); + dump_kbnode (keyblock); reorder_keyblock (keyblock); + log_debug ("after reorder:\n"); + dump_kbnode (keyblock); if (opt.with_colons) list_keyblock_colon (keyblock, secret ); else diff --git a/g10/mainproc.c b/g10/mainproc.c index 40d6258b1..948643f05 100644 --- a/g10/mainproc.c +++ b/g10/mainproc.c @@ -136,12 +136,12 @@ add_onepass_sig( CTX c, PACKET *pkt ) static int add_gpg_control( CTX c, PACKET *pkt ) { - if ( pkt->pkt.gpg_control->control == 1 ) { + if ( pkt->pkt.gpg_control->control == CTRLPKT_CLEARSIGN_START ) { /* New clear text signature. * Process the last one and reset everything */ release_list(c); } - else if ( pkt->pkt.gpg_control->control == 2 ) { + else if ( pkt->pkt.gpg_control->control == CTRLPKT_PIPEMODE ) { /* Pipemode control packet */ #warning the --pipemode does not yet work /* FIXME: We have to do more sanity checks all over the place */ @@ -485,13 +485,14 @@ proc_plaintext( CTX c, PACKET *pkt ) only_md5 = 0; } else if( n->pkt->pkttype == PKT_GPG_CONTROL - && n->pkt->pkt.gpg_control->control == 1 ) { + && n->pkt->pkt.gpg_control->control + == CTRLPKT_CLEARSIGN_START ) { size_t datalen = n->pkt->pkt.gpg_control->datalen; const byte *data = n->pkt->pkt.gpg_control->data; /* check that we have at least the sigclass and one hash */ if ( datalen < 2 ) - log_fatal("invalid control packet of type 1\n"); + log_fatal("invalid control packet CTRLPKT_CLEARSIGN_START\n"); /* Note that we don't set the clearsig flag for not-dash-escaped * documents */ clearsig = (*data == 0x01); @@ -1380,7 +1381,8 @@ proc_tree( CTX c, KBNODE node ) check_sig_and_print( c, n1 ); } else if( node->pkt->pkttype == PKT_GPG_CONTROL - && node->pkt->pkt.gpg_control->control == 1 ) { + && node->pkt->pkt.gpg_control->control + == CTRLPKT_CLEARSIGN_START ) { /* clear text signed message */ if( !c->have_data ) { log_error("cleartext signature without data\n" ); diff --git a/g10/misc.c b/g10/misc.c index 573ff1b50..53dfd0fac 100644 --- a/g10/misc.c +++ b/g10/misc.c @@ -257,7 +257,7 @@ get_session_marker( size_t *rlen ) static int initialized; if ( !initialized ) { - volatile ulong aa, bb; /* we really want the unitialized value */ + volatile ulong aa, bb; /* we really want the uninitialized value */ ulong a, b; initialized = 1; diff --git a/g10/packet.h b/g10/packet.h index 034ebdd47..1033c7b88 100644 --- a/g10/packet.h +++ b/g10/packet.h @@ -55,6 +55,13 @@ typedef enum { typedef struct packet_struct PACKET; +/* PKT_GPG_CONTROL types */ +enum { + CTRLPKT_CLEARSIGN_START = 1, + CTRLPKT_PIPEMODE = 2 +} ctrlpkttype_t; + + typedef struct { int mode; byte hash_algo; diff --git a/g10/parse-packet.c b/g10/parse-packet.c index 32b33bec8..191c0f13e 100644 --- a/g10/parse-packet.c +++ b/g10/parse-packet.c @@ -1840,8 +1840,7 @@ parse_mdc( IOBUF inp, int pkttype, unsigned long pktlen, * we first check that tehre is a unique tag in it. * The format of such a control packet is: * n byte session marker - * 1 byte control type: 1 = Clearsign hash info - * 2 = Pipemode control + * 1 byte control type CTRLPKT_xxxxx * m byte control data */ diff --git a/g10/pipemode.c b/g10/pipemode.c index 54e461f46..eb69995e3 100644 --- a/g10/pipemode.c +++ b/g10/pipemode.c @@ -72,7 +72,7 @@ make_control ( byte *buf, int code, int operation ) buf[n++] = 0xff; /* new format, type 63, 1 length byte */ n++; /* length will fixed below */ memcpy(buf+n, sesmark, sesmarklen ); n+= sesmarklen; - buf[n++] = 2; /* control type: pipemode marker */ + buf[n++] = CTRLPKT_PIPEMODE; buf[n++] = code; buf[n++] = operation; buf[1] = n-2;