APDU for CKECKPIN and MODIFY PIN for Smartcard GnuPG V2 ?

tux.tsndcb at free.fr tux.tsndcb at free.fr
Sat Oct 17 00:46:21 CEST 2009


Hi,

I've done some tests to validate my reader's pinpad with my smartcard GnuPG V2

I've put this to CHECKPIN :

	/* PC/SC v2.02.05 Part 10 PIN verification data structure */
	pin_verify -> bTimerOut = 0x00;
	pin_verify -> bTimerOut2 = 0x00;
	pin_verify -> bmFormatString = 0x82;
	pin_verify -> bmPINBlockString = 0x00;
	pin_verify -> bmPINLengthFormat = 0x00;
	pin_verify -> wPINMaxExtraDigit = HOST_TO_CCID_16(0x0408); /* Min Max */
	pin_verify -> bEntryValidationCondition = 0x02;	/* validation key pressed */
	pin_verify -> bNumberMessage = 0x01;
	pin_verify -> wLangId = HOST_TO_CCID_16(0x0904);
	pin_verify -> bMsgIndex = 0x00;
	pin_verify -> bTeoPrologue[0] = 0x00;
	pin_verify -> bTeoPrologue[1] = 0x00;
	pin_verify -> bTeoPrologue[2] = 0x00;
	/* pin_verify -> ulDataLength = 0x00; we don't know the size yet */

	/* APDU: 00 20 00 82 06 31 32 33 34 35 36 00 00 smartcard GnuPG V2*/
	offset = 0;
	pin_verify -> abData[offset++] = 0x00;	/* CLA */
	pin_verify -> abData[offset++] = 0x20;	/* INS: VERIFY */
	pin_verify -> abData[offset++] = 0x00;	/* P1 */
	pin_verify -> abData[offset++] = 0x82;	/* P2 */
	pin_verify -> abData[offset++] = 0x06;	/* Lc: 8 data bytes */
	pin_verify -> abData[offset++] = 0x31;	/* '0' */
	pin_verify -> abData[offset++] = 0x32;	/* '0' */
	pin_verify -> abData[offset++] = 0x33;	/* '0' */
	pin_verify -> abData[offset++] = 0x34;	/* '0' */
	pin_verify -> abData[offset++] = 0x35;	/* '\0' */
	pin_verify -> abData[offset++] = 0x36;	/* '\0' */
	pin_verify -> abData[offset++] = 0x00;	/* '\0' */
	pin_verify -> abData[offset++] = 0x00;	/* '\0' */
	pin_verify -> ulDataLength = HOST_TO_CCID_32(offset);	/* APDU size */

But I've this answer :

 Reader: Covadis Vega (000000F5) 00 00 (length 30 bytes)
 State: 0x190034
 Prot: 0
 ATR (length 21 bytes): 3B DA 18 FF 81 B1 FE 75 1F 03 00 31 C5 73 C0 01 40 00 90 00 0C
SCardStatus: OK

 Protocol: 2
SCardReconnect: OK

 Secure verify PIN
 command: 00 00 82 00 00 08 04 02 01 04 09 00 00 00 00 0D 00 00 00 00 20 00 82 06 31 32 33 34 35 36 00 00
Enter your PIN: 
 card response: 67 00
SCardControl: OK


verify PIN dump:  00 40 00 00 FF
 card response: 6D 00
SCardTransmit: OK


So if I anderstand : I've a problem with a Wrong length (Lc and/or Le) and with the Instruction (INS) not supported


And for MODIFY PIN, I've put this :


	/* PC/SC v2.02.05 Part 10 PIN modification data structure *
	pin_modify -> bTimerOut = 0x00;
	pin_modify -> bTimerOut2 = 0x00;
	pin_modify -> bmFormatString = 0x82;
	pin_modify -> bmPINBlockString = 0x04;
	pin_modify -> bmPINLengthFormat = 0x00;
	pin_modify -> bInsertionOffsetOld = 0x00; 	/* offset from APDU start */
	pin_modify -> bInsertionOffsetNew = 0x04;	/* offset from APDU start */
	pin_modify -> wPINMaxExtraDigit = HOST_TO_CCID_16(0x0408);	/* Min Max */
	pin_modify -> bConfirmPIN = 0x03;	/* b0 set = confirmation requested */
									/* b1 set = current PIN entry requested */
	pin_modify -> bEntryValidationCondition = 0x02;	/* validation key pressed */
	pin_modify -> bNumberMessage = 0x03; /* see table above */
	pin_modify -> wLangId = HOST_TO_CCID_16(0x0904);
	pin_modify -> bMsgIndex1 = 0x00;
	pin_modify -> bMsgIndex2 = 0x00;
	pin_modify -> bMsgIndex3 = 0x00;
	pin_modify -> bTeoPrologue[0] = 0x00;
	pin_modify -> bTeoPrologue[1] = 0x00;
	pin_modify -> bTeoPrologue[2] = 0x00;
	/* pin_modify -> ulDataLength = 0x00; we don't know the size yet */

	/* APDU: 00 24 00 81 0C 31 32 33 34 35 36 00 00 smartcard GnuPG V2*/
	offset = 0;
	pin_modify -> abData[offset++] = 0x00;	/* CLA */
	pin_modify -> abData[offset++] = 0x24;	/* INS: CHANGE/UNBLOCK */
	pin_modify -> abData[offset++] = 0x00;	/* P1 */
	pin_modify -> abData[offset++] = 0x81;	/* P2 */
	pin_modify -> abData[offset++] = 0x0C;	/* Lc: 2x8 data bytes */
	pin_modify -> abData[offset++] = 0x31;	/* '0' old PIN */
	pin_modify -> abData[offset++] = 0x32;	/* '0' */
	pin_modify -> abData[offset++] = 0x33;	/* '0' */
	pin_modify -> abData[offset++] = 0x34;	/* '0' */
	pin_modify -> abData[offset++] = 0x35;	/* '0' new PIN */
	pin_modify -> abData[offset++] = 0x36;	/* '0' */
	pin_modify -> abData[offset++] = 0x00;	/* '0' */
	pin_modify -> abData[offset++] = 0x00;	/* '0' */
	pin_modify -> ulDataLength = HOST_TO_CCID_32(offset);	/* APDU size */

but I've this answer :


 Secure modify PIN
 command: 00 00 82 04 00 00 04 08 04 03 02 03 04 09 00 00 00 00 00 00 0D 00 00 00 00 24 00 81 0C 31 32 33 34 35 36 00 00
Enter your PIN:  card response: 67 00
SCardControl: OK


modify PIN dump:  00 40 00 00 FF
 card response: 6D 00
SCardTransmit: OK

SCardDisconnect: OK


So if I anderstand : I've also a problem with a Wrong length (Lc and/or Le) and with the Instruction (INS) not supported



Could you give me the good APDU in this two case ?

Thanks in advanced.

Best Ragerds.



More information about the Gnupg-users mailing list