我正在编写一个JAVA应用程序来访问我的OpenPGP卡V2.0。正在使用的卡终端是一个";REINER SCT cyberJack RFID标准";它只支持OSX下的PC/SC,现在我想实现PC/SC 2.0命令";VERIFY_PIN_DIRECT";。
我尝试了以下控制序列,|之后的字节是APDU字节(我的测试引脚是"140396"):
Index: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | 19 20 21 22 23 24 25 26 27 28 29
Seq 0: 0F 0F 88 86 14 08 04 02 01 09 04 00 00 00 00 0B 00 00 00 | 00 20 00 81 06 FF FF FF FF FF FF
一些重要的字节含义(有用的文档:http://www.acs.com.hk/download-manual/1207/API-ACR83-1.06.pdf):
Index 02: PIN format options
Index 03: PIN-block format
Index 04: Position of PIN-length information in the APDU-command
Index 15 - 18: APDU-length
Index 19 - end: APDU-command
但如果我发送这个命令,我总是得到69 82
,这意味着对应于OpenPGP卡数据表(PDF):
安全状态不满足:
PW错误
PW未检查(不允许命令)
安全消息不正确(校验和和和/或密码)
APDU命令似乎是正确的,因为如果我向卡发送以下命令00 20 00 81 06 31 34 30 33 39 36
,则PIN被接受。看来我的控制命令是错误的。我的错误在哪里?
更新:
一个工作命令是:
Index: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | 19 20 21 22
Seq 0: 0F_0F 02_0F_00 0F_06 02 01 09_04 00 00_00_00 04_00_00_00 | 00 20 00 81
比0F_06
(在索引05
处)更好的值是20_06
,因为OpenPGP卡支持长达32个字符的PIN,但我的卡终端抱怨Invalid Value
。。。
附言:下划线象征着相关的字节,当然在解析过程中会被去掉。
OpenPGP使用可变长度的PIN,并且PIN块必须按照流行的惯例(这种情况在CCID规范中没有涵盖)以空APDU的形式发送,只有APDU标头。
有关提示,请参见此处:https://github.com/OpenSC/OpenSC/blob/master/src/libopensc/reader-pcsc.c#L1391
此外,你的应用程序是开源的吗?也许你想贡献一些我还没有写给apdu4j的CCID控制块代码:https://github.com/martinpaljak/apdu4j