1 /* keyedit.c - keyedit stuff
2 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 * 2008 Free Software Foundation, Inc.
5 * This file is part of GnuPG.
7 * GnuPG is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
12 * GnuPG is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, see <http://www.gnu.org/licenses/>.
28 #ifdef HAVE_LIBREADLINE
29 #define GNUPG_LIBREADLINE_H_INCLUDED
30 #include <readline/readline.h>
47 #include "keyserver-internal.h"
49 static void show_prefs( PKT_user_id
*uid
, PKT_signature
*selfsig
, int verbose
);
50 static void show_names(KBNODE keyblock
,PKT_public_key
*pk
,
51 unsigned int flag
,int with_prefs
);
52 static void show_key_with_all_names( KBNODE keyblock
, int only_marked
,
53 int with_revoker
, int with_fpr
, int with_subkeys
, int with_prefs
);
54 static void show_key_and_fingerprint( KBNODE keyblock
);
55 static int menu_adduid( KBNODE keyblock
, KBNODE sec_keyblock
,
56 int photo
, const char *photo_name
);
57 static void menu_deluid( KBNODE pub_keyblock
, KBNODE sec_keyblock
);
58 static int menu_delsig( KBNODE pub_keyblock
);
59 static int menu_clean(KBNODE keyblock
,int self_only
);
60 static void menu_delkey( KBNODE pub_keyblock
, KBNODE sec_keyblock
);
61 static int menu_addrevoker( KBNODE pub_keyblock
,
62 KBNODE sec_keyblock
, int sensitive
);
63 static int menu_expire( KBNODE pub_keyblock
, KBNODE sec_keyblock
);
64 static int menu_backsign(KBNODE pub_keyblock
,KBNODE sec_keyblock
);
65 static int menu_set_primary_uid( KBNODE pub_keyblock
, KBNODE sec_keyblock
);
66 static int menu_set_preferences( KBNODE pub_keyblock
, KBNODE sec_keyblock
);
67 static int menu_set_keyserver_url (const char *url
,
68 KBNODE pub_keyblock
, KBNODE sec_keyblock
);
69 static int menu_set_notation(const char *string
,
70 KBNODE pub_keyblock
,KBNODE sec_keyblock
);
71 static int menu_select_uid( KBNODE keyblock
, int idx
);
72 static int menu_select_uid_namehash( KBNODE keyblock
, const char *namehash
);
73 static int menu_select_key( KBNODE keyblock
, int idx
);
74 static int count_uids( KBNODE keyblock
);
75 static int count_uids_with_flag( KBNODE keyblock
, unsigned flag
);
76 static int count_keys_with_flag( KBNODE keyblock
, unsigned flag
);
77 static int count_selected_uids( KBNODE keyblock
);
78 static int real_uids_left( KBNODE keyblock
);
79 static int count_selected_keys( KBNODE keyblock
);
80 static int menu_revsig( KBNODE keyblock
);
81 static int menu_revuid( KBNODE keyblock
, KBNODE sec_keyblock
);
82 static int menu_revkey( KBNODE pub_keyblock
, KBNODE sec_keyblock
);
83 static int menu_revsubkey( KBNODE pub_keyblock
, KBNODE sec_keyblock
);
84 static int enable_disable_key( KBNODE keyblock
, int disable
);
85 static void menu_showphoto( KBNODE keyblock
);
87 static int update_trust
=0;
89 #define CONTROL_D ('D' - 'A' + 1)
91 #define NODFLG_BADSIG (1<<0) /* bad signature */
92 #define NODFLG_NOKEY (1<<1) /* no public key */
93 #define NODFLG_SIGERR (1<<2) /* other sig error */
95 #define NODFLG_MARK_A (1<<4) /* temporary mark */
96 #define NODFLG_DELSIG (1<<5) /* to be deleted */
98 #define NODFLG_SELUID (1<<8) /* indicate the selected userid */
99 #define NODFLG_SELKEY (1<<9) /* indicate the selected key */
100 #define NODFLG_SELSIG (1<<10) /* indicate a selected signature */
103 int non_exportable
,non_revocable
;
104 struct revocation_reason_info
*reason
;
105 byte trust_depth
,trust_value
;
110 #ifdef ENABLE_CARD_SUPPORT
111 /* Given a node SEC_NODE with a secret key or subkey, locate the
112 corresponding public key from pub_keyblock. */
113 static PKT_public_key
*
114 find_pk_from_sknode (KBNODE pub_keyblock
, KBNODE sec_node
)
116 KBNODE node
= pub_keyblock
;
120 if (sec_node
->pkt
->pkttype
== PKT_SECRET_KEY
121 && node
->pkt
->pkttype
== PKT_PUBLIC_KEY
)
122 return node
->pkt
->pkt
.public_key
;
123 if (sec_node
->pkt
->pkttype
!= PKT_SECRET_SUBKEY
)
125 sk
= sec_node
->pkt
->pkt
.secret_key
;
126 for (; node
; node
= node
->next
)
127 if (node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
)
129 pk
= node
->pkt
->pkt
.public_key
;
130 if (pk
->keyid
[0] == sk
->keyid
[0] && pk
->keyid
[1] == sk
->keyid
[1])
136 #endif /* ENABLE_CARD_SUPPORT */
139 /* TODO: Fix duplicated code between here and the check-sigs/list-sigs
140 code in keylist.c. */
142 print_and_check_one_sig_colon( KBNODE keyblock
, KBNODE node
,
143 int *inv_sigs
, int *no_key
, int *oth_err
,
144 int *is_selfsig
, int print_without_key
)
146 PKT_signature
*sig
= node
->pkt
->pkt
.signature
;
149 /* TODO: Make sure a cached sig record here still has the pk that
150 issued it. See also keylist.c:list_keyblock_print */
152 switch((rc
=check_key_signature(keyblock
,node
,is_selfsig
)))
155 node
->flag
&= ~(NODFLG_BADSIG
|NODFLG_NOKEY
|NODFLG_SIGERR
);
158 case G10ERR_BAD_SIGN
:
159 node
->flag
= NODFLG_BADSIG
;
164 case G10ERR_NO_PUBKEY
:
165 case G10ERR_UNU_PUBKEY
:
166 node
->flag
= NODFLG_NOKEY
;
172 node
->flag
= NODFLG_SIGERR
;
179 if( sigrc
!= '?' || print_without_key
)
181 printf("sig:%c::%d:%08lX%08lX:%lu:%lu:",
182 sigrc
,sig
->pubkey_algo
,(ulong
)sig
->keyid
[0],(ulong
)sig
->keyid
[1],
183 (ulong
)sig
->timestamp
,(ulong
)sig
->expiredate
);
185 if(sig
->trust_depth
|| sig
->trust_value
)
186 printf("%d %d",sig
->trust_depth
,sig
->trust_value
);
190 if(sig
->trust_regexp
)
191 print_string(stdout
,sig
->trust_regexp
,strlen(sig
->trust_regexp
),':');
193 printf("::%02x%c\n",sig
->sig_class
,sig
->flags
.exportable
?'x':'l');
195 if(opt
.show_subpackets
)
196 print_subpackets_colon(sig
);
199 return (sigrc
== '!');
204 * Print information about a signature, check it and return true
205 * if the signature is okay. NODE must be a signature packet.
208 print_and_check_one_sig( KBNODE keyblock
, KBNODE node
,
209 int *inv_sigs
, int *no_key
, int *oth_err
,
210 int *is_selfsig
, int print_without_key
)
212 PKT_signature
*sig
= node
->pkt
->pkt
.signature
;
214 int is_rev
= sig
->sig_class
== 0x30;
216 /* TODO: Make sure a cached sig record here still has the pk that
217 issued it. See also keylist.c:list_keyblock_print */
219 switch( (rc
= check_key_signature( keyblock
, node
, is_selfsig
)) ) {
221 node
->flag
&= ~(NODFLG_BADSIG
|NODFLG_NOKEY
|NODFLG_SIGERR
);
224 case G10ERR_BAD_SIGN
:
225 node
->flag
= NODFLG_BADSIG
;
230 case G10ERR_NO_PUBKEY
:
231 case G10ERR_UNU_PUBKEY
:
232 node
->flag
= NODFLG_NOKEY
;
238 node
->flag
= NODFLG_SIGERR
;
244 if( sigrc
!= '?' || print_without_key
) {
245 tty_printf("%s%c%c %c%c%c%c%c%c %s %s",
246 is_rev
? "rev":"sig",sigrc
,
247 (sig
->sig_class
-0x10>0 &&
248 sig
->sig_class
-0x10<4)?'0'+sig
->sig_class
-0x10:' ',
249 sig
->flags
.exportable
?' ':'L',
250 sig
->flags
.revocable
?' ':'R',
251 sig
->flags
.policy_url
?'P':' ',
252 sig
->flags
.notation
?'N':' ',
253 sig
->flags
.expired
?'X':' ',
254 (sig
->trust_depth
>9)?'T':
255 (sig
->trust_depth
>0)?'0'+sig
->trust_depth
:' ',
256 keystr(sig
->keyid
),datestr_from_sig(sig
));
257 if(opt
.list_options
&LIST_SHOW_SIG_EXPIRE
)
258 tty_printf(" %s",expirestr_from_sig(sig
));
261 tty_printf("[%s] ", g10_errstr(rc
) );
262 else if( sigrc
== '?' )
264 else if( *is_selfsig
) {
265 tty_printf( is_rev
? _("[revocation]")
266 : _("[self-signature]") );
271 char *p
= get_user_id( sig
->keyid
, &n
);
272 tty_print_utf8_string2(p
, n
, opt
.screen_columns
-keystrlen()-26-
273 ((opt
.list_options
&LIST_SHOW_SIG_EXPIRE
)?11:0));
278 if(sig
->flags
.policy_url
&& (opt
.list_options
&LIST_SHOW_POLICY_URLS
))
279 show_policy_url(sig
,3,0);
281 if(sig
->flags
.notation
&& (opt
.list_options
&LIST_SHOW_NOTATIONS
))
282 show_notation(sig
,3,0,
283 ((opt
.list_options
&LIST_SHOW_STD_NOTATIONS
)?1:0)+
284 ((opt
.list_options
&LIST_SHOW_USER_NOTATIONS
)?2:0));
286 if(sig
->flags
.pref_ks
&& (opt
.list_options
&LIST_SHOW_KEYSERVER_URLS
))
287 show_keyserver_url(sig
,3,0);
290 return (sigrc
== '!');
296 * Check the keysigs and set the flags to indicate errors.
297 * Returns true if error found.
300 check_all_keysigs( KBNODE keyblock
, int only_selected
)
309 int selected
= !only_selected
;
312 for( kbctx
=NULL
; (node
=walk_kbnode( keyblock
, &kbctx
, 0)) ; ) {
313 if( node
->pkt
->pkttype
== PKT_USER_ID
) {
314 PKT_user_id
*uid
= node
->pkt
->pkt
.user_id
;
317 selected
= (node
->flag
& NODFLG_SELUID
);
320 tty_print_utf8_string( uid
->name
, uid
->len
);
322 if( anyuid
&& !has_selfsig
)
328 else if( selected
&& node
->pkt
->pkttype
== PKT_SIGNATURE
329 && ( (node
->pkt
->pkt
.signature
->sig_class
&~3) == 0x10
330 || node
->pkt
->pkt
.signature
->sig_class
== 0x30 ) ) {
333 if( print_and_check_one_sig( keyblock
, node
, &inv_sigs
,
334 &no_key
, &oth_err
, &selfsig
, 0 ) ) {
338 /* Hmmm: should we update the trustdb here? */
344 tty_printf(_("1 bad signature\n") );
346 tty_printf(_("%d bad signatures\n"), inv_sigs
);
348 tty_printf(_("1 signature not checked due to a missing key\n") );
350 tty_printf(_("%d signatures not checked due to missing keys\n"), no_key
);
352 tty_printf(_("1 signature not checked due to an error\n") );
354 tty_printf(_("%d signatures not checked due to errors\n"), oth_err
);
355 if( mis_selfsig
== 1 )
356 tty_printf(_("1 user ID without valid self-signature detected\n"));
357 else if( mis_selfsig
)
358 tty_printf(_("%d user IDs without valid self-signatures detected\n"),
361 return inv_sigs
|| no_key
|| oth_err
|| mis_selfsig
;
366 sign_mk_attrib( PKT_signature
*sig
, void *opaque
)
368 struct sign_attrib
*attrib
= opaque
;
371 if( attrib
->non_exportable
) {
372 buf
[0] = 0; /* not exportable */
373 build_sig_subpkt( sig
, SIGSUBPKT_EXPORTABLE
, buf
, 1 );
376 if( attrib
->non_revocable
) {
377 buf
[0] = 0; /* not revocable */
378 build_sig_subpkt( sig
, SIGSUBPKT_REVOCABLE
, buf
, 1 );
382 revocation_reason_build_cb( sig
, attrib
->reason
);
384 if(attrib
->trust_depth
)
386 /* Not critical. If someone doesn't understand trust sigs,
387 this can still be a valid regular signature. */
388 buf
[0] = attrib
->trust_depth
;
389 buf
[1] = attrib
->trust_value
;
390 build_sig_subpkt(sig
,SIGSUBPKT_TRUST
,buf
,2);
392 /* Critical. If someone doesn't understands regexps, this
393 whole sig should be invalid. Note the +1 for the length -
394 regexps are null terminated. */
395 if(attrib
->trust_regexp
)
396 build_sig_subpkt(sig
,SIGSUBPKT_FLAG_CRITICAL
|SIGSUBPKT_REGEXP
,
397 attrib
->trust_regexp
,
398 strlen(attrib
->trust_regexp
)+1);
405 trustsig_prompt(byte
*trust_value
,byte
*trust_depth
,char **regexp
)
413 /* Same string as pkclist.c:do_edit_ownertrust */
414 tty_printf(_("Please decide how far you trust this user to correctly verify"
415 " other users' keys\n(by looking at passports, checking"
416 " fingerprints from different sources, etc.)\n"));
418 tty_printf (_(" %d = I trust marginally\n"), 1);
419 tty_printf (_(" %d = I trust fully\n"), 2);
422 while(*trust_value
==0)
424 p
= cpr_get("trustsig_prompt.trust_value",_("Your selection? "));
427 /* 60 and 120 are as per RFC2440 */
428 if(p
[0]=='1' && !p
[1])
430 else if(p
[0]=='2' && !p
[1])
438 "Please enter the depth of this trust signature.\n"
439 "A depth greater than 1 allows the key you are signing to make\n"
440 "trust signatures on your behalf.\n"));
443 while(*trust_depth
==0)
445 p
= cpr_get("trustsig_prompt.trust_depth",_("Your selection? "));
448 *trust_depth
=atoi(p
);
454 tty_printf(_("Please enter a domain to restrict this signature, "
455 "or enter for none.\n"));
459 p
=cpr_get("trustsig_prompt.trust_regexp",_("Your selection? "));
466 int regexplen
=100,ind
;
468 *regexp
=xmalloc(regexplen
);
470 /* Now mangle the domain the user entered into a regexp. To do
471 this, \-escape everything that isn't alphanumeric, and attach
472 "<[^>]+[@.]" to the front, and ">$" to the end. */
474 strcpy(*regexp
,"<[^>]+[@.]");
479 if(!((*q
>='A' && *q
<='Z')
480 || (*q
>='a' && *q
<='z') || (*q
>='0' && *q
<='9')))
481 (*regexp
)[ind
++]='\\';
485 if((regexplen
-ind
)<3)
488 *regexp
=xrealloc(*regexp
,regexplen
);
495 strcat(*regexp
,">$");
503 * Loop over all locusr and and sign the uids after asking.
504 * If no user id is marked, all user ids will be signed;
505 * if some user_ids are marked those will be signed.
508 sign_uids( KBNODE keyblock
, strlist_t locusr
, int *ret_modified
,
509 int local
, int nonrevocable
, int trust
, int interactive
)
512 SK_LIST sk_list
= NULL
;
513 SK_LIST sk_rover
= NULL
;
514 PKT_secret_key
*sk
= NULL
;
515 KBNODE node
, uidnode
;
516 PKT_public_key
*primary_pk
=NULL
;
517 int select_all
= !count_selected_uids(keyblock
) || interactive
;
520 /* Are there any non-v3 sigs on this key already? */
522 for(node
=keyblock
;node
;node
=node
->next
)
523 if(node
->pkt
->pkttype
==PKT_SIGNATURE
&&
524 node
->pkt
->pkt
.signature
->version
>3)
530 /* build a list of all signators.
532 * We use the CERT flag to request the primary which must always
533 * be one which is capable of signing keys. I can't see a reason
534 * why to sign keys using a subkey. Implementation of USAGE_CERT
535 * is just a hack in getkey.c and does not mean that a subkey
536 * marked as certification capable will be used. */
537 rc
=build_sk_list( locusr
, &sk_list
, 0, PUBKEY_USAGE_CERT
);
541 /* loop over all signators */
542 for( sk_rover
= sk_list
; sk_rover
; sk_rover
= sk_rover
->next
) {
543 u32 sk_keyid
[2],pk_keyid
[2];
544 char *p
,*trust_regexp
=NULL
;
545 int force_v4
=0,class=0,selfsig
=0;
546 u32 duration
=0,timestamp
=0;
547 byte trust_depth
=0,trust_value
=0;
549 if(local
|| nonrevocable
|| trust
||
550 opt
.cert_policy_url
|| opt
.cert_notations
)
553 /* we have to use a copy of the sk, because make_keysig_packet
554 * may remove the protection from sk and if we did other
555 * changes to the secret key, we would save the unprotected
559 sk
= copy_secret_key( NULL
, sk_rover
->sk
);
560 keyid_from_sk( sk
, sk_keyid
);
561 /* set mark A for all selected user ids */
562 for( node
=keyblock
; node
; node
= node
->next
) {
563 if( select_all
|| (node
->flag
& NODFLG_SELUID
) )
564 node
->flag
|= NODFLG_MARK_A
;
566 node
->flag
&= ~NODFLG_MARK_A
;
568 /* reset mark for uids which are already signed */
570 for( node
=keyblock
; node
; node
= node
->next
) {
571 if( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
) {
572 primary_pk
=node
->pkt
->pkt
.public_key
;
573 keyid_from_pk( primary_pk
, pk_keyid
);
575 /* Is this a self-sig? */
576 if(pk_keyid
[0]==sk_keyid
[0] && pk_keyid
[1]==sk_keyid
[1])
579 /* Do not force a v4 sig here, otherwise it would
580 be difficult to remake a v3 selfsig. If this
581 is a v3->v4 promotion case, then we set
582 force_v4 later anyway. */
586 else if( node
->pkt
->pkttype
== PKT_USER_ID
)
588 uidnode
= (node
->flag
& NODFLG_MARK_A
)? node
: NULL
;
592 char *user
=utf8_to_native(uidnode
->pkt
->pkt
.user_id
->name
,
593 uidnode
->pkt
->pkt
.user_id
->len
,
596 if(uidnode
->pkt
->pkt
.user_id
->is_revoked
)
598 tty_printf(_("User ID \"%s\" is revoked."),user
);
605 /* No, so remove the mark and continue */
606 if(!cpr_get_answer_is_yes("sign_uid.revoke_okay",
607 _("Are you sure you "
608 "still want to sign "
611 uidnode
->flag
&= ~NODFLG_MARK_A
;
619 uidnode
->flag
&= ~NODFLG_MARK_A
;
621 tty_printf(_(" Unable to sign.\n"));
624 else if(uidnode
->pkt
->pkt
.user_id
->is_expired
)
626 tty_printf(_("User ID \"%s\" is expired."),user
);
633 /* No, so remove the mark and continue */
634 if(!cpr_get_answer_is_yes("sign_uid.expire_okay",
635 _("Are you sure you "
636 "still want to sign "
639 uidnode
->flag
&= ~NODFLG_MARK_A
;
647 uidnode
->flag
&= ~NODFLG_MARK_A
;
649 tty_printf(_(" Unable to sign.\n"));
652 else if(!uidnode
->pkt
->pkt
.user_id
->created
&& !selfsig
)
654 tty_printf(_("User ID \"%s\" is not self-signed."),
660 /* No, so remove the mark and continue */
661 if(!cpr_get_answer_is_yes("sign_uid.nosig_okay",
662 _("Are you sure you "
663 "still want to sign "
666 uidnode
->flag
&= ~NODFLG_MARK_A
;
674 uidnode
->flag
&= ~NODFLG_MARK_A
;
676 tty_printf(_(" Unable to sign.\n"));
680 if(uidnode
&& interactive
&& !yesreally
)
682 tty_printf(_("User ID \"%s\" is signable. "),user
);
683 if(!cpr_get_answer_is_yes("sign_uid.sign_okay",
684 _("Sign it? (y/N) ")))
686 uidnode
->flag
&= ~NODFLG_MARK_A
;
694 else if( uidnode
&& node
->pkt
->pkttype
== PKT_SIGNATURE
695 && (node
->pkt
->pkt
.signature
->sig_class
&~3) == 0x10 ) {
696 if( sk_keyid
[0] == node
->pkt
->pkt
.signature
->keyid
[0]
697 && sk_keyid
[1] == node
->pkt
->pkt
.signature
->keyid
[1] ) {
699 char *user
=utf8_to_native(uidnode
->pkt
->pkt
.user_id
->name
,
700 uidnode
->pkt
->pkt
.user_id
->len
,
703 /* It's a v3 self-sig. Make it into a v4 self-sig? */
704 if(node
->pkt
->pkt
.signature
->version
<4 && selfsig
)
706 tty_printf(_("The self-signature on \"%s\"\n"
707 "is a PGP 2.x-style signature.\n"),user
);
709 /* Note that the regular PGP2 warning below
710 still applies if there are no v4 sigs on
714 if(cpr_get_answer_is_yes("sign_uid.v4_promote_okay",
715 _("Do you want to promote "
716 "it to an OpenPGP self-"
717 "signature? (y/N) ")))
720 node
->flag
|=NODFLG_DELSIG
;
726 /* Is the current signature expired? */
727 if(node
->pkt
->pkt
.signature
->flags
.expired
)
729 tty_printf(_("Your current signature on \"%s\"\n"
730 "has expired.\n"),user
);
732 if(cpr_get_answer_is_yes("sign_uid.replace_expired_okay",
733 _("Do you want to issue a "
734 "new signature to replace "
735 "the expired one? (y/N) ")))
737 /* Mark these for later deletion. We
738 don't want to delete them here, just in
739 case the replacement signature doesn't
740 happen for some reason. We only delete
741 these after the replacement is already
744 node
->flag
|=NODFLG_DELSIG
;
750 if(!node
->pkt
->pkt
.signature
->flags
.exportable
&& !local
)
752 /* It's a local sig, and we want to make a
754 tty_printf(_("Your current signature on \"%s\"\n"
755 "is a local signature.\n"),user
);
757 if(cpr_get_answer_is_yes("sign_uid.local_promote_okay",
758 _("Do you want to promote "
759 "it to a full exportable "
760 "signature? (y/N) ")))
762 /* Mark these for later deletion. We
763 don't want to delete them here, just in
764 case the replacement signature doesn't
765 happen for some reason. We only delete
766 these after the replacement is already
769 node
->flag
|=NODFLG_DELSIG
;
775 /* Fixme: see whether there is a revocation in which
776 * case we should allow to sign it again. */
777 if (!node
->pkt
->pkt
.signature
->flags
.exportable
&& local
)
779 "\"%s\" was already locally signed by key %s\n"),
780 user
,keystr_from_sk(sk
));
782 tty_printf(_("\"%s\" was already signed by key %s\n"),
783 user
,keystr_from_sk(sk
));
786 && cpr_get_answer_is_yes("sign_uid.dupe_okay",
787 _("Do you want to sign it "
788 "again anyway? (y/N) ")))
790 /* Don't delete the old sig here since this is
791 an --expert thing. */
796 sprintf (buf
, "%08lX%08lX",
797 (ulong
)sk
->keyid
[0], (ulong
)sk
->keyid
[1] );
798 write_status_text (STATUS_ALREADY_SIGNED
, buf
);
799 uidnode
->flag
&= ~NODFLG_MARK_A
; /* remove mark */
806 /* check whether any uids are left for signing */
807 if( !count_uids_with_flag(keyblock
, NODFLG_MARK_A
) )
809 tty_printf(_("Nothing to sign with key %s\n"),keystr_from_sk(sk
));
813 /* Ask whether we really should sign these user id(s) */
815 show_key_with_all_names( keyblock
, 1, 0, 1, 0, 0 );
818 if(primary_pk
->expiredate
&& !selfsig
)
820 u32 now
=make_timestamp();
822 if(primary_pk
->expiredate
<=now
)
824 tty_printf(_("This key has expired!"));
829 if(!cpr_get_answer_is_yes("sign_uid.expired_okay",
830 _("Are you sure you still "
831 "want to sign it? (y/N) ")))
836 tty_printf(_(" Unable to sign.\n"));
842 tty_printf(_("This key is due to expire on %s.\n"),
843 expirestr_from_pk(primary_pk
));
845 if(opt
.ask_cert_expire
)
847 char *answer
=cpr_get("sign_uid.expire",
848 _("Do you want your signature to "
849 "expire at the same time? (Y/n) "));
850 if(answer_is_yes_no_default(answer
,1))
852 /* This fixes the signature timestamp we're
853 going to make as now. This is so the
854 expiration date is exactly correct, and not
855 a few seconds off (due to the time it takes
856 to answer the questions, enter the
859 duration
=primary_pk
->expiredate
-now
;
869 /* Only ask for duration if we haven't already set it to match
870 the expiration of the pk */
871 if(!duration
&& !selfsig
)
873 if(opt
.ask_cert_expire
)
874 duration
=ask_expire_interval(1,opt
.def_cert_expire
);
876 duration
=parse_expire_string(opt
.def_cert_expire
);
882 /* Is --pgp2 on, it's a v3 key, all the sigs on the key are
883 currently v3 and we're about to sign it with a v4 sig? If
886 (sk
->version
>3 || force_v4
) && primary_pk
->version
<=3)
888 tty_printf(_("You may not make an OpenPGP signature on a "
889 "PGP 2.x key while in --pgp2 mode.\n"));
890 tty_printf(_("This would make the key unusable in PGP 2.x.\n"));
894 if(!cpr_get_answer_is_yes("sign_uid.v4_on_v3_okay",
895 _("Are you sure you still "
896 "want to sign it? (y/N) ")))
909 if(opt
.batch
|| !opt
.ask_cert_level
)
910 class=0x10+opt
.def_cert_level
;
915 tty_printf(_("How carefully have you verified the key you are "
916 "about to sign actually belongs\nto the person "
917 "named above? If you don't know what to "
918 "answer, enter \"0\".\n"));
920 tty_printf(_(" (0) I will not answer.%s\n"),
921 opt
.def_cert_level
==0?" (default)":"");
922 tty_printf(_(" (1) I have not checked at all.%s\n"),
923 opt
.def_cert_level
==1?" (default)":"");
924 tty_printf(_(" (2) I have done casual checking.%s\n"),
925 opt
.def_cert_level
==2?" (default)":"");
926 tty_printf(_(" (3) I have done very careful checking.%s\n"),
927 opt
.def_cert_level
==3?" (default)":"");
932 answer
= cpr_get("sign_uid.class",_("Your selection? "
933 "(enter `?' for more information): "));
935 class=0x10+opt
.def_cert_level
; /* Default */
936 else if(ascii_strcasecmp(answer
,"0")==0)
937 class=0x10; /* Generic */
938 else if(ascii_strcasecmp(answer
,"1")==0)
939 class=0x11; /* Persona */
940 else if(ascii_strcasecmp(answer
,"2")==0)
941 class=0x12; /* Casual */
942 else if(ascii_strcasecmp(answer
,"3")==0)
943 class=0x13; /* Positive */
945 tty_printf(_("Invalid selection.\n"));
952 trustsig_prompt(&trust_value
,&trust_depth
,&trust_regexp
);
955 p
=get_user_id_native(sk_keyid
);
956 tty_printf(_("Are you sure that you want to sign this key with your\n"
957 "key \"%s\" (%s)\n"),p
,keystr_from_sk(sk
));
963 tty_printf(_("This will be a self-signature.\n"));
969 _("WARNING: the signature will not be marked "
970 "as non-exportable.\n"));
977 _("WARNING: the signature will not be marked "
978 "as non-revocable.\n"));
987 _("The signature will be marked as non-exportable.\n"));
994 _("The signature will be marked as non-revocable.\n"));
1001 tty_printf(_("I have not checked this key at all.\n"));
1006 tty_printf(_("I have checked this key casually.\n"));
1011 tty_printf(_("I have checked this key very carefully.\n"));
1018 if( opt
.batch
&& opt
.answer_yes
)
1020 else if( !cpr_get_answer_is_yes("sign_uid.okay",
1021 _("Really sign? (y/N) ")) )
1024 /* now we can sign the user ids */
1025 reloop
: /* (must use this, because we are modifing the list) */
1027 for( node
=keyblock
; node
; node
= node
->next
) {
1028 if( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
)
1029 primary_pk
= node
->pkt
->pkt
.public_key
;
1030 else if( node
->pkt
->pkttype
== PKT_USER_ID
1031 && (node
->flag
& NODFLG_MARK_A
) ) {
1034 struct sign_attrib attrib
;
1036 assert( primary_pk
);
1037 memset( &attrib
, 0, sizeof attrib
);
1038 attrib
.non_exportable
= local
;
1039 attrib
.non_revocable
= nonrevocable
;
1040 attrib
.trust_depth
= trust_depth
;
1041 attrib
.trust_value
= trust_value
;
1042 attrib
.trust_regexp
= trust_regexp
;
1043 node
->flag
&= ~NODFLG_MARK_A
;
1045 /* we force creation of a v4 signature for local
1046 * signatures, otherwise we would not generate the
1047 * subpacket with v3 keys and the signature becomes
1051 rc
= make_keysig_packet( &sig
, primary_pk
,
1052 node
->pkt
->pkt
.user_id
,
1055 0x13, 0, force_v4
?4:0, 0, 0,
1056 keygen_add_std_prefs
, primary_pk
);
1058 rc
= make_keysig_packet( &sig
, primary_pk
,
1059 node
->pkt
->pkt
.user_id
,
1062 class, 0, force_v4
?4:0,
1063 timestamp
, duration
,
1064 sign_mk_attrib
, &attrib
);
1066 log_error(_("signing failed: %s\n"), g10_errstr(rc
));
1070 *ret_modified
= 1; /* we changed the keyblock */
1073 pkt
= xmalloc_clear( sizeof *pkt
);
1074 pkt
->pkttype
= PKT_SIGNATURE
;
1075 pkt
->pkt
.signature
= sig
;
1076 insert_kbnode( node
, new_kbnode(pkt
), PKT_SIGNATURE
);
1081 /* Delete any sigs that got promoted */
1082 for( node
=keyblock
; node
; node
= node
->next
)
1083 if( node
->flag
& NODFLG_DELSIG
)
1084 delete_kbnode(node
);
1085 } /* end loop over signators */
1088 release_sk_list( sk_list
);
1090 free_secret_key(sk
);
1097 * Change the passphrase of the primary and all secondary keys.
1098 * We use only one passphrase for all keys.
1101 change_passphrase( KBNODE keyblock
)
1107 char *passphrase
= NULL
;
1108 int no_primary_secrets
= 0;
1111 node
= find_kbnode( keyblock
, PKT_SECRET_KEY
);
1113 log_error("Oops; secret key not found anymore!\n");
1116 sk
= node
->pkt
->pkt
.secret_key
;
1118 for (any
= 0, node
=keyblock
; node
; node
= node
->next
) {
1119 if (node
->pkt
->pkttype
== PKT_SECRET_KEY
1120 || node
->pkt
->pkttype
== PKT_SECRET_SUBKEY
) {
1121 PKT_secret_key
*tmpsk
= node
->pkt
->pkt
.secret_key
;
1122 if (!(tmpsk
->is_protected
1123 && (tmpsk
->protect
.s2k
.mode
== 1001
1124 || tmpsk
->protect
.s2k
.mode
== 1002))) {
1131 tty_printf (_("Key has only stub or on-card key items - "
1132 "no passphrase to change.\n"));
1136 /* See how to handle this key. */
1137 switch( is_secret_key_protected( sk
) ) {
1139 rc
= G10ERR_PUBKEY_ALGO
;
1142 tty_printf(_("This key is not protected.\n"));
1145 if( sk
->protect
.s2k
.mode
== 1001 ) {
1146 tty_printf(_("Secret parts of primary key are not available.\n"));
1147 no_primary_secrets
= 1;
1149 else if( sk
->protect
.s2k
.mode
== 1002 ) {
1150 tty_printf(_("Secret parts of primary key are stored on-card.\n"));
1151 no_primary_secrets
= 1;
1156 tty_printf(_("Key is protected.\n"));
1158 /* Clear the passphrase cache so that the user is required
1159 to enter the old passphrase. */
1160 keyid_from_sk (sk
, keyid
);
1161 passphrase_clear_cache (keyid
, NULL
, 0);
1163 rc
= check_secret_key( sk
, 0 );
1165 passphrase
= get_last_passphrase();
1170 /* Unprotect all subkeys (use the supplied passphrase or ask)*/
1171 for(node
=keyblock
; !rc
&& node
; node
= node
->next
) {
1172 if( node
->pkt
->pkttype
== PKT_SECRET_SUBKEY
) {
1173 PKT_secret_key
*subsk
= node
->pkt
->pkt
.secret_key
;
1174 if ( !(subsk
->is_protected
1175 && (subsk
->protect
.s2k
.mode
== 1001
1176 || subsk
->protect
.s2k
.mode
== 1002))) {
1177 set_next_passphrase( passphrase
);
1178 rc
= check_secret_key( subsk
, 0 );
1179 if( !rc
&& !passphrase
)
1180 passphrase
= get_last_passphrase();
1186 tty_printf(_("Can't edit this key: %s\n"), g10_errstr(rc
));
1189 STRING2KEY
*s2k
= xmalloc_secure( sizeof *s2k
);
1190 const char *errtext
= NULL
;
1192 tty_printf(_("Enter the new passphrase for this secret key.\n\n") );
1194 set_next_passphrase( NULL
);
1198 s2k
->mode
= opt
.s2k_mode
;
1199 s2k
->hash_algo
= S2K_DIGEST_ALGO
;
1200 dek
= passphrase_to_dek( NULL
, 0, opt
.s2k_cipher_algo
,
1201 s2k
, 2, errtext
, &canceled
);
1202 if (!dek
&& canceled
) {
1203 rc
= GPG_ERR_CANCELED
;
1207 errtext
= N_("passphrase not correctly repeated; try again");
1208 tty_printf ("%s.\n", _(errtext
));
1210 else if( !dek
->keylen
) {
1212 tty_printf(_( "You don't want a passphrase -"
1213 " this is probably a *bad* idea!\n\n"));
1214 if( cpr_get_answer_is_yes("change_passwd.empty.okay",
1215 _("Do you really want to do this? (y/N) ")))
1223 if( !no_primary_secrets
) {
1224 sk
->protect
.algo
= dek
->algo
;
1225 sk
->protect
.s2k
= *s2k
;
1226 rc
= protect_secret_key( sk
, dek
);
1228 for(node
=keyblock
; !rc
&& node
; node
= node
->next
) {
1229 if( node
->pkt
->pkttype
== PKT_SECRET_SUBKEY
) {
1230 PKT_secret_key
*subsk
= node
->pkt
->pkt
.secret_key
;
1231 if ( !(subsk
->is_protected
1232 && (subsk
->protect
.s2k
.mode
== 1001
1233 || subsk
->protect
.s2k
.mode
== 1002))) {
1234 subsk
->protect
.algo
= dek
->algo
;
1235 subsk
->protect
.s2k
= *s2k
;
1236 rc
= protect_secret_key( subsk
, dek
);
1241 log_error("protect_secret_key failed: %s\n",
1247 /* Clear the cahce again so that the user is
1248 required to enter the new passphrase at the
1250 keyid_from_sk (sk
, keyid
);
1251 passphrase_clear_cache (keyid
, NULL
, 0);
1263 xfree( passphrase
);
1264 set_next_passphrase( NULL
);
1265 return changed
&& !rc
;
1270 * There are some keys out (due to a bug in gnupg), where the sequence
1271 * of the packets is wrong. This function fixes that.
1272 * Returns: true if the keyblock has been fixed.
1274 * Note: This function does not work if there is more than one user ID.
1277 fix_keyblock( KBNODE keyblock
)
1279 KBNODE node
, last
, subkey
;
1282 /* locate key signatures of class 0x10..0x13 behind sub key packets */
1283 for( subkey
=last
=NULL
, node
= keyblock
; node
;
1284 last
=node
, node
= node
->next
) {
1285 switch( node
->pkt
->pkttype
) {
1286 case PKT_PUBLIC_SUBKEY
:
1287 case PKT_SECRET_SUBKEY
:
1289 subkey
= last
; /* actually it is the one before the subkey */
1293 PKT_signature
*sig
= node
->pkt
->pkt
.signature
;
1294 if( sig
->sig_class
>= 0x10 && sig
->sig_class
<= 0x13 ) {
1296 "moving a key signature to the correct place\n"));
1297 last
->next
= node
->next
;
1298 node
->next
= subkey
->next
;
1299 subkey
->next
= node
;
1313 parse_sign_type(const char *str
,int *localsig
,int *nonrevokesig
,int *trustsig
)
1319 if(ascii_strncasecmp(p
,"l",1)==0)
1324 else if(ascii_strncasecmp(p
,"nr",2)==0)
1329 else if(ascii_strncasecmp(p
,"t",1)==0)
1343 * Menu driven key editor. If seckey_check is true, then a secret key
1344 * that matches username will be looked for. If it is false, not all
1345 * commands will be available.
1347 * Note: to keep track of some selection we use node->mark MARKBIT_xxxx.
1350 /* Need an SK for this command */
1351 #define KEYEDIT_NEED_SK 1
1352 /* Cannot be viewing the SK for this command */
1353 #define KEYEDIT_NOT_SK 2
1354 /* Must be viewing the SK for this command */
1355 #define KEYEDIT_ONLY_SK 4
1356 /* Match the tail of the string */
1357 #define KEYEDIT_TAIL_MATCH 8
1362 cmdQUIT
, cmdHELP
, cmdFPR
, cmdLIST
, cmdSELUID
, cmdCHECK
, cmdSIGN
,
1363 cmdREVSIG
, cmdREVKEY
, cmdREVUID
, cmdDELSIG
, cmdPRIMARY
, cmdDEBUG
,
1364 cmdSAVE
, cmdADDUID
, cmdADDPHOTO
, cmdDELUID
, cmdADDKEY
, cmdDELKEY
,
1365 cmdADDREVOKER
, cmdTOGGLE
, cmdSELKEY
, cmdPASSWD
, cmdTRUST
, cmdPREF
,
1366 cmdEXPIRE
, cmdBACKSIGN
, cmdENABLEKEY
, cmdDISABLEKEY
, cmdSHOWPREF
,
1367 cmdSETPREF
, cmdPREFKS
, cmdNOTATION
, cmdINVCMD
, cmdSHOWPHOTO
, cmdUPDTRUST
,
1368 cmdCHKTRUST
, cmdADDCARDKEY
, cmdKEYTOCARD
, cmdBKUPTOCARD
, cmdCLEAN
,
1380 { "quit" , cmdQUIT
, 0, N_("quit this menu") },
1381 { "q" , cmdQUIT
, 0, NULL
},
1382 { "save" , cmdSAVE
, 0, N_("save and quit") },
1383 { "help" , cmdHELP
, 0, N_("show this help") },
1384 { "?" , cmdHELP
, 0, NULL
},
1385 { "fpr" , cmdFPR
, 0, N_("show key fingerprint") },
1386 { "list" , cmdLIST
, 0, N_("list key and user IDs") },
1387 { "l" , cmdLIST
, 0, NULL
},
1388 { "uid" , cmdSELUID
, 0, N_("select user ID N") },
1389 { "key" , cmdSELKEY
, 0, N_("select subkey N") },
1390 { "check" , cmdCHECK
, 0, N_("check signatures") },
1391 { "c" , cmdCHECK
, 0, NULL
},
1392 { "cross-certify", cmdBACKSIGN
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
, NULL
},
1393 { "backsign", cmdBACKSIGN
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
, NULL
},
1394 { "sign" , cmdSIGN
, KEYEDIT_NOT_SK
|KEYEDIT_TAIL_MATCH
,
1395 N_("sign selected user IDs [* see below for related commands]") },
1396 { "s" , cmdSIGN
, KEYEDIT_NOT_SK
, NULL
},
1397 /* "lsign" and friends will never match since "sign" comes first
1398 and it is a tail match. They are just here so they show up in
1400 { "lsign" , cmdNOP
, 0, N_("sign selected user IDs locally") },
1401 { "tsign" , cmdNOP
, 0,
1402 N_("sign selected user IDs with a trust signature") },
1403 { "nrsign" , cmdNOP
, 0,
1404 N_("sign selected user IDs with a non-revocable signature") },
1406 { "debug" , cmdDEBUG
, 0, NULL
},
1407 { "adduid" , cmdADDUID
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1408 N_("add a user ID") },
1409 { "addphoto", cmdADDPHOTO
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1410 N_("add a photo ID") },
1411 { "deluid" , cmdDELUID
, KEYEDIT_NOT_SK
,
1412 N_("delete selected user IDs") },
1413 /* delphoto is really deluid in disguise */
1414 { "delphoto", cmdDELUID
, KEYEDIT_NOT_SK
, NULL
},
1416 { "addkey" , cmdADDKEY
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1417 N_("add a subkey") },
1419 #ifdef ENABLE_CARD_SUPPORT
1420 { "addcardkey", cmdADDCARDKEY
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1421 N_("add a key to a smartcard") },
1422 { "keytocard", cmdKEYTOCARD
, KEYEDIT_NEED_SK
|KEYEDIT_ONLY_SK
,
1423 N_("move a key to a smartcard")},
1424 { "bkuptocard", cmdBKUPTOCARD
, KEYEDIT_NEED_SK
|KEYEDIT_ONLY_SK
,
1425 N_("move a backup key to a smartcard")},
1426 #endif /*ENABLE_CARD_SUPPORT*/
1428 { "delkey" , cmdDELKEY
, KEYEDIT_NOT_SK
,
1429 N_("delete selected subkeys") },
1430 { "addrevoker",cmdADDREVOKER
,KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1431 N_("add a revocation key") },
1432 { "delsig" , cmdDELSIG
, KEYEDIT_NOT_SK
,
1433 N_("delete signatures from the selected user IDs") },
1434 { "expire" , cmdEXPIRE
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1435 N_("change the expiration date for the key or selected subkeys") },
1436 { "primary" , cmdPRIMARY
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1437 N_("flag the selected user ID as primary")},
1438 { "toggle" , cmdTOGGLE
, KEYEDIT_NEED_SK
,
1439 N_("toggle between the secret and public key listings") },
1440 { "t" , cmdTOGGLE
, KEYEDIT_NEED_SK
, NULL
},
1441 { "pref" , cmdPREF
, KEYEDIT_NOT_SK
,
1442 N_("list preferences (expert)")},
1443 { "showpref", cmdSHOWPREF
, KEYEDIT_NOT_SK
,
1444 N_("list preferences (verbose)") },
1445 { "setpref" , cmdSETPREF
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1446 N_("set preference list for the selected user IDs") },
1448 { "updpref" , cmdSETPREF
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
, NULL
},
1450 { "keyserver",cmdPREFKS
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1451 N_("set the preferred keyserver URL for the selected user IDs")},
1452 { "notation", cmdNOTATION
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1453 N_("set a notation for the selected user IDs")},
1454 { "passwd" , cmdPASSWD
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1455 N_("change the passphrase") },
1457 { "password", cmdPASSWD
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
, NULL
},
1459 { "trust" , cmdTRUST
, KEYEDIT_NOT_SK
, N_("change the ownertrust") },
1460 { "revsig" , cmdREVSIG
, KEYEDIT_NOT_SK
,
1461 N_("revoke signatures on the selected user IDs") },
1462 { "revuid" , cmdREVUID
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1463 N_("revoke selected user IDs") },
1465 { "revphoto", cmdREVUID
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
, NULL
},
1467 { "revkey" , cmdREVKEY
, KEYEDIT_NOT_SK
|KEYEDIT_NEED_SK
,
1468 N_("revoke key or selected subkeys") },
1469 { "enable" , cmdENABLEKEY
, KEYEDIT_NOT_SK
, N_("enable key") },
1470 { "disable" , cmdDISABLEKEY
, KEYEDIT_NOT_SK
, N_("disable key") },
1471 { "showphoto",cmdSHOWPHOTO
, 0, N_("show selected photo IDs") },
1472 { "clean", cmdCLEAN
, KEYEDIT_NOT_SK
,
1473 N_("compact unusable user IDs and remove unusable signatures from key")},
1474 { "minimize", cmdMINIMIZE
, KEYEDIT_NOT_SK
,
1475 N_("compact unusable user IDs and remove all signatures from key") },
1476 { NULL
, cmdNONE
, 0, NULL
}
1479 #ifdef HAVE_LIBREADLINE
1481 /* These two functions are used by readline for command completion. */
1484 command_generator(const char *text
,int state
)
1486 static int list_index
,len
;
1489 /* If this is a new word to complete, initialize now. This includes
1490 saving the length of TEXT for efficiency, and initializing the
1491 index variable to 0. */
1498 /* Return the next partial match */
1499 while((name
=cmds
[list_index
].name
))
1501 /* Only complete commands that have help text */
1502 if(cmds
[list_index
++].desc
&& strncmp(name
,text
,len
)==0)
1503 return strdup(name
);
1510 keyedit_completion(const char *text
, int start
, int end
)
1512 /* If we are at the start of a line, we try and command-complete.
1513 If not, just do nothing for now. */
1518 return rl_completion_matches(text
,command_generator
);
1520 rl_attempted_completion_over
=1;
1524 #endif /* HAVE_LIBREADLINE */
1528 keyedit_menu( const char *username
, strlist_t locusr
,
1529 strlist_t commands
, int quiet
, int seckey_check
)
1531 enum cmdids cmd
= 0;
1533 KBNODE keyblock
= NULL
;
1534 KEYDB_HANDLE kdbhd
= NULL
;
1535 KBNODE sec_keyblock
= NULL
;
1536 KEYDB_HANDLE sec_kdbhd
= NULL
;
1537 KBNODE cur_keyblock
;
1538 char *answer
= NULL
;
1541 int sec_modified
= 0;
1543 int have_commands
= !!commands
;
1545 if ( opt
.command_fd
!= -1 )
1547 else if( opt
.batch
&& !have_commands
)
1549 log_error(_("can't do this in batch mode\n"));
1553 #ifdef HAVE_W32_SYSTEM
1554 /* Due to Windows peculiarities we need to make sure that the
1555 trustdb stale check is done before we open another file
1556 (i.e. by searching for a key). In theory we could make sure
1557 that the files are closed after use but the open/close caches
1558 inhibits that and flushing the cache right before the stale
1559 check is not easy to implement. Thus we take the easy way out
1560 and run the stale check as early as possible. Note, that for
1561 non- W32 platforms it is run indirectly trough a call to
1563 check_trustdb_stale ();
1566 /* Get the public key */
1567 rc
= get_pubkey_byname (NULL
, NULL
, username
, &keyblock
, &kdbhd
, 1, 1);
1570 if( fix_keyblock( keyblock
) )
1572 if( collapse_uids( &keyblock
) )
1574 reorder_keyblock(keyblock
);
1575 /* We modified the keyblock, so let's make sure the flags are
1578 merge_keys_and_selfsig (keyblock
);
1581 {/* see whether we have a matching secret key */
1582 PKT_public_key
*pk
= keyblock
->pkt
->pkt
.public_key
;
1584 sec_kdbhd
= keydb_new (1);
1586 byte afp
[MAX_FINGERPRINT_LEN
];
1589 fingerprint_from_pk (pk
, afp
, &an
);
1590 while (an
< MAX_FINGERPRINT_LEN
)
1592 rc
= keydb_search_fpr (sec_kdbhd
, afp
);
1596 rc
= keydb_get_keyblock (sec_kdbhd
, &sec_keyblock
);
1599 log_error (_("error reading secret keyblock \"%s\": %s\n"),
1600 username
, g10_errstr(rc
));
1604 merge_keys_and_selfsig( sec_keyblock
);
1605 if( fix_keyblock( sec_keyblock
) )
1611 sec_keyblock
= NULL
;
1612 keydb_release (sec_kdbhd
); sec_kdbhd
= NULL
;
1616 if( sec_keyblock
&& !quiet
)
1617 tty_printf(_("Secret key is available.\n"));
1621 cur_keyblock
= keyblock
;
1622 for(;;) { /* main loop */
1623 int i
, arg_number
, photo
;
1624 const char *arg_string
= "";
1626 PKT_public_key
*pk
=keyblock
->pkt
->pkt
.public_key
;
1630 if( redisplay
&& !quiet
)
1632 show_key_with_all_names( cur_keyblock
, 0, 1, 0, 1, 0 );
1638 if( have_commands
) {
1640 answer
= xstrdup( commands
->d
);
1641 commands
= commands
->next
;
1643 else if( opt
.batch
) {
1644 answer
= xstrdup("quit");
1649 if( !have_commands
)
1651 #ifdef HAVE_LIBREADLINE
1652 tty_enable_completion(keyedit_completion
);
1654 answer
= cpr_get_no_help("keyedit.prompt", _("Command> "));
1656 tty_disable_completion();
1658 trim_spaces(answer
);
1659 } while( *answer
== '#' );
1661 arg_number
= 0; /* Yes, here is the init which egcc complains about */
1662 photo
= 0; /* This too */
1665 else if( *answer
== CONTROL_D
)
1667 else if( digitp(answer
) ) {
1669 arg_number
= atoi(answer
);
1672 if( (p
=strchr(answer
,' ')) ) {
1674 trim_spaces(answer
);
1676 arg_number
= atoi(p
);
1680 for(i
=0; cmds
[i
].name
; i
++ )
1682 if(cmds
[i
].flags
& KEYEDIT_TAIL_MATCH
)
1684 size_t l
=strlen(cmds
[i
].name
);
1685 size_t a
=strlen(answer
);
1688 if(ascii_strcasecmp(&answer
[a
-l
],cmds
[i
].name
)==0)
1695 else if( !ascii_strcasecmp( answer
, cmds
[i
].name
) )
1698 if((cmds
[i
].flags
& KEYEDIT_NEED_SK
) && !sec_keyblock
)
1700 tty_printf(_("Need the secret key to do this.\n"));
1703 else if(((cmds
[i
].flags
& KEYEDIT_NOT_SK
) && sec_keyblock
1705 ||((cmds
[i
].flags
& KEYEDIT_ONLY_SK
) && sec_keyblock
1708 tty_printf(_("Please use the command \"toggle\" first.\n"));
1717 for(i
=0; cmds
[i
].name
; i
++ )
1719 if((cmds
[i
].flags
& KEYEDIT_NEED_SK
) && !sec_keyblock
)
1720 ; /* skip if we do not have the secret key */
1721 else if( cmds
[i
].desc
)
1722 tty_printf("%-11s %s\n", cmds
[i
].name
, _(cmds
[i
].desc
) );
1727 "* The `sign' command may be prefixed with an `l' for local "
1728 "signatures (lsign),\n"
1729 " a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
1730 " (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"));
1739 show_key_and_fingerprint( keyblock
);
1743 if(strlen(arg_string
)==NAMEHASH_LEN
*2)
1744 redisplay
=menu_select_uid_namehash(cur_keyblock
,arg_string
);
1746 redisplay
=menu_select_uid(cur_keyblock
,arg_number
);
1750 if( menu_select_key( cur_keyblock
, arg_number
) )
1755 /* we can only do this with the public key becuase the
1756 * check functions can't cope with secret keys and it
1757 * is questionable whether this would make sense at all */
1758 check_all_keysigs( keyblock
, count_selected_uids(keyblock
) );
1761 case cmdSIGN
: /* sign (only the public key) */
1763 int localsig
=0,nonrevokesig
=0,trustsig
=0,interactive
=0;
1765 if( pk
->is_revoked
)
1767 tty_printf(_("Key is revoked."));
1772 if(!cpr_get_answer_is_yes("keyedit.sign_revoked.okay",
1773 _("Are you sure you still want"
1774 " to sign it? (y/N) ")))
1779 tty_printf(_(" Unable to sign.\n"));
1784 if(count_uids(keyblock
) > 1 && !count_selected_uids(keyblock
)
1785 && !cpr_get_answer_is_yes("keyedit.sign_all.okay",
1786 _("Really sign all user IDs?"
1793 tty_printf(_("Hint: Select the user IDs to sign\n"));
1799 /* What sort of signing are we doing? */
1800 if(!parse_sign_type(answer
,&localsig
,&nonrevokesig
,&trustsig
))
1802 tty_printf(_("Unknown signature type `%s'\n"),answer
);
1806 sign_uids(keyblock
, locusr
, &modified
,
1807 localsig
, nonrevokesig
, trustsig
, interactive
);
1812 dump_kbnode( cur_keyblock
);
1817 cur_keyblock
= toggle
? sec_keyblock
: keyblock
;
1822 if (RFC2440
|| RFC1991
|| PGP2
)
1825 _("This command is not allowed while in %s mode.\n"),
1826 compliance_option_string());
1833 if( menu_adduid( keyblock
, sec_keyblock
, photo
, arg_string
) )
1837 sec_modified
= modified
= 1;
1838 merge_keys_and_selfsig( sec_keyblock
);
1839 merge_keys_and_selfsig( keyblock
);
1846 if( !(n1
=count_selected_uids(keyblock
)) )
1847 tty_printf(_("You must select at least one user ID.\n"));
1848 else if( real_uids_left(keyblock
) < 1 )
1849 tty_printf(_("You can't delete the last user ID!\n"));
1850 else if( cpr_get_answer_is_yes("keyedit.remove.uid.okay",
1851 n1
> 1? _("Really remove all selected user IDs? (y/N) ")
1852 : _("Really remove this user ID? (y/N) ")
1854 menu_deluid( keyblock
, sec_keyblock
);
1866 if( !(n1
=count_selected_uids(keyblock
)) )
1867 tty_printf(_("You must select at least one user ID.\n"));
1868 else if( menu_delsig( keyblock
) ) {
1869 /* no redisplay here, because it may scroll away some
1870 * status output of delsig */
1877 if( generate_subkeypair( keyblock
, sec_keyblock
) ) {
1879 sec_modified
= modified
= 1;
1880 merge_keys_and_selfsig( sec_keyblock
);
1881 merge_keys_and_selfsig( keyblock
);
1885 #ifdef ENABLE_CARD_SUPPORT
1887 if (card_generate_subkey (keyblock
, sec_keyblock
)) {
1889 sec_modified
= modified
= 1;
1890 merge_keys_and_selfsig( sec_keyblock
);
1891 merge_keys_and_selfsig( keyblock
);
1898 switch ( count_selected_keys (sec_keyblock
) )
1901 if (cpr_get_answer_is_yes("keyedit.keytocard.use_primary",
1902 _("Really move the primary key? (y/N) ")))
1903 node
= sec_keyblock
;
1906 for (node
= sec_keyblock
; node
; node
= node
->next
)
1908 if (node
->pkt
->pkttype
== PKT_SECRET_SUBKEY
1909 && node
->flag
& NODFLG_SELKEY
)
1914 tty_printf(_("You must select exactly one key.\n"));
1919 PKT_public_key
*xxpk
= find_pk_from_sknode (keyblock
, node
);
1920 if (card_store_subkey (node
, xxpk
?xxpk
->pubkey_usage
:0))
1931 /* Ask for a filename, check whether this is really a
1932 backup key as generated by the card generation, parse
1933 that key and store it on card. */
1942 tty_printf (_("Command expects a filename argument\n"));
1946 /* Open that file. */
1947 a
= iobuf_open (fname
);
1948 if (a
&& is_secured_file (iobuf_get_fd (a
)))
1956 tty_printf (_("Can't open `%s': %s\n"),
1957 fname
, strerror(errno
));
1961 /* Parse and check that file. */
1962 pkt
= xmalloc (sizeof *pkt
);
1964 rc
= parse_packet (a
, pkt
);
1966 iobuf_ioctl (NULL
, 2, 0, (char*)fname
); /* (invalidate cache). */
1968 && pkt
->pkttype
!= PKT_SECRET_KEY
1969 && pkt
->pkttype
!= PKT_SECRET_SUBKEY
)
1970 rc
= G10ERR_NO_SECKEY
;
1973 tty_printf(_("Error reading backup key from `%s': %s\n"),
1974 fname
, g10_errstr (rc
));
1979 node
= new_kbnode (pkt
);
1982 if (card_store_subkey (node
, 0))
1987 release_kbnode (node
);
1991 #endif /* ENABLE_CARD_SUPPORT */
1996 if( !(n1
=count_selected_keys( keyblock
)) )
1997 tty_printf(_("You must select at least one key.\n"));
1998 else if( !cpr_get_answer_is_yes( "keyedit.remove.subkey.okay",
2000 _("Do you really want to delete the selected keys? (y/N) "):
2001 _("Do you really want to delete this key? (y/N) ")
2005 menu_delkey( keyblock
, sec_keyblock
);
2018 if(ascii_strcasecmp(arg_string
,"sensitive")==0)
2020 if( menu_addrevoker( keyblock
, sec_keyblock
, sensitive
) ) {
2022 sec_modified
= modified
= 1;
2023 merge_keys_and_selfsig( sec_keyblock
);
2024 merge_keys_and_selfsig( keyblock
);
2032 if( !(n1
=count_selected_uids(keyblock
)) )
2033 tty_printf(_("You must select at least one user ID.\n"));
2034 else if( cpr_get_answer_is_yes(
2035 "keyedit.revoke.uid.okay",
2036 n1
> 1? _("Really revoke all selected user IDs? (y/N) ")
2037 : _("Really revoke this user ID? (y/N) ")
2039 if(menu_revuid(keyblock
,sec_keyblock
))
2052 if( !(n1
=count_selected_keys( keyblock
)) )
2054 if(cpr_get_answer_is_yes("keyedit.revoke.subkey.okay",
2055 _("Do you really want to revoke"
2056 " the entire key? (y/N) ")))
2058 if(menu_revkey(keyblock
,sec_keyblock
))
2064 else if(cpr_get_answer_is_yes("keyedit.revoke.subkey.okay",
2066 _("Do you really want to revoke"
2067 " the selected subkeys? (y/N) "):
2068 _("Do you really want to revoke"
2069 " this subkey? (y/N) ")))
2071 if( menu_revsubkey( keyblock
, sec_keyblock
) )
2078 merge_keys_and_selfsig( keyblock
);
2083 if( menu_expire( keyblock
, sec_keyblock
) )
2085 merge_keys_and_selfsig( sec_keyblock
);
2086 merge_keys_and_selfsig( keyblock
);
2094 if(menu_backsign(keyblock
,sec_keyblock
))
2103 if( menu_set_primary_uid ( keyblock
, sec_keyblock
) ) {
2104 merge_keys_and_selfsig( keyblock
);
2111 if( change_passphrase( sec_keyblock
) )
2116 if(opt
.trust_model
==TM_EXTERNAL
)
2118 tty_printf (_("Owner trust may not be set while "
2119 "using a user provided trust database\n"));
2123 show_key_with_all_names( keyblock
, 0, 0, 0, 1, 0 );
2125 if( edit_ownertrust( find_kbnode( keyblock
,
2126 PKT_PUBLIC_KEY
)->pkt
->pkt
.public_key
, 1 ) ) {
2128 /* No real need to set update_trust here as
2129 edit_ownertrust() calls revalidation_mark()
2137 int count
=count_selected_uids(keyblock
);
2138 assert(keyblock
->pkt
->pkttype
==PKT_PUBLIC_KEY
);
2139 show_names(keyblock
,keyblock
->pkt
->pkt
.public_key
,
2140 count
?NODFLG_SELUID
:0,1);
2146 int count
=count_selected_uids(keyblock
);
2147 assert(keyblock
->pkt
->pkttype
==PKT_PUBLIC_KEY
);
2148 show_names(keyblock
,keyblock
->pkt
->pkt
.public_key
,
2149 count
?NODFLG_SELUID
:0,2);
2155 PKT_user_id
*tempuid
;
2157 keygen_set_std_prefs(!*arg_string
?"default" : arg_string
, 0);
2159 tempuid
=keygen_get_std_prefs();
2160 tty_printf(_("Set preference list to:\n"));
2161 show_prefs(tempuid
,NULL
,1);
2162 free_user_id(tempuid
);
2164 if(cpr_get_answer_is_yes("keyedit.setpref.okay",
2165 count_selected_uids (keyblock
)?
2166 _("Really update the preferences"
2167 " for the selected user IDs? (y/N) "):
2168 _("Really update the preferences? (y/N) ")))
2170 if ( menu_set_preferences (keyblock
, sec_keyblock
) )
2172 merge_keys_and_selfsig (keyblock
);
2181 if( menu_set_keyserver_url ( *arg_string
?arg_string
:NULL
,
2182 keyblock
, sec_keyblock
) )
2184 merge_keys_and_selfsig( keyblock
);
2191 if( menu_set_notation ( *arg_string
?arg_string
:NULL
,
2192 keyblock
, sec_keyblock
) )
2194 merge_keys_and_selfsig( keyblock
);
2204 if( menu_revsig( keyblock
) ) {
2212 if( enable_disable_key( keyblock
, cmd
== cmdDISABLEKEY
) ) {
2219 menu_showphoto(keyblock
);
2223 if(menu_clean(keyblock
,0))
2224 redisplay
=modified
=1;
2228 if(menu_clean(keyblock
,1))
2229 redisplay
=modified
=1;
2235 if( !modified
&& !sec_modified
)
2237 if( !cpr_get_answer_is_yes("keyedit.save.okay",
2238 _("Save changes? (y/N) ")) ) {
2240 || cpr_get_answer_is_yes("keyedit.cancel.okay",
2241 _("Quit without saving? (y/N) ")))
2247 if( modified
|| sec_modified
) {
2249 rc
= keydb_update_keyblock (kdbhd
, keyblock
);
2251 log_error(_("update failed: %s\n"), g10_errstr(rc
) );
2255 if( sec_modified
) {
2256 rc
= keydb_update_keyblock (sec_kdbhd
, sec_keyblock
);
2258 log_error( _("update secret failed: %s\n"),
2265 tty_printf(_("Key not changed so no update needed.\n"));
2269 revalidation_mark ();
2277 tty_printf(_("Invalid command (try \"help\")\n"));
2280 } /* end main loop */
2283 release_kbnode( keyblock
);
2284 release_kbnode( sec_keyblock
);
2285 keydb_release (kdbhd
);
2290 tty_print_notations(int indent
,PKT_signature
*sig
)
2293 struct notation
*notation
,*nd
;
2301 notation
=sig_to_notation(sig
);
2303 for(nd
=notation
;nd
;nd
=nd
->next
)
2306 tty_printf("%*s",indent
,"");
2310 tty_print_utf8_string(nd
->name
,strlen(nd
->name
));
2312 tty_print_utf8_string(nd
->value
,strlen(nd
->value
));
2316 free_notation(notation
);
2320 * show preferences of a public keyblock.
2323 show_prefs (PKT_user_id
*uid
, PKT_signature
*selfsig
, int verbose
)
2325 const prefitem_t fake
={0,0};
2326 const prefitem_t
*prefs
;
2340 int any
, des_seen
=0, sha1_seen
=0, uncomp_seen
=0;
2343 tty_printf (_("Cipher: "));
2344 for(i
=any
=0; prefs
[i
].type
; i
++ ) {
2345 if( prefs
[i
].type
== PREFTYPE_SYM
) {
2349 /* We don't want to display strings for experimental algos */
2350 if (!openpgp_cipher_test_algo (prefs
[i
].value
)
2351 && prefs
[i
].value
< 100 )
2353 openpgp_cipher_algo_name (prefs
[i
].value
));
2355 tty_printf ("[%d]", prefs
[i
].value
);
2356 if (prefs
[i
].value
== CIPHER_ALGO_3DES
)
2363 tty_printf ("%s", openpgp_cipher_algo_name (CIPHER_ALGO_3DES
));
2366 tty_printf (_("Digest: "));
2367 for(i
=any
=0; prefs
[i
].type
; i
++ ) {
2368 if( prefs
[i
].type
== PREFTYPE_HASH
) {
2372 /* We don't want to display strings for experimental algos */
2373 if (!gcry_md_test_algo (prefs
[i
].value
)
2374 && prefs
[i
].value
< 100 )
2375 tty_printf ("%s", gcry_md_algo_name (prefs
[i
].value
) );
2377 tty_printf ("[%d]", prefs
[i
].value
);
2378 if (prefs
[i
].value
== DIGEST_ALGO_SHA1
)
2385 tty_printf ("%s", gcry_md_algo_name (DIGEST_ALGO_SHA1
));
2388 tty_printf (_("Compression: "));
2389 for(i
=any
=0; prefs
[i
].type
; i
++ ) {
2390 if( prefs
[i
].type
== PREFTYPE_ZIP
) {
2391 const char *s
=compress_algo_to_string(prefs
[i
].value
);
2396 /* We don't want to display strings for experimental algos */
2397 if (s
&& prefs
[i
].value
< 100 )
2398 tty_printf ("%s", s
);
2400 tty_printf ("[%d]", prefs
[i
].value
);
2401 if (prefs
[i
].value
== COMPRESS_ALGO_NONE
)
2409 tty_printf ("%s",compress_algo_to_string(COMPRESS_ALGO_ZIP
));
2412 tty_printf ("%s",compress_algo_to_string(COMPRESS_ALGO_NONE
));
2414 if(uid
->flags
.mdc
|| !uid
->flags
.ks_modify
)
2417 tty_printf (_("Features: "));
2424 if(!uid
->flags
.ks_modify
)
2428 tty_printf (_("Keyserver no-modify"));
2435 const byte
*pref_ks
;
2438 pref_ks
=parse_sig_subpkt(selfsig
->hashed
,
2439 SIGSUBPKT_PREF_KS
,&pref_ks_len
);
2440 if(pref_ks
&& pref_ks_len
)
2443 tty_printf(_("Preferred keyserver: "));
2444 tty_print_utf8_string(pref_ks
,pref_ks_len
);
2448 if(selfsig
->flags
.notation
)
2451 tty_printf(_("Notations: "));
2452 tty_print_notations(5+strlen(_("Notations: ")),selfsig
);
2458 for(i
=0; prefs
[i
].type
; i
++ ) {
2459 tty_printf( " %c%d", prefs
[i
].type
== PREFTYPE_SYM
? 'S' :
2460 prefs
[i
].type
== PREFTYPE_HASH
? 'H' :
2461 prefs
[i
].type
== PREFTYPE_ZIP
? 'Z':'?',
2465 tty_printf (" [mdc]");
2466 if (!uid
->flags
.ks_modify
)
2467 tty_printf (" [no-ks-modify]");
2472 /* This is the version of show_key_with_all_names used when
2473 opt.with_colons is used. It prints all available data in a easy to
2474 parse format and does not translate utf8 */
2476 show_key_with_all_names_colon (KBNODE keyblock
)
2479 int i
, j
, ulti_hack
=0;
2481 PKT_public_key
*primary
=NULL
;
2484 for ( node
= keyblock
; node
; node
= node
->next
)
2486 if (node
->pkt
->pkttype
== PKT_PUBLIC_KEY
2487 || (node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
) )
2489 PKT_public_key
*pk
= node
->pkt
->pkt
.public_key
;
2492 if (node
->pkt
->pkttype
== PKT_PUBLIC_KEY
)
2494 pk_version
= pk
->version
;
2498 keyid_from_pk (pk
, keyid
);
2500 fputs (node
->pkt
->pkttype
== PKT_PUBLIC_KEY
?"pub:":"sub:", stdout
);
2503 else if (pk
->is_revoked
)
2505 else if (pk
->has_expired
)
2507 else if (!(opt
.fast_list_mode
|| opt
.no_expensive_trust_checks
))
2509 int trust
= get_validity_info (pk
, NULL
);
2515 printf (":%u:%d:%08lX%08lX:%lu:%lu::",
2518 (ulong
)keyid
[0], (ulong
)keyid
[1],
2519 (ulong
)pk
->timestamp
,
2520 (ulong
)pk
->expiredate
);
2521 if (node
->pkt
->pkttype
==PKT_PUBLIC_KEY
2522 && !(opt
.fast_list_mode
|| opt
.no_expensive_trust_checks
))
2523 putchar(get_ownertrust_info (pk
));
2527 print_fingerprint (pk
, NULL
, 0);
2534 for (node
= keyblock
; node
; node
= node
->next
)
2536 if ( node
->pkt
->pkttype
== PKT_USER_ID
)
2538 PKT_user_id
*uid
= node
->pkt
->pkt
.user_id
;
2542 if(uid
->attrib_data
)
2547 if ( uid
->is_revoked
)
2548 printf("r::::::::");
2549 else if ( uid
->is_expired
)
2550 printf("e::::::::");
2551 else if ( opt
.fast_list_mode
|| opt
.no_expensive_trust_checks
)
2557 if( primary
&& !ulti_hack
)
2558 uid_validity
= get_validity_info( primary
, uid
);
2561 printf("%c::::::::",uid_validity
);
2564 if(uid
->attrib_data
)
2565 printf ("%u %lu",uid
->numattribs
,uid
->attrib_len
);
2567 print_string (stdout
, uid
->name
, uid
->len
, ':');
2570 /* signature class */
2575 if (pk_version
>3 || uid
->selfsigversion
>3)
2577 const prefitem_t
*prefs
= uid
->prefs
;
2579 for (j
=0; prefs
&& prefs
[j
].type
; j
++)
2583 printf ("%c%d", prefs
[j
].type
== PREFTYPE_SYM
? 'S' :
2584 prefs
[j
].type
== PREFTYPE_HASH
? 'H' :
2585 prefs
[j
].type
== PREFTYPE_ZIP
? 'Z':'?',
2590 if (!uid
->flags
.ks_modify
)
2591 printf (",no-ks-modify");
2596 if (uid
->is_primary
)
2598 if (uid
->is_revoked
)
2600 if (uid
->is_expired
)
2602 if ((node
->flag
& NODFLG_SELUID
))
2604 if ((node
->flag
& NODFLG_MARK_A
))
2613 show_names(KBNODE keyblock
,PKT_public_key
*pk
,unsigned int flag
,int with_prefs
)
2618 for( node
= keyblock
; node
; node
= node
->next
)
2620 if( node
->pkt
->pkttype
== PKT_USER_ID
2621 && !is_deleted_kbnode(node
))
2623 PKT_user_id
*uid
= node
->pkt
->pkt
.user_id
;
2625 if(!flag
|| (flag
&& (node
->flag
& flag
)))
2627 if(!(flag
&NODFLG_MARK_A
) && pk
)
2628 tty_printf("%s ",uid_trust_string_fixed(pk
,uid
));
2630 if( flag
& NODFLG_MARK_A
)
2632 else if( node
->flag
& NODFLG_SELUID
)
2633 tty_printf("(%d)* ", i
);
2634 else if( uid
->is_primary
)
2635 tty_printf("(%d). ", i
);
2637 tty_printf("(%d) ", i
);
2638 tty_print_utf8_string( uid
->name
, uid
->len
);
2640 if(with_prefs
&& pk
)
2642 if(pk
->version
>3 || uid
->selfsigversion
>3)
2644 PKT_signature
*selfsig
=NULL
;
2647 for(signode
=node
->next
;
2648 signode
&& signode
->pkt
->pkttype
==PKT_SIGNATURE
;
2649 signode
=signode
->next
)
2651 if(signode
->pkt
->pkt
.signature
->
2652 flags
.chosen_selfsig
)
2654 selfsig
=signode
->pkt
->pkt
.signature
;
2659 show_prefs (uid
, selfsig
, with_prefs
== 2);
2662 tty_printf(_("There are no preferences on a"
2663 " PGP 2.x-style user ID.\n"));
2671 * Display the key a the user ids, if only_marked is true, do only
2672 * so for user ids with mark A flag set and dont display the index number
2675 show_key_with_all_names( KBNODE keyblock
, int only_marked
, int with_revoker
,
2676 int with_fpr
, int with_subkeys
, int with_prefs
)
2682 PKT_public_key
*primary
=NULL
;
2684 if (opt
.with_colons
)
2686 show_key_with_all_names_colon (keyblock
);
2691 for( node
= keyblock
; node
; node
= node
->next
) {
2692 if( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
2693 || (with_subkeys
&& node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
2694 && !is_deleted_kbnode(node
)) ) {
2695 PKT_public_key
*pk
= node
->pkt
->pkt
.public_key
;
2696 const char *otrust
="err",*trust
="err";
2698 if( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
) {
2699 /* do it here, so that debug messages don't clutter the
2701 static int did_warn
= 0;
2703 trust
= get_validity_string (pk
, NULL
);
2704 otrust
= get_ownertrust_string (pk
);
2706 /* Show a warning once */
2708 && (get_validity (pk
, NULL
) & TRUST_FLAG_PENDING_CHECK
)) {
2713 pk_version
=pk
->version
;
2719 char *user
=get_user_id_string_native(pk
->revoked
.keyid
);
2720 const char *algo
= gcry_pk_algo_name (pk
->revoked
.algo
);
2721 tty_printf(_("This key was revoked on %s by %s key %s\n"),
2722 revokestr_from_pk(pk
),algo
?algo
:"?",user
);
2728 if( !pk
->revkey
&& pk
->numrevkeys
)
2731 for(i
=0;i
<pk
->numrevkeys
;i
++)
2737 algo
= gcry_pk_algo_name (pk
->revkey
[i
].algid
);
2738 keyid_from_fingerprint(pk
->revkey
[i
].fpr
,
2739 MAX_FINGERPRINT_LEN
,r_keyid
);
2741 user
=get_user_id_string_native(r_keyid
);
2742 tty_printf(_("This key may be revoked by %s key %s"),
2743 algo
?algo
:"?",user
);
2745 if(pk
->revkey
[i
].class&0x40)
2748 tty_printf(_("(sensitive)"));
2756 keyid_from_pk(pk
,NULL
);
2757 tty_printf("%s%c %4u%c/%s ",
2758 node
->pkt
->pkttype
== PKT_PUBLIC_KEY
? "pub":"sub",
2759 (node
->flag
& NODFLG_SELKEY
)? '*':' ',
2760 nbits_from_pk( pk
),
2761 pubkey_letter( pk
->pubkey_algo
),
2764 tty_printf(_("created: %s"),datestr_from_pk(pk
));
2767 tty_printf(_("revoked: %s"),revokestr_from_pk(pk
));
2768 else if(pk
->has_expired
)
2769 tty_printf(_("expired: %s"),expirestr_from_pk(pk
));
2771 tty_printf(_("expires: %s"),expirestr_from_pk(pk
));
2773 tty_printf(_("usage: %s"),usagestr_from_pk(pk
));
2776 if( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
)
2778 if(opt
.trust_model
!=TM_ALWAYS
)
2780 tty_printf("%*s", (int)keystrlen()+13,"");
2781 /* Ownertrust is only meaningful for the PGP or
2782 classic trust models */
2783 if(opt
.trust_model
==TM_PGP
|| opt
.trust_model
==TM_CLASSIC
)
2785 int width
=14-strlen(otrust
);
2788 tty_printf(_("trust: %s"), otrust
);
2789 tty_printf("%*s",width
,"");
2792 tty_printf(_("validity: %s"), trust
);
2795 if( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
2796 && (get_ownertrust (pk
)&TRUST_FLAG_DISABLED
))
2799 tty_printf(_("This key has been disabled"));
2804 if( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
&& with_fpr
)
2806 print_fingerprint ( pk
, NULL
, 2 );
2810 else if( node
->pkt
->pkttype
== PKT_SECRET_KEY
2811 || (with_subkeys
&& node
->pkt
->pkttype
== PKT_SECRET_SUBKEY
) )
2813 PKT_secret_key
*sk
= node
->pkt
->pkt
.secret_key
;
2814 tty_printf("%s%c %4u%c/%s ",
2815 node
->pkt
->pkttype
== PKT_SECRET_KEY
? "sec":"ssb",
2816 (node
->flag
& NODFLG_SELKEY
)? '*':' ',
2817 nbits_from_sk( sk
),
2818 pubkey_letter( sk
->pubkey_algo
),
2819 keystr_from_sk(sk
));
2820 tty_printf(_("created: %s"),datestr_from_sk(sk
));
2822 tty_printf(_("expires: %s"),expirestr_from_sk(sk
));
2824 if (sk
->is_protected
&& sk
->protect
.s2k
.mode
== 1002)
2827 tty_printf(_("card-no: "));
2828 if (sk
->protect
.ivlen
== 16
2829 && !memcmp (sk
->protect
.iv
, "\xD2\x76\x00\x01\x24\x01", 6))
2830 { /* This is an OpenPGP card. */
2831 for (i
=8; i
< 14; i
++)
2835 tty_printf ("%02X", sk
->protect
.iv
[i
]);
2839 { /* Something is wrong: Print all. */
2840 for (i
=0; i
< sk
->protect
.ivlen
; i
++)
2841 tty_printf ("%02X", sk
->protect
.iv
[i
]);
2848 show_names(keyblock
,primary
,only_marked
?NODFLG_MARK_A
:0,with_prefs
);
2851 tty_printf (_("Please note that the shown key validity"
2852 " is not necessarily correct\n"
2853 "unless you restart the program.\n"));
2857 /* Display basic key information. This function is suitable to show
2858 information on the key without any dependencies on the trustdb or
2859 any other internal GnuPG stuff. KEYBLOCK may either be a public or
2862 show_basic_key_info ( KBNODE keyblock
)
2867 /* The primary key */
2868 for (node
= keyblock
; node
; node
= node
->next
)
2870 if (node
->pkt
->pkttype
== PKT_PUBLIC_KEY
)
2872 PKT_public_key
*pk
= node
->pkt
->pkt
.public_key
;
2874 /* Note, we use the same format string as in other show
2875 functions to make the translation job easier. */
2876 tty_printf ("%s %4u%c/%s ",
2877 node
->pkt
->pkttype
== PKT_PUBLIC_KEY
? "pub":"sub",
2878 nbits_from_pk( pk
),
2879 pubkey_letter( pk
->pubkey_algo
),
2880 keystr_from_pk(pk
));
2881 tty_printf(_("created: %s"),datestr_from_pk(pk
));
2883 tty_printf(_("expires: %s"),expirestr_from_pk(pk
));
2885 print_fingerprint ( pk
, NULL
, 3 );
2888 else if (node
->pkt
->pkttype
== PKT_SECRET_KEY
)
2890 PKT_secret_key
*sk
= node
->pkt
->pkt
.secret_key
;
2891 tty_printf("%s %4u%c/%s",
2892 node
->pkt
->pkttype
== PKT_SECRET_KEY
? "sec":"ssb",
2893 nbits_from_sk( sk
),
2894 pubkey_letter( sk
->pubkey_algo
),
2895 keystr_from_sk(sk
));
2896 tty_printf(_("created: %s"),datestr_from_sk(sk
));
2898 tty_printf(_("expires: %s"),expirestr_from_sk(sk
));
2900 print_fingerprint (NULL
, sk
, 3 );
2906 for (i
=0, node
= keyblock
; node
; node
= node
->next
)
2908 if (node
->pkt
->pkttype
== PKT_USER_ID
)
2910 PKT_user_id
*uid
= node
->pkt
->pkt
.user_id
;
2914 if (uid
->is_revoked
)
2915 tty_printf("[%s] ",_("revoked"));
2916 else if ( uid
->is_expired
)
2917 tty_printf("[%s] ",_("expired"));
2918 tty_print_utf8_string (uid
->name
, uid
->len
);
2925 show_key_and_fingerprint( KBNODE keyblock
)
2928 PKT_public_key
*pk
= NULL
;
2930 for( node
= keyblock
; node
; node
= node
->next
)
2932 if( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
)
2934 pk
= node
->pkt
->pkt
.public_key
;
2935 tty_printf("pub %4u%c/%s %s ",
2936 nbits_from_pk( pk
),
2937 pubkey_letter( pk
->pubkey_algo
),
2939 datestr_from_pk(pk
) );
2941 else if( node
->pkt
->pkttype
== PKT_USER_ID
)
2943 PKT_user_id
*uid
= node
->pkt
->pkt
.user_id
;
2944 tty_print_utf8_string( uid
->name
, uid
->len
);
2950 print_fingerprint( pk
, NULL
, 2 );
2954 /* Show a warning if no uids on the key have the primary uid flag
2957 no_primary_warning(KBNODE keyblock
)
2960 int have_primary
=0,uid_count
=0;
2962 /* TODO: if we ever start behaving differently with a primary or
2963 non-primary attribute ID, we will need to check for attributes
2966 for(node
=keyblock
; node
; node
= node
->next
)
2968 if(node
->pkt
->pkttype
==PKT_USER_ID
2969 && node
->pkt
->pkt
.user_id
->attrib_data
==NULL
)
2973 if(node
->pkt
->pkt
.user_id
->is_primary
==2)
2981 if(uid_count
>1 && !have_primary
)
2982 log_info(_("WARNING: no user ID has been marked as primary. This command"
2983 " may\n cause a different user ID to become"
2984 " the assumed primary.\n"));
2988 * Ask for a new user id, do the selfsignature and put it into
2990 * Return true if there is a new user id
2993 menu_adduid( KBNODE pub_keyblock
, KBNODE sec_keyblock
,
2994 int photo
, const char *photo_name
)
2997 PKT_public_key
*pk
=NULL
;
2998 PKT_secret_key
*sk
=NULL
;
2999 PKT_signature
*sig
=NULL
;
3002 KBNODE pub_where
=NULL
, sec_where
=NULL
;
3005 for( node
= pub_keyblock
; node
; pub_where
= node
, node
= node
->next
) {
3006 if( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
)
3007 pk
= node
->pkt
->pkt
.public_key
;
3008 else if( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
)
3011 if( !node
) /* no subkey */
3013 for( node
= sec_keyblock
; node
; sec_where
= node
, node
= node
->next
) {
3014 if( node
->pkt
->pkttype
== PKT_SECRET_KEY
)
3015 sk
= copy_secret_key( NULL
, node
->pkt
->pkt
.secret_key
);
3016 else if( node
->pkt
->pkttype
== PKT_SECRET_SUBKEY
)
3019 if( !node
) /* no subkey */
3026 for( node
= pub_keyblock
; node
; node
= node
->next
)
3027 if( node
->pkt
->pkttype
== PKT_USER_ID
&&
3028 node
->pkt
->pkt
.user_id
->attrib_data
!=NULL
)
3034 /* It is legal but bad for compatibility to add a photo ID to a
3035 v3 key as it means that PGP2 will not be able to use that key
3036 anymore. Also, PGP may not expect a photo on a v3 key.
3037 Don't bother to ask this if the key already has a photo - any
3038 damage has already been done at that point. -dms */
3039 if(pk
->version
==3 && !hasattrib
)
3043 tty_printf(_("WARNING: This is a PGP2-style key. "
3044 "Adding a photo ID may cause some versions\n"
3045 " of PGP to reject this key.\n"));
3047 if(!cpr_get_answer_is_yes("keyedit.v3_photo.okay",
3048 _("Are you sure you still want "
3049 "to add it? (y/N) ")))
3054 tty_printf(_("You may not add a photo ID to "
3055 "a PGP2-style key.\n"));
3060 uid
= generate_photo_id(pk
,photo_name
);
3062 uid
= generate_user_id();
3066 rc
= make_keysig_packet( &sig
, pk
, uid
, NULL
, sk
, 0x13, 0, 0, 0, 0,
3067 keygen_add_std_prefs
, pk
);
3068 free_secret_key( sk
);
3070 log_error("signing failed: %s\n", g10_errstr(rc
) );
3075 /* insert/append to secret keyblock */
3076 pkt
= xmalloc_clear( sizeof *pkt
);
3077 pkt
->pkttype
= PKT_USER_ID
;
3078 pkt
->pkt
.user_id
= scopy_user_id(uid
);
3079 node
= new_kbnode(pkt
);
3081 insert_kbnode( sec_where
, node
, 0 );
3083 add_kbnode( sec_keyblock
, node
);
3084 pkt
= xmalloc_clear( sizeof *pkt
);
3085 pkt
->pkttype
= PKT_SIGNATURE
;
3086 pkt
->pkt
.signature
= copy_signature(NULL
, sig
);
3088 insert_kbnode( node
, new_kbnode(pkt
), 0 );
3090 add_kbnode( sec_keyblock
, new_kbnode(pkt
) );
3091 /* insert/append to public keyblock */
3092 pkt
= xmalloc_clear( sizeof *pkt
);
3093 pkt
->pkttype
= PKT_USER_ID
;
3094 pkt
->pkt
.user_id
= uid
;
3095 node
= new_kbnode(pkt
);
3097 insert_kbnode( pub_where
, node
, 0 );
3099 add_kbnode( pub_keyblock
, node
);
3100 pkt
= xmalloc_clear( sizeof *pkt
);
3101 pkt
->pkttype
= PKT_SIGNATURE
;
3102 pkt
->pkt
.signature
= copy_signature(NULL
, sig
);
3104 insert_kbnode( node
, new_kbnode(pkt
), 0 );
3106 add_kbnode( pub_keyblock
, new_kbnode(pkt
) );
3112 * Remove all selected userids from the keyrings
3115 menu_deluid( KBNODE pub_keyblock
, KBNODE sec_keyblock
)
3120 for( node
= pub_keyblock
; node
; node
= node
->next
) {
3121 if( node
->pkt
->pkttype
== PKT_USER_ID
) {
3122 selected
= node
->flag
& NODFLG_SELUID
;
3124 /* Only cause a trust update if we delete a
3125 non-revoked user id */
3126 if(!node
->pkt
->pkt
.user_id
->is_revoked
)
3128 delete_kbnode( node
);
3129 if( sec_keyblock
) {
3132 PKT_user_id
*uid
= node
->pkt
->pkt
.user_id
;
3133 for( snode
= sec_keyblock
; snode
; snode
= snode
->next
) {
3134 if( snode
->pkt
->pkttype
== PKT_USER_ID
) {
3135 PKT_user_id
*suid
= snode
->pkt
->pkt
.user_id
;
3138 (uid
->len
== suid
->len
3139 && !memcmp( uid
->name
, suid
->name
, uid
->len
));
3141 delete_kbnode( snode
);
3144 && snode
->pkt
->pkttype
== PKT_SIGNATURE
)
3145 delete_kbnode( snode
);
3146 else if( snode
->pkt
->pkttype
== PKT_SECRET_SUBKEY
)
3152 else if( selected
&& node
->pkt
->pkttype
== PKT_SIGNATURE
)
3153 delete_kbnode( node
);
3154 else if( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
)
3157 commit_kbnode( &pub_keyblock
);
3159 commit_kbnode( &sec_keyblock
);
3164 menu_delsig( KBNODE pub_keyblock
)
3167 PKT_user_id
*uid
= NULL
;
3170 for( node
= pub_keyblock
; node
; node
= node
->next
) {
3171 if( node
->pkt
->pkttype
== PKT_USER_ID
) {
3172 uid
= (node
->flag
& NODFLG_SELUID
)? node
->pkt
->pkt
.user_id
: NULL
;
3174 else if( uid
&& node
->pkt
->pkttype
== PKT_SIGNATURE
) {
3175 int okay
, valid
, selfsig
, inv_sig
, no_key
, other_err
;
3178 tty_print_utf8_string( uid
->name
, uid
->len
);
3181 okay
= inv_sig
= no_key
= other_err
= 0;
3183 valid
= print_and_check_one_sig_colon( pub_keyblock
, node
,
3184 &inv_sig
, &no_key
, &other_err
,
3187 valid
= print_and_check_one_sig( pub_keyblock
, node
,
3188 &inv_sig
, &no_key
, &other_err
,
3192 okay
= cpr_get_answer_yes_no_quit(
3193 "keyedit.delsig.valid",
3194 _("Delete this good signature? (y/N/q)"));
3196 /* Only update trust if we delete a good signature.
3197 The other two cases do not affect trust. */
3201 else if( inv_sig
|| other_err
)
3202 okay
= cpr_get_answer_yes_no_quit(
3203 "keyedit.delsig.invalid",
3204 _("Delete this invalid signature? (y/N/q)"));
3206 okay
= cpr_get_answer_yes_no_quit(
3207 "keyedit.delsig.unknown",
3208 _("Delete this unknown signature? (y/N/q)"));
3212 if( okay
&& selfsig
&& !cpr_get_answer_is_yes(
3213 "keyedit.delsig.selfsig",
3214 _("Really delete this self-signature? (y/N)") ))
3217 delete_kbnode( node
);
3222 else if( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
)
3227 commit_kbnode( &pub_keyblock
);
3228 tty_printf( changed
== 1? _("Deleted %d signature.\n")
3229 : _("Deleted %d signatures.\n"), changed
);
3232 tty_printf( _("Nothing deleted.\n") );
3238 menu_clean(KBNODE keyblock
,int self_only
)
3241 int modified
=0,select_all
=!count_selected_uids(keyblock
);
3243 for(uidnode
=keyblock
->next
;
3244 uidnode
&& uidnode
->pkt
->pkttype
!=PKT_PUBLIC_SUBKEY
;
3245 uidnode
=uidnode
->next
)
3247 if(uidnode
->pkt
->pkttype
==PKT_USER_ID
3248 && (uidnode
->flag
&NODFLG_SELUID
|| select_all
))
3251 char *user
=utf8_to_native(uidnode
->pkt
->pkt
.user_id
->name
,
3252 uidnode
->pkt
->pkt
.user_id
->len
,
3255 clean_one_uid(keyblock
,uidnode
,opt
.verbose
,self_only
,&uids
,&sigs
);
3260 if(uidnode
->pkt
->pkt
.user_id
->is_revoked
)
3261 reason
=_("revoked");
3262 else if(uidnode
->pkt
->pkt
.user_id
->is_expired
)
3263 reason
=_("expired");
3265 reason
=_("invalid");
3267 tty_printf (_("User ID \"%s\" compacted: %s\n"), user
, reason
);
3274 _("User ID \"%s\": %d signature removed\n") :
3275 _("User ID \"%s\": %d signatures removed\n"),
3282 tty_printf (self_only
==1?
3283 _("User ID \"%s\": already minimized\n") :
3284 _("User ID \"%s\": already clean\n"),
3296 * Remove some of the secondary keys
3299 menu_delkey( KBNODE pub_keyblock
, KBNODE sec_keyblock
)
3304 for( node
= pub_keyblock
; node
; node
= node
->next
) {
3305 if( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
) {
3306 selected
= node
->flag
& NODFLG_SELKEY
;
3308 delete_kbnode( node
);
3309 if( sec_keyblock
) {
3314 keyid_from_pk( node
->pkt
->pkt
.public_key
, ki
);
3315 for( snode
= sec_keyblock
; snode
; snode
= snode
->next
) {
3316 if( snode
->pkt
->pkttype
== PKT_SECRET_SUBKEY
) {
3319 keyid_from_sk( snode
->pkt
->pkt
.secret_key
, ki2
);
3320 s_selected
= (ki
[0] == ki2
[0] && ki
[1] == ki2
[1]);
3322 delete_kbnode( snode
);
3325 && snode
->pkt
->pkttype
== PKT_SIGNATURE
)
3326 delete_kbnode( snode
);
3333 else if( selected
&& node
->pkt
->pkttype
== PKT_SIGNATURE
)
3334 delete_kbnode( node
);
3338 commit_kbnode( &pub_keyblock
);
3340 commit_kbnode( &sec_keyblock
);
3342 /* No need to set update_trust here since signing keys are no
3343 longer used to certify other keys, so there is no change in
3344 trust when revoking/removing them */
3349 * Ask for a new revoker, do the selfsignature and put it into
3351 * Return true if there is a new revoker
3354 menu_addrevoker( KBNODE pub_keyblock
, KBNODE sec_keyblock
, int sensitive
)
3356 PKT_public_key
*pk
=NULL
,*revoker_pk
=NULL
;
3357 PKT_secret_key
*sk
=NULL
;
3358 PKT_signature
*sig
=NULL
;
3360 struct revocation_key revkey
;
3364 assert(pub_keyblock
->pkt
->pkttype
==PKT_PUBLIC_KEY
);
3365 assert(sec_keyblock
->pkt
->pkttype
==PKT_SECRET_KEY
);
3367 pk
=pub_keyblock
->pkt
->pkt
.public_key
;
3369 if(pk
->numrevkeys
==0 && pk
->version
==3)
3371 /* It is legal but bad for compatibility to add a revoker to a
3372 v3 key as it means that PGP2 will not be able to use that key
3373 anymore. Also, PGP may not expect a revoker on a v3 key.
3374 Don't bother to ask this if the key already has a revoker -
3375 any damage has already been done at that point. -dms */
3378 tty_printf(_("WARNING: This is a PGP 2.x-style key. "
3379 "Adding a designated revoker may cause\n"
3380 " some versions of PGP to reject this key.\n"));
3382 if(!cpr_get_answer_is_yes("keyedit.v3_revoker.okay",
3383 _("Are you sure you still want "
3384 "to add it? (y/N) ")))
3389 tty_printf(_("You may not add a designated revoker to "
3390 "a PGP 2.x-style key.\n"));
3395 sk
=copy_secret_key(NULL
,sec_keyblock
->pkt
->pkt
.secret_key
);
3402 free_public_key(revoker_pk
);
3404 revoker_pk
=xmalloc_clear(sizeof(*revoker_pk
));
3408 answer
=cpr_get_utf8("keyedit.add_revoker",
3409 _("Enter the user ID of the designated revoker: "));
3410 if(answer
[0]=='\0' || answer
[0]=='\004')
3416 /* Note that I'm requesting CERT here, which usually implies
3417 primary keys only, but some casual testing shows that PGP and
3418 GnuPG both can handle a designated revokation from a
3420 revoker_pk
->req_usage
=PUBKEY_USAGE_CERT
;
3421 rc
=get_pubkey_byname (NULL
, revoker_pk
,answer
,NULL
,NULL
,1, 1);
3424 log_error (_("key \"%s\" not found: %s\n"),answer
,g10_errstr(rc
));
3431 fingerprint_from_pk(revoker_pk
,revkey
.fpr
,&fprlen
);
3434 log_error(_("cannot appoint a PGP 2.x style key as a "
3435 "designated revoker\n"));
3442 revkey
.algid
=revoker_pk
->pubkey_algo
;
3444 if(cmp_public_keys(revoker_pk
,pk
)==0)
3446 /* This actually causes no harm (after all, a key that
3447 designates itself as a revoker is the same as a
3448 regular key), but it's easy enough to check. */
3449 log_error(_("you cannot appoint a key as its own "
3450 "designated revoker\n"));
3455 keyid_from_pk(pk
,NULL
);
3457 /* Does this revkey already exist? */
3458 if(!pk
->revkey
&& pk
->numrevkeys
)
3464 for(i
=0;i
<pk
->numrevkeys
;i
++)
3466 if(memcmp(&pk
->revkey
[i
],&revkey
,
3467 sizeof(struct revocation_key
))==0)
3471 log_error(_("this key has already been designated "
3474 sprintf(buf
,"%08lX%08lX",
3475 (ulong
)pk
->keyid
[0],(ulong
)pk
->keyid
[1]);
3476 write_status_text(STATUS_ALREADY_SIGNED
,buf
);
3482 if(i
<pk
->numrevkeys
)
3486 print_pubkey_info(NULL
,revoker_pk
);
3487 print_fingerprint(revoker_pk
,NULL
,2);
3490 tty_printf(_("WARNING: appointing a key as a designated revoker "
3491 "cannot be undone!\n"));
3495 if(!cpr_get_answer_is_yes("keyedit.add_revoker.okay",
3496 _("Are you sure you want to appoint this "
3497 "key as a designated revoker? (y/N) ")))
3500 free_public_key(revoker_pk
);
3505 /* The 1F signature must be at least v4 to carry the revocation key
3507 rc
= make_keysig_packet( &sig
, pk
, NULL
, NULL
, sk
, 0x1F, 0, 4, 0, 0,
3508 keygen_add_revkey
,&revkey
);
3511 log_error("signing failed: %s\n", g10_errstr(rc
) );
3515 free_secret_key(sk
);
3518 /* insert into secret keyblock */
3519 pkt
= xmalloc_clear( sizeof *pkt
);
3520 pkt
->pkttype
= PKT_SIGNATURE
;
3521 pkt
->pkt
.signature
= copy_signature(NULL
, sig
);
3522 insert_kbnode( sec_keyblock
, new_kbnode(pkt
), PKT_SIGNATURE
);
3524 /* insert into public keyblock */
3525 pkt
= xmalloc_clear( sizeof *pkt
);
3526 pkt
->pkttype
= PKT_SIGNATURE
;
3527 pkt
->pkt
.signature
= sig
;
3528 insert_kbnode( pub_keyblock
, new_kbnode(pkt
), PKT_SIGNATURE
);
3534 free_secret_key(sk
);
3536 free_seckey_enc(sig
);
3538 free_public_key(revoker_pk
);
3545 menu_expire( KBNODE pub_keyblock
, KBNODE sec_keyblock
)
3547 int n1
, signumber
, rc
;
3550 PKT_secret_key
*sk
; /* copy of the main sk */
3551 PKT_public_key
*main_pk
, *sub_pk
;
3556 if( count_selected_keys( sec_keyblock
) ) {
3557 tty_printf(_("Please remove selections from the secret keys.\n"));
3561 n1
= count_selected_keys( pub_keyblock
);
3563 tty_printf(_("Please select at most one subkey.\n"));
3567 tty_printf(_("Changing expiration time for a subkey.\n"));
3570 tty_printf(_("Changing expiration time for the primary key.\n"));
3572 no_primary_warning(pub_keyblock
);
3575 expiredate
= ask_expiredate();
3576 node
= find_kbnode( sec_keyblock
, PKT_SECRET_KEY
);
3577 sk
= copy_secret_key( NULL
, node
->pkt
->pkt
.secret_key
);
3579 /* Now we can actually change the self signature(s) */
3580 main_pk
= sub_pk
= NULL
;
3583 for( node
=pub_keyblock
; node
; node
= node
->next
) {
3584 if( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
) {
3585 main_pk
= node
->pkt
->pkt
.public_key
;
3586 keyid_from_pk( main_pk
, keyid
);
3587 main_pk
->expiredate
= expiredate
;
3589 else if( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
3590 && (node
->flag
& NODFLG_SELKEY
) ) {
3591 sub_pk
= node
->pkt
->pkt
.public_key
;
3592 sub_pk
->expiredate
= expiredate
;
3594 else if( node
->pkt
->pkttype
== PKT_USER_ID
)
3595 uid
= node
->pkt
->pkt
.user_id
;
3596 else if( main_pk
&& node
->pkt
->pkttype
== PKT_SIGNATURE
3597 && ( mainkey
|| sub_pk
) ) {
3598 PKT_signature
*sig
= node
->pkt
->pkt
.signature
;
3599 if( keyid
[0] == sig
->keyid
[0] && keyid
[1] == sig
->keyid
[1]
3600 && ( (mainkey
&& uid
3601 && uid
->created
&& (sig
->sig_class
&~3) == 0x10)
3602 || (!mainkey
&& sig
->sig_class
== 0x18) )
3603 && sig
->flags
.chosen_selfsig
)
3605 /* this is a selfsignature which is to be replaced */
3606 PKT_signature
*newsig
;
3613 if( (mainkey
&& main_pk
->version
< 4)
3614 || (!mainkey
&& sub_pk
->version
< 4 ) ) {
3616 "You can't change the expiration date of a v3 key\n"));
3617 free_secret_key( sk
);
3621 /* find the corresponding secret self-signature */
3622 for( sn
=sec_keyblock
; sn
; sn
= sn
->next
) {
3623 if( sn
->pkt
->pkttype
== PKT_SIGNATURE
) {
3624 PKT_signature
*b
= sn
->pkt
->pkt
.signature
;
3625 if( keyid
[0] == b
->keyid
[0] && keyid
[1] == b
->keyid
[1]
3626 && sig
->sig_class
== b
->sig_class
3627 && ++signumber2
== signumber
)
3632 log_info(_("No corresponding signature in secret ring\n"));
3635 rc
= update_keysig_packet(&newsig
, sig
, main_pk
, uid
, NULL
,
3636 sk
, keygen_add_key_expire
, main_pk
);
3638 rc
= update_keysig_packet(&newsig
, sig
, main_pk
, NULL
, sub_pk
,
3639 sk
, keygen_add_key_expire
, sub_pk
);
3641 log_error("make_keysig_packet failed: %s\n",
3643 free_secret_key( sk
);
3646 /* replace the packet */
3647 newpkt
= xmalloc_clear( sizeof *newpkt
);
3648 newpkt
->pkttype
= PKT_SIGNATURE
;
3649 newpkt
->pkt
.signature
= newsig
;
3650 free_packet( node
->pkt
);
3654 newpkt
= xmalloc_clear( sizeof *newpkt
);
3655 newpkt
->pkttype
= PKT_SIGNATURE
;
3656 newpkt
->pkt
.signature
= copy_signature( NULL
, newsig
);
3657 free_packet( sn
->pkt
);
3666 free_secret_key( sk
);
3672 menu_backsign(KBNODE pub_keyblock
,KBNODE sec_keyblock
)
3675 PKT_public_key
*main_pk
;
3676 PKT_secret_key
*main_sk
,*sub_sk
=NULL
;
3680 assert(pub_keyblock
->pkt
->pkttype
==PKT_PUBLIC_KEY
);
3681 assert(sec_keyblock
->pkt
->pkttype
==PKT_SECRET_KEY
);
3683 merge_keys_and_selfsig(pub_keyblock
);
3684 main_pk
=pub_keyblock
->pkt
->pkt
.public_key
;
3685 main_sk
=copy_secret_key(NULL
,sec_keyblock
->pkt
->pkt
.secret_key
);
3686 keyid_from_pk(main_pk
,NULL
);
3688 /* We use the same timestamp for all backsigs so that we don't
3689 reveal information about the used machine. */
3690 timestamp
= make_timestamp ();
3692 for(node
=pub_keyblock
;node
;node
=node
->next
)
3694 PKT_public_key
*sub_pk
=NULL
;
3695 KBNODE node2
,sig_pk
=NULL
,sig_sk
=NULL
;
3700 free_secret_key(sub_sk
);
3704 /* Find a signing subkey with no backsig */
3705 if(node
->pkt
->pkttype
==PKT_PUBLIC_SUBKEY
)
3707 if(node
->pkt
->pkt
.public_key
->pubkey_usage
&PUBKEY_USAGE_SIG
)
3709 if(node
->pkt
->pkt
.public_key
->backsig
)
3710 tty_printf(_("signing subkey %s is already cross-certified\n"),
3711 keystr_from_pk(node
->pkt
->pkt
.public_key
));
3713 sub_pk
=node
->pkt
->pkt
.public_key
;
3716 tty_printf(_("subkey %s does not sign and so does"
3717 " not need to be cross-certified\n"),
3718 keystr_from_pk(node
->pkt
->pkt
.public_key
));
3724 /* Find the selected selfsig on this subkey */
3725 for(node2
=node
->next
;
3726 node2
&& node2
->pkt
->pkttype
==PKT_SIGNATURE
;
3728 if(node2
->pkt
->pkt
.signature
->version
>=4
3729 && node2
->pkt
->pkt
.signature
->flags
.chosen_selfsig
)
3738 /* Find the secret subkey that matches the public subkey */
3739 for(node2
=sec_keyblock
;node2
;node2
=node2
->next
)
3740 if(node2
->pkt
->pkttype
==PKT_SECRET_SUBKEY
3741 && !cmp_public_secret_key(sub_pk
,node2
->pkt
->pkt
.secret_key
))
3743 sub_sk
=copy_secret_key(NULL
,node2
->pkt
->pkt
.secret_key
);
3749 tty_printf(_("no secret subkey for public subkey %s - ignoring\n"),
3750 keystr_from_pk(sub_pk
));
3754 /* Now finally find the matching selfsig on the secret subkey.
3755 We can't use chosen_selfsig here (it's not set for secret
3756 keys), so we just pick the selfsig with the right class.
3757 This is what menu_expire does as well. */
3758 for(node2
=node2
->next
;
3759 node2
&& node2
->pkt
->pkttype
!=PKT_SECRET_SUBKEY
;
3761 if(node2
->pkt
->pkttype
==PKT_SIGNATURE
3762 && node2
->pkt
->pkt
.signature
->version
>=4
3763 && node2
->pkt
->pkt
.signature
->keyid
[0]==sig_pk
->pkt
->pkt
.signature
->keyid
[0]
3764 && node2
->pkt
->pkt
.signature
->keyid
[1]==sig_pk
->pkt
->pkt
.signature
->keyid
[1]
3765 && node2
->pkt
->pkt
.signature
->sig_class
==sig_pk
->pkt
->pkt
.signature
->sig_class
)
3771 /* Now we can get to work. We have a main key and secret part,
3772 a signing subkey with signature and secret part possibly with
3775 passphrase
=get_last_passphrase();
3776 set_next_passphrase(passphrase
);
3779 rc
= make_backsig (sig_pk
->pkt
->pkt
.signature
, main_pk
, sub_pk
, sub_sk
,
3783 PKT_signature
*newsig
;
3786 passphrase
=get_last_passphrase();
3787 set_next_passphrase(passphrase
);
3790 rc
=update_keysig_packet(&newsig
,sig_pk
->pkt
->pkt
.signature
,main_pk
,
3791 NULL
,sub_pk
,main_sk
,NULL
,NULL
);
3794 /* Put the new sig into place on the pubkey */
3795 newpkt
=xmalloc_clear(sizeof(*newpkt
));
3796 newpkt
->pkttype
=PKT_SIGNATURE
;
3797 newpkt
->pkt
.signature
=newsig
;
3798 free_packet(sig_pk
->pkt
);
3804 /* Put the new sig into place on the seckey */
3805 newpkt
=xmalloc_clear(sizeof(*newpkt
));
3806 newpkt
->pkttype
=PKT_SIGNATURE
;
3807 newpkt
->pkt
.signature
=copy_signature(NULL
,newsig
);
3808 free_packet(sig_sk
->pkt
);
3817 log_error("update_keysig_packet failed: %s\n",g10_errstr(rc
));
3823 log_error("make_backsig failed: %s\n",g10_errstr(rc
));
3828 set_next_passphrase(NULL
);
3830 free_secret_key(main_sk
);
3832 free_secret_key(sub_sk
);
3839 change_primary_uid_cb ( PKT_signature
*sig
, void *opaque
)
3843 /* first clear all primary uid flags so that we are sure none are
3844 * lingering around */
3845 delete_sig_subpkt (sig
->hashed
, SIGSUBPKT_PRIMARY_UID
);
3846 delete_sig_subpkt (sig
->unhashed
, SIGSUBPKT_PRIMARY_UID
);
3848 /* if opaque is set,we want to set the primary id */
3851 build_sig_subpkt (sig
, SIGSUBPKT_PRIMARY_UID
, buf
, 1 );
3859 * Set the primary uid flag for the selected UID. We will also reset
3860 * all other primary uid flags. For this to work with have to update
3861 * all the signature timestamps. If we would do this with the current
3862 * time, we lose quite a lot of information, so we use a a kludge to
3863 * do this: Just increment the timestamp by one second which is
3864 * sufficient to updated a signature during import.
3867 menu_set_primary_uid ( KBNODE pub_keyblock
, KBNODE sec_keyblock
)
3869 PKT_secret_key
*sk
; /* copy of the main sk */
3870 PKT_public_key
*main_pk
;
3878 if ( count_selected_uids (pub_keyblock
) != 1 ) {
3879 tty_printf(_("Please select exactly one user ID.\n"));
3883 node
= find_kbnode( sec_keyblock
, PKT_SECRET_KEY
);
3884 sk
= copy_secret_key( NULL
, node
->pkt
->pkt
.secret_key
);
3886 /* Now we can actually change the self signature(s) */
3891 /* Is our selected uid an attribute packet? */
3892 for ( node
=pub_keyblock
; node
; node
= node
->next
)
3893 if (node
->pkt
->pkttype
== PKT_USER_ID
&& node
->flag
& NODFLG_SELUID
)
3894 attribute
= (node
->pkt
->pkt
.user_id
->attrib_data
!=NULL
);
3896 for ( node
=pub_keyblock
; node
; node
= node
->next
) {
3897 if ( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
)
3900 if ( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
) {
3901 main_pk
= node
->pkt
->pkt
.public_key
;
3902 keyid_from_pk( main_pk
, keyid
);
3904 else if ( node
->pkt
->pkttype
== PKT_USER_ID
) {
3905 uid
= node
->pkt
->pkt
.user_id
;
3906 selected
= node
->flag
& NODFLG_SELUID
;
3908 else if ( main_pk
&& uid
&& node
->pkt
->pkttype
== PKT_SIGNATURE
) {
3909 PKT_signature
*sig
= node
->pkt
->pkt
.signature
;
3910 if ( keyid
[0] == sig
->keyid
[0] && keyid
[1] == sig
->keyid
[1]
3911 && (uid
&& (sig
->sig_class
&~3) == 0x10)
3912 && attribute
== (uid
->attrib_data
!=NULL
)
3913 && sig
->flags
.chosen_selfsig
)
3915 if(sig
->version
< 4) {
3916 char *user
=utf8_to_native(uid
->name
,strlen(uid
->name
),0);
3918 log_info(_("skipping v3 self-signature on user ID \"%s\"\n"),
3923 /* This is a selfsignature which is to be replaced.
3924 We can just ignore v3 signatures because they are
3925 not able to carry the primary ID flag. We also
3926 ignore self-sigs on user IDs that are not of the
3927 same type that we are making primary. That is, if
3928 we are making a user ID primary, we alter user IDs.
3929 If we are making an attribute packet primary, we
3930 alter attribute packets. */
3932 /* FIXME: We must make sure that we only have one
3933 self-signature per user ID here (not counting
3935 PKT_signature
*newsig
;
3940 /* see whether this signature has the primary UID flag */
3941 p
= parse_sig_subpkt (sig
->hashed
,
3942 SIGSUBPKT_PRIMARY_UID
, NULL
);
3944 p
= parse_sig_subpkt (sig
->unhashed
,
3945 SIGSUBPKT_PRIMARY_UID
, NULL
);
3946 if ( p
&& *p
) /* yes */
3947 action
= selected
? 0 : -1;
3949 action
= selected
? 1 : 0;
3952 int rc
= update_keysig_packet (&newsig
, sig
,
3955 change_primary_uid_cb
,
3956 action
> 0? "x":NULL
);
3958 log_error ("update_keysig_packet failed: %s\n",
3960 free_secret_key( sk
);
3963 /* replace the packet */
3964 newpkt
= xmalloc_clear( sizeof *newpkt
);
3965 newpkt
->pkttype
= PKT_SIGNATURE
;
3966 newpkt
->pkt
.signature
= newsig
;
3967 free_packet( node
->pkt
);
3977 free_secret_key( sk
);
3983 * Set preferences to new values for the selected user IDs
3986 menu_set_preferences (KBNODE pub_keyblock
, KBNODE sec_keyblock
)
3988 PKT_secret_key
*sk
; /* copy of the main sk */
3989 PKT_public_key
*main_pk
;
3993 int selected
, select_all
;
3996 no_primary_warning(pub_keyblock
);
3998 select_all
= !count_selected_uids (pub_keyblock
);
4000 node
= find_kbnode( sec_keyblock
, PKT_SECRET_KEY
);
4001 sk
= copy_secret_key( NULL
, node
->pkt
->pkt
.secret_key
);
4003 /* Now we can actually change the self signature(s) */
4007 for ( node
=pub_keyblock
; node
; node
= node
->next
) {
4008 if ( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
)
4011 if ( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
) {
4012 main_pk
= node
->pkt
->pkt
.public_key
;
4013 keyid_from_pk( main_pk
, keyid
);
4015 else if ( node
->pkt
->pkttype
== PKT_USER_ID
) {
4016 uid
= node
->pkt
->pkt
.user_id
;
4017 selected
= select_all
|| (node
->flag
& NODFLG_SELUID
);
4019 else if ( main_pk
&& uid
&& selected
4020 && node
->pkt
->pkttype
== PKT_SIGNATURE
) {
4021 PKT_signature
*sig
= node
->pkt
->pkt
.signature
;
4022 if ( keyid
[0] == sig
->keyid
[0] && keyid
[1] == sig
->keyid
[1]
4023 && (uid
&& (sig
->sig_class
&~3) == 0x10)
4024 && sig
->flags
.chosen_selfsig
) {
4025 if( sig
->version
< 4 ) {
4026 char *user
=utf8_to_native(uid
->name
,strlen(uid
->name
),0);
4028 log_info(_("skipping v3 self-signature on user ID \"%s\"\n"),
4033 /* This is a selfsignature which is to be replaced
4034 * We have to ignore v3 signatures because they are
4035 * not able to carry the preferences */
4036 PKT_signature
*newsig
;
4040 rc
= update_keysig_packet (&newsig
, sig
,
4043 keygen_upd_std_prefs
,
4046 log_error ("update_keysig_packet failed: %s\n",
4048 free_secret_key( sk
);
4051 /* replace the packet */
4052 newpkt
= xmalloc_clear( sizeof *newpkt
);
4053 newpkt
->pkttype
= PKT_SIGNATURE
;
4054 newpkt
->pkt
.signature
= newsig
;
4055 free_packet( node
->pkt
);
4064 free_secret_key( sk
);
4070 menu_set_keyserver_url (const char *url
,
4071 KBNODE pub_keyblock
, KBNODE sec_keyblock
)
4073 PKT_secret_key
*sk
; /* copy of the main sk */
4074 PKT_public_key
*main_pk
;
4078 int selected
, select_all
;
4082 no_primary_warning(pub_keyblock
);
4085 answer
=xstrdup(url
);
4088 answer
=cpr_get_utf8("keyedit.add_keyserver",
4089 _("Enter your preferred keyserver URL: "));
4090 if(answer
[0]=='\0' || answer
[0]=='\004')
4097 if(ascii_strcasecmp(answer
,"none")==0)
4101 struct keyserver_spec
*keyserver
=NULL
;
4102 /* Sanity check the format */
4103 keyserver
=parse_keyserver_uri(answer
,1,NULL
,0);
4107 log_info(_("could not parse keyserver URL\n"));
4110 uri
=xstrdup(keyserver
->uri
);
4111 free_keyserver_spec(keyserver
);
4114 select_all
= !count_selected_uids (pub_keyblock
);
4116 node
= find_kbnode( sec_keyblock
, PKT_SECRET_KEY
);
4117 sk
= copy_secret_key( NULL
, node
->pkt
->pkt
.secret_key
);
4119 /* Now we can actually change the self signature(s) */
4123 for ( node
=pub_keyblock
; node
; node
= node
->next
)
4125 if ( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
)
4128 if ( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
)
4130 main_pk
= node
->pkt
->pkt
.public_key
;
4131 keyid_from_pk( main_pk
, keyid
);
4133 else if ( node
->pkt
->pkttype
== PKT_USER_ID
)
4135 uid
= node
->pkt
->pkt
.user_id
;
4136 selected
= select_all
|| (node
->flag
& NODFLG_SELUID
);
4138 else if ( main_pk
&& uid
&& selected
4139 && node
->pkt
->pkttype
== PKT_SIGNATURE
)
4141 PKT_signature
*sig
= node
->pkt
->pkt
.signature
;
4142 if ( keyid
[0] == sig
->keyid
[0] && keyid
[1] == sig
->keyid
[1]
4143 && (uid
&& (sig
->sig_class
&~3) == 0x10)
4144 && sig
->flags
.chosen_selfsig
)
4146 char *user
=utf8_to_native(uid
->name
,strlen(uid
->name
),0);
4147 if( sig
->version
< 4 )
4148 log_info(_("skipping v3 self-signature on user ID \"%s\"\n"),
4152 /* This is a selfsignature which is to be replaced
4153 * We have to ignore v3 signatures because they are
4154 * not able to carry the subpacket. */
4155 PKT_signature
*newsig
;
4161 p
=parse_sig_subpkt(sig
->hashed
,SIGSUBPKT_PREF_KS
,&plen
);
4164 tty_printf("Current preferred keyserver for user"
4165 " ID \"%s\": ",user
);
4166 tty_print_utf8_string(p
,plen
);
4168 if(!cpr_get_answer_is_yes("keyedit.confirm_keyserver",
4169 uri
?_("Are you sure you want to replace it? (y/N) "):
4170 _("Are you sure you want to delete it? (y/N) ")))
4175 /* There is no current keyserver URL, so there
4176 is no point in trying to un-set it. */
4180 rc
= update_keysig_packet (&newsig
, sig
,
4183 keygen_add_keyserver_url
, uri
);
4186 log_error ("update_keysig_packet failed: %s\n",
4188 free_secret_key( sk
);
4192 /* replace the packet */
4193 newpkt
= xmalloc_clear( sizeof *newpkt
);
4194 newpkt
->pkttype
= PKT_SIGNATURE
;
4195 newpkt
->pkt
.signature
= newsig
;
4196 free_packet( node
->pkt
);
4208 free_secret_key( sk
);
4213 menu_set_notation(const char *string
,KBNODE pub_keyblock
,KBNODE sec_keyblock
)
4215 PKT_secret_key
*sk
; /* copy of the main sk */
4216 PKT_public_key
*main_pk
;
4220 int selected
, select_all
;
4223 struct notation
*notation
;
4225 no_primary_warning(pub_keyblock
);
4228 answer
=xstrdup(string
);
4231 answer
=cpr_get_utf8("keyedit.add_notation",
4232 _("Enter the notation: "));
4233 if(answer
[0]=='\0' || answer
[0]=='\004')
4240 if(ascii_strcasecmp(answer
,"none")==0
4241 || ascii_strcasecmp(answer
,"-")==0)
4242 notation
=NULL
; /* delete them all */
4245 notation
=string_to_notation(answer
,0);
4255 select_all
= !count_selected_uids (pub_keyblock
);
4257 node
= find_kbnode( sec_keyblock
, PKT_SECRET_KEY
);
4258 sk
= copy_secret_key( NULL
, node
->pkt
->pkt
.secret_key
);
4260 /* Now we can actually change the self signature(s) */
4264 for ( node
=pub_keyblock
; node
; node
= node
->next
)
4266 if ( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
)
4269 if ( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
)
4271 main_pk
= node
->pkt
->pkt
.public_key
;
4272 keyid_from_pk( main_pk
, keyid
);
4274 else if ( node
->pkt
->pkttype
== PKT_USER_ID
)
4276 uid
= node
->pkt
->pkt
.user_id
;
4277 selected
= select_all
|| (node
->flag
& NODFLG_SELUID
);
4279 else if ( main_pk
&& uid
&& selected
4280 && node
->pkt
->pkttype
== PKT_SIGNATURE
)
4282 PKT_signature
*sig
= node
->pkt
->pkt
.signature
;
4283 if ( keyid
[0] == sig
->keyid
[0] && keyid
[1] == sig
->keyid
[1]
4284 && (uid
&& (sig
->sig_class
&~3) == 0x10)
4285 && sig
->flags
.chosen_selfsig
)
4287 char *user
=utf8_to_native(uid
->name
,strlen(uid
->name
),0);
4288 if( sig
->version
< 4 )
4289 log_info(_("skipping v3 self-signature on user ID \"%s\"\n"),
4293 PKT_signature
*newsig
;
4295 int rc
,skip
=0,addonly
=1;
4297 if(sig
->flags
.notation
)
4299 tty_printf("Current notations for user ID \"%s\":\n",
4301 tty_print_notations(-9,sig
);
4305 tty_printf("No notations on user ID \"%s\"\n",user
);
4308 /* There are no current notations, so there
4309 is no point in trying to un-set them. */
4319 notation
->next
=sig_to_notation(sig
);
4321 for(n
=notation
->next
;n
;n
=n
->next
)
4322 if(strcmp(n
->name
,notation
->name
)==0)
4326 if(strcmp(n
->value
,notation
->value
)==0)
4328 if(notation
->flags
.ignore
)
4330 /* Value match with a delete
4337 /* Adding the same notation
4338 twice, so don't add it at
4341 tty_printf("Skipping notation:"
4351 /* No value, so it means delete. */
4358 tty_printf("Removing notation: %s=%s\n",
4364 if(!notation
->flags
.ignore
&& !skip
)
4365 tty_printf("Adding notation: %s=%s\n",
4366 notation
->name
,notation
->value
);
4368 /* We tried to delete, but had no matches */
4369 if(notation
->flags
.ignore
&& !deleting
)
4374 tty_printf("Removing all notations\n");
4380 && !cpr_get_answer_is_yes("keyedit.confirm_notation",
4381 _("Proceed? (y/N) "))))
4384 rc
= update_keysig_packet (&newsig
, sig
,
4387 keygen_add_notations
, notation
);
4390 log_error ("update_keysig_packet failed: %s\n",
4392 free_secret_key( sk
);
4393 free_notation(notation
);
4398 /* replace the packet */
4399 newpkt
= xmalloc_clear( sizeof *newpkt
);
4400 newpkt
->pkttype
= PKT_SIGNATURE
;
4401 newpkt
->pkt
.signature
= newsig
;
4402 free_packet( node
->pkt
);
4409 /* Snip off the notation list from the sig */
4410 free_notation(notation
->next
);
4411 notation
->next
=NULL
;
4420 free_notation(notation
);
4421 free_secret_key( sk
);
4427 * Select one user id or remove all selection if index is 0.
4428 * Returns: True if the selection changed;
4431 menu_select_uid( KBNODE keyblock
, int idx
)
4436 /* first check that the index is valid */
4438 for( i
=0, node
= keyblock
; node
; node
= node
->next
) {
4439 if( node
->pkt
->pkttype
== PKT_USER_ID
) {
4445 tty_printf(_("No user ID with index %d\n"), idx
);
4449 else { /* reset all */
4450 for( i
=0, node
= keyblock
; node
; node
= node
->next
) {
4451 if( node
->pkt
->pkttype
== PKT_USER_ID
)
4452 node
->flag
&= ~NODFLG_SELUID
;
4456 /* and toggle the new index */
4457 for( i
=0, node
= keyblock
; node
; node
= node
->next
) {
4458 if( node
->pkt
->pkttype
== PKT_USER_ID
) {
4460 if( (node
->flag
& NODFLG_SELUID
) )
4461 node
->flag
&= ~NODFLG_SELUID
;
4463 node
->flag
|= NODFLG_SELUID
;
4471 /* Search in the keyblock for a uid that matches namehash */
4473 menu_select_uid_namehash( KBNODE keyblock
, const char *namehash
)
4475 byte hash
[NAMEHASH_LEN
];
4479 assert(strlen(namehash
)==NAMEHASH_LEN
*2);
4481 for(i
=0;i
<NAMEHASH_LEN
;i
++)
4482 hash
[i
]=hextobyte(&namehash
[i
*2]);
4484 for(node
=keyblock
->next
;node
;node
=node
->next
)
4486 if(node
->pkt
->pkttype
==PKT_USER_ID
)
4488 namehash_from_uid(node
->pkt
->pkt
.user_id
);
4489 if(memcmp(node
->pkt
->pkt
.user_id
->namehash
,hash
,NAMEHASH_LEN
)==0)
4491 if(node
->flag
&NODFLG_SELUID
)
4492 node
->flag
&= ~NODFLG_SELUID
;
4494 node
->flag
|= NODFLG_SELUID
;
4503 tty_printf(_("No user ID with hash %s\n"),namehash
);
4511 * Select secondary keys
4512 * Returns: True if the selection changed;
4515 menu_select_key( KBNODE keyblock
, int idx
)
4520 /* first check that the index is valid */
4522 for( i
=0, node
= keyblock
; node
; node
= node
->next
) {
4523 if( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
4524 || node
->pkt
->pkttype
== PKT_SECRET_SUBKEY
) {
4530 tty_printf(_("No subkey with index %d\n"), idx
);
4534 else { /* reset all */
4535 for( i
=0, node
= keyblock
; node
; node
= node
->next
) {
4536 if( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
4537 || node
->pkt
->pkttype
== PKT_SECRET_SUBKEY
)
4538 node
->flag
&= ~NODFLG_SELKEY
;
4542 /* and set the new index */
4543 for( i
=0, node
= keyblock
; node
; node
= node
->next
) {
4544 if( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
4545 || node
->pkt
->pkttype
== PKT_SECRET_SUBKEY
) {
4547 if( (node
->flag
& NODFLG_SELKEY
) )
4548 node
->flag
&= ~NODFLG_SELKEY
;
4550 node
->flag
|= NODFLG_SELKEY
;
4560 count_uids_with_flag( KBNODE keyblock
, unsigned flag
)
4565 for( node
= keyblock
; node
; node
= node
->next
)
4566 if( node
->pkt
->pkttype
== PKT_USER_ID
&& (node
->flag
& flag
) )
4572 count_keys_with_flag( KBNODE keyblock
, unsigned flag
)
4577 for( node
= keyblock
; node
; node
= node
->next
)
4578 if( ( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
4579 || node
->pkt
->pkttype
== PKT_SECRET_SUBKEY
)
4580 && (node
->flag
& flag
) )
4586 count_uids( KBNODE keyblock
)
4591 for( node
= keyblock
; node
; node
= node
->next
)
4592 if( node
->pkt
->pkttype
== PKT_USER_ID
)
4599 * Returns true if there is at least one selected user id
4602 count_selected_uids( KBNODE keyblock
)
4604 return count_uids_with_flag( keyblock
, NODFLG_SELUID
);
4608 count_selected_keys( KBNODE keyblock
)
4610 return count_keys_with_flag( keyblock
, NODFLG_SELKEY
);
4613 /* returns how many real (i.e. not attribute) uids are unmarked */
4615 real_uids_left( KBNODE keyblock
)
4620 for(node
=keyblock
;node
;node
=node
->next
)
4621 if(node
->pkt
->pkttype
==PKT_USER_ID
&& !(node
->flag
&NODFLG_SELUID
) &&
4622 !node
->pkt
->pkt
.user_id
->attrib_data
)
4629 * Ask whether the signature should be revoked. If the user commits this,
4630 * flag bit MARK_A is set on the signature and the user ID.
4633 ask_revoke_sig( KBNODE keyblock
, KBNODE node
)
4637 PKT_signature
*sig
= node
->pkt
->pkt
.signature
;
4638 KBNODE unode
= find_prev_kbnode( keyblock
, node
, PKT_USER_ID
);
4641 log_error("Oops: no user ID for signature\n");
4645 uid
=unode
->pkt
->pkt
.user_id
;
4649 if(uid
->attrib_data
)
4650 printf("uat:::::::::%u %lu",uid
->numattribs
,uid
->attrib_len
);
4653 printf("uid:::::::::");
4654 print_string (stdout
, uid
->name
, uid
->len
, ':');
4659 print_and_check_one_sig_colon(keyblock
,node
,NULL
,NULL
,NULL
,NULL
,1);
4663 char *p
=utf8_to_native(unode
->pkt
->pkt
.user_id
->name
,
4664 unode
->pkt
->pkt
.user_id
->len
,0);
4665 tty_printf(_("user ID: \"%s\"\n"),p
);
4668 tty_printf(_("signed by your key %s on %s%s%s\n"),
4669 keystr(sig
->keyid
),datestr_from_sig(sig
),
4670 sig
->flags
.exportable
?"":_(" (non-exportable)"),"");
4672 if(sig
->flags
.expired
)
4674 tty_printf(_("This signature expired on %s.\n"),
4675 expirestr_from_sig(sig
));
4676 /* Use a different question so we can have different help text */
4677 doit
=cpr_get_answer_is_yes("ask_revoke_sig.expired",
4678 _("Are you sure you still want to revoke it? (y/N) "));
4681 doit
=cpr_get_answer_is_yes("ask_revoke_sig.one",
4682 _("Create a revocation certificate for this signature? (y/N) "));
4685 node
->flag
|= NODFLG_MARK_A
;
4686 unode
->flag
|= NODFLG_MARK_A
;
4691 * Display all user ids of the current public key together with signatures
4692 * done by one of our keys. Then walk over all this sigs and ask the user
4693 * whether he wants to revoke this signature.
4694 * Return: True when the keyblock has changed.
4697 menu_revsig( KBNODE keyblock
)
4700 PKT_public_key
*primary_pk
;
4703 int rc
, any
, skip
=1, all
=!count_selected_uids(keyblock
);
4704 struct revocation_reason_info
*reason
= NULL
;
4706 assert(keyblock
->pkt
->pkttype
==PKT_PUBLIC_KEY
);
4708 /* FIXME: detect duplicates here */
4709 tty_printf(_("You have signed these user IDs on key %s:\n"),
4710 keystr_from_pk(keyblock
->pkt
->pkt
.public_key
));
4711 for( node
= keyblock
; node
; node
= node
->next
) {
4712 node
->flag
&= ~(NODFLG_SELSIG
| NODFLG_MARK_A
);
4713 if( node
->pkt
->pkttype
== PKT_USER_ID
) {
4714 if( node
->flag
&NODFLG_SELUID
|| all
) {
4715 PKT_user_id
*uid
= node
->pkt
->pkt
.user_id
;
4716 /* Hmmm: Should we show only UIDs with a signature? */
4718 tty_print_utf8_string( uid
->name
, uid
->len
);
4725 else if( !skip
&& node
->pkt
->pkttype
== PKT_SIGNATURE
4726 && ((sig
= node
->pkt
->pkt
.signature
),
4727 !seckey_available(sig
->keyid
) ) )
4729 if( (sig
->sig_class
&~3) == 0x10 )
4732 tty_printf(_("signed by your key %s on %s%s%s\n"),
4733 keystr(sig
->keyid
), datestr_from_sig(sig
),
4734 sig
->flags
.exportable
?"":_(" (non-exportable)"),
4735 sig
->flags
.revocable
?"":_(" (non-revocable)"));
4736 if(sig
->flags
.revocable
)
4737 node
->flag
|= NODFLG_SELSIG
;
4739 else if( sig
->sig_class
== 0x30 )
4742 tty_printf(_("revoked by your key %s on %s\n"),
4743 keystr(sig
->keyid
),datestr_from_sig(sig
));
4751 for( node
= keyblock
; node
; node
= node
->next
) {
4752 if( !(node
->flag
& NODFLG_SELSIG
) )
4754 ask_revoke_sig( keyblock
, node
);
4757 /* present selected */
4759 for( node
= keyblock
; node
; node
= node
->next
) {
4760 if( !(node
->flag
& NODFLG_MARK_A
) )
4764 tty_printf(_("You are about to revoke these signatures:\n"));
4766 if( node
->pkt
->pkttype
== PKT_USER_ID
) {
4767 PKT_user_id
*uid
= node
->pkt
->pkt
.user_id
;
4769 tty_print_utf8_string( uid
->name
, uid
->len
);
4772 else if( node
->pkt
->pkttype
== PKT_SIGNATURE
) {
4773 sig
= node
->pkt
->pkt
.signature
;
4775 tty_printf(_("signed by your key %s on %s%s%s\n"),
4776 keystr(sig
->keyid
), datestr_from_sig(sig
),"",
4777 sig
->flags
.exportable
?"":_(" (non-exportable)") );
4781 return 0; /* none selected */
4783 if( !cpr_get_answer_is_yes("ask_revoke_sig.okay",
4784 _("Really create the revocation certificates? (y/N) ")) )
4785 return 0; /* forget it */
4787 reason
= ask_revocation_reason( 0, 1, 0 );
4788 if( !reason
) { /* user decided to cancel */
4792 /* now we can sign the user ids */
4793 reloop
: /* (must use this, because we are modifing the list) */
4794 primary_pk
= keyblock
->pkt
->pkt
.public_key
;
4795 for( node
=keyblock
; node
; node
= node
->next
) {
4798 struct sign_attrib attrib
;
4801 if( !(node
->flag
& NODFLG_MARK_A
)
4802 || node
->pkt
->pkttype
!= PKT_SIGNATURE
)
4804 unode
= find_prev_kbnode( keyblock
, node
, PKT_USER_ID
);
4805 assert( unode
); /* we already checked this */
4807 memset( &attrib
, 0, sizeof attrib
);
4808 attrib
.reason
= reason
;
4809 attrib
.non_exportable
=!node
->pkt
->pkt
.signature
->flags
.exportable
;
4811 node
->flag
&= ~NODFLG_MARK_A
;
4812 sk
= xmalloc_secure_clear( sizeof *sk
);
4813 if( get_seckey( sk
, node
->pkt
->pkt
.signature
->keyid
) ) {
4814 log_info(_("no secret key\n"));
4817 rc
= make_keysig_packet( &sig
, primary_pk
,
4818 unode
->pkt
->pkt
.user_id
,
4824 free_secret_key(sk
);
4826 log_error(_("signing failed: %s\n"), g10_errstr(rc
));
4827 release_revocation_reason_info( reason
);
4830 changed
= 1; /* we changed the keyblock */
4832 /* Are we revoking our own uid? */
4833 if(primary_pk
->keyid
[0]==sig
->keyid
[0] &&
4834 primary_pk
->keyid
[1]==sig
->keyid
[1])
4835 unode
->pkt
->pkt
.user_id
->is_revoked
=1;
4836 pkt
= xmalloc_clear( sizeof *pkt
);
4837 pkt
->pkttype
= PKT_SIGNATURE
;
4838 pkt
->pkt
.signature
= sig
;
4839 insert_kbnode( unode
, new_kbnode(pkt
), 0 );
4843 release_revocation_reason_info( reason
);
4847 /* Revoke a user ID (i.e. revoke a user ID selfsig). Return true if
4848 keyblock changed. */
4850 menu_revuid( KBNODE pub_keyblock
, KBNODE sec_keyblock
)
4852 PKT_public_key
*pk
= pub_keyblock
->pkt
->pkt
.public_key
;
4853 PKT_secret_key
*sk
= copy_secret_key( NULL
,
4854 sec_keyblock
->pkt
->pkt
.secret_key
);
4858 struct revocation_reason_info
*reason
= NULL
;
4860 /* Note that this is correct as per the RFCs, but nevertheless
4861 somewhat meaningless in the real world. 1991 did define the 0x30
4862 sig class, but PGP 2.x did not actually implement it, so it would
4863 probably be safe to use v4 revocations everywhere. -ds */
4865 for( node
= pub_keyblock
; node
; node
= node
->next
)
4866 if(pk
->version
>3 || (node
->pkt
->pkttype
==PKT_USER_ID
&&
4867 node
->pkt
->pkt
.user_id
->selfsigversion
>3))
4869 if((reason
= ask_revocation_reason( 0, 1, 4 )))
4875 reloop
: /* (better this way because we are modifing the keyring) */
4876 for( node
= pub_keyblock
; node
; node
= node
->next
)
4877 if(node
->pkt
->pkttype
== PKT_USER_ID
&& (node
->flag
& NODFLG_SELUID
))
4879 PKT_user_id
*uid
=node
->pkt
->pkt
.user_id
;
4883 char *user
=utf8_to_native(uid
->name
,uid
->len
,0);
4884 log_info(_("user ID \"%s\" is already revoked\n"),user
);
4891 struct sign_attrib attrib
;
4892 u32 timestamp
=make_timestamp();
4894 if(uid
->created
>=timestamp
)
4896 /* Okay, this is a problem. The user ID selfsig was
4897 created in the future, so we need to warn the user and
4898 set our revocation timestamp one second after that so
4899 everything comes out clean. */
4901 log_info(_("WARNING: a user ID signature is dated %d"
4902 " seconds in the future\n"),uid
->created
-timestamp
);
4904 timestamp
=uid
->created
+1;
4907 memset( &attrib
, 0, sizeof attrib
);
4908 attrib
.reason
= reason
;
4910 node
->flag
&= ~NODFLG_SELUID
;
4912 rc
= make_keysig_packet( &sig
, pk
, uid
, NULL
, sk
, 0x30, 0,
4913 (reason
==NULL
)?3:0, timestamp
, 0,
4914 sign_mk_attrib
, &attrib
);
4917 log_error(_("signing failed: %s\n"), g10_errstr(rc
));
4922 pkt
= xmalloc_clear( sizeof *pkt
);
4923 pkt
->pkttype
= PKT_SIGNATURE
;
4924 pkt
->pkt
.signature
= sig
;
4925 insert_kbnode( node
, new_kbnode(pkt
), 0 );
4927 /* If the trustdb has an entry for this key+uid then the
4928 trustdb needs an update. */
4930 && (get_validity(pk
,uid
)&TRUST_MASK
)>=TRUST_UNDEFINED
)
4934 node
->pkt
->pkt
.user_id
->is_revoked
=1;
4942 commit_kbnode( &pub_keyblock
);
4945 free_secret_key(sk
);
4946 release_revocation_reason_info( reason
);
4951 * Revoke the whole key.
4954 menu_revkey( KBNODE pub_keyblock
, KBNODE sec_keyblock
)
4956 PKT_public_key
*pk
=pub_keyblock
->pkt
->pkt
.public_key
;
4959 struct revocation_reason_info
*reason
;
4965 tty_printf(_("Key %s is already revoked.\n"),keystr_from_pk(pk
));
4969 reason
= ask_revocation_reason( 1, 0, 0 );
4970 /* user decided to cancel */
4974 sk
= copy_secret_key( NULL
, sec_keyblock
->pkt
->pkt
.secret_key
);
4975 rc
= make_keysig_packet( &sig
, pk
, NULL
, NULL
, sk
,
4976 0x20, 0, opt
.force_v4_certs
?4:0, 0, 0,
4977 revocation_reason_build_cb
, reason
);
4978 free_secret_key(sk
);
4981 log_error(_("signing failed: %s\n"), g10_errstr(rc
));
4985 changed
= 1; /* we changed the keyblock */
4987 pkt
= xmalloc_clear( sizeof *pkt
);
4988 pkt
->pkttype
= PKT_SIGNATURE
;
4989 pkt
->pkt
.signature
= sig
;
4990 insert_kbnode( pub_keyblock
, new_kbnode(pkt
), 0 );
4991 commit_kbnode( &pub_keyblock
);
4996 release_revocation_reason_info( reason
);
5001 menu_revsubkey( KBNODE pub_keyblock
, KBNODE sec_keyblock
)
5003 PKT_public_key
*mainpk
;
5007 struct revocation_reason_info
*reason
= NULL
;
5009 reason
= ask_revocation_reason( 1, 0, 0 );
5010 if( !reason
) { /* user decided to cancel */
5014 reloop
: /* (better this way because we are modifing the keyring) */
5015 mainpk
= pub_keyblock
->pkt
->pkt
.public_key
;
5016 for( node
= pub_keyblock
; node
; node
= node
->next
) {
5017 if( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
5018 && (node
->flag
& NODFLG_SELKEY
) ) {
5022 PKT_public_key
*subpk
= node
->pkt
->pkt
.public_key
;
5023 struct sign_attrib attrib
;
5025 if(subpk
->is_revoked
)
5027 tty_printf(_("Subkey %s is already revoked.\n"),
5028 keystr_from_pk(subpk
));
5032 memset( &attrib
, 0, sizeof attrib
);
5033 attrib
.reason
= reason
;
5035 node
->flag
&= ~NODFLG_SELKEY
;
5036 sk
= copy_secret_key( NULL
, sec_keyblock
->pkt
->pkt
.secret_key
);
5037 rc
= make_keysig_packet( &sig
, mainpk
, NULL
, subpk
, sk
,
5039 sign_mk_attrib
, &attrib
);
5040 free_secret_key(sk
);
5042 log_error(_("signing failed: %s\n"), g10_errstr(rc
));
5043 release_revocation_reason_info( reason
);
5046 changed
= 1; /* we changed the keyblock */
5048 pkt
= xmalloc_clear( sizeof *pkt
);
5049 pkt
->pkttype
= PKT_SIGNATURE
;
5050 pkt
->pkt
.signature
= sig
;
5051 insert_kbnode( node
, new_kbnode(pkt
), 0 );
5055 commit_kbnode( &pub_keyblock
);
5056 /*commit_kbnode( &sec_keyblock );*/
5058 /* No need to set update_trust here since signing keys no longer
5059 are used to certify other keys, so there is no change in trust
5060 when revoking/removing them */
5062 release_revocation_reason_info( reason
);
5066 /* Note that update_ownertrust is going to mark the trustdb dirty when
5067 enabling or disabling a key. This is arguably sub-optimal as
5068 disabled keys are still counted in the web of trust, but perhaps
5069 not worth adding extra complexity to change. -ds */
5071 enable_disable_key( KBNODE keyblock
, int disable
)
5073 PKT_public_key
*pk
= find_kbnode( keyblock
, PKT_PUBLIC_KEY
)
5074 ->pkt
->pkt
.public_key
;
5075 unsigned int trust
, newtrust
;
5077 trust
= newtrust
= get_ownertrust (pk
);
5078 newtrust
&= ~TRUST_FLAG_DISABLED
;
5080 newtrust
|= TRUST_FLAG_DISABLED
;
5081 if( trust
== newtrust
)
5082 return 0; /* already in that state */
5083 update_ownertrust(pk
, newtrust
);
5089 menu_showphoto( KBNODE keyblock
)
5092 int select_all
= !count_selected_uids(keyblock
);
5094 PKT_public_key
*pk
=NULL
;
5096 /* Look for the public key first. We have to be really, really,
5097 explicit as to which photo this is, and what key it is a UID on
5098 since people may want to sign it. */
5100 for( node
= keyblock
; node
; node
= node
->next
)
5102 if( node
->pkt
->pkttype
== PKT_PUBLIC_KEY
)
5103 pk
= node
->pkt
->pkt
.public_key
;
5104 else if( node
->pkt
->pkttype
== PKT_USER_ID
)
5106 PKT_user_id
*uid
= node
->pkt
->pkt
.user_id
;
5109 if((select_all
|| (node
->flag
& NODFLG_SELUID
)) &&
5114 for(i
=0;i
<uid
->numattribs
;i
++)
5119 if(uid
->attribs
[i
].type
==ATTRIB_IMAGE
&&
5120 parse_image_header(&uid
->attribs
[i
],&type
,&size
))
5122 tty_printf(_("Displaying %s photo ID of size %ld for "
5123 "key %s (uid %d)\n"),
5124 image_type_to_string(type
,1),
5125 (ulong
)size
,keystr_from_pk(pk
),count
);
5126 show_photos(&uid
->attribs
[i
],1,pk
,NULL
,uid
);