diff --git a/g10/ChangeLog b/g10/ChangeLog index 74a1f1080..8e49478e3 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,14 @@ +2004-09-12 David Shaw + + * options.h, keylist.c (print_one_subpacket, + print_subpackets_colon): Print a spk record for each request + subpacket. + (list_keyblock_colon): Call them here. + + * g10.c (parse_subpacket_list, parse_list_options): New. Make the + list of subpackets we are going to print. + (main): Call them here. + 2004-09-11 David Shaw * card-util.c (fetch_url, card_edit): Use the pubkey URL stored on diff --git a/g10/g10.c b/g10/g10.c index fcc6f7095..ba1258132 100644 --- a/g10/g10.c +++ b/g10/g10.c @@ -1358,6 +1358,113 @@ gpgconf_list (const char *configfile) } +static int +parse_subpacket_list(char *list) +{ + char *tok; + byte subpackets[128],i; + int count=0; + + if(!list) + { + /* No arguments means all subpackets */ + memset(subpackets+1,1,sizeof(subpackets)-1); + count=127; + } + else + { + memset(subpackets,0,sizeof(subpackets)); + + /* Merge with earlier copy */ + if(opt.show_subpackets) + { + byte *in; + + for(in=opt.show_subpackets;*in;in++) + { + if(*in>127 || *in<1) + BUG(); + + if(!subpackets[*in]) + count++; + subpackets[*in]=1; + } + } + + while((tok=strsep(&list," ,"))) + { + if(!*tok) + continue; + + i=atoi(tok); + if(i>127 || i<1) + return 0; + + if(!subpackets[i]) + count++; + subpackets[i]=1; + } + } + + m_free(opt.show_subpackets); + opt.show_subpackets=m_alloc(count+1); + opt.show_subpackets[count--]=0; + + for(i=1;i<128 && count>=0;i++) + if(subpackets[i]) + opt.show_subpackets[count--]=i; + + return 1; +} + + +static int +parse_list_options(char *str) +{ + char *subpackets=""; /* something that isn't NULL */ + struct parse_options lopts[]= + { + {"show-photos",LIST_SHOW_PHOTOS,NULL}, + {"show-policy-urls",LIST_SHOW_POLICY_URLS,NULL}, + {"show-notations",LIST_SHOW_NOTATIONS,NULL}, + {"show-std-notations",LIST_SHOW_STD_NOTATIONS,NULL}, + {"show-standard-notations",LIST_SHOW_STD_NOTATIONS,NULL}, + {"show-user-notations",LIST_SHOW_USER_NOTATIONS,NULL}, + {"show-keyserver-urls",LIST_SHOW_KEYSERVER_URLS,NULL}, + {"show-uid-validity",LIST_SHOW_UID_VALIDITY,NULL}, + {"show-unusable-uids",LIST_SHOW_UNUSABLE_UIDS,NULL}, + {"show-unusable-subkeys",LIST_SHOW_UNUSABLE_SUBKEYS,NULL}, + {"show-keyring",LIST_SHOW_KEYRING,NULL}, + {"show-sig-expire",LIST_SHOW_SIG_EXPIRE,NULL}, + {"show-sig-subpackets",LIST_SHOW_SIG_SUBPACKETS,&subpackets}, + {NULL,0,NULL} + }; + + /* this is wrong since the show-sig-subpackets could have been set + from a previous incarnation of list-options */ + + if(parse_options(str,&opt.list_options,lopts,1)) + { + if(opt.list_options&LIST_SHOW_SIG_SUBPACKETS) + { + /* Unset so users can pass multiple lists in. */ + opt.list_options&=~LIST_SHOW_SIG_SUBPACKETS; + if(!parse_subpacket_list(subpackets)) + return 0; + } + else if(subpackets==NULL && opt.show_subpackets) + { + /* User did 'no-show-subpackets' */ + m_free(opt.show_subpackets); + opt.show_subpackets=NULL; + } + + return 1; + } + else + return 0; +} + /* Collapses argc/argv into a single string that must be freed */ static char * @@ -2150,33 +2257,14 @@ main( int argc, char **argv ) } break; case oListOptions: - { - struct parse_options lopts[]= - { - {"show-photos",LIST_SHOW_PHOTOS,NULL}, - {"show-policy-urls",LIST_SHOW_POLICY_URLS,NULL}, - {"show-notations",LIST_SHOW_NOTATIONS,NULL}, - {"show-std-notations",LIST_SHOW_STD_NOTATIONS,NULL}, - {"show-standard-notations",LIST_SHOW_STD_NOTATIONS,NULL}, - {"show-user-notations",LIST_SHOW_USER_NOTATIONS,NULL}, - {"show-keyserver-urls",LIST_SHOW_KEYSERVER_URLS,NULL}, - {"show-uid-validity",LIST_SHOW_UID_VALIDITY,NULL}, - {"show-unusable-uids",LIST_SHOW_UNUSABLE_UIDS,NULL}, - {"show-unusable-subkeys",LIST_SHOW_UNUSABLE_SUBKEYS,NULL}, - {"show-keyring",LIST_SHOW_KEYRING,NULL}, - {"show-sig-expire",LIST_SHOW_SIG_EXPIRE,NULL}, - {NULL,0,NULL} - }; - - if(!parse_options(pargs.r.ret_str,&opt.list_options,lopts,1)) - { - if(configname) - log_error(_("%s:%d: invalid list options\n"), - configname,configlineno); - else - log_error(_("invalid list options\n")); - } - } + if(!parse_list_options(pargs.r.ret_str)) + { + if(configname) + log_error(_("%s:%d: invalid list options\n"), + configname,configlineno); + else + log_error(_("invalid list options\n")); + } break; case oVerifyOptions: { diff --git a/g10/keylist.c b/g10/keylist.c index 9c18996d0..34c2920c6 100644 --- a/g10/keylist.c +++ b/g10/keylist.c @@ -551,6 +551,51 @@ print_capabilities (PKT_public_key *pk, PKT_secret_key *sk, KBNODE keyblock) putchar(':'); } +/* Flags = 0x01 hashed 0x02 critical */ +static void +print_one_subpacket(sigsubpkttype_t type,size_t len,int flags,const byte *buf) +{ + size_t i; + + printf("spk:%d:%u:%u:",type,flags,len); + + for(i=0;i=32 && buf[i]<=126 && buf[i]!=':' && buf[i]!='%') + printf("%c",buf[i]); + else + printf("%%%02X",buf[i]); + } + + printf("\n"); +} + +static void +print_subpackets_colon(PKT_signature *sig) +{ + byte *i; + + assert(opt.show_subpackets); + + for(i=opt.show_subpackets;*i;i++) + { + const byte *p; + size_t len; + int seq,crit; + + seq=0; + + while((p=enum_sig_subpkt(sig->hashed,*i,&len,&seq,&crit))) + print_one_subpacket(*i,len,0x01|(crit?0x02:0),p); + + seq=0; + + while((p=enum_sig_subpkt(sig->unhashed,*i,&len,&seq,&crit))) + print_one_subpacket(*i,len,0x00|(crit?0x02:0),p); + } +} + void dump_attribs(const PKT_user_id *uid,PKT_public_key *pk,PKT_secret_key *sk) { @@ -1232,6 +1277,9 @@ list_keyblock_colon( KBNODE keyblock, int secret, int fpr ) printf("\n"); + if(opt.show_subpackets) + print_subpackets_colon(sig); + /* fixme: check or list other sigs here */ } } diff --git a/g10/options.h b/g10/options.h index 7e79b3451..db6932dc6 100644 --- a/g10/options.h +++ b/g10/options.h @@ -191,6 +191,7 @@ struct int enable_progress_filter; unsigned int screen_columns; unsigned int screen_lines; + byte *show_subpackets; #ifdef ENABLE_CARD_SUPPORT const char *ctapi_driver; /* Library to access the ctAPI. */ @@ -264,6 +265,7 @@ struct { #define LIST_SHOW_UNUSABLE_SUBKEYS (1<<7) #define LIST_SHOW_KEYRING (1<<8) #define LIST_SHOW_SIG_EXPIRE (1<<9) +#define LIST_SHOW_SIG_SUBPACKETS (1<<10) #define VERIFY_SHOW_PHOTOS (1<<0) #define VERIFY_SHOW_POLICY_URLS (1<<1)