当前位置: 首页 > 知识库问答 >
问题:

在J3A081上安装applet(Java Card)

琴光亮
2023-03-14

我刚刚创建了一个非常简单的小程序。这是Java card技术中的“Hello World”。我在下面粘贴了一个代码。

public class helloworld extends Applet {
    private byte[] echoBytes;
    private static final short LENGTH_ECHO_BYTES = 256;
    /**
     * Installs this applet.
     * 
     * @param bArray
     *            the array containing installation parameters
     * @param bOffset
     *            the starting offset in bArray
     * @param bLength
     *            the length in bytes of the parameter data in bArray
     */
    public static void install(byte[] bArray, short bOffset, byte bLength) {
        new helloworld();
    }

    /**
     * Only this class's install method should create the applet object.
     */
    protected helloworld() {
        echoBytes = new byte[LENGTH_ECHO_BYTES];
        register();
    }

    /**
     * Processes an incoming APDU.
     * 
     * @see APDU
     * @param apdu
     *            the incoming APDU
     */
    @Override
    public void process(APDU apdu) {
        //Insert your code here
        //
        byte buffer[] = apdu.getBuffer();
        if ((buffer[ISO7816.OFFSET_CLA] ==  0) && (buffer[ISO7816.OFFSET_INS] == (byte) (0xA4))){
            return;
        }
        short bytesRead = apdu.setIncomingAndReceive();
        short echoOffset = (short) 0;

        Util.arrayCopyNonAtomic(buffer, ISO7816.OFFSET_CDATA, echoBytes, echoOffset, bytesRead);
        echoOffset += bytesRead;

        apdu.setOutgoing();
        apdu.setOutgoingLength((short)(echoOffset + 5));

        //echo header
        apdu.sendBytes((short) 0, (short) 5);
        //echo data
        apdu.sendBytesLong(echoBytes, (short) 0, echoOffset);
    }
}

之后,我决定使用Global Platform在real card(J3A081)上安装它,但失败了。首先,我用命令检查了卡上是否已经安装了任何小程序:

java -jar gp.jar -l

回应是:

AID: A000000003000000 (|........|)
     ISD OP_READY: Security Domain, Card lock, Card terminate, Default selected, CVM (PIN) management
java -jar gp.jar -install krystian.cap

javax.smartcardio.CardException: sun.security.smartcardio.PCSCException: Unknown error 0x1f
        at sun.security.smartcardio.ChannelImpl.doTransmit(ChannelImpl.java:219)
        at sun.security.smartcardio.ChannelImpl.transmit(ChannelImpl.java:90)
        at pro.javacard.gp.GlobalPlatform.transmit(GlobalPlatform.java:661)
        at pro.javacard.gp.GlobalPlatform.loadCapFile(GlobalPlatform.java:727)
        at pro.javacard.gp.GlobalPlatform.loadCapFile(GlobalPlatform.java:686)
        at pro.javacard.gp.GPTool.main(GPTool.java:453)
Caused by: sun.security.smartcardio.PCSCException: Unknown error 0x1f
        at sun.security.smartcardio.PCSC.SCardTransmit(Native Method)
        at sun.security.smartcardio.ChannelImpl.doTransmit(ChannelImpl.java:188)
        ... 5 more
Exception in thread "main" javax.smartcardio.CardException: sun.security.smartcardio.PCSCException: Unknown error 0x1f
        at sun.security.smartcardio.ChannelImpl.doTransmit(ChannelImpl.java:219)
        at sun.security.smartcardio.ChannelImpl.transmit(ChannelImpl.java:90)
        at pro.javacard.gp.GlobalPlatform.transmit(GlobalPlatform.java:661)
        at pro.javacard.gp.GlobalPlatform.loadCapFile(GlobalPlatform.java:727)
        at pro.javacard.gp.GlobalPlatform.loadCapFile(GlobalPlatform.java:686)
        at pro.javacard.gp.GPTool.main(GPTool.java:453)
Caused by: sun.security.smartcardio.PCSCException: Unknown error 0x1f
        at sun.security.smartcardio.PCSC.SCardTransmit(Native Method)
        at sun.security.smartcardio.ChannelImpl.doTransmit(ChannelImpl.java:188)
        ... 5 more

经过几个小时的努力,我终于取得了一些成就。首先,我为ACR122U智能卡读卡器更新了一个驱动程序。此外,我熟悉了GPShell,并创建了一个简单的脚本:

mode_211
enable_trace
establish_context
card_connect
select -AID a000000003000000
open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4f -enc_key 404142434445464748494a4b4c4d4e4f   
card_disconnect
release_context

哪些产出:

mode_211
enable_trace
establish_context
card_connect
select -AID a000000003000000
Command --> 00A4040008A000000003000000
Wrapped command --> 00A4040008A000000003000000
Response <-- 6F658408A000000003000000A5599F6501FF9F6E06479100783400734A06072A864                                                                   886FC6B01600C060A2A864886FC6B02020101630906072A864886FC6B03640B06092A864886FC6B0                                                                   40215650B06092B8510864864020103660C060A2B060104012A026E01029000
open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4                                                                   f -enc_key 404142434445464748494a4b4c4d4e4f
Command --> 80CA006600
Wrapped command --> 80CA006600
Response <-- 664C734A06072A864886FC6B01600C060A2A864886FC6B02020101630906072A864                                                                   886FC6B03640B06092A864886FC6B040215650B06092B8510864864020103660C060A2B060104012                                                                   A026E01029000
Command --> 805000000853DFBA4B056DAE8800
Wrapped command --> 805000000853DFBA4B056DAE8800
Response <-- 0000510101086197846701020018CC282BD831DB0145313B12DB3E169000
Command --> 84820100103294E6632BFE5E59879A2C9C03EE345E
Wrapped command --> 84820100103294E6632BFE5E59879A2C9C03EE345E
Response <-- 9000
card_disconnect
release_context

所以我想一切都很好,但是当我想用以下方式安装applet时:

mode_211
enable_trace
establish_context
card_connect
select -AID a000000003000000
open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4f -enc_key 404142434445464748494a4b4c4d4e4f
install -file helloworld.cap -nvDataLimit 2000 -instParam 00 -priv 2
card_disconnect
release_context
mode_211
enable_trace
establish_context
card_connect
select -AID a000000003000000
Command --> 00A4040008A000000003000000
Wrapped command --> 00A4040008A000000003000000
Response <-- 6F658408A000000003000000A5599F6501FF9F6E06479100783400734A06072A864                                                                   886FC6B01600C060A2A864886FC6B02020101630906072A864886FC6B03640B06092A864886FC6B0                                                                   40215650B06092B8510864864020103660C060A2B060104012A026E01029000
open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4                                                                   f -enc_key 404142434445464748494a4b4c4d4e4f
Command --> 80CA006600
Wrapped command --> 80CA006600
Response <-- 664C734A06072A864886FC6B01600C060A2A864886FC6B02020101630906072A864                                                                   886FC6B03640B06092A864886FC6B040215650B06092B8510864864020103660C060A2B060104012                                                                   A026E01029000
Command --> 8050000008ADBD20501C2C87A400
Wrapped command --> 8050000008ADBD20501C2C87A400
Response <-- 0000510101086197846701020019DFABEED157EA9E2F7E75EAA739E89000
Command --> 848201001014781742A86F6C5026B0D999238ABEBA
Wrapped command --> 848201001014781742A86F6C5026B0D999238ABEBA
Response <-- 9000
install -file helloworld.cap -nvDataLimit 2000 -instParam 00 -priv 2
Command --> 80E602001E07D0D1D2D3D4D50108A000000003000000000AEF08C6020160C80207D0                                                                   0000
Wrapped command --> 84E602002607D0D1D2D3D4D50108A000000003000000000AEF08C6020160                                                                   C80207D000B9A71938B63B8CFB00
Response <-- 009000
Command --> 80E80000EFC4820157010011DECAFFED010204000107D0D1D2D3D4D50102001F0011                                                                   001F000C000B0026000C003B0019000F0000005D00020001000C01010004000B01000107A0000000                                                                   62010103000C0108D0D1D2D3D4D50101000C06000C00800300FF0007010000001707003B00011018                                                                   8C0000188B00017A02308F00023D8C00033B7A0521198B00042D198B00053B7B0006031A037B0006                                                                   928D00073B19037B0006928B00087A08001900020001000103000C48656C6C6F20576F726C642100                                                                   00000005002600090680030003800301010000000600000103800A0103800A060500000006801002                                                                   03800A0809000F000000
Wrapped command --> 84E80000F7C4820157010011DECAFFED010204000107D0D1D2D3D4D50102                                                                   001F0011001F000C000B0026000C003B0019000F0000005D00020001000C01010004000B01000107                                                                   A000000062010103000C0108D0D1D2D3D4D50101000C06000C00800300FF0007010000001707003B                                                                   000110188C0000188B00017A02308F00023D8C00033B7A0521198B00042D198B00053B7B0006031A                                                                   037B0006928D00073B19037B0006928B00087A08001900020001000103000C48656C6C6F20576F72                                                                   6C64210000000005002600090680030003800301010000000600000103800A0103800A0605000000                                                                   0680100203800A0809000F00000067CDD7B27E70D011
load() returns 0x0000001F (Urzdzenie doczone do komputera nie dziaa.

但是我只能安装hello world小程序,在处理我的过程中,GlobalPlatformPro返回异常:

java -jar gp_16byteLoadBlock.jar --install inzynierka.cap
pro.javacard.gp.GPException: LOAD failed SW: 6A80
        at pro.javacard.gp.GlobalPlatform.check(GlobalPlatform.java:1092)
        at pro.javacard.gp.GlobalPlatform.loadCapFile(GlobalPlatform.java:728)
        at pro.javacard.gp.GlobalPlatform.loadCapFile(GlobalPlatform.java:686)
        at pro.javacard.gp.GPTool.main(GPTool.java:453)

共有1个答案

唐阳泽
2023-03-14

(评论讨论实录)

事实证明,ACR122U NFC读卡器存在长APDU的问题(这里也提到过)。

可能的解决方案之一是按以下方式修改GlobalPlatformPro工具:

通过用一些较小的常量替换wrapper.getblocksize()部分来减小加载块的大小(32被确认可以工作,64被确认不能使用此读取器)

重新编译GlobalPlatformPro

编辑>

 类似资料:
  • 在添加这些行之前,我的applet在cref上安装没有问题(SW1 SW2 9000),但是在这些编辑之后,我在安装中遇到了问题-SW1 SW2 0x6438,这意味着没有找到导入的包。 我做错了什么?在编译过程中,我使用了sim.toolkit jar文件,在生成过程中,cap文件使用了从sim工具箱导出的文件。

  • 问题内容: 我在Android手机上安装Pocketsphinx时遇到一些问题,但在CMUSphinx的支持论坛,IRC,现有的StackOverflow帖子或强化的Googling上找不到答案。如果在座的人有时间愿意提供帮助,我将不胜感激。 首先,我对于是否可以在Android上安装Pocketsphinx感到困惑。我相信我需要Java容器才能在Android上运行,因此我尝试安装Sphinx4

  • 问题内容: 我正在尝试在Ubuntu10.04上安装RMagick。但没有喜悦。我什至从源代码编译并安装了ImageMagick,但是当我尝试使用RubyGems安装RMagick时,这里的说明仍然没有帮助。我收到此错误: 这是什么意思呢?:)我是Ruby和RubyGems的新手,所以请保持谦虚。我的设置如下: 我几乎没有想法(也很累!)。我厌倦了使用上面的链接从源代码编译RMagick,但是由于

  • 问题内容: 我通过阅读本教程安装了预构建版本。如果我启动elasticsearch,则会收到以下错误消息,我应该尝试旧版本的ES还是解决该问题? 问题答案: 您尝试将ES分配给已使用的端口8080。从那里的配置的罪魁祸首是。只需将两个配置都保留在配置之外,或为envvar分配其他端口。ES的默认端口是http和9300的9200。

  • 这是不言自明的... 无法完成安装,因为找不到一个或多个必需的项目。 正在安装的软件:Android 原生开发工具 20.0.0.v201206242043-391819 (com.android.ide.eclipse.ndk.feature.group 20.0.0.v201206242043-391819) 缺少要求:Android本机开发工具20 . 0 . 0 . v 201206242