mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-03 22:56:33 +02:00
Fix pinpad input support for passphrase modification.
* apdu.c (pcsc_keypad_verify): Have dummy Lc field with value 0. (pcsc_keypad_modify): Likewise. (pcsc_keypad_modify): It's only for ISO7816_CHANGE_REFERENCE_DATA. bConfirmPIN value is determined by the parameter p0. * app-openpgp.c (do_change_pin): The flag use_keypad should be 0 when reset_mode is on, or resetcode is on. use_keypad only makes sense for iso7816_change_reference_data_kp. * iso7816.h (iso7816_put_data_kp): Remove. (iso7816_reset_retry_counter_kp): Remove. (iso7816_reset_retry_counter_with_rc_kp): Remove. (iso7816_change_reference_data_kp): Add an argument: IS_EXCHANGE. * iso7816.c (iso7816_put_data_kp): Remove. (iso7816_reset_retry_counter_kp): Remove. (iso7816_reset_retry_counter_with_rc_kp): Remove. (iso7816_change_reference_data_kp): Add an argument: IS_EXCHANGE.
This commit is contained in:
parent
29e96e6b9a
commit
bf37c32367
4 changed files with 89 additions and 194 deletions
44
scd/apdu.c
44
scd/apdu.c
|
@ -2043,7 +2043,7 @@ check_pcsc_keypad (int slot, int command, int pin_mode,
|
|||
}
|
||||
|
||||
|
||||
#define PIN_VERIFY_STRUCTURE_SIZE 23
|
||||
#define PIN_VERIFY_STRUCTURE_SIZE 24
|
||||
static int
|
||||
pcsc_keypad_verify (int slot, int class, int ins, int p0, int p1,
|
||||
struct pininfo_s *pininfo)
|
||||
|
@ -2096,7 +2096,7 @@ pcsc_keypad_verify (int slot, int class, int ins, int p0, int p1,
|
|||
pin_verify[12] = 0x00; /* bTeoPrologue[0] */
|
||||
pin_verify[13] = 0x00; /* bTeoPrologue[1] */
|
||||
pin_verify[14] = 0x00; /* bTeoPrologue[2] */
|
||||
pin_verify[15] = 0x04; /* ulDataLength */
|
||||
pin_verify[15] = 0x05; /* ulDataLength */
|
||||
pin_verify[16] = 0x00; /* ulDataLength */
|
||||
pin_verify[17] = 0x00; /* ulDataLength */
|
||||
pin_verify[18] = 0x00; /* ulDataLength */
|
||||
|
@ -2104,6 +2104,7 @@ pcsc_keypad_verify (int slot, int class, int ins, int p0, int p1,
|
|||
pin_verify[20] = ins; /* abData[1] */
|
||||
pin_verify[21] = p0; /* abData[2] */
|
||||
pin_verify[22] = p1; /* abData[3] */
|
||||
pin_verify[23] = 0x00; /* abData[4] */
|
||||
|
||||
sw = control_pcsc (slot, reader_table[slot].pcsc.verify_ioctl,
|
||||
pin_verify, len, result, &resultlen);
|
||||
|
@ -2115,7 +2116,7 @@ pcsc_keypad_verify (int slot, int class, int ins, int p0, int p1,
|
|||
}
|
||||
|
||||
|
||||
#define PIN_MODIFY_STRUCTURE_SIZE 28
|
||||
#define PIN_MODIFY_STRUCTURE_SIZE 29
|
||||
static int
|
||||
pcsc_keypad_modify (int slot, int class, int ins, int p0, int p1,
|
||||
struct pininfo_s *pininfo)
|
||||
|
@ -2125,32 +2126,6 @@ pcsc_keypad_modify (int slot, int class, int ins, int p0, int p1,
|
|||
unsigned long len = PIN_MODIFY_STRUCTURE_SIZE;
|
||||
unsigned char result[2];
|
||||
size_t resultlen = 2;
|
||||
unsigned char confirm_pin;
|
||||
|
||||
/* bConfirmPIN
|
||||
* 0x00: new PIN once
|
||||
* 0x01: new PIN twice (confirmation)
|
||||
* 0x02: old PIN and new PIN once
|
||||
* 0x03: old PIN and new PIN twice (confirmation)
|
||||
*/
|
||||
switch (ins)
|
||||
{
|
||||
case ISO7816_CHANGE_REFERENCE_DATA:
|
||||
confirm_pin = 0x03;
|
||||
break;
|
||||
case 0xDA: /* PUT_DATA */
|
||||
confirm_pin = 0x01;
|
||||
break;
|
||||
case ISO7816_RESET_RETRY_COUNTER:
|
||||
if (p0 == 0)
|
||||
confirm_pin = 0x03;
|
||||
else
|
||||
confirm_pin = 0x01;
|
||||
break;
|
||||
default:
|
||||
confirm_pin = 0x00;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!reader_table[slot].atrlen
|
||||
&& (sw = reset_pcsc_reader (slot)))
|
||||
|
@ -2186,7 +2161,13 @@ pcsc_keypad_modify (int slot, int class, int ins, int p0, int p1,
|
|||
pin_modify[6] = 0x00; /* bInsertionOffsetNew */
|
||||
pin_modify[7] = pininfo->maxlen; /* wPINMaxExtraDigit */
|
||||
pin_modify[8] = pininfo->minlen; /* wPINMaxExtraDigit */
|
||||
pin_modify[9] = confirm_pin;
|
||||
pin_modify[9] = (p0 == 0 ? 0x03 : 0x01);
|
||||
/* bConfirmPIN
|
||||
* 0x00: new PIN once
|
||||
* 0x01: new PIN twice (confirmation)
|
||||
* 0x02: old PIN and new PIN once
|
||||
* 0x03: old PIN and new PIN twice (confirmation)
|
||||
*/
|
||||
pin_modify[10] = 0x02; /* bEntryValidationCondition: Validation key pressed */
|
||||
if (pininfo->minlen && pininfo->maxlen && pininfo->minlen == pininfo->maxlen)
|
||||
pin_modify[10] |= 0x01; /* Max size reached. */
|
||||
|
@ -2199,7 +2180,7 @@ pcsc_keypad_modify (int slot, int class, int ins, int p0, int p1,
|
|||
pin_modify[17] = 0x00; /* bTeoPrologue[0] */
|
||||
pin_modify[18] = 0x00; /* bTeoPrologue[1] */
|
||||
pin_modify[19] = 0x00; /* bTeoPrologue[2] */
|
||||
pin_modify[20] = 0x04; /* ulDataLength */
|
||||
pin_modify[20] = 0x05; /* ulDataLength */
|
||||
pin_modify[21] = 0x00; /* ulDataLength */
|
||||
pin_modify[22] = 0x00; /* ulDataLength */
|
||||
pin_modify[23] = 0x00; /* ulDataLength */
|
||||
|
@ -2207,6 +2188,7 @@ pcsc_keypad_modify (int slot, int class, int ins, int p0, int p1,
|
|||
pin_modify[25] = ins; /* abData[1] */
|
||||
pin_modify[26] = p0; /* abData[2] */
|
||||
pin_modify[27] = p1; /* abData[3] */
|
||||
pin_modify[28] = 0x00; /* abData[4] */
|
||||
|
||||
sw = control_pcsc (slot, reader_table[slot].pcsc.modify_ioctl,
|
||||
pin_modify, len, result, &resultlen);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue