使用PPSE而不是PSE读取EMV卡

时间:2013-02-25 03:22:41

标签: nfc credit-card emv

我试图通过非接触式Visa Paywave卡读取数据。

对于Paywave,我必须使用PPSE(2PAY.SYS.DDF01)而不是PSE(1PAY.SYS.DDF01)提交SELECT。

EMV书1,第11.3.4节,表43仅描述了如何使用PSE解释成功SELECT命令的响应。有没有人知道或者可以将我介绍给一个显示如何使用PPSE处理从成功的SELECT命令返回的数据的源?

这是我的请求APDU:

00A404000e325041592e5359532e444446303100

以下是回复:

6F2F840E325041592E5359532E4444463031A51DBF0C1A61184F07A0000000031010500A564953412044454249548701019000

我理解来自回复的代码84,代码85,代码BF0C。根据读取PSE的示例,我应该能够在成功响应之后发送GET PROCESSION OPTIONS(获取AIP和AFL)PDOL = null,如下所示:80A80000830000

但请求80A80000830000返回错误代码6985 - 不允许命令;使用条件不满意。

我还尝试通过遍历每个SFI(0-30)和每个SFI的每个记录(0-16)成功选择PPSE来读取所有文件。是的,我也进行了3位移位,并使用0x4对SFI进行按位或运算。但我没有数据。

我被卡住了,任何帮助我从我的Paywave卡中获取一些信息的帮助都将不胜感激!

6 个答案:

答案 0 :(得分:7)

答案 1 :(得分:2)

你似乎有点混乱,你想:

  • 发送1PAY或2PAY,对我测试的所有卡片实际上并不重要。这将返回卡上可用的AID列表。或者你可以直接选择一个AID,如果你知道它在那里,但好的做法是先检查。

  • 获取响应1PAY / 2PAY返回的AID列表,在PayWave的情况下,如果您发送2PAY,这可能是A0000000031010,但如果您发送1PAY,可能会获得更多。

  • 选择一个已发回的AID(或您已经知道的AID)。

  • 然后遍历SFI并记录发送读取记录命令以获取数据。

在发送“读取记录”命令之前,您不必发送“获取处理选项”,即使现在这是正常的事务流程。

答案 2 :(得分:0)

我认为您正在寻找的信息可从this VISA website获得。但只有您是VISA的注册和/或许可合作伙伴。

编辑:查看BF0C下的结果TLV结构:

tag=0xBF0C, length=0x1A
    tag=0x61, length=0x18
        tag=0x4F, length=0x07, value=0xA0000000031010 // looks like an AID to me
        tag=0x50, length=0x0A, value="VISA DEBIT"
        tag=0x87, length=0x01, value=0x01

我猜你需要先获得A0000000031010才能获得处理选项。

答案 3 :(得分:0)

我正在选择应用程序2PAY.SYS.DDF01。什么时候我应该选择AID = 0xA0000000031010。看起来应用程序2PAY.SYS.DDF01下没有记录。

但申请表0xA0000000031010下有1条记录。在我拿到这个应用程序后,我执行了READ RECORD,第一条记录给了我PAN和我想要的所有信用卡信息。

感谢所有人的欢呼声。

答案 4 :(得分:0)

如果您对MasterCard感兴趣,可以使用triangle.io的API来执行此操作。它是免费的,可以为您阅读MasterCard和Visa非接触式卡,这是您想要的。

请注意,直接从卡上读取所有文件,虽然它会为您提供所需的数据,但并不是真正遵循EMV数据流。选择应用程序后,您应该执行“获取处理选项”,然后构建PDOL和剩下的魔法。

http://www.triangle.io

免责声明:我为triangle.io工作

答案 5 :(得分:0)

2PAY.SYS.DDF01用于非接触式(例如NFC)卡,而1PAY.SYS.DDF01用于接触卡。

  1. 成功(SW1 SW2 = 90 00)读取PSE后,您应该只搜索SFI(标签88),它是返回的FCI模板中的必填字段。

  2. 使用SFI作为起始索引,您必须从起始索引开始读取记录,直到获得6A83(RECORD_NOT_FOUND)。例如。如果您的SFI是1,您将使用record_number = 1执行readRecord。那可能会成功。然后你将record_number增加到2并再次执行readRecord。增加到3 ....重复它直到你得到6A83作为你的状态。

  3. 读取的记录将是ADF(至少为1)。然后,您必须将读取的ADF名称与终端支持以及ASI(应用程序选择指示符)进行比较。最后,您将获得可能的ADF列表(候选列表)

  4. 所有上述步骤(1-3)都记录在EMV规范的第12.3.2章Book1 v4.3中。

    您必须做出最终选择(第12.4章Book1)

    阅读规格书1第12.3 - 12.4节,了解所有详细步骤。