繁体   English   中英

Java Card发送数据而不获取数据APDU

[英]Java Card to send data without get data APDU

我是这个领域的新手,如果我的问题很幼稚,请原谅我。

我要发行一个具有自动选择小程序的Java卡,并且几乎所有APDU都将在此小程序中处理。 我需要此applet来将数据发送到CAD,而不使用Java卡标准中的常规格式(即,不发送0x61 0xbytesToRead并等待0x00 0xc0 )。
例如,我想发送0x23字节作为对0xA0A40000027F20答复,这几乎是一个SELECT命令,但首字节错误!

那么这有可能做到吗? 如果可能的话,请告诉我怎么做。

谢谢。

对的,这是可能的。 为了实现您的目标,您需要执行以下两个步骤:

  1. 您必须使小程序默认为选中状态。
  2. 您必须在接收该命令和/或接收SELECT APDU命令时返回一些数据。

对于第一步,因为它是回答在这里

这取决于卡-安装后,并非所有卡似乎都支持将applet设置为默认值。 但是您可以使用具有--make-default选项的Java开源GlobalPlatform工具:

java -jar gp.jar --make-default A000100201100001

IIRC JCOP是实际上支持它的卡之一。

对于第二步,在这里回答:

我猜您正在执行“如果选择Applet()然后返回”的“良好做法”? 您需要处理传入的APDU,而不是简单的返回。 您可以返回数据以选择正常方式,但是如果选择成功,请小心返回0x9000。

它必须看起来像这样:

public void process(APDU apdu)
    { 
       byte[] buf = apdu.getBuffer();
       if (selectingApplet())
          { 
          //send the data in buffer return;
          }
    } 

更新:

在此答案下面回答您的评论:

我写了下面的程序:

package test;

import javacard.framework.APDU;
import javacard.framework.ISO7816;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacard.framework.Util;

public class Test extends Applet {

    public static final byte[] res = { (byte) 0x00, (byte) 0x00, (byte) 0x3B,
            (byte) 0xAD, (byte) 0x3F, (byte) 0x00, (byte) 0x01, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x16,
            (byte) 0xB3, (byte) 0x03, (byte) 0x06, (byte) 0x04, (byte) 0x00,
            (byte) 0x83, (byte) 0x8A, (byte) 0x83, (byte) 0x8A, (byte) 0x00,
            (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x3B, (byte) 0xAD,
            (byte) 0x00, (byte) 0x00, (byte) 0x3B, (byte) 0xAD, (byte) 0x2F,
            (byte) 0x06, (byte) 0x02 };

    public static void install(byte[] bArray, short bOffset, byte bLength) {
        new test.Test()
                .register(bArray, (short) (bOffset + 1), bArray[bOffset]);
    }

    public void process(APDU apdu) {
        if (selectingApplet()) {
            return;
        }

        byte[] buf = apdu.getBuffer();

        if (buf[ISO7816.OFFSET_CLA] == (byte)0xA0 && buf[ISO7816.OFFSET_INS] == (byte) 0xA4 && buf[ISO7816.OFFSET_P1] == (byte) 0x00&& buf[ISO7816.OFFSET_P2] == (byte) 0x00 
                && buf[ISO7816.OFFSET_LC] == (byte) 0x02 && buf[ISO7816.OFFSET_LC + 1] == (byte) 0x7F  && buf[ISO7816.OFFSET_LC + 2] == (byte) 0x20) {
            ISOException.throwIt((short) 0x9F23);
        } else if (buf[ISO7816.OFFSET_CLA] == (byte) 0xA0 && buf[ISO7816.OFFSET_INS] == (byte) 0xC0  && buf[ISO7816.OFFSET_P1] == (byte) 0x00 
                && buf[ISO7816.OFFSET_P2] == (byte) 0x00  && buf[ISO7816.OFFSET_P2+1] == (byte) 0x23 ) {
            Util.arrayCopyNonAtomic(res, (short) 0, buf, (short) 0, (short) 35);
            apdu.setOutgoingAndSend((short) 0, (short) 35);

        } else {
            ISOException.throwIt((short) 0x9090);
        }
    }
}

然后我将其安装为默认选择的applet:

CommandLine> gp -install e:\soq.cap --default

CommandLine>

然后我将APDU命令发送给它:

CommandLine> OSC.exe -s A0A40000027F20 -s a0c0000023
Using reader with a card: ACS CCID USB Reader 0
Sending: A0 A4 00 00 02 7F 20
Received (SW1=0x9F, SW2=0x23)
Sending: A0 C0 00 00 23
Received (SW1=0x90, SW2=0x00):
00 00 3B AD 3F 00 01 00 00 00 00 00 16 B3 03 06 ..;.?...........
04 00 83 8A 83 8A 00 03 00 00 3B AD 00 00 3B AD ..........;...;.
2F 06 02                                        /..

看来它可以按照您的要求工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM