如何使用android发送ATR命令重置nfc安全元素?

时间:2014-03-12 10:20:38

标签: android security nfc reset javacard

我正在构建连接到nfc安全元素的android应用程序并获取数据到android设备。用于构建安全元素我使用了java卡API。在jcop工具中发送ATR命令来重置java卡。这是发送命令

/card -a a000000003000000 -c com.ibm.jc.CardManager
resetCard with timeout: 0 (ms)
--Waiting for card...
ATR=3B F8 18 00 FF 81 31 FE 45 4A 43 4F 50 76 32 34    ;.....1.EJCOPv24
    31 43                                              1C
ATR: T=1, FI=1/DI=8 (31clk/etu), N=-1, IFSC=254, BWI=4/CWI=5, Hist="JCOPv241"
 => 00 A4 04 00 08 A0 00 00 00 03 00 00 00 00 

我正在使用jcop工具。安全元素部分已完成。但我的android应用程序需要在一秒钟内向安全元素发送更多请求。我用这个方式创建标签并发送数据。

byte[] GET_STRING = { 
        (byte) 0x80, // CLA Class        
        0x04, // INS Instruction
        0x00, // P1  Parameter 1
        0x00, // P2  Parameter 2
        0x10  // LE  maximal number of bytes expected in result
    };

result = tag.transceive(GET_STRING);
int len = result.length;
if (!(result[len-2]==(byte)0x90&&result[len-1]==(byte) 0x00))
   throw new RuntimeException("could not retrieve msisdn");

byte[] data = new byte[len-2];
System.arraycopy(result, 0, data, 0, len-2);
String str = new String(data).trim();

tag.close()

但我需要知道如何使用android isoDep连接发送ATR命令。如果无法在获取数据后如何重置Java卡。

由于 Sajith

1 个答案:

答案 0 :(得分:1)

关于您的术语:

在非接触式接口上,您的卡没有产生ATR的重置序列。但是,非接触式界面上有两个类似的事件。一个是关闭HF场。这导致功率损耗并因此导致卡的硬复位。第二种是将非接触式卡置于HALT状态,并通过激活和重新激活卡。 ISO / IEC 14443-3中规定的选择程序。这通常也会导致卡重置其内部状态。

关于如何重置通过Android IsoDep连接的非接触式卡的问题:

  • 硬重置:只有将卡从NFC设备的读取范围中取出然后再扫描才能实现。

  • "软复位":在大多数设备上,这应该可以通过使用IsoDep实例关闭并重新打开连接来实现:

    IsoDep isoDepTag = IsoDep.get(tag);
    
    [...]
    
    isoDepTag.close();
    isoDepTag.connect();
    
    [...]
    

    但是,您应该认为某些设备(例如Galaxy S4与某些Android版本相结合)将无法正常执行软重置(HALT +重新激活/选择),而只是继续之前的连接。