NFC Android截断APDU响应字节

时间:2016-08-02 15:33:31

标签: android nfc smartcard apdu

我将Android设置为通过NFC来来回发送APDU命令。 其中一个APDU响应字节会被截断一些。

2之前的日志语句中打印的响应字节是

  

I / NfcService:通报侦听状态:DEBUG_APDU_SENT数据:7F4982010A81820101009F80023FC39926A237680FFFF47060239F4D240C1EBC424428965FADDBBD0BC3B2CB9BF8952AFF24135C5DCEA7931CEB0BF1406B57BE099DBF7F3A36FA6F20B9B244C1C4131CBFA1D088E1F2298845402B2505E28CA52403EFD09882C361A2F63C30C1FFA3160BAB9BE7CF64E1DA6066EEAAB995B3F627676E4FEF32F9FEA5534E472EBF990F7C964BB9FB36DFE995124AC80C306C796A22840A6FC3871508F1B5CCB063D4DDAD252AA9B4E13219ED4C5EA50FF2BBACA937BB0F9CF80472818AE49DE05E8B66D3863EEF3028325812958099C78CD65919A3660592A0BA5E966D6A01A3DD8242BDA5940146C07AE8475F35C88024DE566112

但是在接收端,我看到只收到了前4个字符而且应用程序失败了 APDU响应:

  

SW = 7F49(无法翻译),Nr = 0,APDU响应字节数:7f 49

知道为什么会这样吗?这是由于extendedAPDU功能吗? https://code.google.com/p/android/issues/detail?id=76598

附加整个APDU命令跟踪,直到失败。请注意,相同的代码适用于任何其他界面(例如通过蓝牙,物理卡等),而不适用于NFC Android(HostAPDUService)。

我看到我无法覆盖HostAPDUService.sendResponseAPDU,因此无法找到截断发生的位置。我确信在发送此方法之前,我的响应字节不会被截断。

HostAPDUService.sendResponseApdu(bytes[])

2 个答案:

答案 0 :(得分:0)

512个十六进制字符的数据表示接收到256字节的缓冲区。

这可能是你的回复缓冲区大小限制。首先,尝试增加bytes[]数组大小,让API将更长的缓冲区放入其中。

回复中的TLV数据长于256.从TLV数据解析可以清楚地看出:

TLVs:#"7F4982010A81820101009F80023FC39926A237680FFFF47060239F4D240C..6112" # EMV, Tag + Length + Value (TLV) series
- x7F49:#"7F4982010A81820101009F80023FC39926A237680FFFF47060239F4D240C..6112" # ISO 7816, Template, Cardholder public key
  - tag: "7F49"
  - len: "82010A" #  // 266
  - val:#"81820101009F80023FC39926A237680FFFF47060239F4D240C1EBC424428..6112"
    - x81:#"81820101009F80023FC39926A237680FFFF47060239F4D240C1EBC424428..6112" # ISO 7816, RSA Modulus (a number denoted as n coded on x bytes), or DSA First prime (a number denoted as p coded on y bytes), or ECDSA Prime (a number denoted as p coded on z bytes)
      - tag: "81"
      - len: "820101" #  // 257
      - val: "
009F80023FC39926A237680FFFF47060239F4D240C1EBC424428965FADDBBD0BC3B2CB9BF8952AFF24135C5DCEA7931CEB0BF1406B57BE099DBF7F3A36FA6F20B9B244C1C4131CBFA1D088E1F2298845402B2505E28CA52403EFD09882C361A2F63C30C1FFA3160BAB9BE7CF64E1DA6066EEAAB995B3F627676E4FEF32F9FEA5534E472EBF990F7C964BB9FB36DFE995124AC80C306C796A22840A6FC3871508F1B5CCB063D4DDAD252AA9B4E13219ED4C5EA50FF2BBACA937BB0F9CF80472818AE49DE05E8B66D3863EEF3028325812958099C78CD65919A3660592A0BA5E966D6A01A3DD8242BDA5940146C07AE8475F35C88024DE566112"

预期的回复长度:266字节的模板值+ 3字节的长度(0x82010A)+ 2字节标记(0x7F49)+ 2字节,SW1SW2 = 273字节。

如果您可以登录,请提供APDU跟踪。

作为第二次尝试,您可以发送Get Response APDU命令(指令“C0”)来读取下一条回复缓冲区。类似的东西:

# 1st Get Response
> 00 C0 00 00 00
< you will get first 256 bytes

# 2nd Get Response
> 00 C0 00 00 00
< you will get next 256 bytes or the rest of data

答案 1 :(得分:0)

好的,这是供任何人使用的。

APDU命令或缓冲区没有任何问题。它适用于三星Galaxy S7(Android版本6.0.6),而不是Note 2或Nexus手机(4.4.X版本)。 4.4.X版本的android手机无法发送整个字节,如果超出则会截断。

此链接可能会解释此问题 https://code.google.com/p/android/issues/detail?id=76598