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

时间:2018-05-03 14:48:49

标签: apdu emv

继续:EMV Reading PAN Code

我在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 118 1 1 020 1 1 0 所以我发送00 B2 SFI P2 00,其中SFI是10>> 3(10是第一个AFL的第一个字节),P2是SFI<< 3 | 4,这样我得到了我的卡的正确PAN代码。

案例B)

我有三种不同的AFL:18 1 1 020 1 1 028 1 3 1。 所以我以与案例A相同的方式发送00 B2 SFI P2 00,但我得到了每个AFL的响应6A 83。

案例C) 我有两个不同的AFL:8 1 1 018 1 2 0但我不能自动解析它们,因为之前的响应没有相同的TAG。 如果我使用那些AFL它工作,我可以得到卡的PAN代码。

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

1 个答案:

答案 0 :(得分:8)

这是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初始记录中的SInce为02)

P2(SFI)SFI 02:以5个二进制数字00010表示SFI,然后在最后附加100:00010100:在十六进制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 B2 04 14 00

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

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