代码之家  ›  专栏  ›  技术社区  ›  K. Biermann

无法构造VERIFY_PIN_DIRECT控制命令

  •  1
  • K. Biermann  · 技术社区  · 10 年前

    我正在编写一个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-Card datasheet (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 ...

    附笔。: 下划线表示相关的字节,当然在解析过程中会被去掉。

    1 回复  |  直到 4 年前
        1
  •  1
  •   Martin Paljak    10 年前

    OpenPGP使用可变长度的PIN,并且PIN块必须按照流行的惯例(CCID规范中未包含这种情况)发送为 空的 仅具有APDU报头的APDU。

    请参阅此处获取提示: https://github.com/OpenSC/OpenSC/blob/master/src/libopensc/reader-pcsc.c#L1391

    此外,你的应用程序是开源的吗?也许你想贡献一些CCID控制块代码,我还没有写给apdu4j: https://github.com/martinpaljak/apdu4j