当卡不存在时,是否可能发送伪apdu命令?



我正在使用javax.smartcardio包开发智能卡相关应用程序。我想发送伪ADPU命令来设置阅读器的LED/LCD状态。

我发现发送APDU命令到阅读器/卡的唯一方法是CardChannel::transmit,但它必须在卡上运行。

是否有可能发送伪apdu命令,而卡不存在于阅读器中?那么APDU命令呢?(使用Java)

在http://www.springcard.com中找到SDK for PC/SC中card-emul样本的解。下面是我的代码:

import java.util.List;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;
public class TestPcsc {
    public static void main( String[] args ) throws CardException {
        TerminalFactory tf = TerminalFactory.getDefault();
        List< CardTerminal > terminals = tf.terminals().list();
        CardTerminal cardTerminal = (CardTerminal) terminals.get( 0 );
        byte[] command = { (byte) 0xE0, (byte) 0x00, (byte) 0x00, (byte) 0x29, (byte) 0x01, (byte) 0x00 };
        cardTerminal.connect( "DIRECT" ).transmitControlCommand( CONTROL_CODE(), command );
    }
    public static int CONTROL_CODE() {
        String osName = System.getProperty( "os.name" ).toLowerCase();
        if ( osName.indexOf( "windows" ) > -1 ) {
            /* Value used by both MS' CCID driver and SpringCard's CCID driver */
            return (0x31 << 16 | 3500 << 2);
        }
        else {
            /* Value used by PCSC-Lite */
            return 0x42000000 + 1;
        }
    }
}

我认为要点是:

  1. 使用DIRECT协议获取"卡"
  2. 使用Card::transmitControlCommand方法与从CONTROL_CODE函数获得的代码(从示例代码复制,不确定理论是什么>_<)

我认为下面的方法也需要一个卡片在阅读器中,但只是为了你的信息,我把它贴在这里说我们有另一种终端控制命令的方法:

从这里引用:

transmitControlCommand:

public abstract byte[] transmitControlCommand(int controlCode,byte[] command)抛出CardException

向终端设备发送控制命令。这可以用来,例如,控制终端功能,如内置PIN pad或生物识别。

参数:

controlCode—命令

的控制代码——

命令命令数据

抛出:

SecurityException—如果SecurityManager存在并且调用者没有所需的权限

NullPointerException -如果命令为空

CardException -如果卡片操作失败

IllegalStateException -如果这个卡片对象已经通过disconnect()方法被处理

相关内容

  • 没有找到相关文章

最新更新