芯片EMV - 为每张智能卡获取AFL

Val*_*ese 3 apdu emv

继续:EMV阅读PAN代码

我在C工作,所以我没有Java工具和所有自动解析APDU命令响应的函数.我想阅读所有类型的智能卡.我必须解析GET PROCESSING OPTIONS的响应并获得每张卡的AFL(访问文件定位器).

我有三张卡,有三种不同的情况:

  • A)HelloBank: 77 12 82 2 38 0 94 c 10 2 4 1 18 1 1 0 20 1 1 0 90
  • B)PayPal: 77 12 82 2 39 0 94 c 18 1 1 0 20 1 1 0 28 1 3 1 90
  • C)PostePay: 80 a 1c 0 8 1 1 0 18 1 2 0 90

案例A)

我有三个不同的AFL: ,,10 2 4 1 所以我送其中SFI为10 >> 3(10是第一AFL的第一个字节)和P2是SFI << 3 | 4这样我得到了我的卡的正确PAN代码.18 1 1 020 1 1 000 B2 SFI P2 00

案例B)

我有三个不同的AFL: ,18 1 1 0,.20 1 1 0 28 1 3 1所以我00 B2 SFI P2 00以与案例A相同的方式发送建筑物,但我得到了每个AFL的响应6A 83.

案例C)我有两个不同的AFL: 8 1 1 0,18 1 2 0但我不能自动解析那些因为没有先前的反应相同的标记.如果我使用那些AFL它工作,我可以得到卡的PAN代码.

如何制作通用的方法来读取正确的AFL以及如何使用这些AFL制作正确的命令?

小智 9

这是AFL的解码:

通常情况下,您将获得4个字节的AFL.将完整的AFL分成4个字节的块.让我们举一个Chunk的例子:AABBCCDD

AA - > SFI(解码如下所述)

BB - >此SFI下的第一个记录

CC - >此SFI下的最后记录

DD - >记录涉及离线数据验证(目前暂不供您使用)

举个例子10 02 04 01 18 01 01 00 20 01 10 00

块是10 02 04 01,18 01 01 00,20 01 10 00

10 02 04 01 - >第1字节10:00010000从MSB获取初始5位 - > 00010表示2:表示SFI 2

第二个字节02:SFI 2下的第一个记录是02

采取第3字节04:SFI 2下的最后记录是04

不包括4字节解释,因为没有用

摘要:SFI 2包含记录2到4

如何形成Read Record命令:

APDU结构:CLA INS P1 P2 LE

CLA 00

INS B2

P1(Rec No)02(此SFI 2初始记录中的SI为02)

P2(SFI)SFI 02:用5个binay数字00010表示SFI,然后在最后附加100:00010100:在Hex 14中所以P2是14

LE 00

APDU读取SFI 2 Rec 2:00 B2 02 14 00

APDU读取SFI 2 Rec 3:00 B2 03 14 00

APDU读取SFI 2 Rec 4:00 PM 04 14 00

现在,如果您将尝试阅读Rec 5,由于此Rec不存在,在这种情况下您将获得SW 6A83.

对所有块使用相同的过程来识别可用的记录和SFI通过此机制,您可以编写解析AFL的函数