1 /* keygen.c - generate a key pair
2 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 * 2006, 2007 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 #include <sys/types.h>
43 #include "keyserver-internal.h"
44 #include "call-agent.h"
64 pKEYCREATIONDATE
, /* Same in seconds since epoch. */
66 pKEYEXPIRE
, /* in n seconds */
67 pSUBKEYEXPIRE
, /* in n seconds */
78 struct para_data_s
*next
;
87 struct revocation_key revkey
;
92 struct output_control_s
{
101 armor_filter_context_t
*afx
;
107 armor_filter_context_t
*afx
;
112 struct opaque_data_usage_and_pk
{
118 static int prefs_initialized
= 0;
119 static byte sym_prefs
[MAX_PREFS
];
120 static int nsym_prefs
;
121 static byte hash_prefs
[MAX_PREFS
];
122 static int nhash_prefs
;
123 static byte zip_prefs
[MAX_PREFS
];
124 static int nzip_prefs
;
125 static int mdc_available
,ks_modify
;
127 static void do_generate_keypair( struct para_data_s
*para
,
128 struct output_control_s
*outctrl
, int card
);
129 static int write_keyblock( IOBUF out
, KBNODE node
);
130 static int gen_card_key (int algo
, int keyno
, int is_primary
,
131 KBNODE pub_root
, KBNODE sec_root
,
132 PKT_secret_key
**ret_sk
,
134 u32 expireval
, struct para_data_s
*para
);
135 static int gen_card_key_with_backup (int algo
, int keyno
, int is_primary
,
136 KBNODE pub_root
, KBNODE sec_root
,
138 u32 expireval
, struct para_data_s
*para
,
139 const char *backup_dir
);
143 print_status_key_created (int letter
, PKT_public_key
*pk
, const char *handle
)
145 byte array
[MAX_FINGERPRINT_LEN
], *s
;
152 buf
= xmalloc (MAX_FINGERPRINT_LEN
*2+31 + strlen (handle
) + 1);
159 fingerprint_from_pk (pk
, array
, &n
);
161 for (i
=0; i
< n
; i
++, s
++, p
+= 2)
162 sprintf (p
, "%02X", *s
);
167 for (i
=0; handle
[i
] && i
< 100; i
++)
168 *p
++ = isspace ((unsigned int)handle
[i
])? '_':handle
[i
];
171 write_status_text ((letter
|| pk
)?STATUS_KEY_CREATED
:STATUS_KEY_NOT_CREATED
,
177 print_status_key_not_created (const char *handle
)
179 print_status_key_created (0, NULL
, handle
);
185 write_uid( KBNODE root
, const char *s
)
187 PACKET
*pkt
= xmalloc_clear(sizeof *pkt
);
188 size_t n
= strlen(s
);
190 pkt
->pkttype
= PKT_USER_ID
;
191 pkt
->pkt
.user_id
= xmalloc_clear( sizeof *pkt
->pkt
.user_id
+ n
- 1 );
192 pkt
->pkt
.user_id
->len
= n
;
193 pkt
->pkt
.user_id
->ref
= 1;
194 strcpy(pkt
->pkt
.user_id
->name
, s
);
195 add_kbnode( root
, new_kbnode( pkt
) );
199 do_add_key_flags (PKT_signature
*sig
, unsigned int use
)
205 /* The spec says that all primary keys MUST be able to certify. */
206 if(sig
->sig_class
!=0x18)
209 if (use
& PUBKEY_USAGE_SIG
)
211 if (use
& PUBKEY_USAGE_ENC
)
212 buf
[0] |= 0x04 | 0x08;
213 if (use
& PUBKEY_USAGE_AUTH
)
219 build_sig_subpkt (sig
, SIGSUBPKT_KEY_FLAGS
, buf
, 1);
224 keygen_add_key_expire( PKT_signature
*sig
, void *opaque
)
226 PKT_public_key
*pk
= opaque
;
230 if( pk
->expiredate
) {
231 if(pk
->expiredate
> pk
->timestamp
)
232 u
= pk
->expiredate
- pk
->timestamp
;
236 buf
[0] = (u
>> 24) & 0xff;
237 buf
[1] = (u
>> 16) & 0xff;
238 buf
[2] = (u
>> 8) & 0xff;
240 build_sig_subpkt( sig
, SIGSUBPKT_KEY_EXPIRE
, buf
, 4 );
244 /* Make sure we don't leave a key expiration subpacket lying
246 delete_sig_subpkt (sig
->hashed
, SIGSUBPKT_KEY_EXPIRE
);
253 keygen_add_key_flags_and_expire (PKT_signature
*sig
, void *opaque
)
255 struct opaque_data_usage_and_pk
*oduap
= opaque
;
257 do_add_key_flags (sig
, oduap
->usage
);
258 return keygen_add_key_expire (sig
, oduap
->pk
);
262 set_one_pref (int val
, int type
, const char *item
, byte
*buf
, int *nbuf
)
266 for (i
=0; i
< *nbuf
; i
++ )
269 log_info (_("preference `%s' duplicated\n"), item
);
273 if (*nbuf
>= MAX_PREFS
)
276 log_info(_("too many cipher preferences\n"));
278 log_info(_("too many digest preferences\n"));
280 log_info(_("too many compression preferences\n"));
287 buf
[(*nbuf
)++] = val
;
292 * Parse the supplied string and use it to set the standard
293 * preferences. The string may be in a form like the one printed by
294 * "pref" (something like: "S10 S3 H3 H2 Z2 Z1") or the actual
295 * cipher/hash/compress names. Use NULL to set the default
296 * preferences. Returns: 0 = okay
299 keygen_set_std_prefs (const char *string
,int personal
)
301 byte sym
[MAX_PREFS
], hash
[MAX_PREFS
], zip
[MAX_PREFS
];
302 int nsym
=0, nhash
=0, nzip
=0, val
, rc
=0;
303 int mdc
=1, modify
=0; /* mdc defaults on, modify defaults off. */
304 char dummy_string
[45+1]; /* Enough for 15 items. */
306 if (!string
|| !ascii_strcasecmp (string
, "default"))
308 if (opt
.def_preference_list
)
309 string
=opt
.def_preference_list
;
312 dummy_string
[0]='\0';
314 /* The rationale why we use the order AES256,192,128 is
315 for compatibility reasons with PGP. If gpg would
316 define AES128 first, we would get the somewhat
319 gpg -r pgpkey -r gpgkey ---gives--> AES256
320 gpg -r gpgkey -r pgpkey ---gives--> AES
322 Note that by using --personal-cipher-preferences it is
323 possible to prefer AES128.
326 /* Make sure we do not add more than 15 items here, as we
327 could overflow the size of dummy_string. We currently
329 if ( !openpgp_cipher_test_algo (CIPHER_ALGO_AES256
) )
330 strcat(dummy_string
,"S9 ");
331 if ( !openpgp_cipher_test_algo (CIPHER_ALGO_AES192
) )
332 strcat(dummy_string
,"S8 ");
333 if ( !openpgp_cipher_test_algo (CIPHER_ALGO_AES
) )
334 strcat(dummy_string
,"S7 ");
335 if ( !openpgp_cipher_test_algo (CIPHER_ALGO_CAST5
) )
336 strcat(dummy_string
,"S3 ");
337 strcat(dummy_string
,"S2 "); /* 3DES */
338 /* If we have it, IDEA goes *after* 3DES so it won't be
339 used unless we're encrypting along with a V3 key.
340 Ideally, we would only put the S1 preference in if the
341 key was RSA and <=2048 bits, as that is what won't
342 break PGP2, but that is difficult with the current
343 code, and not really worth checking as a non-RSA <=2048
344 bit key wouldn't be usable by PGP2 anyway. -dms */
345 if ( !openpgp_cipher_test_algo (CIPHER_ALGO_IDEA
) )
346 strcat(dummy_string
,"S1 ");
349 strcat(dummy_string
,"H2 ");
351 if (!openpgp_md_test_algo(DIGEST_ALGO_SHA256
))
352 strcat(dummy_string
,"H8 ");
355 if (!openpgp_md_test_algo(DIGEST_ALGO_RMD160
))
356 strcat(dummy_string
,"H3 ");
359 strcat(dummy_string
,"Z2 ");
361 if(!check_compress_algo(COMPRESS_ALGO_BZIP2
))
362 strcat(dummy_string
,"Z3 ");
365 strcat(dummy_string
,"Z1");
370 else if (!ascii_strcasecmp (string
, "none"))
375 char *tok
,*prefstring
;
377 prefstring
=xstrdup(string
); /* need a writable string! */
379 while((tok
=strsep(&prefstring
," ,")))
381 if((val
=string_to_cipher_algo (tok
)))
383 if(set_one_pref(val
,1,tok
,sym
,&nsym
))
386 else if((val
=string_to_digest_algo (tok
)))
388 if(set_one_pref(val
,2,tok
,hash
,&nhash
))
391 else if((val
=string_to_compress_algo(tok
))>-1)
393 if(set_one_pref(val
,3,tok
,zip
,&nzip
))
396 else if (ascii_strcasecmp(tok
,"mdc")==0)
398 else if (ascii_strcasecmp(tok
,"no-mdc")==0)
400 else if (ascii_strcasecmp(tok
,"ks-modify")==0)
402 else if (ascii_strcasecmp(tok
,"no-ks-modify")==0)
406 log_info (_("invalid item `%s' in preference string\n"),tok
);
408 /* Complain if IDEA is not available. */
409 if(ascii_strcasecmp(tok
,"s1")==0
410 || ascii_strcasecmp(tok
,"idea")==0)
424 if(personal
==PREFTYPE_SYM
)
426 xfree(opt
.personal_cipher_prefs
);
429 opt
.personal_cipher_prefs
=NULL
;
434 opt
.personal_cipher_prefs
=
435 xmalloc(sizeof(prefitem_t
*)*(nsym
+1));
437 for (i
=0; i
<nsym
; i
++)
439 opt
.personal_cipher_prefs
[i
].type
= PREFTYPE_SYM
;
440 opt
.personal_cipher_prefs
[i
].value
= sym
[i
];
443 opt
.personal_cipher_prefs
[i
].type
= PREFTYPE_NONE
;
444 opt
.personal_cipher_prefs
[i
].value
= 0;
447 else if(personal
==PREFTYPE_HASH
)
449 xfree(opt
.personal_digest_prefs
);
452 opt
.personal_digest_prefs
=NULL
;
457 opt
.personal_digest_prefs
=
458 xmalloc(sizeof(prefitem_t
*)*(nhash
+1));
460 for (i
=0; i
<nhash
; i
++)
462 opt
.personal_digest_prefs
[i
].type
= PREFTYPE_HASH
;
463 opt
.personal_digest_prefs
[i
].value
= hash
[i
];
466 opt
.personal_digest_prefs
[i
].type
= PREFTYPE_NONE
;
467 opt
.personal_digest_prefs
[i
].value
= 0;
470 else if(personal
==PREFTYPE_ZIP
)
472 xfree(opt
.personal_compress_prefs
);
475 opt
.personal_compress_prefs
=NULL
;
480 opt
.personal_compress_prefs
=
481 xmalloc(sizeof(prefitem_t
*)*(nzip
+1));
483 for (i
=0; i
<nzip
; i
++)
485 opt
.personal_compress_prefs
[i
].type
= PREFTYPE_ZIP
;
486 opt
.personal_compress_prefs
[i
].value
= zip
[i
];
489 opt
.personal_compress_prefs
[i
].type
= PREFTYPE_NONE
;
490 opt
.personal_compress_prefs
[i
].value
= 0;
496 memcpy (sym_prefs
, sym
, (nsym_prefs
=nsym
));
497 memcpy (hash_prefs
, hash
, (nhash_prefs
=nhash
));
498 memcpy (zip_prefs
, zip
, (nzip_prefs
=nzip
));
501 prefs_initialized
= 1;
508 /* Return a fake user ID containing the preferences. Caller must
510 PKT_user_id
*keygen_get_std_prefs(void)
513 PKT_user_id
*uid
=xmalloc_clear(sizeof(PKT_user_id
));
515 if(!prefs_initialized
)
516 keygen_set_std_prefs(NULL
,0);
520 uid
->prefs
=xmalloc((sizeof(prefitem_t
*)*
521 (nsym_prefs
+nhash_prefs
+nzip_prefs
+1)));
523 for(i
=0;i
<nsym_prefs
;i
++,j
++)
525 uid
->prefs
[j
].type
=PREFTYPE_SYM
;
526 uid
->prefs
[j
].value
=sym_prefs
[i
];
529 for(i
=0;i
<nhash_prefs
;i
++,j
++)
531 uid
->prefs
[j
].type
=PREFTYPE_HASH
;
532 uid
->prefs
[j
].value
=hash_prefs
[i
];
535 for(i
=0;i
<nzip_prefs
;i
++,j
++)
537 uid
->prefs
[j
].type
=PREFTYPE_ZIP
;
538 uid
->prefs
[j
].value
=zip_prefs
[i
];
541 uid
->prefs
[j
].type
=PREFTYPE_NONE
;
542 uid
->prefs
[j
].value
=0;
544 uid
->flags
.mdc
=mdc_available
;
545 uid
->flags
.ks_modify
=ks_modify
;
551 add_feature_mdc (PKT_signature
*sig
,int enabled
)
558 s
= parse_sig_subpkt (sig
->hashed
, SIGSUBPKT_FEATURES
, &n
);
559 /* Already set or cleared */
561 ((enabled
&& (s
[0] & 0x01)) || (!enabled
&& !(s
[0] & 0x01))))
564 if (!s
|| !n
) { /* create a new one */
566 buf
= xmalloc_clear (n
);
574 buf
[0] |= 0x01; /* MDC feature */
578 /* Are there any bits set? */
584 delete_sig_subpkt (sig
->hashed
, SIGSUBPKT_FEATURES
);
586 build_sig_subpkt (sig
, SIGSUBPKT_FEATURES
, buf
, n
);
592 add_keyserver_modify (PKT_signature
*sig
,int enabled
)
599 /* The keyserver modify flag is a negative flag (i.e. no-modify) */
602 s
= parse_sig_subpkt (sig
->hashed
, SIGSUBPKT_KS_FLAGS
, &n
);
603 /* Already set or cleared */
605 ((enabled
&& (s
[0] & 0x80)) || (!enabled
&& !(s
[0] & 0x80))))
608 if (!s
|| !n
) { /* create a new one */
610 buf
= xmalloc_clear (n
);
618 buf
[0] |= 0x80; /* no-modify flag */
622 /* Are there any bits set? */
628 delete_sig_subpkt (sig
->hashed
, SIGSUBPKT_KS_FLAGS
);
630 build_sig_subpkt (sig
, SIGSUBPKT_KS_FLAGS
, buf
, n
);
637 keygen_upd_std_prefs (PKT_signature
*sig
, void *opaque
)
641 if (!prefs_initialized
)
642 keygen_set_std_prefs (NULL
, 0);
645 build_sig_subpkt (sig
, SIGSUBPKT_PREF_SYM
, sym_prefs
, nsym_prefs
);
648 delete_sig_subpkt (sig
->hashed
, SIGSUBPKT_PREF_SYM
);
649 delete_sig_subpkt (sig
->unhashed
, SIGSUBPKT_PREF_SYM
);
653 build_sig_subpkt (sig
, SIGSUBPKT_PREF_HASH
, hash_prefs
, nhash_prefs
);
656 delete_sig_subpkt (sig
->hashed
, SIGSUBPKT_PREF_HASH
);
657 delete_sig_subpkt (sig
->unhashed
, SIGSUBPKT_PREF_HASH
);
661 build_sig_subpkt (sig
, SIGSUBPKT_PREF_COMPR
, zip_prefs
, nzip_prefs
);
664 delete_sig_subpkt (sig
->hashed
, SIGSUBPKT_PREF_COMPR
);
665 delete_sig_subpkt (sig
->unhashed
, SIGSUBPKT_PREF_COMPR
);
668 /* Make sure that the MDC feature flag is set if needed. */
669 add_feature_mdc (sig
,mdc_available
);
670 add_keyserver_modify (sig
,ks_modify
);
671 keygen_add_keyserver_url(sig
,NULL
);
678 * Add preference to the self signature packet.
679 * This is only called for packets with version > 3.
683 keygen_add_std_prefs( PKT_signature
*sig
, void *opaque
)
685 PKT_public_key
*pk
= opaque
;
687 do_add_key_flags (sig
, pk
->pubkey_usage
);
688 keygen_add_key_expire( sig
, opaque
);
689 keygen_upd_std_prefs (sig
, opaque
);
690 keygen_add_keyserver_url(sig
,NULL
);
696 keygen_add_keyserver_url(PKT_signature
*sig
, void *opaque
)
698 const char *url
=opaque
;
701 url
=opt
.def_keyserver_url
;
704 build_sig_subpkt(sig
,SIGSUBPKT_PREF_KS
,url
,strlen(url
));
706 delete_sig_subpkt (sig
->hashed
,SIGSUBPKT_PREF_KS
);
712 keygen_add_notations(PKT_signature
*sig
,void *opaque
)
714 struct notation
*notation
;
716 /* We always start clean */
717 delete_sig_subpkt(sig
->hashed
,SIGSUBPKT_NOTATION
);
718 delete_sig_subpkt(sig
->unhashed
,SIGSUBPKT_NOTATION
);
719 sig
->flags
.notation
=0;
721 for(notation
=opaque
;notation
;notation
=notation
->next
)
722 if(!notation
->flags
.ignore
)
727 n1
=strlen(notation
->name
);
728 if(notation
->altvalue
)
729 n2
=strlen(notation
->altvalue
);
730 else if(notation
->bdat
)
733 n2
=strlen(notation
->value
);
735 buf
= xmalloc( 8 + n1
+ n2
);
737 /* human readable or not */
738 buf
[0] = notation
->bdat
?0:0x80;
739 buf
[1] = buf
[2] = buf
[3] = 0;
744 memcpy(buf
+8, notation
->name
, n1
);
745 if(notation
->altvalue
)
746 memcpy(buf
+8+n1
, notation
->altvalue
, n2
);
747 else if(notation
->bdat
)
748 memcpy(buf
+8+n1
, notation
->bdat
, n2
);
750 memcpy(buf
+8+n1
, notation
->value
, n2
);
751 build_sig_subpkt( sig
, SIGSUBPKT_NOTATION
|
752 (notation
->flags
.critical
?SIGSUBPKT_FLAG_CRITICAL
:0),
761 keygen_add_revkey(PKT_signature
*sig
, void *opaque
)
763 struct revocation_key
*revkey
=opaque
;
764 byte buf
[2+MAX_FINGERPRINT_LEN
];
766 buf
[0]=revkey
->class;
767 buf
[1]=revkey
->algid
;
768 memcpy(&buf
[2],revkey
->fpr
,MAX_FINGERPRINT_LEN
);
770 build_sig_subpkt(sig
,SIGSUBPKT_REV_KEY
,buf
,2+MAX_FINGERPRINT_LEN
);
772 /* All sigs with revocation keys set are nonrevocable */
773 sig
->flags
.revocable
=0;
775 build_sig_subpkt( sig
, SIGSUBPKT_REVOCABLE
, buf
, 1 );
784 /* Create a back-signature. If TIMESTAMP is not NULL, use it for the
785 signature creation time. */
787 make_backsig (PKT_signature
*sig
,PKT_public_key
*pk
,
788 PKT_public_key
*sub_pk
,PKT_secret_key
*sub_sk
,
791 PKT_signature
*backsig
;
794 cache_public_key(sub_pk
);
796 rc
= make_keysig_packet (&backsig
, pk
, NULL
, sub_pk
, sub_sk
, 0x19,
797 0, 0, timestamp
, 0, NULL
, NULL
);
799 log_error("make_keysig_packet failed for backsig: %s\n",g10_errstr(rc
));
802 /* Get it into a binary packed form. */
803 IOBUF backsig_out
=iobuf_temp();
806 init_packet(&backsig_pkt
);
807 backsig_pkt
.pkttype
=PKT_SIGNATURE
;
808 backsig_pkt
.pkt
.signature
=backsig
;
809 rc
=build_packet(backsig_out
,&backsig_pkt
);
810 free_packet(&backsig_pkt
);
812 log_error("build_packet failed for backsig: %s\n",g10_errstr(rc
));
816 byte
*buf
=iobuf_get_temp_buffer(backsig_out
);
818 /* Remove the packet header */
828 pktlen
=(buf
[1]-192)*256;
834 pktlen
=buf
[2] << 24;
835 pktlen
|=buf
[3] << 16;
854 pktlen
=buf
[mark
++] << 24;
855 pktlen
|=buf
[mark
++] << 16;
858 pktlen
|=buf
[mark
++] << 8;
867 /* Now make the binary blob into a subpacket. */
868 build_sig_subpkt(sig
,SIGSUBPKT_SIGNATURE
,buf
,pktlen
);
870 iobuf_close(backsig_out
);
879 write_direct_sig (KBNODE root
, KBNODE pub_root
, PKT_secret_key
*sk
,
880 struct revocation_key
*revkey
, u32 timestamp
)
889 log_info(_("writing direct signature\n"));
891 /* Get the pk packet from the pub_tree. */
892 node
= find_kbnode( pub_root
, PKT_PUBLIC_KEY
);
895 pk
= node
->pkt
->pkt
.public_key
;
897 /* We have to cache the key, so that the verification of the
898 signature creation is able to retrieve the public key. */
899 cache_public_key (pk
);
901 /* Make the signature. */
902 rc
= make_keysig_packet (&sig
,pk
,NULL
,NULL
,sk
,0x1F,
904 keygen_add_revkey
, revkey
);
907 log_error("make_keysig_packet failed: %s\n", g10_errstr(rc
) );
911 pkt
= xmalloc_clear( sizeof *pkt
);
912 pkt
->pkttype
= PKT_SIGNATURE
;
913 pkt
->pkt
.signature
= sig
;
914 add_kbnode( root
, new_kbnode( pkt
) );
920 write_selfsigs( KBNODE sec_root
, KBNODE pub_root
, PKT_secret_key
*sk
,
921 unsigned int use
, u32 timestamp
)
931 log_info(_("writing self signature\n"));
933 /* Get the uid packet from the list. */
934 node
= find_kbnode( pub_root
, PKT_USER_ID
);
936 BUG(); /* No user id packet in tree. */
937 uid
= node
->pkt
->pkt
.user_id
;
939 /* Get the pk packet from the pub_tree. */
940 node
= find_kbnode( pub_root
, PKT_PUBLIC_KEY
);
943 pk
= node
->pkt
->pkt
.public_key
;
944 pk
->pubkey_usage
= use
;
946 /* We have to cache the key, so that the verification of the
947 signature creation is able to retrieve the public key. */
948 cache_public_key (pk
);
950 /* Make the signature. */
951 rc
= make_keysig_packet (&sig
, pk
, uid
, NULL
, sk
, 0x13,
953 keygen_add_std_prefs
, pk
);
956 log_error("make_keysig_packet failed: %s\n", g10_errstr(rc
) );
960 pkt
= xmalloc_clear( sizeof *pkt
);
961 pkt
->pkttype
= PKT_SIGNATURE
;
962 pkt
->pkt
.signature
= sig
;
963 add_kbnode( sec_root
, new_kbnode( pkt
) );
965 pkt
= xmalloc_clear( sizeof *pkt
);
966 pkt
->pkttype
= PKT_SIGNATURE
;
967 pkt
->pkt
.signature
= copy_signature(NULL
,sig
);
968 add_kbnode( pub_root
, new_kbnode( pkt
) );
973 /* Write the key binding signature. If TIMESTAMP is not NULL use the
974 signature creation times. */
976 write_keybinding (KBNODE root
, KBNODE pub_root
,
977 PKT_secret_key
*pri_sk
, PKT_secret_key
*sub_sk
,
978 unsigned int use
, u32 timestamp
)
984 PKT_public_key
*pri_pk
, *sub_pk
;
985 struct opaque_data_usage_and_pk oduap
;
988 log_info(_("writing key binding signature\n"));
990 /* Get the pk packet from the pub_tree. */
991 node
= find_kbnode ( pub_root
, PKT_PUBLIC_KEY
);
994 pri_pk
= node
->pkt
->pkt
.public_key
;
996 /* We have to cache the key, so that the verification of the
997 * signature creation is able to retrieve the public key. */
998 cache_public_key (pri_pk
);
1000 /* Find the last subkey. */
1002 for (node
=pub_root
; node
; node
= node
->next
)
1004 if ( node
->pkt
->pkttype
== PKT_PUBLIC_SUBKEY
)
1005 sub_pk
= node
->pkt
->pkt
.public_key
;
1010 /* Make the signature. */
1013 rc
= make_keysig_packet (&sig
, pri_pk
, NULL
, sub_pk
, pri_sk
, 0x18,
1015 keygen_add_key_flags_and_expire
, &oduap
);
1018 log_error ("make_keysig_packet failed: %s\n", g10_errstr(rc
) );
1022 /* Make a backsig. */
1023 if (use
&PUBKEY_USAGE_SIG
)
1025 rc
= make_backsig (sig
, pri_pk
, sub_pk
, sub_sk
, timestamp
);
1030 pkt
= xmalloc_clear ( sizeof *pkt
);
1031 pkt
->pkttype
= PKT_SIGNATURE
;
1032 pkt
->pkt
.signature
= sig
;
1033 add_kbnode (root
, new_kbnode (pkt
) );
1040 key_from_sexp (gcry_mpi_t
*array
, gcry_sexp_t sexp
,
1041 const char *topname
, const char *elems
)
1043 gcry_sexp_t list
, l2
;
1048 list
= gcry_sexp_find_token (sexp
, topname
, 0);
1050 return gpg_error (GPG_ERR_INV_OBJ
);
1051 l2
= gcry_sexp_cadr (list
);
1052 gcry_sexp_release (list
);
1055 return gpg_error (GPG_ERR_NO_OBJ
);
1057 for (idx
=0,s
=elems
; *s
; s
++, idx
++)
1059 l2
= gcry_sexp_find_token (list
, s
, 1);
1062 rc
= gpg_error (GPG_ERR_NO_OBJ
); /* required parameter not found */
1065 array
[idx
] = gcry_sexp_nth_mpi (l2
, 1, GCRYMPI_FMT_USG
);
1066 gcry_sexp_release (l2
);
1069 rc
= gpg_error (GPG_ERR_INV_OBJ
); /* required parameter invalid */
1073 gcry_sexp_release (list
);
1078 for (i
=0; i
<idx
; i
++)
1083 gcry_sexp_release (list
);
1090 genhelp_protect (DEK
*dek
, STRING2KEY
*s2k
, PKT_secret_key
*sk
)
1096 sk
->protect
.algo
= dek
->algo
;
1097 sk
->protect
.s2k
= *s2k
;
1098 rc
= protect_secret_key (sk
, dek
);
1100 log_error ("protect_secret_key failed: %s\n", gpg_strerror (rc
) );
1107 genhelp_factors (gcry_sexp_t misc_key_info
, KBNODE sec_root
)
1109 (void)misc_key_info
;
1111 #if 0 /* Not used anymore */
1117 /* DSA: don't know whether it makes sense to have the factors, so for now
1118 we store them in the secret keyring (but they are not secret)
1119 p = 2 * q * f1 * f2 * ... * fn
1120 We store only f1 to f_n-1; fn can be calculated because p and q
1122 n
= gcry_sexp_sprint (misc_key_info
, 0, NULL
, 0);
1123 buf
= xmalloc (n
+4);
1124 strcpy (buf
, "#::");
1125 n
= gcry_sexp_sprint (misc_key_info
, 0, buf
+3, n
);
1129 add_kbnode (sec_root
, make_comment_node_from_buffer (buf
, n
));
1132 gcry_sexp_release (misc_key_info
);
1138 /* Generate an Elgamal encryption key pair. TIMESTAMP is the creatuion
1139 time to be put into the key structure. */
1141 gen_elg (int algo
, unsigned int nbits
,
1142 KBNODE pub_root
, KBNODE sec_root
, DEK
*dek
,
1143 STRING2KEY
*s2k
, PKT_secret_key
**ret_sk
,
1144 u32 timestamp
, u32 expireval
, int is_subkey
)
1150 gcry_sexp_t s_parms
, s_key
;
1151 gcry_sexp_t misc_key_info
;
1153 assert( is_ELGAMAL(algo
) );
1158 log_info (_("keysize invalid; using %u bits\n"), nbits
);
1163 nbits
= ((nbits
+ 31) / 32) * 32;
1164 log_info (_("keysize rounded up to %u bits\n"), nbits
);
1168 rc
= gcry_sexp_build ( &s_parms
, NULL
,
1169 "(genkey(%s(nbits %d)))",
1170 algo
== GCRY_PK_ELG_E
? "openpgp-elg" :
1171 algo
== GCRY_PK_ELG
? "elg" : "x-oops" ,
1174 log_bug ("gcry_sexp_build failed: %s\n", gpg_strerror (rc
));
1176 rc
= gcry_pk_genkey (&s_key
, s_parms
);
1177 gcry_sexp_release (s_parms
);
1180 log_error ("gcry_pk_genkey failed: %s\n", gpg_strerror (rc
) );
1184 sk
= xmalloc_clear( sizeof *sk
);
1185 pk
= xmalloc_clear( sizeof *pk
);
1186 sk
->timestamp
= pk
->timestamp
= timestamp
;
1187 sk
->version
= pk
->version
= 4;
1190 sk
->expiredate
= pk
->expiredate
= sk
->timestamp
+ expireval
;
1192 sk
->pubkey_algo
= pk
->pubkey_algo
= algo
;
1194 rc
= key_from_sexp (pk
->pkey
, s_key
, "public-key", "pgy");
1197 log_error ("key_from_sexp failed: %s\n", gpg_strerror (rc
) );
1198 gcry_sexp_release (s_key
);
1199 free_secret_key (sk
);
1200 free_public_key (pk
);
1203 rc
= key_from_sexp (sk
->skey
, s_key
, "private-key", "pgyx");
1206 log_error("key_from_sexp failed: %s\n", gpg_strerror (rc
) );
1207 gcry_sexp_release (s_key
);
1208 free_secret_key (sk
);
1209 free_public_key (pk
);
1212 misc_key_info
= gcry_sexp_find_token (s_key
, "misc-key-info", 0);
1213 gcry_sexp_release (s_key
);
1215 sk
->is_protected
= 0;
1216 sk
->protect
.algo
= 0;
1218 sk
->csum
= checksum_mpi (sk
->skey
[3]);
1219 if (ret_sk
) /* Return an unprotected version of the sk. */
1220 *ret_sk
= copy_secret_key ( NULL
, sk
);
1222 rc
= genhelp_protect (dek
, s2k
, sk
);
1225 free_public_key (pk
);
1226 free_secret_key (sk
);
1227 gcry_sexp_release (misc_key_info
);
1231 pkt
= xmalloc_clear (sizeof *pkt
);
1232 pkt
->pkttype
= is_subkey
? PKT_PUBLIC_SUBKEY
: PKT_PUBLIC_KEY
;
1233 pkt
->pkt
.public_key
= pk
;
1234 add_kbnode (pub_root
, new_kbnode( pkt
));
1236 /* Don't know whether it makes sense to have access to the factors,
1237 so for now we store them in the secret keyring (but they are not
1239 pkt
= xmalloc_clear (sizeof *pkt
);
1240 pkt
->pkttype
= is_subkey
? PKT_SECRET_SUBKEY
: PKT_SECRET_KEY
;
1241 pkt
->pkt
.secret_key
= sk
;
1242 add_kbnode (sec_root
, new_kbnode( pkt
));
1244 genhelp_factors (misc_key_info
, sec_root
);
1251 * Generate a DSA key
1254 gen_dsa (unsigned int nbits
, KBNODE pub_root
, KBNODE sec_root
, DEK
*dek
,
1255 STRING2KEY
*s2k
, PKT_secret_key
**ret_sk
,
1256 u32 timestamp
, u32 expireval
, int is_subkey
)
1262 gcry_sexp_t s_parms
, s_key
;
1263 gcry_sexp_t misc_key_info
;
1266 if ( nbits
< 512 || (!opt
.flags
.dsa2
&& nbits
> 1024))
1269 log_info(_("keysize invalid; using %u bits\n"), nbits
);
1271 else if ( nbits
> 3072 )
1274 log_info(_("keysize invalid; using %u bits\n"), nbits
);
1279 nbits
= ((nbits
+ 63) / 64) * 64;
1280 log_info(_("keysize rounded up to %u bits\n"), nbits
);
1284 Figure out a q size based on the key size. FIPS 180-3 says:
1291 2048/256 is an odd pair since there is also a 2048/224 and
1292 3072/256. Matching sizes is not a very exact science.
1294 We'll do 256 qbits for nbits over 2048, 224 for nbits over 1024
1295 but less than 2048, and 160 for 1024 (DSA1).
1300 else if ( nbits
> 1024)
1306 log_info (_("WARNING: some OpenPGP programs can't"
1307 " handle a DSA key with this digest size\n"));
1309 rc
= gcry_sexp_build (&s_parms
, NULL
,
1310 "(genkey(dsa(nbits %d)(qbits %d)))",
1311 (int)nbits
, (int)qbits
);
1313 log_bug ("gcry_sexp_build failed: %s\n", gpg_strerror (rc
));
1315 rc
= gcry_pk_genkey (&s_key
, s_parms
);
1316 gcry_sexp_release (s_parms
);
1319 log_error ("gcry_pk_genkey failed: %s\n", gpg_strerror (rc
) );
1323 sk
= xmalloc_clear( sizeof *sk
);
1324 pk
= xmalloc_clear( sizeof *pk
);
1325 sk
->timestamp
= pk
->timestamp
= timestamp
;
1326 sk
->version
= pk
->version
= 4;
1328 sk
->expiredate
= pk
->expiredate
= sk
->timestamp
+ expireval
;
1329 sk
->pubkey_algo
= pk
->pubkey_algo
= PUBKEY_ALGO_DSA
;
1331 rc
= key_from_sexp (pk
->pkey
, s_key
, "public-key", "pqgy");
1334 log_error ("key_from_sexp failed: %s\n", gpg_strerror (rc
));
1335 gcry_sexp_release (s_key
);
1336 free_public_key(pk
);
1337 free_secret_key(sk
);
1340 rc
= key_from_sexp (sk
->skey
, s_key
, "private-key", "pqgyx");
1343 log_error ("key_from_sexp failed: %s\n", gpg_strerror (rc
) );
1344 gcry_sexp_release (s_key
);
1345 free_public_key(pk
);
1346 free_secret_key(sk
);
1349 misc_key_info
= gcry_sexp_find_token (s_key
, "misc-key-info", 0);
1350 gcry_sexp_release (s_key
);
1352 sk
->is_protected
= 0;
1353 sk
->protect
.algo
= 0;
1355 sk
->csum
= checksum_mpi ( sk
->skey
[4] );
1356 if( ret_sk
) /* return an unprotected version of the sk */
1357 *ret_sk
= copy_secret_key( NULL
, sk
);
1359 rc
= genhelp_protect (dek
, s2k
, sk
);
1362 free_public_key (pk
);
1363 free_secret_key (sk
);
1364 gcry_sexp_release (misc_key_info
);
1368 pkt
= xmalloc_clear(sizeof *pkt
);
1369 pkt
->pkttype
= is_subkey
? PKT_PUBLIC_SUBKEY
: PKT_PUBLIC_KEY
;
1370 pkt
->pkt
.public_key
= pk
;
1371 add_kbnode(pub_root
, new_kbnode( pkt
));
1373 /* Don't know whether it makes sense to have the factors, so for now
1374 * we store them in the secret keyring (but they are not secret)
1375 * p = 2 * q * f1 * f2 * ... * fn
1376 * We store only f1 to f_n-1; fn can be calculated because p and q
1379 pkt
= xmalloc_clear(sizeof *pkt
);
1380 pkt
->pkttype
= is_subkey
? PKT_SECRET_SUBKEY
: PKT_SECRET_KEY
;
1381 pkt
->pkt
.secret_key
= sk
;
1382 add_kbnode(sec_root
, new_kbnode( pkt
));
1384 genhelp_factors (misc_key_info
, sec_root
);
1391 * Generate an RSA key.
1394 gen_rsa (int algo
, unsigned nbits
, KBNODE pub_root
, KBNODE sec_root
, DEK
*dek
,
1395 STRING2KEY
*s2k
, PKT_secret_key
**ret_sk
,
1396 u32 timestamp
, u32 expireval
, int is_subkey
)
1402 gcry_sexp_t s_parms
, s_key
;
1404 assert (is_RSA(algo
));
1409 log_info (_("keysize invalid; using %u bits\n"), nbits
);
1414 nbits
= ((nbits
+ 31) / 32) * 32;
1415 log_info (_("keysize rounded up to %u bits\n"), nbits
);
1418 rc
= gcry_sexp_build (&s_parms
, NULL
,
1419 "(genkey(rsa(nbits %d)))",
1422 log_bug ("gcry_sexp_build failed: %s\n", gpg_strerror (rc
));
1424 rc
= gcry_pk_genkey (&s_key
, s_parms
);
1425 gcry_sexp_release (s_parms
);
1428 log_error ("gcry_pk_genkey failed: %s\n", gpg_strerror (rc
) );
1432 sk
= xmalloc_clear( sizeof *sk
);
1433 pk
= xmalloc_clear( sizeof *pk
);
1434 sk
->timestamp
= pk
->timestamp
= timestamp
;
1435 sk
->version
= pk
->version
= 4;
1438 sk
->expiredate
= pk
->expiredate
= sk
->timestamp
+ expireval
;
1440 sk
->pubkey_algo
= pk
->pubkey_algo
= algo
;
1442 rc
= key_from_sexp (pk
->pkey
, s_key
, "public-key", "ne");
1445 log_error ("key_from_sexp failed: %s\n", gpg_strerror (rc
));
1446 gcry_sexp_release (s_key
);
1447 free_public_key(pk
);
1448 free_secret_key(sk
);
1451 rc
= key_from_sexp (sk
->skey
, s_key
, "private-key", "nedpqu");
1454 log_error ("key_from_sexp failed: %s\n", gpg_strerror (rc
) );
1455 gcry_sexp_release (s_key
);
1456 free_public_key(pk
);
1457 free_secret_key(sk
);
1460 gcry_sexp_release (s_key
);
1462 sk
->is_protected
= 0;
1463 sk
->protect
.algo
= 0;
1465 sk
->csum
= checksum_mpi (sk
->skey
[2] );
1466 sk
->csum
+= checksum_mpi (sk
->skey
[3] );
1467 sk
->csum
+= checksum_mpi (sk
->skey
[4] );
1468 sk
->csum
+= checksum_mpi (sk
->skey
[5] );
1469 if( ret_sk
) /* return an unprotected version of the sk */
1470 *ret_sk
= copy_secret_key( NULL
, sk
);
1472 rc
= genhelp_protect (dek
, s2k
, sk
);
1475 free_public_key (pk
);
1476 free_secret_key (sk
);
1480 pkt
= xmalloc_clear(sizeof *pkt
);
1481 pkt
->pkttype
= is_subkey
? PKT_PUBLIC_SUBKEY
: PKT_PUBLIC_KEY
;
1482 pkt
->pkt
.public_key
= pk
;
1483 add_kbnode(pub_root
, new_kbnode( pkt
));
1485 pkt
= xmalloc_clear(sizeof *pkt
);
1486 pkt
->pkttype
= is_subkey
? PKT_SECRET_SUBKEY
: PKT_SECRET_KEY
;
1487 pkt
->pkt
.secret_key
= sk
;
1488 add_kbnode(sec_root
, new_kbnode( pkt
));
1496 * return 0 on error or the multiplier
1499 check_valid_days( const char *s
)
1509 return 0; /* e.g. "2323wc" */
1510 if( *s
== 'd' || *s
== 'D' )
1512 if( *s
== 'w' || *s
== 'W' )
1514 if( *s
== 'm' || *s
== 'M' )
1516 if( *s
== 'y' || *s
== 'Y' )
1523 print_key_flags(int flags
)
1525 if(flags
&PUBKEY_USAGE_SIG
)
1526 tty_printf("%s ",_("Sign"));
1528 if(flags
&PUBKEY_USAGE_CERT
)
1529 tty_printf("%s ",_("Certify"));
1531 if(flags
&PUBKEY_USAGE_ENC
)
1532 tty_printf("%s ",_("Encrypt"));
1534 if(flags
&PUBKEY_USAGE_AUTH
)
1535 tty_printf("%s ",_("Authenticate"));
1539 /* Returns the key flags */
1541 ask_key_flags(int algo
,int subkey
)
1543 /* TRANSLATORS: Please use only plain ASCII characters for the
1544 translation. If this is not possible use single digits. The
1545 string needs to 8 bytes long. Here is a description of the
1548 s = Toggle signing capability
1549 e = Toggle encryption capability
1550 a = Toggle authentication capability
1553 const char *togglers
=_("SsEeAaQq");
1555 unsigned int current
=0;
1556 unsigned int possible
=openpgp_pk_algo_usage(algo
);
1558 if ( strlen(togglers
) != 7 )
1560 tty_printf ("NOTE: Bad translation at %s:%d. "
1561 "Please report.\n", __FILE__
, __LINE__
);
1562 togglers
= "11223300";
1565 /* Only primary keys may certify. */
1567 possible
&=~PUBKEY_USAGE_CERT
;
1569 /* Preload the current set with the possible set, minus
1570 authentication, since nobody really uses auth yet. */
1571 current
=possible
&~PUBKEY_USAGE_AUTH
;
1576 tty_printf(_("Possible actions for a %s key: "),
1577 gcry_pk_algo_name (algo
));
1578 print_key_flags(possible
);
1580 tty_printf(_("Current allowed actions: "));
1581 print_key_flags(current
);
1584 if(possible
&PUBKEY_USAGE_SIG
)
1585 tty_printf(_(" (%c) Toggle the sign capability\n"),
1587 if(possible
&PUBKEY_USAGE_ENC
)
1588 tty_printf(_(" (%c) Toggle the encrypt capability\n"),
1590 if(possible
&PUBKEY_USAGE_AUTH
)
1591 tty_printf(_(" (%c) Toggle the authenticate capability\n"),
1594 tty_printf(_(" (%c) Finished\n"),togglers
[6]);
1598 answer
= cpr_get("keygen.flags",_("Your selection? "));
1601 if(strlen(answer
)>1)
1602 tty_printf(_("Invalid selection.\n"));
1603 else if(*answer
=='\0' || *answer
==togglers
[6] || *answer
==togglers
[7])
1605 else if((*answer
==togglers
[0] || *answer
==togglers
[1])
1606 && possible
&PUBKEY_USAGE_SIG
)
1608 if(current
&PUBKEY_USAGE_SIG
)
1609 current
&=~PUBKEY_USAGE_SIG
;
1611 current
|=PUBKEY_USAGE_SIG
;
1613 else if((*answer
==togglers
[2] || *answer
==togglers
[3])
1614 && possible
&PUBKEY_USAGE_ENC
)
1616 if(current
&PUBKEY_USAGE_ENC
)
1617 current
&=~PUBKEY_USAGE_ENC
;
1619 current
|=PUBKEY_USAGE_ENC
;
1621 else if((*answer
==togglers
[4] || *answer
==togglers
[5])
1622 && possible
&PUBKEY_USAGE_AUTH
)
1624 if(current
&PUBKEY_USAGE_AUTH
)
1625 current
&=~PUBKEY_USAGE_AUTH
;
1627 current
|=PUBKEY_USAGE_AUTH
;
1630 tty_printf(_("Invalid selection.\n"));
1640 * Returns: 0 to create both a DSA and a Elgamal key.
1641 * and only if key flags are to be written the desired usage.
1644 ask_algo (int addmode
, unsigned int *r_usage
)
1650 tty_printf(_("Please select what kind of key you want:\n"));
1652 tty_printf(_(" (%d) DSA and Elgamal (default)\n"), 1 );
1653 tty_printf( _(" (%d) DSA (sign only)\n"), 2 );
1655 tty_printf( _(" (%d) DSA (set your own capabilities)\n"), 3 );
1657 tty_printf(_(" (%d) Elgamal (encrypt only)\n"), 4 );
1658 tty_printf( _(" (%d) RSA (sign only)\n"), 5 );
1660 tty_printf(_(" (%d) RSA (encrypt only)\n"), 6 );
1662 tty_printf( _(" (%d) RSA (set your own capabilities)\n"), 7 );
1665 answer
= cpr_get("keygen.algo",_("Your selection? "));
1667 algo
= *answer
? atoi(answer
): 1;
1669 if( algo
== 1 && !addmode
) {
1670 algo
= 0; /* create both keys */
1673 else if( algo
== 7 && opt
.expert
) {
1674 algo
= PUBKEY_ALGO_RSA
;
1675 *r_usage
=ask_key_flags(algo
,addmode
);
1678 else if( algo
== 6 && addmode
) {
1679 algo
= PUBKEY_ALGO_RSA
;
1680 *r_usage
= PUBKEY_USAGE_ENC
;
1683 else if( algo
== 5 ) {
1684 algo
= PUBKEY_ALGO_RSA
;
1685 *r_usage
= PUBKEY_USAGE_SIG
;
1688 else if( algo
== 4 && addmode
) {
1689 algo
= PUBKEY_ALGO_ELGAMAL_E
;
1690 *r_usage
= PUBKEY_USAGE_ENC
;
1693 else if( algo
== 3 && opt
.expert
) {
1694 algo
= PUBKEY_ALGO_DSA
;
1695 *r_usage
=ask_key_flags(algo
,addmode
);
1698 else if( algo
== 2 ) {
1699 algo
= PUBKEY_ALGO_DSA
;
1700 *r_usage
= PUBKEY_USAGE_SIG
;
1704 tty_printf(_("Invalid selection.\n"));
1712 ask_keysize( int algo
)
1714 unsigned int nbits
, min
, def
=2048, max
=4096;
1723 case PUBKEY_ALGO_DSA
:
1731 tty_printf(_("DSA keypair will have %u bits.\n"),1024);
1736 case PUBKEY_ALGO_RSA
:
1741 tty_printf(_("%s keys may be between %u and %u bits long.\n"),
1742 gcry_pk_algo_name (algo
), min
, max
);
1746 char *prompt
,*answer
;
1748 #define PROMPTSTRING _("What keysize do you want? (%u) ")
1750 prompt
=xmalloc(strlen(PROMPTSTRING
)+20);
1751 sprintf(prompt
,PROMPTSTRING
,def
);
1755 answer
= cpr_get("keygen.size",prompt
);
1757 nbits
= *answer
? atoi(answer
): def
;
1761 if(nbits
<min
|| nbits
>max
)
1762 tty_printf(_("%s keysizes must be in the range %u-%u\n"),
1763 gcry_pk_algo_name (algo
), min
, max
);
1768 tty_printf(_("Requested keysize is %u bits\n"), nbits
);
1770 if( algo
== PUBKEY_ALGO_DSA
&& (nbits
% 64) )
1772 nbits
= ((nbits
+ 63) / 64) * 64;
1773 tty_printf(_("rounded up to %u bits\n"), nbits
);
1775 else if( (nbits
% 32) )
1777 nbits
= ((nbits
+ 31) / 32) * 32;
1778 tty_printf(_("rounded up to %u bits\n"), nbits
);
1786 * Parse an expire string and return its value in seconds.
1787 * Returns (u32)-1 on error.
1788 * This isn't perfect since scan_isodatestr returns unix time, and
1789 * OpenPGP actually allows a 32-bit time *plus* a 32-bit offset.
1790 * Because of this, we only permit setting expirations up to 2106, but
1791 * OpenPGP could theoretically allow up to 2242. I think we'll all
1792 * just cope for the next few years until we get a 64-bit time_t or
1796 parse_expire_string( const char *string
)
1801 u32 curtime
= make_timestamp ();
1805 else if (!strncmp (string
, "seconds=", 8))
1806 seconds
= atoi (string
+8);
1807 else if ((abs_date
= scan_isodatestr(string
)) && abs_date
> curtime
)
1808 seconds
= abs_date
- curtime
;
1809 else if ((mult
= check_valid_days (string
)))
1810 seconds
= atoi (string
) * 86400L * mult
;
1812 seconds
= (u32
)(-1);
1817 /* Parsean Creation-Date string which is either "1986-04-26" or
1818 "19860426T042640". Returns 0 on error. */
1820 parse_creation_string (const char *string
)
1826 else if ( !strncmp (string
, "seconds=", 8) )
1827 seconds
= atoi (string
+8);
1828 else if ( !(seconds
= scan_isodatestr (string
)))
1830 time_t tmp
= isotime2epoch (string
);
1831 seconds
= (tmp
== (time_t)(-1))? 0 : tmp
;
1837 /* object == 0 for a key, and 1 for a sig */
1839 ask_expire_interval(int object
,const char *def_expire
)
1849 tty_printf(_("Please specify how long the key should be valid.\n"
1850 " 0 = key does not expire\n"
1851 " <n> = key expires in n days\n"
1852 " <n>w = key expires in n weeks\n"
1853 " <n>m = key expires in n months\n"
1854 " <n>y = key expires in n years\n"));
1860 tty_printf(_("Please specify how long the signature should be valid.\n"
1861 " 0 = signature does not expire\n"
1862 " <n> = signature expires in n days\n"
1863 " <n>w = signature expires in n weeks\n"
1864 " <n>m = signature expires in n months\n"
1865 " <n>y = signature expires in n years\n"));
1872 /* Note: The elgamal subkey for DSA has no expiration date because
1873 * it must be signed with the DSA key and this one has the expiration
1879 u32 curtime
=make_timestamp();
1883 answer
= cpr_get("keygen.valid",_("Key is valid for? (0) "));
1888 #define PROMPTSTRING _("Signature is valid for? (%s) ")
1889 /* This will actually end up larger than necessary because
1890 of the 2 bytes for '%s' */
1891 prompt
=xmalloc(strlen(PROMPTSTRING
)+strlen(def_expire
)+1);
1892 sprintf(prompt
,PROMPTSTRING
,def_expire
);
1895 answer
= cpr_get("siggen.valid",prompt
);
1899 answer
=xstrdup(def_expire
);
1902 trim_spaces(answer
);
1903 interval
= parse_expire_string( answer
);
1904 if( interval
== (u32
)-1 )
1906 tty_printf(_("invalid value\n"));
1912 tty_printf((object
==0)
1913 ? _("Key does not expire at all\n")
1914 : _("Signature does not expire at all\n"));
1918 tty_printf(object
==0
1919 ? _("Key expires at %s\n")
1920 : _("Signature expires at %s\n"),
1921 asctimestamp((ulong
)(curtime
+ interval
) ) );
1922 #if SIZEOF_TIME_T <= 4
1923 if ( (time_t)((ulong
)(curtime
+interval
)) < 0 )
1924 tty_printf (_("Your system can't display dates beyond 2038.\n"
1925 "However, it will be correctly handled up to"
1928 #endif /*SIZEOF_TIME_T*/
1929 if ( (time_t)((unsigned long)(curtime
+interval
)) < curtime
)
1931 tty_printf (_("invalid value\n"));
1936 if( cpr_enabled() || cpr_get_answer_is_yes("keygen.valid.okay",
1937 _("Is this correct? (y/N) ")) )
1948 u32 x
= ask_expire_interval(0,NULL
);
1949 return x
? make_timestamp() + x
: 0;
1954 ask_user_id( int mode
)
1957 char *aname
, *acomment
, *amail
, *uid
;
1963 "GnuPG needs to construct a user ID to identify your key.\n"
1965 const char *s2
= _(s1
);
1967 if (!strcmp (s1
, s2
))
1969 /* There is no translation for the string thus we to use
1970 the old info text. gettext has no way to tell whether
1971 a translation is actually available, thus we need to
1972 to compare again. */
1973 const char *s3
= N_("\n"
1974 "You need a user ID to identify your key; "
1975 "the software constructs the user ID\n"
1976 "from the Real Name, Comment and Email Address in this form:\n"
1977 " \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n\n");
1978 const char *s4
= _(s3
);
1979 if (strcmp (s3
, s4
))
1980 s2
= s3
; /* A translation exists - use it. */
1982 tty_printf ("%s", s2
) ;
1984 uid
= aname
= acomment
= amail
= NULL
;
1992 aname
= cpr_get("keygen.name",_("Real name: "));
1996 if( opt
.allow_freeform_uid
)
1999 if( strpbrk( aname
, "<>" ) )
2000 tty_printf(_("Invalid character in name\n"));
2001 else if( digitp(aname
) )
2002 tty_printf(_("Name may not start with a digit\n"));
2003 else if( strlen(aname
) < 5 )
2004 tty_printf(_("Name must be at least 5 characters long\n"));
2012 amail
= cpr_get("keygen.email",_("Email address: "));
2015 if( !*amail
|| opt
.allow_freeform_uid
)
2016 break; /* no email address is okay */
2017 else if ( !is_valid_mailbox (amail
) )
2018 tty_printf(_("Not a valid email address\n"));
2026 acomment
= cpr_get("keygen.comment",_("Comment: "));
2027 trim_spaces(acomment
);
2030 break; /* no comment is okay */
2031 else if( strpbrk( acomment
, "()" ) )
2032 tty_printf(_("Invalid character in comment\n"));
2040 uid
= p
= xmalloc(strlen(aname
)+strlen(amail
)+strlen(acomment
)+12+10);
2041 p
= stpcpy(p
, aname
);
2043 p
= stpcpy(stpcpy(stpcpy(p
," ("), acomment
),")");
2045 p
= stpcpy(stpcpy(stpcpy(p
," <"), amail
),">");
2047 /* Append a warning if the RNG is switched into fake mode. */
2048 if ( random_is_faked () )
2049 strcpy(p
, " (insecure!)" );
2051 /* print a note in case that UTF8 mapping has to be done */
2052 for(p
=uid
; *p
; p
++ ) {
2054 tty_printf(_("You are using the `%s' character set.\n"),
2055 get_native_charset() );
2060 tty_printf(_("You selected this USER-ID:\n \"%s\"\n\n"), uid
);
2061 /* fixme: add a warning if this user-id already exists */
2062 if( !*amail
&& !opt
.allow_freeform_uid
2063 && (strchr( aname
, '@' ) || strchr( acomment
, '@'))) {
2065 tty_printf(_("Please don't put the email address "
2066 "into the real name or the comment\n") );
2070 /* TRANSLATORS: These are the allowed answers in
2071 lower and uppercase. Below you will find the matching
2072 string which should be translated accordingly and the
2073 letter changed to match the one in the answer string.
2078 o = Okay (ready, continue)
2081 const char *ansstr
= _("NnCcEeOoQq");
2083 if( strlen(ansstr
) != 10 )
2085 if( cpr_enabled() ) {
2086 answer
= xstrdup(ansstr
+6);
2090 answer
= cpr_get("keygen.userid.cmd", fail
?
2091 _("Change (N)ame, (C)omment, (E)mail or (Q)uit? ") :
2092 _("Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "));
2095 if( strlen(answer
) > 1 )
2097 else if( *answer
== ansstr
[0] || *answer
== ansstr
[1] ) {
2098 xfree(aname
); aname
= NULL
;
2101 else if( *answer
== ansstr
[2] || *answer
== ansstr
[3] ) {
2102 xfree(acomment
); acomment
= NULL
;
2105 else if( *answer
== ansstr
[4] || *answer
== ansstr
[5] ) {
2106 xfree(amail
); amail
= NULL
;
2109 else if( *answer
== ansstr
[6] || *answer
== ansstr
[7] ) {
2111 tty_printf(_("Please correct the error first\n"));
2114 xfree(aname
); aname
= NULL
;
2115 xfree(acomment
); acomment
= NULL
;
2116 xfree(amail
); amail
= NULL
;
2120 else if( *answer
== ansstr
[8] || *answer
== ansstr
[9] ) {
2121 xfree(aname
); aname
= NULL
;
2122 xfree(acomment
); acomment
= NULL
;
2123 xfree(amail
); amail
= NULL
;
2124 xfree(uid
); uid
= NULL
;
2130 if( !amail
&& !acomment
&& !amail
)
2132 xfree(uid
); uid
= NULL
;
2135 char *p
= native_to_utf8( uid
);
2144 do_ask_passphrase ( STRING2KEY
**ret_s2k
, int *r_canceled
)
2148 const char *errtext
= NULL
;
2150 tty_printf(_("You need a Passphrase to protect your secret key.\n\n") );
2152 s2k
= xmalloc_secure( sizeof *s2k
);
2154 s2k
->mode
= opt
.s2k_mode
;
2155 s2k
->hash_algo
= S2K_DIGEST_ALGO
;
2156 dek
= passphrase_to_dek( NULL
, 0, opt
.s2k_cipher_algo
, s2k
,2,
2157 errtext
, r_canceled
);
2158 if (!dek
&& *r_canceled
) {
2159 xfree(dek
); dek
= NULL
;
2160 xfree(s2k
); s2k
= NULL
;
2164 errtext
= N_("passphrase not correctly repeated; try again");
2165 tty_printf(_("%s.\n"), _(errtext
));
2167 else if( !dek
->keylen
) {
2168 xfree(dek
); dek
= NULL
;
2169 xfree(s2k
); s2k
= NULL
;
2171 "You don't want a passphrase - this is probably a *bad* idea!\n"
2172 "I will do it anyway. You can change your passphrase at any time,\n"
2173 "using this program with the option \"--edit-key\".\n\n"));
2184 /* Basic key generation. Here we divert to the actual generation
2185 routines based on the requested algorithm. */
2187 do_create (int algo
, unsigned int nbits
, KBNODE pub_root
, KBNODE sec_root
,
2188 DEK
*dek
, STRING2KEY
*s2k
, PKT_secret_key
**sk
,
2189 u32 timestamp
, u32 expiredate
, int is_subkey
)
2195 "We need to generate a lot of random bytes. It is a good idea to perform\n"
2196 "some other action (type on the keyboard, move the mouse, utilize the\n"
2197 "disks) during the prime generation; this gives the random number\n"
2198 "generator a better chance to gain enough entropy.\n") );
2200 if( algo
== PUBKEY_ALGO_ELGAMAL_E
)
2201 rc
= gen_elg(algo
, nbits
, pub_root
, sec_root
, dek
, s2k
, sk
,
2202 timestamp
, expiredate
, is_subkey
);
2203 else if( algo
== PUBKEY_ALGO_DSA
)
2204 rc
= gen_dsa(nbits
, pub_root
, sec_root
, dek
, s2k
, sk
,
2205 timestamp
, expiredate
, is_subkey
);
2206 else if( algo
== PUBKEY_ALGO_RSA
)
2207 rc
= gen_rsa(algo
, nbits
, pub_root
, sec_root
, dek
, s2k
, sk
,
2208 timestamp
, expiredate
, is_subkey
);
2217 * Generate a new user id packet, or return NULL if canceled
2226 p
= ask_user_id( 1 );
2230 uid
= xmalloc_clear( sizeof *uid
+ n
);
2232 strcpy(uid
->name
, p
);
2239 release_parameter_list( struct para_data_s
*r
)
2241 struct para_data_s
*r2
;
2243 for( ; r
; r
= r2
) {
2245 if( r
->key
== pPASSPHRASE_DEK
)
2247 else if( r
->key
== pPASSPHRASE_S2K
)
2254 static struct para_data_s
*
2255 get_parameter( struct para_data_s
*para
, enum para_name key
)
2257 struct para_data_s
*r
;
2259 for( r
= para
; r
&& r
->key
!= key
; r
= r
->next
)
2265 get_parameter_value( struct para_data_s
*para
, enum para_name key
)
2267 struct para_data_s
*r
= get_parameter( para
, key
);
2268 return (r
&& *r
->u
.value
)? r
->u
.value
: NULL
;
2272 get_parameter_algo( struct para_data_s
*para
, enum para_name key
)
2275 struct para_data_s
*r
= get_parameter( para
, key
);
2278 if( digitp( r
->u
.value
) )
2279 i
= atoi( r
->u
.value
);
2280 else if ( !strcmp ( r
->u
.value
, "ELG-E")
2281 || !strcmp ( r
->u
.value
, "ELG") )
2284 i
= gcry_pk_map_name (r
->u
.value
);
2285 if (i
== PUBKEY_ALGO_RSA_E
|| i
== PUBKEY_ALGO_RSA_S
)
2286 i
= 0; /* we don't want to allow generation of these algorithms */
2291 * Parse the usage parameter and set the keyflags. Returns -1 on
2292 * error, 0 for no usage given or 1 for usage available.
2295 parse_parameter_usage (const char *fname
,
2296 struct para_data_s
*para
, enum para_name key
)
2298 struct para_data_s
*r
= get_parameter( para
, key
);
2303 return 0; /* none (this is an optional parameter)*/
2307 while ( (p
= strsep (&pn
, " \t,")) ) {
2310 else if ( !ascii_strcasecmp (p
, "sign") )
2311 use
|= PUBKEY_USAGE_SIG
;
2312 else if ( !ascii_strcasecmp (p
, "encrypt") )
2313 use
|= PUBKEY_USAGE_ENC
;
2314 else if ( !ascii_strcasecmp (p
, "auth") )
2315 use
|= PUBKEY_USAGE_AUTH
;
2317 log_error("%s:%d: invalid usage list\n", fname
, r
->lnr
);
2318 return -1; /* error */
2326 parse_revocation_key (const char *fname
,
2327 struct para_data_s
*para
, enum para_name key
)
2329 struct para_data_s
*r
= get_parameter( para
, key
);
2330 struct revocation_key revkey
;
2335 return 0; /* none (this is an optional parameter) */
2340 revkey
.algid
=atoi(pn
);
2344 /* Skip to the fpr */
2345 while(*pn
&& *pn
!=':')
2353 for(i
=0;i
<MAX_FINGERPRINT_LEN
&& *pn
;i
++,pn
+=2)
2355 int c
=hextobyte(pn
);
2362 /* skip to the tag */
2363 while(*pn
&& *pn
!='s' && *pn
!='S')
2366 if(ascii_strcasecmp(pn
,"sensitive")==0)
2369 memcpy(&r
->u
.revkey
,&revkey
,sizeof(struct revocation_key
));
2374 log_error("%s:%d: invalid revocation key\n", fname
, r
->lnr
);
2375 return -1; /* error */
2380 get_parameter_u32( struct para_data_s
*para
, enum para_name key
)
2382 struct para_data_s
*r
= get_parameter( para
, key
);
2386 if( r
->key
== pKEYCREATIONDATE
)
2387 return r
->u
.creation
;
2388 if( r
->key
== pKEYEXPIRE
|| r
->key
== pSUBKEYEXPIRE
)
2390 if( r
->key
== pKEYUSAGE
|| r
->key
== pSUBKEYUSAGE
)
2393 return (unsigned int)strtoul( r
->u
.value
, NULL
, 10 );
2397 get_parameter_uint( struct para_data_s
*para
, enum para_name key
)
2399 return get_parameter_u32( para
, key
);
2403 get_parameter_dek( struct para_data_s
*para
, enum para_name key
)
2405 struct para_data_s
*r
= get_parameter( para
, key
);
2406 return r
? r
->u
.dek
: NULL
;
2410 get_parameter_s2k( struct para_data_s
*para
, enum para_name key
)
2412 struct para_data_s
*r
= get_parameter( para
, key
);
2413 return r
? r
->u
.s2k
: NULL
;
2416 static struct revocation_key
*
2417 get_parameter_revkey( struct para_data_s
*para
, enum para_name key
)
2419 struct para_data_s
*r
= get_parameter( para
, key
);
2420 return r
? &r
->u
.revkey
: NULL
;
2424 proc_parameter_file( struct para_data_s
*para
, const char *fname
,
2425 struct output_control_s
*outctrl
, int card
)
2427 struct para_data_s
*r
;
2428 const char *s1
, *s2
, *s3
;
2431 int have_user_id
=0,err
,algo
;
2433 /* Check that we have all required parameters. */
2434 r
= get_parameter( para
, pKEYTYPE
);
2437 algo
=get_parameter_algo(para
,pKEYTYPE
);
2438 if (openpgp_pk_test_algo2 (algo
, PUBKEY_USAGE_SIG
))
2440 log_error ("%s:%d: invalid algorithm\n", fname
, r
->lnr
);
2446 log_error ("%s: no Key-Type specified\n",fname
);
2450 err
= parse_parameter_usage (fname
, para
, pKEYUSAGE
);
2453 /* Default to algo capabilities if key-usage is not provided */
2454 r
= xmalloc_clear(sizeof(*r
));
2456 r
->u
.usage
= openpgp_pk_algo_usage(algo
);
2464 r
= get_parameter (para
, pKEYUSAGE
);
2465 if (r
&& (r
->u
.usage
& ~openpgp_pk_algo_usage (algo
)))
2467 log_error ("%s:%d: specified Key-Usage not allowed for algo %d\n",
2468 fname
, r
->lnr
, algo
);
2473 r
= get_parameter( para
, pSUBKEYTYPE
);
2476 algo
= get_parameter_algo (para
, pSUBKEYTYPE
);
2477 if (openpgp_pk_test_algo (algo
))
2479 log_error ("%s:%d: invalid algorithm\n", fname
, r
->lnr
);
2483 err
= parse_parameter_usage (fname
, para
, pSUBKEYUSAGE
);
2486 /* Default to algo capabilities if subkey-usage is not
2488 r
= xmalloc_clear (sizeof(*r
));
2489 r
->key
= pSUBKEYUSAGE
;
2490 r
->u
.usage
= openpgp_pk_algo_usage (algo
);
2498 r
= get_parameter (para
, pSUBKEYUSAGE
);
2499 if (r
&& (r
->u
.usage
& ~openpgp_pk_algo_usage (algo
)))
2501 log_error ("%s:%d: specified Subkey-Usage not allowed"
2502 " for algo %d\n", fname
, r
->lnr
, algo
);
2509 if( get_parameter_value( para
, pUSERID
) )
2513 /* create the formatted user ID */
2514 s1
= get_parameter_value( para
, pNAMEREAL
);
2515 s2
= get_parameter_value( para
, pNAMECOMMENT
);
2516 s3
= get_parameter_value( para
, pNAMEEMAIL
);
2517 if( s1
|| s2
|| s3
)
2519 n
= (s1
?strlen(s1
):0) + (s2
?strlen(s2
):0) + (s3
?strlen(s3
):0);
2520 r
= xmalloc_clear( sizeof *r
+ n
+ 20 );
2526 p
= stpcpy(stpcpy(stpcpy(p
," ("), s2
),")");
2528 p
= stpcpy(stpcpy(stpcpy(p
," <"), s3
),">");
2537 log_error("%s: no User-ID specified\n",fname
);
2541 /* Set preferences, if any. */
2542 keygen_set_std_prefs(get_parameter_value( para
, pPREFERENCES
), 0);
2544 /* Set keyserver, if any. */
2545 s1
=get_parameter_value( para
, pKEYSERVER
);
2548 struct keyserver_spec
*spec
;
2550 spec
=parse_keyserver_uri(s1
,1,NULL
,0);
2553 free_keyserver_spec(spec
);
2554 opt
.def_keyserver_url
=s1
;
2558 log_error("%s:%d: invalid keyserver url\n", fname
, r
->lnr
);
2563 /* Set revoker, if any. */
2564 if (parse_revocation_key (fname
, para
, pREVOKER
))
2567 /* Make DEK and S2K from the Passphrase. */
2568 if (outctrl
->ask_passphrase
)
2570 /* %ask-passphrase is active - ignore pPASSPRASE and ask. This
2571 feature is required so that GUIs are able to do a key
2572 creation but have gpg-agent ask for the passphrase. */
2577 dek
= do_ask_passphrase ( &s2k
, &canceled
);
2580 r
= xmalloc_clear( sizeof *r
);
2581 r
->key
= pPASSPHRASE_DEK
;
2585 r
= xmalloc_clear( sizeof *r
);
2586 r
->key
= pPASSPHRASE_S2K
;
2594 log_error ("%s:%d: key generation canceled\n", fname
, r
->lnr
);
2600 r
= get_parameter( para
, pPASSPHRASE
);
2601 if ( r
&& *r
->u
.value
)
2603 /* We have a plain text passphrase - create a DEK from it.
2604 * It is a little bit ridiculous to keep it in secure memory
2605 * but because we do this always, why not here. */
2609 s2k
= xmalloc_secure ( sizeof *s2k
);
2610 s2k
->mode
= opt
.s2k_mode
;
2611 s2k
->hash_algo
= S2K_DIGEST_ALGO
;
2612 set_next_passphrase ( r
->u
.value
);
2613 dek
= passphrase_to_dek (NULL
, 0, opt
.s2k_cipher_algo
, s2k
, 2,
2615 set_next_passphrase (NULL
);
2617 memset (r
->u
.value
, 0, strlen(r
->u
.value
));
2619 r
= xmalloc_clear (sizeof *r
);
2620 r
->key
= pPASSPHRASE_S2K
;
2624 r
= xmalloc_clear (sizeof *r
);
2625 r
->key
= pPASSPHRASE_DEK
;
2632 /* Make KEYCREATIONDATE from Creation-Date. */
2633 r
= get_parameter (para
, pCREATIONDATE
);
2634 if (r
&& *r
->u
.value
)
2638 seconds
= parse_creation_string (r
->u
.value
);
2641 log_error ("%s:%d: invalid creation date\n", fname
, r
->lnr
);
2644 r
->u
.creation
= seconds
;
2645 r
->key
= pKEYCREATIONDATE
; /* Change that entry. */
2648 /* Make KEYEXPIRE from Expire-Date. */
2649 r
= get_parameter( para
, pEXPIREDATE
);
2650 if( r
&& *r
->u
.value
)
2654 seconds
= parse_expire_string( r
->u
.value
);
2655 if( seconds
== (u32
)-1 )
2657 log_error("%s:%d: invalid expire date\n", fname
, r
->lnr
);
2660 r
->u
.expire
= seconds
;
2661 r
->key
= pKEYEXPIRE
; /* change hat entry */
2662 /* also set it for the subkey */
2663 r
= xmalloc_clear( sizeof *r
+ 20 );
2664 r
->key
= pSUBKEYEXPIRE
;
2665 r
->u
.expire
= seconds
;
2670 if( !!outctrl
->pub
.newfname
^ !!outctrl
->sec
.newfname
) {
2671 log_error("%s:%d: only one ring name is set\n", fname
, outctrl
->lnr
);
2675 do_generate_keypair( para
, outctrl
, card
);
2681 * Kludge to allow non interactive key generation controlled
2682 * by a parameter file.
2683 * Note, that string parameters are expected to be in UTF-8
2686 read_parameter_file( const char *fname
)
2688 static struct { const char *name
;
2691 { "Key-Type", pKEYTYPE
},
2692 { "Key-Length", pKEYLENGTH
},
2693 { "Key-Usage", pKEYUSAGE
},
2694 { "Subkey-Type", pSUBKEYTYPE
},
2695 { "Subkey-Length", pSUBKEYLENGTH
},
2696 { "Subkey-Usage", pSUBKEYUSAGE
},
2697 { "Name-Real", pNAMEREAL
},
2698 { "Name-Email", pNAMEEMAIL
},
2699 { "Name-Comment", pNAMECOMMENT
},
2700 { "Expire-Date", pEXPIREDATE
},
2701 { "Creation-Date", pCREATIONDATE
},
2702 { "Passphrase", pPASSPHRASE
},
2703 { "Preferences", pPREFERENCES
},
2704 { "Revoker", pREVOKER
},
2705 { "Handle", pHANDLE
},
2706 { "Keyserver", pKEYSERVER
},
2711 unsigned int maxlen
, nline
;
2714 const char *err
= NULL
;
2715 struct para_data_s
*para
, *r
;
2717 struct output_control_s outctrl
;
2719 memset( &outctrl
, 0, sizeof( outctrl
) );
2720 outctrl
.pub
.afx
= new_armor_context ();
2721 outctrl
.sec
.afx
= new_armor_context ();
2723 if( !fname
|| !*fname
)
2726 fp
= iobuf_open (fname
);
2727 if (fp
&& is_secured_file (iobuf_get_fd (fp
)))
2734 log_error (_("can't open `%s': %s\n"), fname
, strerror(errno
) );
2737 iobuf_ioctl (fp
, 3, 1, NULL
); /* No file caching. */
2744 while ( iobuf_read_line (fp
, &line
, &nline
, &maxlen
) ) {
2745 char *keyword
, *value
;
2749 err
= "line too long";
2752 for( p
= line
; isspace(*(byte
*)p
); p
++ )
2754 if( !*p
|| *p
== '#' )
2757 if( *keyword
== '%' ) {
2758 for( ; !isspace(*(byte
*)p
); p
++ )
2762 for( ; isspace(*(byte
*)p
); p
++ )
2765 trim_trailing_ws( value
, strlen(value
) );
2766 if( !ascii_strcasecmp( keyword
, "%echo" ) )
2767 log_info("%s\n", value
);
2768 else if( !ascii_strcasecmp( keyword
, "%dry-run" ) )
2770 else if( !ascii_strcasecmp( keyword
, "%ask-passphrase" ) )
2771 outctrl
.ask_passphrase
= 1;
2772 else if( !ascii_strcasecmp( keyword
, "%no-ask-passphrase" ) )
2773 outctrl
.ask_passphrase
= 0;
2774 else if( !ascii_strcasecmp( keyword
, "%commit" ) ) {
2776 if (proc_parameter_file( para
, fname
, &outctrl
, 0 ))
2777 print_status_key_not_created
2778 (get_parameter_value (para
, pHANDLE
));
2779 release_parameter_list( para
);
2782 else if( !ascii_strcasecmp( keyword
, "%pubring" ) ) {
2783 if( outctrl
.pub
.fname
&& !strcmp( outctrl
.pub
.fname
, value
) )
2784 ; /* still the same file - ignore it */
2786 xfree( outctrl
.pub
.newfname
);
2787 outctrl
.pub
.newfname
= xstrdup( value
);
2788 outctrl
.use_files
= 1;
2791 else if( !ascii_strcasecmp( keyword
, "%secring" ) ) {
2792 if( outctrl
.sec
.fname
&& !strcmp( outctrl
.sec
.fname
, value
) )
2793 ; /* still the same file - ignore it */
2795 xfree( outctrl
.sec
.newfname
);
2796 outctrl
.sec
.newfname
= xstrdup( value
);
2797 outctrl
.use_files
= 1;
2801 log_info("skipping control `%s' (%s)\n", keyword
, value
);
2808 if( !(p
= strchr( p
, ':' )) || p
== keyword
) {
2809 err
= "missing colon";
2814 for( ; isspace(*(byte
*)p
); p
++ )
2817 err
= "missing argument";
2821 trim_trailing_ws( value
, strlen(value
) );
2823 for(i
=0; keywords
[i
].name
; i
++ ) {
2824 if( !ascii_strcasecmp( keywords
[i
].name
, keyword
) )
2827 if( !keywords
[i
].name
) {
2828 err
= "unknown keyword";
2831 if( keywords
[i
].key
!= pKEYTYPE
&& !para
) {
2832 err
= "parameter block does not start with \"Key-Type\"";
2836 if( keywords
[i
].key
== pKEYTYPE
&& para
) {
2838 if (proc_parameter_file( para
, fname
, &outctrl
, 0 ))
2839 print_status_key_not_created
2840 (get_parameter_value (para
, pHANDLE
));
2841 release_parameter_list( para
);
2845 for( r
= para
; r
; r
= r
->next
) {
2846 if( r
->key
== keywords
[i
].key
)
2850 err
= "duplicate keyword";
2854 r
= xmalloc_clear( sizeof *r
+ strlen( value
) );
2856 r
->key
= keywords
[i
].key
;
2857 strcpy( r
->u
.value
, value
);
2862 log_error("%s:%d: %s\n", fname
, lnr
, err
);
2863 else if( iobuf_error (fp
) ) {
2864 log_error("%s:%d: read error\n", fname
, lnr
);
2868 if (proc_parameter_file( para
, fname
, &outctrl
, 0 ))
2869 print_status_key_not_created (get_parameter_value (para
, pHANDLE
));
2872 if( outctrl
.use_files
) { /* close open streams */
2873 iobuf_close( outctrl
.pub
.stream
);
2874 iobuf_close( outctrl
.sec
.stream
);
2876 /* Must invalidate that ugly cache to actually close it. */
2877 if (outctrl
.pub
.fname
)
2878 iobuf_ioctl (NULL
, 2, 0, (char*)outctrl
.pub
.fname
);
2879 if (outctrl
.sec
.fname
)
2880 iobuf_ioctl (NULL
, 2, 0, (char*)outctrl
.sec
.fname
);
2882 xfree( outctrl
.pub
.fname
);
2883 xfree( outctrl
.pub
.newfname
);
2884 xfree( outctrl
.sec
.fname
);
2885 xfree( outctrl
.sec
.newfname
);
2888 release_parameter_list( para
);
2890 release_armor_context (outctrl
.pub
.afx
);
2891 release_armor_context (outctrl
.sec
.afx
);
2896 * Generate a keypair (fname is only used in batch mode) If
2897 * CARD_SERIALNO is not NULL the function will create the keys on an
2898 * OpenPGP Card. If BACKUP_ENCRYPTION_DIR has been set and
2899 * CARD_SERIALNO is NOT NULL, the encryption key for the card gets
2900 * generate in software, imported to the card and a backup file
2901 * written to directory given by this argument .
2904 generate_keypair (const char *fname
, const char *card_serialno
,
2905 const char *backup_encryption_dir
)
2915 struct para_data_s
*para
= NULL
;
2916 struct para_data_s
*r
;
2917 struct output_control_s outctrl
;
2920 memset( &outctrl
, 0, sizeof( outctrl
) );
2922 if (opt
.batch
&& card_serialno
)
2924 /* We don't yet support unattended key generation. */
2925 log_error (_("can't do this in batch mode\n"));
2931 read_parameter_file( fname
);
2937 #ifdef ENABLE_CARD_SUPPORT
2938 r
= xcalloc (1, sizeof *r
+ strlen (card_serialno
) );
2940 strcpy( r
->u
.value
, card_serialno
);
2944 algo
= PUBKEY_ALGO_RSA
;
2946 r
= xcalloc (1, sizeof *r
+ 20 );
2948 sprintf( r
->u
.value
, "%d", algo
);
2951 r
= xcalloc (1, sizeof *r
+ 20 );
2953 strcpy (r
->u
.value
, "sign");
2957 r
= xcalloc (1, sizeof *r
+ 20 );
2958 r
->key
= pSUBKEYTYPE
;
2959 sprintf( r
->u
.value
, "%d", algo
);
2962 r
= xcalloc (1, sizeof *r
+ 20 );
2963 r
->key
= pSUBKEYUSAGE
;
2964 strcpy (r
->u
.value
, "encrypt");
2968 r
= xcalloc (1, sizeof *r
+ 20 );
2969 r
->key
= pAUTHKEYTYPE
;
2970 sprintf( r
->u
.value
, "%d", algo
);
2974 if (backup_encryption_dir
)
2976 r
= xcalloc (1, sizeof *r
+ strlen (backup_encryption_dir
) );
2977 r
->key
= pBACKUPENCDIR
;
2978 strcpy (r
->u
.value
, backup_encryption_dir
);
2982 #endif /*ENABLE_CARD_SUPPORT*/
2986 algo
= ask_algo( 0, &use
);
2988 { /* default: DSA with ElG subkey of the specified size */
2990 r
= xmalloc_clear( sizeof *r
+ 20 );
2992 sprintf( r
->u
.value
, "%d", PUBKEY_ALGO_DSA
);
2995 nbits
= ask_keysize( PUBKEY_ALGO_DSA
);
2996 r
= xmalloc_clear( sizeof *r
+ 20 );
2997 r
->key
= pKEYLENGTH
;
2998 sprintf( r
->u
.value
, "%u", nbits
);
3001 r
= xmalloc_clear( sizeof *r
+ 20 );
3003 strcpy( r
->u
.value
, "sign" );
3007 algo
= PUBKEY_ALGO_ELGAMAL_E
;
3008 r
= xmalloc_clear( sizeof *r
+ 20 );
3009 r
->key
= pSUBKEYTYPE
;
3010 sprintf( r
->u
.value
, "%d", algo
);
3013 r
= xmalloc_clear( sizeof *r
+ 20 );
3014 r
->key
= pSUBKEYUSAGE
;
3015 strcpy( r
->u
.value
, "encrypt" );
3021 r
= xmalloc_clear( sizeof *r
+ 20 );
3023 sprintf( r
->u
.value
, "%d", algo
);
3029 r
= xmalloc_clear( sizeof *r
+ 25 );
3031 sprintf( r
->u
.value
, "%s%s%s",
3032 (use
& PUBKEY_USAGE_SIG
)? "sign ":"",
3033 (use
& PUBKEY_USAGE_ENC
)? "encrypt ":"",
3034 (use
& PUBKEY_USAGE_AUTH
)? "auth":"" );
3041 nbits
= ask_keysize( algo
);
3042 r
= xmalloc_clear( sizeof *r
+ 20 );
3043 r
->key
= both
? pSUBKEYLENGTH
: pKEYLENGTH
;
3044 sprintf( r
->u
.value
, "%u", nbits
);
3049 expire
= ask_expire_interval(0,NULL
);
3050 r
= xmalloc_clear( sizeof *r
+ 20 );
3051 r
->key
= pKEYEXPIRE
;
3052 r
->u
.expire
= expire
;
3055 r
= xmalloc_clear( sizeof *r
+ 20 );
3056 r
->key
= pSUBKEYEXPIRE
;
3057 r
->u
.expire
= expire
;
3061 uid
= ask_user_id(0);
3064 log_error(_("Key generation canceled.\n"));
3065 release_parameter_list( para
);
3068 r
= xmalloc_clear( sizeof *r
+ strlen(uid
) );
3070 strcpy( r
->u
.value
, uid
);
3075 dek
= card_serialno
? NULL
: do_ask_passphrase ( &s2k
, &canceled
);
3078 r
= xmalloc_clear( sizeof *r
);
3079 r
->key
= pPASSPHRASE_DEK
;
3083 r
= xmalloc_clear( sizeof *r
);
3084 r
->key
= pPASSPHRASE_S2K
;
3091 log_error (_("Key generation canceled.\n"));
3093 proc_parameter_file( para
, "[internal]", &outctrl
, !!card_serialno
);
3094 release_parameter_list( para
);
3098 #ifdef ENABLE_CARD_SUPPORT
3099 /* Generate a raw key and return it as a secret key packet. The
3100 function will ask for the passphrase and return a protected as well
3101 as an unprotected copy of a new secret key packet. 0 is returned
3102 on success and the caller must then free the returned values. */
3104 generate_raw_key (int algo
, unsigned int nbits
, u32 created_at
,
3105 PKT_secret_key
**r_sk_unprotected
,
3106 PKT_secret_key
**r_sk_protected
)
3110 STRING2KEY
*s2k
= NULL
;
3111 PKT_secret_key
*sk
= NULL
;
3113 size_t nskey
, npkey
;
3114 gcry_sexp_t s_parms
, s_key
;
3117 npkey
= pubkey_get_npkey (algo
);
3118 nskey
= pubkey_get_nskey (algo
);
3119 assert (nskey
<= PUBKEY_MAX_NSKEY
&& npkey
< nskey
);
3124 log_info (_("keysize invalid; using %u bits\n"), nbits
);
3129 nbits
= ((nbits
+ 31) / 32) * 32;
3130 log_info(_("keysize rounded up to %u bits\n"), nbits
);
3133 dek
= do_ask_passphrase (&s2k
, &canceled
);
3136 rc
= gpg_error (GPG_ERR_CANCELED
);
3140 sk
= xmalloc_clear (sizeof *sk
);
3141 sk
->timestamp
= created_at
;
3143 sk
->pubkey_algo
= algo
;
3145 if ( !is_RSA (algo
) )
3147 log_error ("only RSA is supported for offline generated keys\n");
3148 rc
= gpg_error (GPG_ERR_NOT_IMPLEMENTED
);
3151 rc
= gcry_sexp_build (&s_parms
, NULL
,
3152 "(genkey(rsa(nbits %d)))",
3155 log_bug ("gcry_sexp_build failed: %s\n", gpg_strerror (rc
));
3156 rc
= gcry_pk_genkey (&s_key
, s_parms
);
3157 gcry_sexp_release (s_parms
);
3160 log_error ("gcry_pk_genkey failed: %s\n", gpg_strerror (rc
) );
3163 rc
= key_from_sexp (sk
->skey
, s_key
, "private-key", "nedpqu");
3164 gcry_sexp_release (s_key
);
3167 log_error ("key_from_sexp failed: %s\n", gpg_strerror (rc
) );
3171 for (i
=npkey
; i
< nskey
; i
++)
3172 sk
->csum
+= checksum_mpi (sk
->skey
[i
]);
3174 if (r_sk_unprotected
)
3175 *r_sk_unprotected
= copy_secret_key (NULL
, sk
);
3177 rc
= genhelp_protect (dek
, s2k
, sk
);
3183 *r_sk_protected
= sk
;
3189 free_secret_key (sk
);
3194 #endif /* ENABLE_CARD_SUPPORT */
3196 /* Create and delete a dummy packet to start off a list of kbnodes. */
3198 start_tree(KBNODE
*tree
)
3202 pkt
=xmalloc_clear(sizeof(*pkt
));
3203 pkt
->pkttype
=PKT_NONE
;
3204 *tree
=new_kbnode(pkt
);
3205 delete_kbnode(*tree
);
3210 do_generate_keypair (struct para_data_s
*para
,
3211 struct output_control_s
*outctrl
, int card
)
3213 KBNODE pub_root
= NULL
;
3214 KBNODE sec_root
= NULL
;
3215 PKT_secret_key
*pri_sk
= NULL
, *sub_sk
= NULL
;
3217 struct revocation_key
*revkey
;
3222 if( outctrl
->dryrun
)
3224 log_info("dry-run mode - key generation skipped\n");
3228 if ( outctrl
->use_files
)
3230 if ( outctrl
->pub
.newfname
)
3232 iobuf_close(outctrl
->pub
.stream
);
3233 outctrl
->pub
.stream
= NULL
;
3234 if (outctrl
->pub
.fname
)
3235 iobuf_ioctl (NULL
, 2, 0, (char*)outctrl
->pub
.fname
);
3236 xfree( outctrl
->pub
.fname
);
3237 outctrl
->pub
.fname
= outctrl
->pub
.newfname
;
3238 outctrl
->pub
.newfname
= NULL
;
3240 if (is_secured_filename (outctrl
->pub
.fname
) )
3242 outctrl
->pub
.stream
= NULL
;
3246 outctrl
->pub
.stream
= iobuf_create( outctrl
->pub
.fname
);
3247 if (!outctrl
->pub
.stream
)
3249 log_error(_("can't create `%s': %s\n"), outctrl
->pub
.newfname
,
3255 outctrl
->pub
.afx
->what
= 1;
3256 push_armor_filter (outctrl
->pub
.afx
, outctrl
->pub
.stream
);
3259 if (outctrl
->sec
.newfname
)
3263 iobuf_close(outctrl
->sec
.stream
);
3264 outctrl
->sec
.stream
= NULL
;
3265 if (outctrl
->sec
.fname
)
3266 iobuf_ioctl (NULL
, 2, 0, (char*)outctrl
->sec
.fname
);
3267 xfree( outctrl
->sec
.fname
);
3268 outctrl
->sec
.fname
= outctrl
->sec
.newfname
;
3269 outctrl
->sec
.newfname
= NULL
;
3271 oldmask
= umask (077);
3272 if (is_secured_filename (outctrl
->sec
.fname
) )
3274 outctrl
->sec
.stream
= NULL
;
3278 outctrl
->sec
.stream
= iobuf_create( outctrl
->sec
.fname
);
3280 if (!outctrl
->sec
.stream
)
3282 log_error(_("can't create `%s': %s\n"), outctrl
->sec
.newfname
,
3288 outctrl
->sec
.afx
->what
= 5;
3289 push_armor_filter (outctrl
->sec
.afx
, outctrl
->sec
.stream
);
3292 assert( outctrl
->pub
.stream
);
3293 assert( outctrl
->sec
.stream
);
3296 log_info (_("writing public key to `%s'\n"), outctrl
->pub
.fname
);
3298 log_info (_("writing secret key stub to `%s'\n"),
3299 outctrl
->sec
.fname
);
3301 log_info(_("writing secret key to `%s'\n"), outctrl
->sec
.fname
);
3306 /* We create the packets as a tree of kbnodes. Because the
3307 structure we create is known in advance we simply generate a
3308 linked list. The first packet is a dummy packet which we flag as
3309 deleted. The very first packet must always be a KEY packet. */
3311 start_tree (&pub_root
);
3312 start_tree (&sec_root
);
3314 timestamp
= get_parameter_u32 (para
, pKEYCREATIONDATE
);
3316 timestamp
= make_timestamp ();
3320 rc
= do_create (get_parameter_algo( para
, pKEYTYPE
),
3321 get_parameter_uint( para
, pKEYLENGTH
),
3323 get_parameter_dek( para
, pPASSPHRASE_DEK
),
3324 get_parameter_s2k( para
, pPASSPHRASE_S2K
),
3327 get_parameter_u32( para
, pKEYEXPIRE
), 0 );
3331 /* Note, that depending on the backend, the card key generation
3332 may update TIMESTAMP. */
3333 rc
= gen_card_key (PUBKEY_ALGO_RSA
, 1, 1, pub_root
, sec_root
, NULL
,
3335 get_parameter_u32 (para
, pKEYEXPIRE
), para
);
3338 pri_sk
= sec_root
->next
->pkt
->pkt
.secret_key
;
3343 if(!rc
&& (revkey
=get_parameter_revkey(para
,pREVOKER
)))
3345 rc
= write_direct_sig (pub_root
, pub_root
, pri_sk
, revkey
, timestamp
);
3347 rc
= write_direct_sig (sec_root
, pub_root
, pri_sk
, revkey
, timestamp
);
3350 if( !rc
&& (s
=get_parameter_value(para
, pUSERID
)) )
3352 write_uid (pub_root
, s
);
3353 write_uid (sec_root
, s
);
3355 rc
= write_selfsigs (sec_root
, pub_root
, pri_sk
,
3356 get_parameter_uint (para
, pKEYUSAGE
), timestamp
);
3359 /* Write the auth key to the card before the encryption key. This
3360 is a partial workaround for a PGP bug (as of this writing, all
3361 versions including 8.1), that causes it to try and encrypt to
3362 the most recent subkey regardless of whether that subkey is
3363 actually an encryption type. In this case, the auth key is an
3364 RSA key so it succeeds. */
3366 if (!rc
&& card
&& get_parameter (para
, pAUTHKEYTYPE
))
3368 /* Note, that depending on the backend, the card key generation
3369 may update TIMESTAMP. */
3370 rc
= gen_card_key (PUBKEY_ALGO_RSA
, 3, 0, pub_root
, sec_root
, NULL
,
3372 get_parameter_u32 (para
, pKEYEXPIRE
), para
);
3375 rc
= write_keybinding (pub_root
, pub_root
, pri_sk
, sub_sk
,
3376 PUBKEY_USAGE_AUTH
, timestamp
);
3378 rc
= write_keybinding (sec_root
, pub_root
, pri_sk
, sub_sk
,
3379 PUBKEY_USAGE_AUTH
, timestamp
);
3382 if( !rc
&& get_parameter( para
, pSUBKEYTYPE
) )
3386 rc
= do_create( get_parameter_algo( para
, pSUBKEYTYPE
),
3387 get_parameter_uint( para
, pSUBKEYLENGTH
),
3389 get_parameter_dek( para
, pPASSPHRASE_DEK
),
3390 get_parameter_s2k( para
, pPASSPHRASE_S2K
),
3393 get_parameter_u32( para
, pSUBKEYEXPIRE
), 1 );
3397 if ((s
= get_parameter_value (para
, pBACKUPENCDIR
)))
3399 /* A backup of the encryption key has been requested.
3400 Generate the key in software and import it then to
3401 the card. Write a backup file. */
3402 rc
= gen_card_key_with_backup (PUBKEY_ALGO_RSA
, 2, 0,
3405 get_parameter_u32 (para
,
3411 /* Note, that depending on the backend, the card key
3412 generation may update TIMESTAMP. */
3413 rc
= gen_card_key (PUBKEY_ALGO_RSA
, 2, 0, pub_root
, sec_root
,
3416 get_parameter_u32 (para
, pKEYEXPIRE
), para
);
3421 rc
= write_keybinding(pub_root
, pub_root
, pri_sk
, sub_sk
,
3422 get_parameter_uint (para
, pSUBKEYUSAGE
),
3425 rc
= write_keybinding(sec_root
, pub_root
, pri_sk
, sub_sk
,
3426 get_parameter_uint (para
, pSUBKEYUSAGE
),
3431 if (!rc
&& outctrl
->use_files
) /* Direct write to specified files. */
3433 rc
= write_keyblock( outctrl
->pub
.stream
, pub_root
);
3435 log_error ("can't write public key: %s\n", g10_errstr(rc
) );
3438 rc
= write_keyblock( outctrl
->sec
.stream
, sec_root
);
3440 log_error ("can't write secret key: %s\n", g10_errstr(rc
) );
3443 else if (!rc
) /* Write to the standard keyrings. */
3445 KEYDB_HANDLE pub_hd
= keydb_new (0);
3446 KEYDB_HANDLE sec_hd
= keydb_new (1);
3448 rc
= keydb_locate_writable (pub_hd
, NULL
);
3450 log_error (_("no writable public keyring found: %s\n"),
3455 rc
= keydb_locate_writable (sec_hd
, NULL
);
3457 log_error (_("no writable secret keyring found: %s\n"),
3461 if (!rc
&& opt
.verbose
)
3463 log_info (_("writing public key to `%s'\n"),
3464 keydb_get_resource_name (pub_hd
));
3466 log_info (_("writing secret key stub to `%s'\n"),
3467 keydb_get_resource_name (sec_hd
));
3469 log_info (_("writing secret key to `%s'\n"),
3470 keydb_get_resource_name (sec_hd
));
3475 rc
= keydb_insert_keyblock (pub_hd
, pub_root
);
3477 log_error (_("error writing public keyring `%s': %s\n"),
3478 keydb_get_resource_name (pub_hd
), g10_errstr(rc
));
3483 rc
= keydb_insert_keyblock (sec_hd
, sec_root
);
3485 log_error (_("error writing secret keyring `%s': %s\n"),
3486 keydb_get_resource_name (pub_hd
), g10_errstr(rc
));
3489 keydb_release (pub_hd
);
3490 keydb_release (sec_hd
);
3497 no_enc_rsa
= (get_parameter_algo (para
, pKEYTYPE
) == PUBKEY_ALGO_RSA
3498 && get_parameter_uint (para
, pKEYUSAGE
)
3499 && !((get_parameter_uint (para
, pKEYUSAGE
)
3500 & PUBKEY_USAGE_ENC
)) );
3502 pk
= find_kbnode (pub_root
, PKT_PUBLIC_KEY
)->pkt
->pkt
.public_key
;
3504 keyid_from_pk(pk
,pk
->main_keyid
);
3505 register_trusted_keyid(pk
->main_keyid
);
3507 update_ownertrust (pk
, ((get_ownertrust (pk
) & ~TRUST_MASK
)
3508 | TRUST_ULTIMATE
));
3512 tty_printf (_("public and secret key created and signed.\n") );
3514 list_keyblock(pub_root
,0,1,NULL
);
3519 && (get_parameter_algo (para
, pKEYTYPE
) == PUBKEY_ALGO_DSA
3521 && !get_parameter (para
, pSUBKEYTYPE
) )
3523 tty_printf(_("Note that this key cannot be used for "
3524 "encryption. You may want to use\n"
3525 "the command \"--edit-key\" to generate a "
3526 "subkey for this purpose.\n") );
3534 log_error ("key generation failed: %s\n", g10_errstr(rc
) );
3536 tty_printf (_("Key generation failed: %s\n"), g10_errstr(rc
) );
3537 print_status_key_not_created ( get_parameter_value (para
, pHANDLE
) );
3541 PKT_public_key
*pk
= find_kbnode (pub_root
,
3542 PKT_PUBLIC_KEY
)->pkt
->pkt
.public_key
;
3543 print_status_key_created (did_sub
? 'B':'P', pk
,
3544 get_parameter_value (para
, pHANDLE
));
3546 release_kbnode( pub_root
);
3547 release_kbnode( sec_root
);
3549 if (pri_sk
&& !card
) /* The unprotected secret key unless we */
3550 free_secret_key (pri_sk
); /* have a shallow copy in card mode. */
3552 free_secret_key(sub_sk
);
3556 /* Add a new subkey to an existing key. Returns true if a new key has
3557 been generated and put into the keyblocks. */
3559 generate_subkeypair (KBNODE pub_keyblock
, KBNODE sec_keyblock
)
3563 PKT_secret_key
*pri_sk
= NULL
, *sub_sk
= NULL
;
3568 char *passphrase
= NULL
;
3570 STRING2KEY
*s2k
= NULL
;
3575 /* Break out the primary secret key. */
3576 node
= find_kbnode( sec_keyblock
, PKT_SECRET_KEY
);
3579 log_error ("Oops; secret key not found anymore!\n");
3583 /* Make a copy of the sk to keep the protected one in the keyblock. */
3584 pri_sk
= copy_secret_key (NULL
, node
->pkt
->pkt
.secret_key
);
3586 cur_time
= make_timestamp();
3588 if (pri_sk
->timestamp
> cur_time
)
3590 ulong d
= pri_sk
->timestamp
- cur_time
;
3591 log_info ( d
==1 ? _("key has been created %lu second "
3592 "in future (time warp or clock problem)\n")
3593 : _("key has been created %lu seconds "
3594 "in future (time warp or clock problem)\n"), d
);
3595 if (!opt
.ignore_time_conflict
)
3597 rc
= G10ERR_TIME_CONFLICT
;
3602 if (pri_sk
->version
< 4)
3604 log_info (_("NOTE: creating subkeys for v3 keys "
3605 "is not OpenPGP compliant\n"));
3609 if (pri_sk
->is_protected
&& pri_sk
->protect
.s2k
.mode
== 1001)
3611 tty_printf (_("Secret parts of primary key are not available.\n"));
3612 rc
= G10ERR_NO_SECKEY
;
3617 /* Unprotect to get the passphrase. */
3618 switch (is_secret_key_protected (pri_sk
) )
3621 rc
= G10ERR_PUBKEY_ALGO
;
3624 tty_printf (_("This key is not protected.\n"));
3627 tty_printf (_("Secret parts of primary key are stored on-card.\n"));
3631 tty_printf (_("Key is protected.\n"));
3632 rc
= check_secret_key ( pri_sk
, 0 );
3634 passphrase
= get_last_passphrase();
3640 algo
= ask_algo (1, &use
);
3642 nbits
= ask_keysize (algo
);
3643 expire
= ask_expire_interval (0, NULL
);
3644 if (!cpr_enabled() && !cpr_get_answer_is_yes("keygen.sub.okay",
3645 _("Really create? (y/N) ")))
3650 dek
= do_ask_passphrase (&s2k
, &canceled
);
3651 else if (passphrase
)
3653 s2k
= xmalloc_secure ( sizeof *s2k
);
3654 s2k
->mode
= opt
.s2k_mode
;
3655 s2k
->hash_algo
= S2K_DIGEST_ALGO
;
3656 set_next_passphrase ( passphrase
);
3657 dek
= passphrase_to_dek (NULL
, 0, opt
.s2k_cipher_algo
, s2k
, 2,
3662 rc
= GPG_ERR_CANCELED
;
3665 rc
= do_create (algo
, nbits
, pub_keyblock
, sec_keyblock
,
3666 dek
, s2k
, &sub_sk
, cur_time
, expire
, 1 );
3668 rc
= write_keybinding (pub_keyblock
, pub_keyblock
, pri_sk
, sub_sk
,
3671 rc
= write_keybinding (sec_keyblock
, pub_keyblock
, pri_sk
, sub_sk
,
3676 write_status_text (STATUS_KEY_CREATED
, "S");
3681 log_error (_("Key generation failed: %s\n"), g10_errstr(rc
) );
3685 /* Release the copy of the (now unprotected) secret keys. */
3687 free_secret_key (pri_sk
);
3689 free_secret_key (sub_sk
);
3690 set_next_passphrase (NULL
);
3695 #ifdef ENABLE_CARD_SUPPORT
3696 /* Generate a subkey on a card. */
3698 generate_card_subkeypair (KBNODE pub_keyblock
, KBNODE sec_keyblock
,
3699 int keyno
, const char *serialno
)
3703 PKT_secret_key
*pri_sk
= NULL
, *sub_sk
;
3707 char *passphrase
= NULL
;
3709 struct para_data_s
*para
= NULL
;
3711 assert (keyno
>= 1 && keyno
<= 3);
3713 para
= xcalloc (1, sizeof *para
+ strlen (serialno
) );
3714 para
->key
= pSERIALNO
;
3715 strcpy (para
->u
.value
, serialno
);
3717 /* Break out the primary secret key */
3718 node
= find_kbnode (sec_keyblock
, PKT_SECRET_KEY
);
3721 log_error("Oops; secret key not found anymore!\n");
3725 /* Make a copy of the sk to keep the protected one in the keyblock */
3726 pri_sk
= copy_secret_key (NULL
, node
->pkt
->pkt
.secret_key
);
3728 cur_time
= make_timestamp();
3729 if (pri_sk
->timestamp
> cur_time
)
3731 ulong d
= pri_sk
->timestamp
- cur_time
;
3732 log_info (d
==1 ? _("key has been created %lu second "
3733 "in future (time warp or clock problem)\n")
3734 : _("key has been created %lu seconds "
3735 "in future (time warp or clock problem)\n"), d
);
3736 if (!opt
.ignore_time_conflict
)
3738 rc
= G10ERR_TIME_CONFLICT
;
3743 if (pri_sk
->version
< 4)
3745 log_info (_("NOTE: creating subkeys for v3 keys "
3746 "is not OpenPGP compliant\n"));
3750 /* Unprotect to get the passphrase. */
3751 switch( is_secret_key_protected (pri_sk
) )
3754 rc
= G10ERR_PUBKEY_ALGO
;
3757 tty_printf("This key is not protected.\n");
3760 tty_printf("Key is protected.\n");
3761 rc
= check_secret_key( pri_sk
, 0 );
3763 passphrase
= get_last_passphrase();
3769 algo
= PUBKEY_ALGO_RSA
;
3770 expire
= ask_expire_interval (0,NULL
);
3772 use
= PUBKEY_USAGE_SIG
;
3773 else if (keyno
== 2)
3774 use
= PUBKEY_USAGE_ENC
;
3776 use
= PUBKEY_USAGE_AUTH
;
3777 if (!cpr_enabled() && !cpr_get_answer_is_yes("keygen.cardsub.okay",
3778 _("Really create? (y/N) ")))
3782 set_next_passphrase (passphrase
);
3784 /* Note, that depending on the backend, the card key generation may
3786 rc
= gen_card_key (algo
, keyno
, 0, pub_keyblock
, sec_keyblock
,
3787 &sub_sk
, &cur_time
, expire
, para
);
3789 rc
= write_keybinding (pub_keyblock
, pub_keyblock
, pri_sk
, sub_sk
,
3792 rc
= write_keybinding (sec_keyblock
, pub_keyblock
, pri_sk
, sub_sk
,
3797 write_status_text (STATUS_KEY_CREATED
, "S");
3802 log_error (_("Key generation failed: %s\n"), g10_errstr(rc
) );
3804 /* Release the copy of the (now unprotected) secret keys. */
3806 free_secret_key (pri_sk
);
3807 set_next_passphrase( NULL
);
3808 release_parameter_list (para
);
3811 #endif /* !ENABLE_CARD_SUPPORT */
3815 * Write a keyblock to an output stream
3818 write_keyblock( IOBUF out
, KBNODE node
)
3820 for( ; node
; node
= node
->next
)
3822 if(!is_deleted_kbnode(node
))
3824 int rc
= build_packet( out
, node
->pkt
);
3827 log_error("build_packet(%d) failed: %s\n",
3828 node
->pkt
->pkttype
, g10_errstr(rc
) );
3838 /* Note that timestamp is an in/out arg. */
3840 gen_card_key (int algo
, int keyno
, int is_primary
,
3841 KBNODE pub_root
, KBNODE sec_root
, PKT_secret_key
**ret_sk
,
3842 u32
*timestamp
, u32 expireval
, struct para_data_s
*para
)
3844 #ifdef ENABLE_CARD_SUPPORT
3847 struct agent_card_genkey_s info
;
3852 assert (algo
== PUBKEY_ALGO_RSA
);
3854 /* Fixme: We don't have the serialnumber available, thus passing NULL. */
3855 rc
= agent_scd_genkey (&info
, keyno
, 1, NULL
, *timestamp
);
3856 /* if (gpg_err_code (rc) == GPG_ERR_EEXIST) */
3858 /* tty_printf ("\n"); */
3859 /* log_error ("WARNING: key does already exists!\n"); */
3860 /* tty_printf ("\n"); */
3861 /* if ( cpr_get_answer_is_yes( "keygen.card.replace_key", */
3862 /* _("Replace existing key? "))) */
3863 /* rc = agent_scd_genkey (&info, keyno, 1); */
3868 log_error ("key generation failed: %s\n", gpg_strerror (rc
));
3871 if ( !info
.n
|| !info
.e
)
3873 log_error ("communication error with SCD\n");
3874 gcry_mpi_release (info
.n
);
3875 gcry_mpi_release (info
.e
);
3876 return gpg_error (GPG_ERR_GENERAL
);
3879 if (*timestamp
!= info
.created_at
)
3880 log_info ("Note that the key does not use the suggested creation date\n");
3881 *timestamp
= info
.created_at
;
3883 pk
= xcalloc (1, sizeof *pk
);
3884 sk
= xcalloc (1, sizeof *sk
);
3885 sk
->timestamp
= pk
->timestamp
= info
.created_at
;
3886 sk
->version
= pk
->version
= 4;
3888 sk
->expiredate
= pk
->expiredate
= pk
->timestamp
+ expireval
;
3889 sk
->pubkey_algo
= pk
->pubkey_algo
= algo
;
3890 pk
->pkey
[0] = info
.n
;
3891 pk
->pkey
[1] = info
.e
;
3892 sk
->skey
[0] = gcry_mpi_copy (pk
->pkey
[0]);
3893 sk
->skey
[1] = gcry_mpi_copy (pk
->pkey
[1]);
3894 sk
->skey
[2] = gcry_mpi_set_opaque (NULL
, xstrdup ("dummydata"), 10*8);
3895 sk
->is_protected
= 1;
3896 sk
->protect
.s2k
.mode
= 1002;
3897 s
= get_parameter_value (para
, pSERIALNO
);
3900 for (sk
->protect
.ivlen
=0; sk
->protect
.ivlen
< 16 && *s
&& s
[1];
3901 sk
->protect
.ivlen
++, s
+= 2)
3902 sk
->protect
.iv
[sk
->protect
.ivlen
] = xtoi_2 (s
);
3908 pkt
= xcalloc (1,sizeof *pkt
);
3909 pkt
->pkttype
= is_primary
? PKT_PUBLIC_KEY
: PKT_PUBLIC_SUBKEY
;
3910 pkt
->pkt
.public_key
= pk
;
3911 add_kbnode(pub_root
, new_kbnode( pkt
));
3913 pkt
= xcalloc (1,sizeof *pkt
);
3914 pkt
->pkttype
= is_primary
? PKT_SECRET_KEY
: PKT_SECRET_SUBKEY
;
3915 pkt
->pkt
.secret_key
= sk
;
3916 add_kbnode(sec_root
, new_kbnode( pkt
));
3921 #endif /*!ENABLE_CARD_SUPPORT*/
3927 gen_card_key_with_backup (int algo
, int keyno
, int is_primary
,
3928 KBNODE pub_root
, KBNODE sec_root
,
3930 u32 expireval
, struct para_data_s
*para
,
3931 const char *backup_dir
)
3933 #ifdef ENABLE_CARD_SUPPORT
3937 PKT_secret_key
*sk
, *sk_unprotected
= NULL
, *sk_protected
= NULL
;
3942 rc
= generate_raw_key (algo
, 1024, timestamp
,
3943 &sk_unprotected
, &sk_protected
);
3947 /* First, store the key to the card. */
3948 rc
= save_unprotected_key_to_card (sk_unprotected
, keyno
);
3951 log_error (_("storing key onto card failed: %s\n"), g10_errstr (rc
));
3952 free_secret_key (sk_unprotected
);
3953 free_secret_key (sk_protected
);
3957 /* Get rid of the secret key parameters and store the serial numer. */
3958 sk
= sk_unprotected
;
3959 n
= pubkey_get_nskey (sk
->pubkey_algo
);
3960 for (i
=pubkey_get_npkey (sk
->pubkey_algo
); i
< n
; i
++)
3962 gcry_mpi_release (sk
->skey
[i
]);
3965 i
= pubkey_get_npkey (sk
->pubkey_algo
);
3966 sk
->skey
[i
] = gcry_mpi_set_opaque (NULL
, xstrdup ("dummydata"), 10*8);
3967 sk
->is_protected
= 1;
3968 sk
->protect
.s2k
.mode
= 1002;
3969 s
= get_parameter_value (para
, pSERIALNO
);
3971 for (sk
->protect
.ivlen
=0; sk
->protect
.ivlen
< 16 && *s
&& s
[1];
3972 sk
->protect
.ivlen
++, s
+= 2)
3973 sk
->protect
.iv
[sk
->protect
.ivlen
] = xtoi_2 (s
);
3975 /* Now write the *protected* secret key to the file. */
3977 char name_buffer
[50];
3982 keyid_from_sk (sk
, NULL
);
3983 sprintf (name_buffer
,"sk_%08lX%08lX.gpg",
3984 (ulong
)sk
->keyid
[0], (ulong
)sk
->keyid
[1]);
3986 fname
= make_filename (backup_dir
, name_buffer
, NULL
);
3987 oldmask
= umask (077);
3988 if (is_secured_filename (fname
))
3994 fp
= iobuf_create (fname
);
3998 rc
= gpg_error_from_syserror ();
3999 log_error (_("can't create backup file `%s': %s\n"),
4000 fname
, strerror(errno
) );
4002 free_secret_key (sk_unprotected
);
4003 free_secret_key (sk_protected
);
4007 pkt
= xcalloc (1, sizeof *pkt
);
4008 pkt
->pkttype
= PKT_SECRET_KEY
;
4009 pkt
->pkt
.secret_key
= sk_protected
;
4010 sk_protected
= NULL
;
4012 rc
= build_packet (fp
, pkt
);
4015 log_error("build packet failed: %s\n", g10_errstr(rc
) );
4020 unsigned char array
[MAX_FINGERPRINT_LEN
];
4024 iobuf_ioctl (NULL
, 2, 0, (char*)fname
);
4025 log_info (_("NOTE: backup of card key saved to `%s'\n"), fname
);
4027 fingerprint_from_sk (sk
, array
, &n
);
4028 p
= fprbuf
= xmalloc (MAX_FINGERPRINT_LEN
*2 + 1 + 1);
4029 for (i
=0; i
< n
; i
++, p
+= 2)
4030 sprintf (p
, "%02X", array
[i
]);
4034 write_status_text_and_buffer (STATUS_BACKUP_KEY_CREATED
,
4036 fname
, strlen (fname
),
4045 free_secret_key (sk_unprotected
);
4050 /* Create the public key from the secret key. */
4051 pk
= xcalloc (1, sizeof *pk
);
4052 pk
->timestamp
= sk
->timestamp
;
4053 pk
->version
= sk
->version
;
4055 pk
->expiredate
= sk
->expiredate
= sk
->timestamp
+ expireval
;
4056 pk
->pubkey_algo
= sk
->pubkey_algo
;
4057 n
= pubkey_get_npkey (sk
->pubkey_algo
);
4058 for (i
=0; i
< n
; i
++)
4059 pk
->pkey
[i
] = mpi_copy (sk
->skey
[i
]);
4061 /* Build packets and add them to the node lists. */
4062 pkt
= xcalloc (1,sizeof *pkt
);
4063 pkt
->pkttype
= is_primary
? PKT_PUBLIC_KEY
: PKT_PUBLIC_SUBKEY
;
4064 pkt
->pkt
.public_key
= pk
;
4065 add_kbnode(pub_root
, new_kbnode( pkt
));
4067 pkt
= xcalloc (1,sizeof *pkt
);
4068 pkt
->pkttype
= is_primary
? PKT_SECRET_KEY
: PKT_SECRET_SUBKEY
;
4069 pkt
->pkt
.secret_key
= sk
;
4070 add_kbnode(sec_root
, new_kbnode( pkt
));
4075 #endif /*!ENABLE_CARD_SUPPORT*/
4079 #ifdef ENABLE_CARD_SUPPORT
4081 save_unprotected_key_to_card (PKT_secret_key
*sk
, int keyno
)
4084 unsigned char *rsa_n
= NULL
;
4085 unsigned char *rsa_e
= NULL
;
4086 unsigned char *rsa_p
= NULL
;
4087 unsigned char *rsa_q
= NULL
;
4088 size_t rsa_n_len
, rsa_e_len
, rsa_p_len
, rsa_q_len
;
4089 unsigned char *sexp
= NULL
;
4091 char numbuf
[55], numbuf2
[50];
4093 assert (is_RSA (sk
->pubkey_algo
));
4094 assert (!sk
->is_protected
);
4096 /* Copy the parameters into straight buffers. */
4097 gcry_mpi_aprint (GCRYMPI_FMT_USG
, &rsa_n
, &rsa_n_len
, sk
->skey
[0]);
4098 gcry_mpi_aprint (GCRYMPI_FMT_USG
, &rsa_e
, &rsa_e_len
, sk
->skey
[1]);
4099 gcry_mpi_aprint (GCRYMPI_FMT_USG
, &rsa_p
, &rsa_p_len
, sk
->skey
[3]);
4100 gcry_mpi_aprint (GCRYMPI_FMT_USG
, &rsa_q
, &rsa_q_len
, sk
->skey
[4]);
4101 if (!rsa_n
|| !rsa_e
|| !rsa_p
|| !rsa_q
)
4103 rc
= G10ERR_INV_ARG
;
4107 /* Put the key into an S-expression. */
4108 sexp
= p
= xmalloc_secure (30
4109 + rsa_n_len
+ rsa_e_len
+ rsa_p_len
+ rsa_q_len
4110 + 4*sizeof (numbuf
) + 25 + sizeof(numbuf
) + 20);
4112 p
= stpcpy (p
,"(11:private-key(3:rsa(1:n");
4113 sprintf (numbuf
, "%u:", (unsigned int)rsa_n_len
);
4114 p
= stpcpy (p
, numbuf
);
4115 memcpy (p
, rsa_n
, rsa_n_len
);
4118 sprintf (numbuf
, ")(1:e%u:", (unsigned int)rsa_e_len
);
4119 p
= stpcpy (p
, numbuf
);
4120 memcpy (p
, rsa_e
, rsa_e_len
);
4123 sprintf (numbuf
, ")(1:p%u:", (unsigned int)rsa_p_len
);
4124 p
= stpcpy (p
, numbuf
);
4125 memcpy (p
, rsa_p
, rsa_p_len
);
4128 sprintf (numbuf
, ")(1:q%u:", (unsigned int)rsa_q_len
);
4129 p
= stpcpy (p
, numbuf
);
4130 memcpy (p
, rsa_q
, rsa_q_len
);
4133 p
= stpcpy (p
,"))(10:created-at");
4134 sprintf (numbuf2
, "%lu", (unsigned long)sk
->timestamp
);
4135 sprintf (numbuf
, "%lu:", (unsigned long)strlen (numbuf2
));
4136 p
= stpcpy (stpcpy (stpcpy (p
, numbuf
), numbuf2
), "))");
4138 /* Fixme: Unfortunately we don't have the serialnumber available -
4139 thus we can't pass it down to the agent. */
4140 rc
= agent_scd_writekey (keyno
, NULL
, sexp
, p
- sexp
);
4150 #endif /*ENABLE_CARD_SUPPORT*/