diff --git a/ChangeLog b/ChangeLog index f8ab93d..04800c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2011-11-29 Niibe Yutaka + + * src/openpgp.c (cmd_put_data) [PINPAD_SUPPORT]: Support pinpad + input (for reset code). + 2011-11-24 Niibe Yutaka * Version 0.15. diff --git a/src/openpgp.c b/src/openpgp.c index 1738363..646f9be 100644 --- a/src/openpgp.c +++ b/src/openpgp.c @@ -572,13 +572,44 @@ cmd_put_data (void) GPG_NO_RECORD(); tag = ((cmd_APDU[2]<<8) | cmd_APDU[3]); - len = cmd_APDU_size - 5; data = &cmd_APDU[5]; - if (len >= 256) - /* extended Lc */ + +#if defined(PINPAD_SUPPORT) + if (cmd_APDU_size == 4) /* For 0xD3: reset code */ { - data += 2; - len -= 2; + len = get_pinpad_input (PIN_INPUT_NEW); + if (len < 0) + { + GPG_ERROR (); + return; + } + + cmd_APDU[4] = len; + memcpy (data, pin_input_buffer, len); + + len = get_pinpad_input (PIN_INPUT_CONFIRM); + if (len < 0) + { + GPG_ERROR (); + return; + } + + if (len != cmd_APDU[4] || memcmp (data, pin_input_buffer, len) !=0) + { + GPG_SECURITY_FAILURE (); + return; + } + } + else +#endif + { + len = cmd_APDU_size - 5; + if (len >= 256) + /* extended Lc */ + { + data += 2; + len -= 2; + } } gpg_do_put_data (tag, data, len);