2 * openpgp.c -- OpenPGP card protocol support
4 * Copyright (C) 2010, 2011 Free Software Initiative of Japan
5 * Author: NIIBE Yutaka <gniibe@fsij.org>
7 * This file is a part of Gnuk, a GnuPG USB Token implementation.
9 * Gnuk is free software: you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
14 * Gnuk is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 * License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
29 #include "polarssl/config.h"
30 #include "polarssl/sha1.h"
32 #define CLS(a) a.cmd_apdu_head[0]
33 #define INS(a) a.cmd_apdu_head[1]
34 #define P1(a) a.cmd_apdu_head[2]
35 #define P2(a) a.cmd_apdu_head[3]
37 #define INS_VERIFY 0x20
38 #define INS_CHANGE_REFERENCE_DATA 0x24
40 #define INS_RESET_RETRY_COUNTER 0x2c
41 #define INS_PGP_GENERATE_ASYMMETRIC_KEY_PAIR 0x47
42 #define INS_INTERNAL_AUTHENTICATE 0x88
43 #define INS_SELECT_FILE 0xa4
44 #define INS_READ_BINARY 0xb0
45 #define INS_GET_DATA 0xca
46 #define INS_WRITE_BINARY 0xd0
47 #define INS_UPDATE_BINARY 0xd6
48 #define INS_PUT_DATA 0xda
49 #define INS_PUT_DATA_ODD 0xdb /* For key import */
52 select_file_TOP_result[] __attribute__ ((aligned (1))) = {
53 0x00, 0x00, /* unused */
54 0x00, 0x00, /* number of bytes in this directory: to be filled */
55 0x3f, 0x00, /* field of selected file: MF, 3f00 */
58 0xff, 0x44, 0x44, /* access conditions */
59 0x01, /* status of the selected file (OK, unblocked) */
60 0x05, /* number of bytes of data follow */
61 0x03, /* Features: unused */
62 0x01, /* number of subdirectories (OpenPGP) */
63 0x01, /* number of elementary files (SerialNo) */
64 0x00, /* number of secret codes */
66 0x00, 0x00 /* PIN status: OK, PIN blocked?: No */
70 set_res_sw (uint8_t sw1, uint8_t sw2)
72 apdu.sw = (sw1 << 8) | sw2;
76 #define FILE_DF_OPENPGP 1
79 #define FILE_EF_SERIAL 4
80 #define FILE_EF_CH_CERTIFICATE 5
82 static uint8_t file_selection;
87 const uint8_t *flash_data_start;
89 file_selection = FILE_NONE;
90 flash_data_start = flash_init ();
91 gpg_data_scan (flash_data_start);
100 #if defined(PINPAD_SUPPORT)
102 * Let user input PIN string.
103 * Return length of the string.
104 * The string itself is in PIN_INPUT_BUFFER.
107 get_pinpad_input (int msg_code)
111 chEvtSignal (main_thread, LED_INPUT_MODE);
112 r = pinpad_getline (msg_code, MS2ST (8000));
113 chEvtSignal (main_thread, LED_STATUS_MODE);
122 uint8_t p2 = P2 (apdu);
126 DEBUG_INFO (" - VERIFY\r\n");
129 len = apdu.cmd_apdu_data_len;
130 pw = apdu.cmd_apdu_data;
133 r = verify_pso_cds (pw, len);
135 r = verify_other (pw, len);
137 r = verify_admin (pw, len);
141 DEBUG_INFO ("failed\r\n");
142 GPG_SECURITY_FAILURE ();
146 DEBUG_INFO ("blocked\r\n");
147 GPG_SECURITY_AUTH_BLOCKED ();
151 DEBUG_INFO ("good\r\n");
157 gpg_change_keystring (int who_old, const uint8_t *old_ks,
158 int who_new, const uint8_t *new_ks)
161 int prv_keys_exist = 0;
163 r = gpg_do_load_prvkey (GPG_KEY_FOR_SIGNING, who_old, old_ks);
170 r = gpg_do_chks_prvkey (GPG_KEY_FOR_SIGNING, who_old, old_ks,
175 r = gpg_do_load_prvkey (GPG_KEY_FOR_DECRYPTION, who_old, old_ks);
182 r = gpg_do_chks_prvkey (GPG_KEY_FOR_DECRYPTION, who_old, old_ks,
187 r = gpg_do_load_prvkey (GPG_KEY_FOR_AUTHENTICATION, who_old, old_ks);
194 r = gpg_do_chks_prvkey (GPG_KEY_FOR_AUTHENTICATION, who_old, old_ks,
206 cmd_change_password (void)
208 uint8_t old_ks[KEYSTRING_MD_SIZE];
209 uint8_t new_ks0[KEYSTRING_MD_SIZE+1];
210 uint8_t *new_ks = &new_ks0[1];
211 uint8_t p1 = P1 (apdu); /* 0: change (old+new), 1: exchange (new) */
212 uint8_t p2 = P2 (apdu);
215 const uint8_t *newpw;
216 int pw_len, newpw_len;
220 DEBUG_INFO ("Change PW\r\n");
223 len = apdu.cmd_apdu_data_len;
224 pw = apdu.cmd_apdu_data;
228 GPG_FUNCTION_NOT_SUPPORTED();
232 if (who == BY_USER) /* PW1 */
234 const uint8_t *ks_pw1 = gpg_do_read_simple (NR_DO_KEYSTRING_PW1);
236 pw_len = verify_user_0 (AC_PSO_CDS_AUTHORIZED, pw, len, -1, ks_pw1);
240 DEBUG_INFO ("permission denied.\r\n");
241 GPG_SECURITY_FAILURE ();
244 else if (pw_len == 0)
246 DEBUG_INFO ("blocked.\r\n");
247 GPG_SECURITY_AUTH_BLOCKED ();
253 newpw_len = len - pw_len;
256 else /* PW3 (0x83) */
258 pw_len = verify_admin_0 (pw, len, -1);
262 DEBUG_INFO ("permission denied.\r\n");
263 GPG_SECURITY_FAILURE ();
266 else if (pw_len == 0)
268 DEBUG_INFO ("blocked.\r\n");
269 GPG_SECURITY_AUTH_BLOCKED ();
275 newpw_len = len - pw_len;
276 gpg_set_pw3 (newpw, newpw_len);
280 sha1 (pw, pw_len, old_ks);
281 sha1 (newpw, newpw_len, new_ks);
282 new_ks0[0] = newpw_len;
284 r = gpg_change_keystring (who, old_ks, who, new_ks);
287 DEBUG_INFO ("memory error.\r\n");
288 GPG_MEMORY_FAILURE ();
292 DEBUG_INFO ("security error.\r\n");
293 GPG_SECURITY_FAILURE ();
295 else if (r == 0 && who == BY_USER) /* no prvkey */
297 gpg_do_write_simple (NR_DO_KEYSTRING_PW1, new_ks0, KEYSTRING_SIZE_PW1);
300 DEBUG_INFO ("Changed DO_KEYSTRING_PW1.\r\n");
303 else if (r > 0 && who == BY_USER)
305 gpg_do_write_simple (NR_DO_KEYSTRING_PW1, new_ks0, 1);
308 DEBUG_INFO ("Changed length of DO_KEYSTRING_PW1.\r\n");
311 else /* r >= 0 && who == BY_ADMIN */
313 DEBUG_INFO ("done.\r\n");
320 cmd_reset_user_password (void)
322 uint8_t p1 = P1 (apdu);
325 const uint8_t *newpw;
326 int pw_len, newpw_len;
328 uint8_t new_ks0[KEYSTRING_MD_SIZE+1];
329 uint8_t *new_ks = &new_ks0[1];
331 DEBUG_INFO ("Reset PW1\r\n");
334 len = apdu.cmd_apdu_data_len;
335 pw = apdu.cmd_apdu_data;
337 if (p1 == 0x00) /* by User with Reseting Code */
339 const uint8_t *ks_rc = gpg_do_read_simple (NR_DO_KEYSTRING_RC);
340 uint8_t old_ks[KEYSTRING_MD_SIZE];
342 if (gpg_pw_locked (PW_ERR_RC))
344 DEBUG_INFO ("blocked.\r\n");
345 GPG_SECURITY_AUTH_BLOCKED ();
351 DEBUG_INFO ("security error.\r\n");
352 GPG_SECURITY_FAILURE ();
358 newpw_len = len - pw_len;
359 sha1 (pw, pw_len, old_ks);
360 sha1 (newpw, newpw_len, new_ks);
361 new_ks0[0] = newpw_len;
362 r = gpg_change_keystring (BY_RESETCODE, old_ks, BY_USER, new_ks);
365 DEBUG_INFO ("memory error.\r\n");
366 GPG_MEMORY_FAILURE ();
371 DEBUG_INFO ("failed.\r\n");
372 gpg_pw_increment_err_counter (PW_ERR_RC);
373 GPG_SECURITY_FAILURE ();
377 if (memcmp (ks_rc+1, old_ks, KEYSTRING_MD_SIZE) != 0)
379 DEBUG_INFO ("done (no prvkey).\r\n");
380 gpg_do_write_simple (NR_DO_KEYSTRING_PW1, new_ks0,
384 gpg_pw_reset_err_counter (PW_ERR_RC);
385 gpg_pw_reset_err_counter (PW_ERR_PW1);
390 DEBUG_INFO ("done.\r\n");
393 gpg_pw_reset_err_counter (PW_ERR_RC);
394 gpg_pw_reset_err_counter (PW_ERR_PW1);
398 else /* by Admin (p1 == 0x02) */
400 const uint8_t *old_ks = keystring_md_pw3;
402 if (!ac_check_status (AC_ADMIN_AUTHORIZED))
404 DEBUG_INFO ("permission denied.\r\n");
405 GPG_SECURITY_FAILURE ();
411 sha1 (newpw, newpw_len, new_ks);
412 new_ks0[0] = newpw_len;
413 r = gpg_change_keystring (admin_authorized, old_ks, BY_USER, new_ks);
416 DEBUG_INFO ("memory error.\r\n");
417 GPG_MEMORY_FAILURE ();
421 DEBUG_INFO ("security error.\r\n");
422 GPG_SECURITY_FAILURE ();
426 DEBUG_INFO ("done (no privkey).\r\n");
427 gpg_do_write_simple (NR_DO_KEYSTRING_PW1, new_ks0,
431 gpg_pw_reset_err_counter (PW_ERR_PW1);
436 DEBUG_INFO ("done.\r\n");
439 gpg_pw_reset_err_counter (PW_ERR_PW1);
452 DEBUG_INFO (" - PUT DATA\r\n");
454 if (file_selection != FILE_DF_OPENPGP)
457 tag = ((P1 (apdu)<<8) | P2 (apdu));
458 len = apdu.cmd_apdu_data_len;
459 data = apdu.cmd_apdu_data;
460 gpg_do_put_data (tag, data, len);
466 DEBUG_INFO (" - Generate Asymmetric Key Pair\r\n");
467 DEBUG_BYTE (P1 (apdu));
469 if (P1 (apdu) == 0x81)
471 gpg_do_public_key (apdu.cmd_apdu_data[0]);
473 { /* Generate key pair */
474 if (!ac_check_status (AC_ADMIN_AUTHORIZED))
475 GPG_SECURITY_FAILURE ();
477 /* XXX: Not yet supported */
483 cmd_read_binary (void)
485 DEBUG_INFO (" - Read binary\r\n");
487 if (file_selection == FILE_EF_SERIAL)
493 gpg_do_get_data (0x004f, 1); /* AID */
502 cmd_select_file (void)
504 if (P1 (apdu) == 4) /* Selection by DF name */
506 DEBUG_INFO (" - select DF by name\r\n");
508 /* name = D2 76 00 01 24 01 */
509 if (apdu.cmd_apdu_data_len != 6
510 || memcmp (openpgpcard_aid, apdu.cmd_apdu_data, 6) != 0)
512 DEBUG_SHORT (apdu.cmd_apdu_data_len);
513 DEBUG_BINARY (apdu.cmd_apdu_data, apdu.cmd_apdu_data_len);
519 file_selection = FILE_DF_OPENPGP;
520 if ((P2 (apdu) & 0x0c) == 0x0c) /* No FCI */
524 gpg_do_get_data (0x004f, 1); /* AID */
525 memmove (res_APDU+2, res_APDU, res_APDU_size);
528 res_APDU[2] = 0x84; /* overwrite: DF name */
533 else if (apdu.cmd_apdu_data_len == 2
534 && apdu.cmd_apdu_data[0] == 0x2f && apdu.cmd_apdu_data[1] == 0x02)
536 DEBUG_INFO (" - select 0x2f02 EF\r\n");
538 * MF.EF-GDO -- Serial number of the card and name of the owner
541 file_selection = FILE_EF_SERIAL;
543 else if (apdu.cmd_apdu_data_len == 2
544 && apdu.cmd_apdu_data[0] == 0x3f && apdu.cmd_apdu_data[1] == 0x00)
546 DEBUG_INFO (" - select ROOT MF\r\n");
547 if (P2 (apdu) == 0x0c)
553 int len = sizeof (select_file_TOP_result);
556 memcpy (res_APDU, select_file_TOP_result, len);
557 res_APDU[2] = (data_objects_number_of_bytes & 0xff);
558 res_APDU[3] = (data_objects_number_of_bytes >> 8);
562 file_selection = FILE_MF;
563 ac_fini (); /* Reset authentication */
567 DEBUG_INFO (" - select ?? \r\n");
569 file_selection = FILE_NONE;
577 uint16_t tag = ((P1 (apdu)<<8) | P2 (apdu));
579 DEBUG_INFO (" - Get Data\r\n");
581 if (file_selection != FILE_DF_OPENPGP)
584 gpg_do_get_data (tag, 0);
590 int len = apdu.cmd_apdu_data_len;
593 DEBUG_INFO (" - PSO: ");
594 DEBUG_WORD ((uint32_t)&r);
595 DEBUG_BINARY (apdu.cmd_apdu_data, apdu.cmd_apdu_data_len);
597 if (P1 (apdu) == 0x9e && P2 (apdu) == 0x9a)
599 if (!ac_check_status (AC_PSO_CDS_AUTHORIZED))
601 DEBUG_INFO ("security error.");
602 GPG_SECURITY_FAILURE ();
606 /* Check size of digestInfo */
607 if (len != 34 /* MD5 */
608 && len != 35 /* SHA1 / RIPEMD-160 */
609 && len != 47 /* SHA224 */
610 && len != 51 /* SHA256 */
611 && len != 67 /* SHA384 */
612 && len != 83) /* SHA512 */
614 DEBUG_INFO (" wrong length: ");
621 DEBUG_BINARY (&kd[GPG_KEY_FOR_SIGNING], KEY_CONTENT_LEN);
623 r = rsa_sign (apdu.cmd_apdu_data, res_APDU, len,
624 &kd[GPG_KEY_FOR_SIGNING]);
632 gpg_increment_digital_signature_counter ();
635 else if (P1 (apdu) == 0x80 && P2 (apdu) == 0x86)
638 DEBUG_BINARY (&kd[GPG_KEY_FOR_DECRYPTION], KEY_CONTENT_LEN);
640 if (!ac_check_status (AC_OTHER_AUTHORIZED))
642 DEBUG_INFO ("security error.");
643 GPG_SECURITY_FAILURE ();
647 /* Skip padding 0x00 */
649 r = rsa_decrypt (apdu.cmd_apdu_data+1, res_APDU, len,
650 &kd[GPG_KEY_FOR_DECRYPTION]);
656 DEBUG_INFO (" - ??");
657 DEBUG_BYTE (P1 (apdu));
658 DEBUG_INFO (" - ??");
659 DEBUG_BYTE (P2 (apdu));
663 DEBUG_INFO ("PSO done.\r\n");
667 cmd_internal_authenticate (void)
669 int len = apdu.cmd_apdu_data_len;
672 DEBUG_INFO (" - INTERNAL AUTHENTICATE\r\n");
674 if (P1 (apdu) == 0x00 && P2 (apdu) == 0x00)
678 if (!ac_check_status (AC_OTHER_AUTHORIZED))
680 DEBUG_INFO ("security error.");
681 GPG_SECURITY_FAILURE ();
685 r = rsa_sign (apdu.cmd_apdu_data, res_APDU, len,
686 &kd[GPG_KEY_FOR_AUTHENTICATION]);
692 DEBUG_INFO (" - ??");
693 DEBUG_BYTE (P1 (apdu));
694 DEBUG_INFO (" - ??");
695 DEBUG_BYTE (P2 (apdu));
699 DEBUG_INFO ("INTERNAL AUTHENTICATE done.\r\n");
703 #if defined(CERTDO_SUPPORT)
705 cmd_update_binary (void)
707 int len = apdu.cmd_apdu_data_len;
711 DEBUG_INFO (" - UPDATE BINARY\r\n");
713 if (!ac_check_status (AC_ADMIN_AUTHORIZED))
715 DEBUG_INFO ("security error.");
716 GPG_SECURITY_FAILURE ();
720 if ((P1 (apdu) & 0x80))
721 if ((P1 (apdu) & 0x7f) == FILEID_CH_CERTIFICATE)
723 file_selection = FILE_EF_CH_CERTIFICATE;
724 r = flash_erase_binary (FILEID_CH_CERTIFICATE);
727 DEBUG_INFO ("memory error.\r\n");
728 GPG_MEMORY_FAILURE ();
741 if (file_selection != FILE_EF_CH_CERTIFICATE)
743 GPG_COMMAND_NOT_ALLOWED ();
747 offset = (P1 (apdu) << 8) | P2 (apdu);
751 DEBUG_SHORT (offset);
753 r = flash_write_binary (FILEID_CH_CERTIFICATE,
754 apdu.cmd_apdu_data, len, offset);
757 DEBUG_INFO ("memory error.\r\n");
758 GPG_MEMORY_FAILURE ();
763 DEBUG_INFO ("UPDATE BINARY done.\r\n");
769 cmd_write_binary (void)
771 int len = apdu.cmd_apdu_data_len;
775 DEBUG_INFO (" - WRITE BINARY\r\n");
777 if (!ac_check_status (AC_ADMIN_AUTHORIZED))
779 DEBUG_INFO ("security error.");
780 GPG_SECURITY_FAILURE ();
784 if ((P1 (apdu) & 0x80))
785 if ((P1 (apdu) & 0x7f) <= FILEID_CH_CERTIFICATE)
787 file_selection = FILE_EF_SERIAL + (P1 (apdu) & 0x7f);
797 if (file_selection != FILE_EF_SERIAL
798 && file_selection != FILE_EF_CH_CERTIFICATE)
800 GPG_COMMAND_NOT_ALLOWED ();
804 offset = (P1 (apdu) << 8) | P2 (apdu);
808 DEBUG_SHORT (offset);
810 r = flash_write_binary (file_selection - FILE_EF_SERIAL,
811 apdu.cmd_apdu_data, len, offset);
814 DEBUG_INFO ("memory error.\r\n");
815 GPG_MEMORY_FAILURE ();
820 DEBUG_INFO ("WRITE BINARY done.\r\n");
827 void (*cmd_handler) (void);
830 const struct command cmds[] = {
831 { INS_VERIFY, cmd_verify },
832 { INS_CHANGE_REFERENCE_DATA, cmd_change_password },
833 { INS_PSO, cmd_pso },
834 { INS_RESET_RETRY_COUNTER, cmd_reset_user_password },
835 { INS_PGP_GENERATE_ASYMMETRIC_KEY_PAIR, cmd_pgp_gakp },
836 { INS_INTERNAL_AUTHENTICATE, cmd_internal_authenticate },
837 { INS_SELECT_FILE, cmd_select_file },
838 { INS_READ_BINARY, cmd_read_binary },
839 { INS_GET_DATA, cmd_get_data },
840 { INS_WRITE_BINARY, cmd_write_binary}, /* Not in OpenPGP card protocol */
841 #if defined(CERTDO_SUPPORT)
842 { INS_UPDATE_BINARY, cmd_update_binary }, /* Not in OpenPGP card protocol */
844 { INS_PUT_DATA, cmd_put_data },
845 { INS_PUT_DATA_ODD, cmd_put_data },
847 #define NUM_CMDS ((int)(sizeof (cmds) / sizeof (struct command)))
850 process_command_apdu (void)
853 uint8_t cmd = INS (apdu);
855 for (i = 0; i < NUM_CMDS; i++)
856 if (cmds[i].command == cmd)
860 cmds[i].cmd_handler ();
863 DEBUG_INFO (" - ??");
870 GPGthread (void *arg)
872 Thread *icc_thread = (Thread *)arg;
876 chEvtClear (ALL_EVENTS);
878 while (!chThdShouldTerminate ())
880 eventmask_t m = chEvtWaitOne (ALL_EVENTS);
881 #if defined(PINPAD_SUPPORT)
882 int len, pw_len, newpw_len;
885 DEBUG_INFO ("GPG!: ");
887 if (m == EV_VERIFY_CMD_AVAILABLE)
889 #if defined(PINPAD_SUPPORT)
890 if (INS (apdu) != INS_VERIFY)
892 GPG_CONDITION_NOT_SATISFIED ();
896 pw_len = get_pinpad_input (PIN_INPUT_CURRENT);
902 memcpy (apdu.cmd_apdu_data, pin_input_buffer, pw_len);
903 apdu.cmd_apdu_data_len = pw_len;
909 else if (m == EV_MODIFY_CMD_AVAILABLE)
911 #if defined(PINPAD_SUPPORT)
912 uint8_t bConfirmPIN = apdu.cmd_apdu_data[5];
913 uint8_t *p = apdu.cmd_apdu_data;
915 if (INS (apdu) != INS_CHANGE_REFERENCE_DATA
916 && INS (apdu) != INS_RESET_RETRY_COUNTER
917 && INS (apdu) != INS_PUT_DATA)
919 GPG_CONDITION_NOT_SATISFIED ();
923 if ((bConfirmPIN & 2)) /* Require old PIN */
925 pw_len = get_pinpad_input (PIN_INPUT_CURRENT);
931 memcpy (p, pin_input_buffer, pw_len);
937 newpw_len = get_pinpad_input (PIN_INPUT_NEW);
943 memcpy (p, pin_input_buffer, newpw_len);
945 if ((bConfirmPIN & 1)) /* New PIN twice */
947 len = get_pinpad_input (PIN_INPUT_CONFIRM);
954 if (len != newpw_len || memcmp (p, pin_input_buffer, len) != 0)
956 GPG_SECURITY_FAILURE ();
961 apdu.cmd_apdu_data_len = pw_len + newpw_len;
967 else if (m == EV_NOP)
970 process_command_apdu ();
972 chEvtSignal (icc_thread, EV_EXEC_FINISHED);