Here's some really minimal docs on the APDUs that PIV cards use.
There's also 2 example apdu sequences:
1) Read certificate
2) Sign piece of data
--
Thomas Harning Jr.
Authentication Engineer @ Identity Alliance
http://www.trustbearer.com/
For PIN commands: replace p2's 80 with 81 for PUK/SO_PIN
Haven't had a chance to test it or verify that it is real
VerifyPIN: (basically ISO)
Send: 00 20 00 80 (
PIN Bytes padded with FF, max 8
)
ChangePIN: (basically ISO)
Send: 00 24 00 80 (
OldPin Bytes padded with FF, max 8
NewPin ....
)
Recv:
63 XX Invalid PIN
69 83 Blocked
90 XX OK
ReadData:
Send: 00 CB 3F FF
5C (Ber encoded Length+Tagvalue)
Le = 0x00
Length and Tags are in the piv_objects table in the source after the OID
Recv Chained data ASN1 encoded
53 (Ber encoded Length+Data)
Chain is as follows:
(Data + 6100)*
[Data + 61XX] (optional, I think, if the data is evenly rounded)
[Data + 9000]
For the most part, you should always read through all of the data that
is
given.
If you read < 256, then some implementations may reset the index counter
or otherwise break. This puts a limitation on readers.
Example reading a cert: @ Appendix A
WriteData:
While Remaining > 255
Send: 10 DB 3F FF
Remaining data : Max 255 bytes
Send: 00 DB 3F FF
Final Remaining Data : Max 255 bytes
Data Format:
5C (Ber Encoded Length+TagValue) Ber encoded data
Expected tags for certificate data:
71: 1 byte, used for compression information, specs/impl are iffy here
0x80 or 0x01 denote that the cert is compressed
70: variable length, used for actual certificate storage
May be compressed with either zlib or gzip encoding. The
finalized
standard went with gzip encoding (adds extra headers that are
actually
quite useless for the most part)
72: MSCUID
RSACrypt:
While Remaining > 255
Send: 10 87 (mech) (keytag)
Remaining data: Max 255 ...
Send: 00 87 (mech) (keytag)
Remaining data: Max 255
Data Format:
7C (
82: 0 bytes
81: crypt-data
)
Receive: (Same as read-data)
Data Format:
7C (
82: crypted data
)
Example RSA-PKCS sign operation @ Appendix B
== Appendix A ==
card-piv.c:284:piv_general_io: calling sc_transmit_apdu flags=1 le=256,
resplen=20000, resp=0x7fffa0c050f0
card.c:285:sc_lock: called
winscard_msg_srv.c:274:SHMProcessEventsContext() correctly processed client: 9
winscard.c:1464:SCardTransmit() Send Protocol: T=1
APDU: 00 CB 3F FF 05 5C 03 5F C1 05 00
ifdhandler.c:894:IFDHTransmitToICC() lun: 0
SW: 53 82 04 85 70 82 04 79 78 DA 33 68 62 DB 61 D0 C4 BA 60 01 33 13 23 13 13
57 E1 A4 CE 55 0C 40 20 EC 68 C0 CB C6 A9 D5 E6 D1 F6 9D 97 91 91 95 95 C1 20
D2 50 D4 40 98 8D 8B 73 92 5A E7 E4 4F 3A 29 8C 92 62 AC 39 F9 C9 89 39 86 0A
06 72 28 C2 02 9E 29 A9 79 25 99 25 95 8E 39 39 99 89 79 C9 A9 86 72 06 32 6C
CC A1 2C CC C2 A2 30 29 05 98 9C 82 B3 A3 A1 81 9C 38 AF 81 B9 81 A1 81 91 91
A1 A9 99 81 49 14 90 6B 81 C4 35 88 25 DF 6A 3E 03 1E 88 D5 AC A1 C5 A9 45 C5
86 42 06 02 10 3E 67 48 6A 71 89 02 48 D0 A0 71 3E B2 5F 19 59 19 98 1B 7B 19
0C 1A 3B 99 1A 1B 19 D6 07 95 E5 3E 5C 50 CF DC B2 AC 5B AA E0 EC B5 1D 57 18
BA 3D 74 4B F3 9B 36 DE C8 F5 A8 CD EC 17 F1 79 EB F0 48 76 E6 94 52 83 F4 90
0F FE 33 DC B7 71 7D 98 7C 27 26 4E 86 E1 B3 CF E1 C9 1F 02 FA 5E 5E 61 00
card.c:285:sc_lock: called
winscard_msg_srv.c:274:SHMProcessEventsContext() correctly processed client: 9
winscard.c:1464:SCardTransmit() Send Protocol: T=1
APDU: 00 C0 00 00 00
ifdhandler.c:894:IFDHTransmitToICC() lun: 0
SW: 5E CD 74 C1 2C 78 75 1E D3 DE 1E 99 D3 1F FF 6A AC 08 58 7C FF 9B C1 F9 A2
1B E6 47 A4 1F FE 4A 64 E3 DE FA 2A F1 62 E7 EC CB 76 F5 61 35 AB 1E 7E 32 7C
B3 C7 26 E1 54 F9 8C 3D AB DE 32 3C 58 E8 D0 FD 94 89 99 91 81 71 71 13 0B 83
41 13 F3 1F 03 59 A0 DB 65 F9 58 C4 58 44 E6 2C B1 65 65 59 99 AA 13 91 D6 33
E1 F9 AF A6 84 A8 DE 1A 31 03 79 90 B4 32 8B 84 81 58 83 C8 E9 E9 4B 78 A5 B6
76 07 EF 71 13 7C 65 B9 4B F3 EB 0A EF 50 01 83 26 46 47 90 12 79 96 26 46 0B
20 C7 04 88 0D 16 34 31 EA 00 B1 46 5B E3 85 9C 94 C4 02 2B 7D 7D 7D 67 3F 5B
58 40 AA 1A 19 C0 C2 12 C8 04 46 96 0E 50 32 33 25 51 37 25 3F 37 31 33 4F 17
CC 77 76 09 00 51 01 A5 49 39 99 C9 40 65 DE A9 20 7D C1 A9 45 65 99 C9 A9 C5
20 29 64 B6 73 7E 5E 5A 66 7A 69 51 62 49 66 7E 9E 8E 8B B3 2D 7A A4 61 00
card.c:312:sc_unlock: called
card.c:285:sc_lock: called
winscard_msg_srv.c:274:SHMProcessEventsContext() correctly processed client: 9
winscard.c:1464:SCardTransmit() Send Protocol: T=1
APDU: 00 C0 00 00 00
ifdhandler.c:894:IFDHTransmitToICC() lun: 0
SW: 81 C4 C0 F1 6B 9F 9C 5A 54 92 99 96 99 9C 58 92 1A 94 5A 06 14 02 69 F1 C9
2C 2E B1 4F 4A 2C 4E B5 CF 4F CA 4A 4D 2E 71 CE 49 2C 2E B6 4D 0E F2 71 01 4A
14 65 26 95 82 14 05 E4 67 E6 95 B4 05 67 94 94 80 7C 84 EC 60 BD 4C A8 75 89
50 EB F4 C0 76 E9 3B 03 ED 72 CD 2B CA CF C9 D1 C7 E9 79 BD E4 A2 1C 60 98 C5
B1 71 68 B3 01 33 05 3B 23 23 30 24 03 80 22 3E 06 8D 87 61 82 06 4C 6D 8D DB
88 0D 4A 47 4F 47 1A 05 9D A3 33 22 F0 B0 04 17 5C 12 68 92 63 69 49 46 7E 11
D0 18 83 C6 66 24 5F 94 93 17 7A 28 CA D1 1D 08 51 1E 8F 2F 84 4B C0 59 56 56
98 91 F1 3F 0B 93 01 83 01 37 88 C7 CF C2 C2 CC C4 BA C0 C0 86 8D 13 E8 3E 16
C6 26 73 51 76 16 7D 03 5D 36 55 18 97 A3 ED DE 9A C2 A6 D6 56 B3 C6 AF DD 42
AD EF B6 86 B7 FD 35 C9 6E 79 D7 CD D7 78 F9 40 2C 13 63 0A 13 23 AB 61 00
card.c:312:sc_unlock: called
card.c:285:sc_lock: called
winscard_msg_srv.c:274:SHMProcessEventsContext() correctly processed client: 9
winscard.c:1464:SCardTransmit() Send Protocol: T=1
APDU: 00 C0 00 00 00
ifdhandler.c:894:IFDHTransmitToICC() lun: 0
SW: 81 26 C8 28 55 16 25 03 05 36 8E 84 36 0F C6 54 66 36 0E 36 2E A8 09 22 4C
4C 30 CF 33 33 19 98 22 2C E2 62 D1 30 50 33 E0 42 68 01 3A 10 49 13 48 06 AE
CD 1A 64 83 20 8B 89 81 D1 02 03 24 45 CC 0B 94 78 14 4A 80 25 4E 29 B0 C0 31
74 C0 1E 2A 06 D2 20 CD 9C 2C 22 06 A0 52 0A 6A 26 27 8B 21 8B 30 53 68 30 5A
71 CC DC C4 C8 C8 60 72 D8 32 F6 CE 2F C9 FB B2 47 76 FC AB DE A4 7F 5B EF F4
2B FE FF 0D 8F BE CE 3A 74 F0 FA CE BD 0A 2C 5A 75 BB 19 26 07 17 17 66 3C 90
7E E1 C5 F0 22 B3 26 E1 BE CD 8D 63 37 EF AA 2C AD 58 53 DD 1A FC D6 8A CB E0
53 8D F1 9A B8 F8 E0 3D 56 6F BD F8 4F 4D 10 09 7D BE AA 64 C7 E7 48 7E A6 AC
8B A9 F2 69 DB 82 94 22 D3 7C A4 EA C4 8C F6 6D 10 D2 D8 F0 FF 20 A3 52 AD E7
4A A1 13 36 CF B4 83 2E BE 98 FD 66 7D E7 BE 4A E3 2B 15 86 19 CA 41 61 89
card.c:312:sc_unlock: called
card.c:285:sc_lock: called
winscard_msg_srv.c:274:SHMProcessEventsContext() correctly processed client: 9
winscard.c:1464:SCardTransmit() Send Protocol: T=1
APDU: 00 C0 00 00 00
ifdhandler.c:894:IFDHTransmitToICC() lun: 0
SW: 56 4C 17 DC 32 0E CC C8 7A 54 70 B2 CB F7 9B 14 D7 4E 7E CE F4 CC 72 56 6D
F6 1B 1B 2F 49 AF E2 3D 11 14 7A F7 A9 D0 8B 5F 69 2D 17 36 B6 3D BD 64 C1 B9
F4 F0 F2 25 FD F1 59 33 8C 5E FE 65 33 DF B2 F5 D4 BC F4 CD 4A EA 8F 6F ED 79
7C 56 BA F7 8F FF F9 C9 7F 56 3C 4B 78 96 F5 3E C5 A7 D5 2C F1 F5 C4 00 4B A1
9A 2C 55 C5 8A 6F 3F 24 B4 4D CF 2D 35 BA 65 E3 7A A9 F6 59 22 00 A0 49 43 45
71 01 80 72 03 49 44 41 90 00
=== Appendix B ===
APDU: 00 87 06 9A 88 7C 81 85 82 00 81 81 80 00 01 FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF 00 30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14 29 B0 E7 87 82 71 64
5F FF B7 EE C7 DB 4A 74 73 A1 C0 0B C1 00
ifdhandler.c:894:IFDHTransmitToICC() lun: 0
SW: 7C 81 83 82 81 80 A4 DB 59 81 C5 50 EA 74 9A 38 D8 A2 00 61 34 A4 F5 65 E2
24 49 9B FA 9F 3C 2E DC 39 D0 66 A2 87 B8 C6 68 45 60 33 5A E3 72 A7 86 79 AE
AC 63 3F A7 A5 39 1B D1 BD 8E 3B 3A 0B AF FA 5D F8 ED FB 90 17 8D 1F 09 CA 17
71 7C F4 D2 F7 CA 2E 6F 08 B3 61 AD F9 FE 22 7E 12 5E 41 F6 62 A7 68 4B F9 12
BB 47 C0 CA 84 E7 24 B5 3F 08 5C 00 45 27 61 6F 8D 28 0B 50 4A D8 4E 53 B5 32
26 92 65 28 3B 90 00
_______________________________________________
opensc-devel mailing list
[email protected]
http://www.opensc-project.org/mailman/listinfo/opensc-devel