1 /* card-util.c - Utility functions for the OpenPGP card.
2 * Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
4 * This file is part of GnuPG.
6 * GnuPG is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * GnuPG is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
27 #if GNUPG_MAJOR_VERSION != 1
29 #endif /*GNUPG_MAJOR_VERSION != 1*/
36 #include "keyserver-internal.h"
37 #if GNUPG_MAJOR_VERSION == 1
38 # ifdef HAVE_LIBREADLINE
39 # define GNUPG_LIBREADLINE_H_INCLUDED
41 # include <readline/readline.h>
42 # endif /*HAVE_LIBREADLINE*/
43 # include "cardglue.h"
44 #else /*GNUPG_MAJOR_VERSION!=1*/
45 # include "call-agent.h"
46 #endif /*GNUPG_MAJOR_VERSION!=1*/
48 #define CONTROL_D ('D' - 'A' + 1)
51 /* Change the PIN of a an OpenPGP card. This is an interactive
54 change_pin (int unblock_v2
, int allow_admin
)
56 struct agent_card_info_s info
;
59 rc
= agent_learn (&info
);
62 log_error (_("OpenPGP card not available: %s\n"),
67 log_info (_("OpenPGP card no. %s detected\n"),
68 info
.serialno
? info
.serialno
: "[none]");
70 agent_clear_pin_cache (info
.serialno
);
74 agent_release_card_info (&info
);
75 log_error (_("can't do this in batch mode\n"));
83 log_error (_("This command is only available for version 2 cards\n"));
84 else if (!info
.chvretry
[1])
85 log_error (_("Reset Code not or not anymore available\n"));
88 rc
= agent_scd_change_pin (2, info
.serialno
);
90 tty_printf ("Error changing the PIN: %s\n", gpg_strerror (rc
));
93 write_status (STATUS_SC_OP_SUCCESS
);
94 tty_printf ("PIN changed.\n");
98 else if (!allow_admin
)
100 rc
= agent_scd_change_pin (1, info
.serialno
);
102 tty_printf ("Error changing the PIN: %s\n", gpg_strerror (rc
));
105 write_status (STATUS_SC_OP_SUCCESS
);
106 tty_printf ("PIN changed.\n");
115 tty_printf ("1 - change PIN\n"
117 "3 - change Admin PIN\n"
118 "4 - set the Reset Code\n"
122 answer
= cpr_get("cardutil.change_pin.menu",_("Your selection? "));
124 if (strlen (answer
) != 1)
131 rc
= agent_scd_change_pin (1, info
.serialno
);
133 tty_printf ("Error changing the PIN: %s\n", gpg_strerror (rc
));
136 write_status (STATUS_SC_OP_SUCCESS
);
137 tty_printf ("PIN changed.\n");
140 else if (*answer
== '2')
143 rc
= agent_scd_change_pin (101, info
.serialno
);
145 tty_printf ("Error unblocking the PIN: %s\n", gpg_strerror (rc
));
148 write_status (STATUS_SC_OP_SUCCESS
);
149 tty_printf ("PIN unblocked and new PIN set.\n");
152 else if (*answer
== '3')
154 /* Change Admin PIN. */
155 rc
= agent_scd_change_pin (3, info
.serialno
);
157 tty_printf ("Error changing the PIN: %s\n", gpg_strerror (rc
));
160 write_status (STATUS_SC_OP_SUCCESS
);
161 tty_printf ("PIN changed.\n");
164 else if (*answer
== '4')
166 /* Set a new Reset Code. */
167 rc
= agent_scd_change_pin (102, info
.serialno
);
169 tty_printf ("Error setting the Reset Code: %s\n",
173 write_status (STATUS_SC_OP_SUCCESS
);
174 tty_printf ("Reset Code set.\n");
177 else if (*answer
== 'q' || *answer
== 'Q')
183 agent_release_card_info (&info
);
187 get_manufacturer (unsigned int no
)
189 /* Note: Make sure that there is no colon or linefeed in the string. */
192 case 0x0001: return "PPC Card Systems";
193 case 0x0002: return "Prism";
194 case 0x0003: return "OpenFortress";
195 case 0x0004: return "Wewid AB";
197 /* 0x00000 and 0xFFFF are defined as test cards per spec,
198 0xFFF00 to 0xFFFE are assigned for use with randomly created
201 case 0xffff: return "test card";
202 default: return (no
& 0xff00) == 0xff00? "unmanaged S/N range":"unknown";
208 print_sha1_fpr (FILE *fp
, const unsigned char *fpr
)
214 for (i
=0; i
< 20 ; i
+=2, fpr
+= 2 )
217 tty_fprintf (fp
, " ");
218 tty_fprintf (fp
, " %02X%02X", *fpr
, fpr
[1]);
222 tty_fprintf (fp
, " [none]");
223 tty_fprintf (fp
, "\n");
228 print_sha1_fpr_colon (FILE *fp
, const unsigned char *fpr
)
234 for (i
=0; i
< 20 ; i
++, fpr
++)
235 fprintf (fp
, "%02X", *fpr
);
242 print_name (FILE *fp
, const char *text
, const char *name
)
244 tty_fprintf (fp
, "%s", text
);
246 /* FIXME: tty_printf_utf8_string2 eats everything after and
247 including an @ - e.g. when printing an url. */
251 print_utf8_string2 (fp
, name
, strlen (name
), '\n');
253 tty_print_utf8_string2 (name
, strlen (name
), 0);
256 tty_fprintf (fp
, _("[not set]"));
257 tty_fprintf (fp
, "\n");
261 print_isoname (FILE *fp
, const char *text
, const char *tag
, const char *name
)
264 fprintf (fp
, "%s:", tag
);
266 tty_fprintf (fp
, "%s", text
);
270 char *p
, *given
, *buf
= xstrdup (name
);
272 given
= strstr (buf
, "<<");
276 if (given
&& given
[2])
281 print_string (fp
, given
, strlen (given
), ':');
283 print_utf8_string2 (fp
, given
, strlen (given
), '\n');
285 tty_print_utf8_string2 (given
, strlen (given
), 0);
290 tty_fprintf (fp
, " ");
294 print_string (fp
, buf
, strlen (buf
), ':');
296 print_utf8_string2 (fp
, buf
, strlen (buf
), '\n');
298 tty_print_utf8_string2 (buf
, strlen (buf
), 0);
306 tty_fprintf (fp
, _("[not set]"));
312 tty_fprintf (fp
, "\n");
315 /* Return true if the SHA1 fingerprint FPR consists only of zeroes. */
317 fpr_is_zero (const char *fpr
)
321 for (i
=0; i
< 20 && !fpr
[i
]; i
++)
327 /* Return true if the SHA1 fingerprint FPR consists only of 0xFF. */
329 fpr_is_ff (const char *fpr
)
333 for (i
=0; i
< 20 && fpr
[i
] == '\xff'; i
++)
339 /* Print all available information about the current card. */
341 card_status (FILE *fp
, char *serialno
, size_t serialnobuflen
)
343 struct agent_card_info_s info
;
344 PKT_public_key
*pk
= xcalloc (1, sizeof *pk
);
347 const unsigned char *thefpr
;
350 if (serialno
&& serialnobuflen
)
353 rc
= agent_learn (&info
);
357 fputs ("AID:::\n", fp
);
358 log_error (_("OpenPGP card not available: %s\n"),
365 fprintf (fp
, "AID:%s:", info
.serialno
? info
.serialno
: "");
367 tty_fprintf (fp
, "Application ID ...: %s\n",
368 info
.serialno
? info
.serialno
: "[none]");
369 if (!info
.serialno
|| strncmp (info
.serialno
, "D27600012401", 12)
370 || strlen (info
.serialno
) != 32 )
372 if (info
.apptype
&& !strcmp (info
.apptype
, "NKS"))
375 fputs ("netkey-card:\n", fp
);
376 log_info ("this is a NetKey card\n");
378 else if (info
.apptype
&& !strcmp (info
.apptype
, "DINSIG"))
381 fputs ("dinsig-card:\n", fp
);
382 log_info ("this is a DINSIG compliant card\n");
384 else if (info
.apptype
&& !strcmp (info
.apptype
, "P15"))
387 fputs ("pkcs15-card:\n", fp
);
388 log_info ("this is a PKCS#15 compliant card\n");
390 else if (info
.apptype
&& !strcmp (info
.apptype
, "GELDKARTE"))
393 fputs ("geldkarte-card:\n", fp
);
394 log_info ("this is a Geldkarte compliant card\n");
399 fputs ("unknown:\n", fp
);
401 log_info ("not an OpenPGP card\n");
402 agent_release_card_info (&info
);
409 else if (strlen (serialno
)+1 > serialnobuflen
)
410 log_error ("serial number longer than expected\n");
412 strcpy (serialno
, info
.serialno
);
415 fputs ("openpgp-card:\n", fp
);
420 fprintf (fp
, "version:%.4s:\n", info
.serialno
+12);
421 uval
= xtoi_2(info
.serialno
+16)*256 + xtoi_2 (info
.serialno
+18);
422 fprintf (fp
, "vendor:%04x:%s:\n", uval
, get_manufacturer (uval
));
423 fprintf (fp
, "serial:%.8s:\n", info
.serialno
+20);
425 print_isoname (fp
, "Name of cardholder: ", "name", info
.disp_name
);
429 print_string (fp
, info
.disp_lang
, strlen (info
.disp_lang
), ':');
432 fprintf (fp
, "sex:%c:\n", (info
.disp_sex
== 1? 'm':
433 info
.disp_sex
== 2? 'f' : 'u'));
437 print_string (fp
, info
.pubkey_url
, strlen (info
.pubkey_url
), ':');
440 fputs ("login:", fp
);
442 print_string (fp
, info
.login_data
, strlen (info
.login_data
), ':');
445 fprintf (fp
, "forcepin:%d:::\n", !info
.chv1_cached
);
446 for (i
=0; i
< DIM (info
.key_attr
); i
++)
447 if (info
.key_attr
[0].algo
)
448 fprintf (fp
, "keyattr:%d:%d:%u:\n", i
+1,
449 info
.key_attr
[i
].algo
, info
.key_attr
[i
].nbits
);
450 fprintf (fp
, "maxpinlen:%d:%d:%d:\n",
451 info
.chvmaxlen
[0], info
.chvmaxlen
[1], info
.chvmaxlen
[2]);
452 fprintf (fp
, "pinretry:%d:%d:%d:\n",
453 info
.chvretry
[0], info
.chvretry
[1], info
.chvretry
[2]);
454 fprintf (fp
, "sigcount:%lu:::\n", info
.sig_counter
);
456 for (i
=0; i
< 4; i
++)
458 if (info
.private_do
[i
])
460 fprintf (fp
, "private_do:%d:", i
+1);
461 print_string (fp
, info
.private_do
[i
],
462 strlen (info
.private_do
[i
]), ':');
467 fputs ("cafpr:", fp
);
468 print_sha1_fpr_colon (fp
, info
.cafpr1valid
? info
.cafpr1
:NULL
);
469 print_sha1_fpr_colon (fp
, info
.cafpr2valid
? info
.cafpr2
:NULL
);
470 print_sha1_fpr_colon (fp
, info
.cafpr3valid
? info
.cafpr3
:NULL
);
473 print_sha1_fpr_colon (fp
, info
.fpr1valid
? info
.fpr1
:NULL
);
474 print_sha1_fpr_colon (fp
, info
.fpr2valid
? info
.fpr2
:NULL
);
475 print_sha1_fpr_colon (fp
, info
.fpr3valid
? info
.fpr3
:NULL
);
477 fprintf (fp
, "fprtime:%lu:%lu:%lu:\n",
478 (unsigned long)info
.fpr1time
, (unsigned long)info
.fpr2time
,
479 (unsigned long)info
.fpr3time
);
483 tty_fprintf (fp
, "Version ..........: %.1s%c.%.1s%c\n",
484 info
.serialno
[12] == '0'?"":info
.serialno
+12,
486 info
.serialno
[14] == '0'?"":info
.serialno
+14,
488 tty_fprintf (fp
, "Manufacturer .....: %s\n",
489 get_manufacturer (xtoi_2(info
.serialno
+16)*256
490 + xtoi_2 (info
.serialno
+18)));
491 tty_fprintf (fp
, "Serial number ....: %.8s\n", info
.serialno
+20);
493 print_isoname (fp
, "Name of cardholder: ", "name", info
.disp_name
);
494 print_name (fp
, "Language prefs ...: ", info
.disp_lang
);
495 tty_fprintf (fp
, "Sex ..............: %s\n",
496 info
.disp_sex
== 1? _("male"):
497 info
.disp_sex
== 2? _("female") : _("unspecified"));
498 print_name (fp
, "URL of public key : ", info
.pubkey_url
);
499 print_name (fp
, "Login data .......: ", info
.login_data
);
500 if (info
.private_do
[0])
501 print_name (fp
, "Private DO 1 .....: ", info
.private_do
[0]);
502 if (info
.private_do
[1])
503 print_name (fp
, "Private DO 2 .....: ", info
.private_do
[1]);
504 if (info
.private_do
[2])
505 print_name (fp
, "Private DO 3 .....: ", info
.private_do
[2]);
506 if (info
.private_do
[3])
507 print_name (fp
, "Private DO 4 .....: ", info
.private_do
[3]);
508 if (info
.cafpr1valid
)
510 tty_fprintf (fp
, "CA fingerprint %d .:", 1);
511 print_sha1_fpr (fp
, info
.cafpr1
);
513 if (info
.cafpr2valid
)
515 tty_fprintf (fp
, "CA fingerprint %d .:", 2);
516 print_sha1_fpr (fp
, info
.cafpr2
);
518 if (info
.cafpr3valid
)
520 tty_fprintf (fp
, "CA fingerprint %d .:", 3);
521 print_sha1_fpr (fp
, info
.cafpr3
);
523 tty_fprintf (fp
, "Signature PIN ....: %s\n",
524 info
.chv1_cached
? _("not forced"): _("forced"));
525 if (info
.key_attr
[0].algo
)
527 tty_fprintf (fp
, "Key attributes ...:");
528 for (i
=0; i
< DIM (info
.key_attr
); i
++)
529 tty_fprintf (fp
, " %u%c",
530 info
.key_attr
[i
].nbits
,
531 info
.key_attr
[i
].algo
== 1? 'R':
532 info
.key_attr
[i
].algo
== 17? 'D': '?');
533 tty_fprintf (fp
, "\n");
535 tty_fprintf (fp
, "Max. PIN lengths .: %d %d %d\n",
536 info
.chvmaxlen
[0], info
.chvmaxlen
[1], info
.chvmaxlen
[2]);
537 tty_fprintf (fp
, "PIN retry counter : %d %d %d\n",
538 info
.chvretry
[0], info
.chvretry
[1], info
.chvretry
[2]);
539 tty_fprintf (fp
, "Signature counter : %lu\n", info
.sig_counter
);
540 tty_fprintf (fp
, "Signature key ....:");
541 print_sha1_fpr (fp
, info
.fpr1valid
? info
.fpr1
:NULL
);
542 if (info
.fpr1valid
&& info
.fpr1time
)
543 tty_fprintf (fp
, " created ....: %s\n",
544 isotimestamp (info
.fpr1time
));
545 tty_fprintf (fp
, "Encryption key....:");
546 print_sha1_fpr (fp
, info
.fpr2valid
? info
.fpr2
:NULL
);
547 if (info
.fpr2valid
&& info
.fpr2time
)
548 tty_fprintf (fp
, " created ....: %s\n",
549 isotimestamp (info
.fpr2time
));
550 tty_fprintf (fp
, "Authentication key:");
551 print_sha1_fpr (fp
, info
.fpr3valid
? info
.fpr3
:NULL
);
552 if (info
.fpr3valid
&& info
.fpr3time
)
553 tty_fprintf (fp
, " created ....: %s\n",
554 isotimestamp (info
.fpr3time
));
555 tty_fprintf (fp
, "General key info..: ");
557 thefpr
= (info
.fpr1valid
? info
.fpr1
: info
.fpr2valid
? info
.fpr2
:
558 info
.fpr3valid
? info
.fpr3
: NULL
);
559 /* If the fingerprint is all 0xff, the key has no asssociated
560 OpenPGP certificate. */
561 if ( thefpr
&& !fpr_is_ff (thefpr
)
562 && !get_pubkey_byfprint (pk
, thefpr
, 20))
564 KBNODE keyblock
= NULL
;
566 print_pubkey_info (fp
, pk
);
568 if ( !get_seckeyblock_byfprint (&keyblock
, thefpr
, 20) )
569 print_card_key_info (fp
, keyblock
);
570 else if ( !get_keyblock_byfprint (&keyblock
, thefpr
, 20) )
572 release_kbnode (keyblock
);
575 if (!auto_create_card_key_stub (info
.serialno
,
576 info
.fpr1valid
? info
.fpr1
:NULL
,
577 info
.fpr2valid
? info
.fpr2
:NULL
,
578 info
.fpr3valid
? info
.fpr3
:NULL
))
580 if ( !get_seckeyblock_byfprint (&keyblock
, thefpr
, 20) )
581 print_card_key_info (fp
, keyblock
);
585 release_kbnode (keyblock
);
588 tty_fprintf (fp
, "[none]\n");
591 free_public_key (pk
);
592 agent_release_card_info (&info
);
597 get_one_name (const char *prompt1
, const char *prompt2
)
604 name
= cpr_get (prompt1
, prompt2
);
609 for (i
=0; name
[i
] && name
[i
] >= ' ' && name
[i
] <= 126; i
++)
612 /* The name must be in Latin-1 and not UTF-8 - lacking the code
613 to ensure this we restrict it to ASCII. */
615 tty_printf (_("Error: Only plain ASCII is currently allowed.\n"));
616 else if (strchr (name
, '<'))
617 tty_printf (_("Error: The \"<\" character may not be used.\n"));
618 else if (strstr (name
, " "))
619 tty_printf (_("Error: Double spaces are not allowed.\n"));
631 char *surname
= NULL
, *givenname
= NULL
;
635 surname
= get_one_name ("keygen.smartcard.surname",
636 _("Cardholder's surname: "));
637 givenname
= get_one_name ("keygen.smartcard.givenname",
638 _("Cardholder's given name: "));
639 if (!surname
|| !givenname
|| (!*surname
&& !*givenname
))
643 return -1; /*canceled*/
646 isoname
= xmalloc ( strlen (surname
) + 2 + strlen (givenname
) + 1);
647 strcpy (stpcpy (stpcpy (isoname
, surname
), "<<"), givenname
);
650 for (p
=isoname
; *p
; p
++)
654 if (strlen (isoname
) > 39 )
656 tty_printf (_("Error: Combined name too long "
657 "(limit is %d characters).\n"), 39);
662 rc
= agent_scd_setattr ("DISP-NAME", isoname
, strlen (isoname
), NULL
);
664 log_error ("error setting Name: %s\n", gpg_strerror (rc
));
677 url
= cpr_get ("cardedit.change_url", _("URL to retrieve public key: "));
683 if (strlen (url
) > 254 )
685 tty_printf (_("Error: URL too long "
686 "(limit is %d characters).\n"), 254);
691 rc
= agent_scd_setattr ("PUBKEY-URL", url
, strlen (url
), NULL
);
693 log_error ("error setting URL: %s\n", gpg_strerror (rc
));
699 /* Fetch the key from the URL given on the card or try to get it from
700 the default keyserver. */
704 #if GNUPG_MAJOR_VERSION == 1
706 struct agent_card_info_s info
;
708 memset(&info
,0,sizeof(info
));
710 rc
=agent_scd_getattr("PUBKEY-URL",&info
);
712 log_error("error retrieving URL from card: %s\n",gpg_strerror(rc
));
715 struct keyserver_spec
*spec
=NULL
;
717 rc
=agent_scd_getattr("KEY-FPR",&info
);
719 log_error("error retrieving key fingerprint from card: %s\n",
721 else if (info
.pubkey_url
&& *info
.pubkey_url
)
723 spec
=parse_keyserver_uri(info
.pubkey_url
,1,NULL
,0);
724 if(spec
&& info
.fpr1valid
)
726 /* This is not perfectly right. Currently, all card
727 fingerprints are 20 digits, but what about
728 fingerprints for a future v5 key? We should get the
729 length from somewhere lower in the code. In any
730 event, the fpr/keyid is not meaningful for straight
731 HTTP fetches, but using it allows the card to point
732 to HKP and LDAP servers as well. */
733 rc
=keyserver_import_fprint(info
.fpr1
,20,spec
);
734 free_keyserver_spec(spec
);
737 else if (info
.fpr1valid
)
739 rc
= keyserver_import_fprint (info
.fpr1
, 20, opt
.keyserver
);
750 /* Read data from file FNAME up to MAXLEN characters. On error return
751 -1 and store NULl at R_BUFFER; on success return the number of
752 bytes read and store the address of a newly allocated buffer at
755 get_data_from_file (const char *fname
, size_t maxlen
, char **r_buffer
)
763 fp
= fopen (fname
, "rb");
764 #if GNUPG_MAJOR_VERSION == 1
765 if (fp
&& is_secured_file (fileno (fp
)))
774 tty_printf (_("can't open `%s': %s\n"), fname
, strerror (errno
));
778 data
= xtrymalloc (maxlen
? maxlen
:1);
781 tty_printf (_("error allocating enough memory: %s\n"), strerror (errno
));
787 n
= fread (data
, 1, maxlen
, fp
);
793 tty_printf (_("error reading `%s': %s\n"), fname
, strerror (errno
));
803 change_login (const char *args
)
809 if (args
&& *args
== '<') /* Read it from a file */
811 for (args
++; spacep (args
); args
++)
813 n
= get_data_from_file (args
, 254, &data
);
819 data
= cpr_get ("cardedit.change_login",
820 _("Login data (account name): "));
830 tty_printf (_("Error: Login data too long "
831 "(limit is %d characters).\n"), 254);
836 rc
= agent_scd_setattr ("LOGIN-DATA", data
, n
, NULL
);
838 log_error ("error setting login data: %s\n", gpg_strerror (rc
));
844 change_private_do (const char *args
, int nr
)
846 char do_name
[] = "PRIVATE-DO-X";
851 assert (nr
>= 1 && nr
<= 4);
852 do_name
[11] = '0' + nr
;
854 if (args
&& (args
= strchr (args
, '<'))) /* Read it from a file */
856 for (args
++; spacep (args
); args
++)
858 n
= get_data_from_file (args
, 254, &data
);
864 data
= cpr_get ("cardedit.change_private_do",
865 _("Private DO data: "));
875 tty_printf (_("Error: Private DO too long "
876 "(limit is %d characters).\n"), 254);
881 rc
= agent_scd_setattr (do_name
, data
, n
, NULL
);
883 log_error ("error setting private DO: %s\n", gpg_strerror (rc
));
890 change_cert (const char *args
)
896 if (args
&& *args
== '<') /* Read it from a file */
898 for (args
++; spacep (args
); args
++)
900 n
= get_data_from_file (args
, 16384, &data
);
906 tty_printf ("usage error: redirectrion to file required\n");
910 rc
= agent_scd_writecert ("OPENPGP.3", data
, n
);
912 log_error ("error writing certificate to card: %s\n", gpg_strerror (rc
));
924 data
= cpr_get ("cardedit.change_lang",
925 _("Language preferences: "));
931 if (strlen (data
) > 8 || (strlen (data
) & 1))
933 tty_printf (_("Error: invalid length of preference string.\n"));
938 for (p
=data
; *p
&& *p
>= 'a' && *p
<= 'z'; p
++)
942 tty_printf (_("Error: invalid characters in preference string.\n"));
947 rc
= agent_scd_setattr ("DISP-LANG", data
, strlen (data
), NULL
);
949 log_error ("error setting lang: %s\n", gpg_strerror (rc
));
962 data
= cpr_get ("cardedit.change_sex",
963 _("Sex ((M)ale, (F)emale or space): "));
971 else if ((*data
== 'M' || *data
== 'm') && !data
[1])
973 else if ((*data
== 'F' || *data
== 'f') && !data
[1])
977 tty_printf (_("Error: invalid response.\n"));
982 rc
= agent_scd_setattr ("DISP-SEX", str
, 1, NULL
);
984 log_error ("error setting sex: %s\n", gpg_strerror (rc
));
991 change_cafpr (int fprno
)
996 unsigned char fpr
[20];
998 data
= cpr_get ("cardedit.change_cafpr", _("CA fingerprint: "));
1004 for (i
=0, s
=data
; i
< 20 && *s
; )
1021 tty_printf (_("Error: invalid formatted fingerprint.\n"));
1025 rc
= agent_scd_setattr (fprno
==1?"CA-FPR-1":
1026 fprno
==2?"CA-FPR-2":
1027 fprno
==3?"CA-FPR-3":"x", fpr
, 20, NULL
);
1029 log_error ("error setting cafpr: %s\n", gpg_strerror (rc
));
1036 toggle_forcesig (void)
1038 struct agent_card_info_s info
;
1042 memset (&info
, 0, sizeof info
);
1043 rc
= agent_scd_getattr ("CHV-STATUS", &info
);
1046 log_error ("error getting current status: %s\n", gpg_strerror (rc
));
1049 newstate
= !info
.chv1_cached
;
1050 agent_release_card_info (&info
);
1052 rc
= agent_scd_setattr ("CHV-STATUS-1", newstate
? "\x01":"", 1, NULL
);
1054 log_error ("error toggling signature PIN flag: %s\n", gpg_strerror (rc
));
1058 /* Helper for the key generation/edit functions. */
1060 get_info_for_key_operation (struct agent_card_info_s
*info
)
1064 memset (info
, 0, sizeof *info
);
1065 rc
= agent_scd_getattr ("SERIALNO", info
);
1066 if (rc
|| !info
->serialno
|| strncmp (info
->serialno
, "D27600012401", 12)
1067 || strlen (info
->serialno
) != 32 )
1069 log_error (_("key operation not possible: %s\n"),
1070 rc
? gpg_strerror (rc
) : _("not an OpenPGP card"));
1073 rc
= agent_scd_getattr ("KEY-FPR", info
);
1075 rc
= agent_scd_getattr ("CHV-STATUS", info
);
1077 rc
= agent_scd_getattr ("DISP-NAME", info
);
1079 log_error (_("error getting current key info: %s\n"), gpg_strerror (rc
));
1084 /* Helper for the key generation/edit functions. */
1086 check_pin_for_key_operation (struct agent_card_info_s
*info
, int *forced_chv1
)
1090 agent_clear_pin_cache (info
->serialno
);
1092 *forced_chv1
= !info
->chv1_cached
;
1094 { /* Switch off the forced mode so that during key generation we
1095 don't get bothered with PIN queries for each
1097 rc
= agent_scd_setattr ("CHV-STATUS-1", "\x01", 1, info
->serialno
);
1100 log_error ("error clearing forced signature PIN flag: %s\n",
1108 /* Check the PIN now, so that we won't get asked later for each
1109 binding signature. */
1110 rc
= agent_scd_checkpin (info
->serialno
);
1112 log_error ("error checking the PIN: %s\n", gpg_strerror (rc
));
1117 /* Helper for the key generation/edit functions. */
1119 restore_forced_chv1 (int *forced_chv1
)
1124 { /* Switch back to forced state. */
1125 rc
= agent_scd_setattr ("CHV-STATUS-1", "", 1, NULL
);
1128 log_error ("error setting forced signature PIN flag: %s\n",
1135 /* Helper for the key generation/edit functions. */
1137 show_card_key_info (struct agent_card_info_s
*info
)
1139 tty_fprintf (NULL
, "Signature key ....:");
1140 print_sha1_fpr (NULL
, info
->fpr1valid
? info
->fpr1
:NULL
);
1141 tty_fprintf (NULL
, "Encryption key....:");
1142 print_sha1_fpr (NULL
, info
->fpr2valid
? info
->fpr2
:NULL
);
1143 tty_fprintf (NULL
, "Authentication key:");
1144 print_sha1_fpr (NULL
, info
->fpr3valid
? info
->fpr3
:NULL
);
1149 /* Helper for the key generation/edit functions. */
1151 replace_existing_key_p (struct agent_card_info_s
*info
, int keyno
)
1153 assert (keyno
>= 0 && keyno
<= 3);
1155 if ((keyno
== 1 && info
->fpr1valid
)
1156 || (keyno
== 2 && info
->fpr2valid
)
1157 || (keyno
== 3 && info
->fpr3valid
))
1160 log_info ("WARNING: such a key has already been stored on the card!\n");
1162 if ( !cpr_get_answer_is_yes( "cardedit.genkeys.replace_key",
1163 _("Replace existing key? (y/N) ")))
1171 generate_card_keys (void)
1173 struct agent_card_info_s info
;
1177 if (get_info_for_key_operation (&info
))
1180 #if GNUPG_MAJOR_VERSION == 1
1182 char *answer
=cpr_get("cardedit.genkeys.backup_enc",
1183 _("Make off-card backup of encryption key? (Y/n) "));
1185 want_backup
=answer_is_yes_no_default(answer
,1);
1190 want_backup
= cpr_get_answer_is_yes
1191 ( "cardedit.genkeys.backup_enc",
1192 _("Make off-card backup of encryption key? (Y/n) "));
1193 /*FIXME: we need answer_is_yes_no_default()*/
1196 if ( (info
.fpr1valid
&& !fpr_is_zero (info
.fpr1
))
1197 || (info
.fpr2valid
&& !fpr_is_zero (info
.fpr2
))
1198 || (info
.fpr3valid
&& !fpr_is_zero (info
.fpr3
)))
1201 log_info ("NOTE: keys are already stored on the card!\n");
1203 if ( !cpr_get_answer_is_yes( "cardedit.genkeys.replace_keys",
1204 _("Replace existing keys? (y/N) ")))
1206 agent_release_card_info (&info
);
1210 else if (!info
.disp_name
|| !*info
.disp_name
)
1213 tty_printf (_("Please note that the factory settings of the PINs are\n"
1214 " PIN = `%s' Admin PIN = `%s'\n"
1215 "You should change them using the command --change-pin\n"),
1216 "123456", "12345678");
1220 if (check_pin_for_key_operation (&info
, &forced_chv1
))
1223 generate_keypair (NULL
, info
.serialno
,
1224 want_backup
? opt
.homedir
:NULL
);
1227 agent_release_card_info (&info
);
1228 restore_forced_chv1 (&forced_chv1
);
1232 /* This function is used by the key edit menu to generate an arbitrary
1235 card_generate_subkey (KBNODE pub_keyblock
, KBNODE sec_keyblock
)
1237 struct agent_card_info_s info
;
1239 int forced_chv1
= 0;
1242 if (get_info_for_key_operation (&info
))
1245 show_card_key_info (&info
);
1247 tty_printf (_("Please select the type of key to generate:\n"));
1249 tty_printf (_(" (1) Signature key\n"));
1250 tty_printf (_(" (2) Encryption key\n"));
1251 tty_printf (_(" (3) Authentication key\n"));
1255 char *answer
= cpr_get ("cardedit.genkeys.subkeytype",
1256 _("Your selection? "));
1258 if (*answer
== CONTROL_D
)
1263 keyno
= *answer
? atoi(answer
): 0;
1265 if (keyno
>= 1 && keyno
<= 3)
1267 tty_printf(_("Invalid selection.\n"));
1270 if (replace_existing_key_p (&info
, keyno
))
1273 if (check_pin_for_key_operation (&info
, &forced_chv1
))
1276 okay
= generate_card_subkeypair (pub_keyblock
, sec_keyblock
,
1277 keyno
, info
.serialno
);
1280 agent_release_card_info (&info
);
1281 restore_forced_chv1 (&forced_chv1
);
1286 /* Store the key at NODE into the smartcard and modify NODE to
1287 carry the serialno stuff instead of the actual secret key
1288 parameters. USE is the usage for that key; 0 means any
1291 card_store_subkey (KBNODE node
, int use
)
1293 struct agent_card_info_s info
;
1297 PKT_secret_key
*copied_sk
= NULL
;
1303 assert (node
->pkt
->pkttype
== PKT_SECRET_KEY
1304 || node
->pkt
->pkttype
== PKT_SECRET_SUBKEY
);
1305 sk
= node
->pkt
->pkt
.secret_key
;
1307 if (get_info_for_key_operation (&info
))
1310 show_card_key_info (&info
);
1312 if (!is_RSA (sk
->pubkey_algo
) || nbits_from_sk (sk
) != 1024 )
1314 tty_printf ("You may only store a 1024 bit RSA key on the card\n");
1319 allow_keyno
[0] = (!use
|| (use
& (PUBKEY_USAGE_SIG
)));
1320 allow_keyno
[1] = (!use
|| (use
& (PUBKEY_USAGE_ENC
)));
1321 allow_keyno
[2] = (!use
|| (use
& (PUBKEY_USAGE_SIG
|PUBKEY_USAGE_AUTH
)));
1323 tty_printf (_("Please select where to store the key:\n"));
1326 tty_printf (_(" (1) Signature key\n"));
1328 tty_printf (_(" (2) Encryption key\n"));
1330 tty_printf (_(" (3) Authentication key\n"));
1334 char *answer
= cpr_get ("cardedit.genkeys.storekeytype",
1335 _("Your selection? "));
1337 if (*answer
== CONTROL_D
|| !*answer
)
1342 keyno
= *answer
? atoi(answer
): 0;
1344 if (keyno
>= 1 && keyno
<= 3 && allow_keyno
[keyno
-1])
1346 tty_printf(_("Invalid selection.\n"));
1349 if (replace_existing_key_p (&info
, keyno
))
1352 /* Unprotect key. */
1353 switch (is_secret_key_protected (sk
) )
1355 case 0: /* Not protected. */
1358 log_error (_("unknown key protection algorithm\n"));
1361 if (sk
->protect
.s2k
.mode
== 1001)
1363 log_error (_("secret parts of key are not available\n"));
1366 if (sk
->protect
.s2k
.mode
== 1002)
1368 log_error (_("secret key already stored on a card\n"));
1371 /* We better copy the key before we unprotect it. */
1372 copied_sk
= sk
= copy_secret_key (NULL
, sk
);
1373 rc
= check_secret_key (sk
, 0);
1378 rc
= save_unprotected_key_to_card (sk
, keyno
);
1382 /* Get back to the maybe protected original secret key. */
1385 free_secret_key (copied_sk
);
1388 sk
= node
->pkt
->pkt
.secret_key
;
1390 /* Get rid of the secret key parameters and store the serial numer. */
1391 n
= pubkey_get_nskey (sk
->pubkey_algo
);
1392 for (i
=pubkey_get_npkey (sk
->pubkey_algo
); i
< n
; i
++)
1394 gcry_mpi_release (sk
->skey
[i
]);
1397 i
= pubkey_get_npkey (sk
->pubkey_algo
);
1398 sk
->skey
[i
] = gcry_mpi_set_opaque (NULL
, xstrdup ("dummydata"), 10*8);
1399 sk
->is_protected
= 1;
1400 sk
->protect
.s2k
.mode
= 1002;
1402 for (sk
->protect
.ivlen
=0; sk
->protect
.ivlen
< 16 && *s
&& s
[1];
1403 sk
->protect
.ivlen
++, s
+= 2)
1404 sk
->protect
.iv
[sk
->protect
.ivlen
] = xtoi_2 (s
);
1410 free_secret_key (copied_sk
);
1411 agent_release_card_info (&info
);
1417 /* Data used by the command parser. This needs to be outside of the
1418 function scope to allow readline based command completion. */
1422 cmdQUIT
, cmdADMIN
, cmdHELP
, cmdLIST
, cmdDEBUG
, cmdVERIFY
,
1423 cmdNAME
, cmdURL
, cmdFETCH
, cmdLOGIN
, cmdLANG
, cmdSEX
, cmdCAFPR
,
1424 cmdFORCESIG
, cmdGENERATE
, cmdPASSWD
, cmdPRIVATEDO
, cmdWRITECERT
,
1437 { "quit" , cmdQUIT
, 0, N_("quit this menu")},
1438 { "q" , cmdQUIT
, 0, NULL
},
1439 { "admin" , cmdADMIN
, 0, N_("show admin commands")},
1440 { "help" , cmdHELP
, 0, N_("show this help")},
1441 { "?" , cmdHELP
, 0, NULL
},
1442 { "list" , cmdLIST
, 0, N_("list all available data")},
1443 { "l" , cmdLIST
, 0, NULL
},
1444 { "debug" , cmdDEBUG
, 0, NULL
},
1445 { "name" , cmdNAME
, 1, N_("change card holder's name")},
1446 { "url" , cmdURL
, 1, N_("change URL to retrieve key")},
1447 { "fetch" , cmdFETCH
, 0, N_("fetch the key specified in the card URL")},
1448 { "login" , cmdLOGIN
, 1, N_("change the login name")},
1449 { "lang" , cmdLANG
, 1, N_("change the language preferences")},
1450 { "sex" , cmdSEX
, 1, N_("change card holder's sex")},
1451 { "cafpr" , cmdCAFPR
, 1, N_("change a CA fingerprint")},
1452 { "forcesig", cmdFORCESIG
, 1, N_("toggle the signature force PIN flag")},
1453 { "generate", cmdGENERATE
, 1, N_("generate new keys")},
1454 { "passwd" , cmdPASSWD
, 0, N_("menu to change or unblock the PIN")},
1455 { "verify" , cmdVERIFY
, 0, N_("verify the PIN and list all data")},
1456 { "unblock" , cmdUNBLOCK
,0, N_("unblock the PIN using a Reset Code") },
1457 /* Note, that we do not announce these command yet. */
1458 { "privatedo", cmdPRIVATEDO
, 0, NULL
},
1459 { "writecert", cmdWRITECERT
, 1, NULL
},
1460 { NULL
, cmdINVCMD
, 0, NULL
}
1464 #if GNUPG_MAJOR_VERSION == 1 && defined (HAVE_LIBREADLINE)
1466 /* These two functions are used by readline for command completion. */
1469 command_generator(const char *text
,int state
)
1471 static int list_index
,len
;
1474 /* If this is a new word to complete, initialize now. This includes
1475 saving the length of TEXT for efficiency, and initializing the
1476 index variable to 0. */
1483 /* Return the next partial match */
1484 while((name
=cmds
[list_index
].name
))
1486 /* Only complete commands that have help text */
1487 if(cmds
[list_index
++].desc
&& strncmp(name
,text
,len
)==0)
1488 return strdup(name
);
1495 card_edit_completion(const char *text
, int start
, int end
)
1497 /* If we are at the start of a line, we try and command-complete.
1498 If not, just do nothing for now. */
1501 return rl_completion_matches(text
,command_generator
);
1503 rl_attempted_completion_over
=1;
1507 #endif /* GNUPG_MAJOR_VERSION == 1 && HAVE_LIBREADLINE */
1509 /* Menu to edit all user changeable values on an OpenPGP card. Only
1510 Key creation is not handled here. */
1512 card_edit (strlist_t commands
)
1514 enum cmdids cmd
= cmdNOP
;
1515 int have_commands
= !!commands
;
1517 char *answer
= NULL
;
1518 int did_checkpin
= 0, allow_admin
=0;
1519 char serialnobuf
[50];
1522 if (opt
.command_fd
!= -1)
1524 else if (opt
.batch
&& !have_commands
)
1526 log_error(_("can't do this in batch mode\n"));
1533 const char *arg_string
= "";
1534 const char *arg_rest
= "";
1542 if (opt
.with_colons
)
1544 card_status (stdout
, serialnobuf
, DIM (serialnobuf
));
1549 card_status (NULL
, serialnobuf
, DIM (serialnobuf
));
1562 answer
= xstrdup (commands
->d
);
1563 commands
= commands
->next
;
1567 answer
= xstrdup ("quit");
1575 #if GNUPG_MAJOR_VERSION == 1
1576 tty_enable_completion (card_edit_completion
);
1578 answer
= cpr_get_no_help("cardedit.prompt", _("Command> "));
1580 #if GNUPG_MAJOR_VERSION == 1
1581 tty_disable_completion ();
1584 trim_spaces(answer
);
1586 while ( *answer
== '#' );
1588 arg_number
= 0; /* Yes, here is the init which egcc complains about */
1591 cmd
= cmdLIST
; /* Default to the list command */
1592 else if (*answer
== CONTROL_D
)
1596 if ((p
=strchr (answer
,' ')))
1599 trim_spaces (answer
);
1601 arg_number
= atoi(p
);
1604 while (digitp (arg_rest
))
1606 while (spacep (arg_rest
))
1610 for (i
=0; cmds
[i
].name
; i
++ )
1611 if (!ascii_strcasecmp (answer
, cmds
[i
].name
))
1615 cmd_admin_only
= cmds
[i
].admin_only
;
1618 if (!allow_admin
&& cmd_admin_only
)
1621 tty_printf (_("Admin-only command\n"));
1628 for (i
=0; cmds
[i
].name
; i
++ )
1630 && (!cmds
[i
].admin_only
|| (cmds
[i
].admin_only
&& allow_admin
)))
1631 tty_printf("%-10s %s\n", cmds
[i
].name
, _(cmds
[i
].desc
) );
1635 if ( !strcmp (arg_string
, "on") )
1637 else if ( !strcmp (arg_string
, "off") )
1639 else if ( !strcmp (arg_string
, "verify") )
1641 /* Force verification of the Admin Command. However,
1642 this is only done if the retry counter is at initial
1644 char *tmp
= xmalloc (strlen (serialnobuf
) + 6 + 1);
1645 strcpy (stpcpy (tmp
, serialnobuf
), "[CHV3]");
1646 allow_admin
= !agent_scd_checkpin (tmp
);
1650 allow_admin
=!allow_admin
;
1652 tty_printf(_("Admin commands are allowed\n"));
1654 tty_printf(_("Admin commands are not allowed\n"));
1658 agent_scd_checkpin (serialnobuf
);
1679 change_login (arg_string
);
1691 if ( arg_number
< 1 || arg_number
> 3 )
1692 tty_printf ("usage: cafpr N\n"
1695 change_cafpr (arg_number
);
1699 if ( arg_number
< 1 || arg_number
> 4 )
1700 tty_printf ("usage: privatedo N\n"
1703 change_private_do (arg_string
, arg_number
);
1707 if ( arg_number
!= 3 )
1708 tty_printf ("usage: writecert 3 < FILE\n");
1710 change_cert (arg_rest
);
1718 generate_card_keys ();
1722 change_pin (0, allow_admin
);
1723 did_checkpin
= 0; /* Need to reset it of course. */
1727 change_pin (1, allow_admin
);
1728 did_checkpin
= 0; /* Need to reset it of course. */
1740 tty_printf (_("Invalid command (try \"help\")\n"));
1742 } /* End command switch. */
1743 } /* End of main menu loop. */