我正在编写一个JAVA-app来访问我的OpenPGP-Card 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-Card datasheet (PDF):
安全状态不满足:未检查PW错误的PW(不允许命令)安全消息不正确(校验和和/或密码)
APDU命令似乎是正确的,因为如果我将以下命令 00 20 00 81 06 31 34 30 33 39 36
发送到卡,则接受PIN . 所以看来我的控制命令是错误的 . 我的错误在哪里?
Update:
一个工作命令是:
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
...
P.S.: 下划线表示相关字节,当然在解析过程中被删除 .
1 回答
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