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

JCWDE模拟器运行:调用的install()方法异常

时宾实
2023-03-14
package hello;



import javacard.framework.APDU;

import javacard.framework.Applet;

import javacard.framework.ISO7816;

import javacard.framework.ISOException;

import javacard.framework.Util;



public class HelloWorldApplet extends Applet {

         private static final byte[] helloWorld = {(byte)'H',(byte)'e',(byte)'l',(byte)'l',(byte)'o',(byte)' ',(byte)'W',(byte)'o',(byte)'r',(byte)'l',(byte)'d',};



         private static final byte HW_CLA = (byte)0x80;

         private static final byte HW_INS = (byte)0x00;



         public static void install(byte[] bArray, short bOffset, byte bLength) {

             new HelloWorldApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);

         }



         public void process(APDU apdu) {



             if (selectingApplet()) {

             return;

         }



         byte[] buffer = apdu.getBuffer();

         byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);

         byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);



         if (CLA != HW_CLA)

        {

            ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);

        }



          switch ( INS ) {

             case HW_INS:

               getHelloWorld( apdu );

               break;

            default:

               ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);

         }

   }



  private void getHelloWorld( APDU apdu)

  {

      byte[] buffer = apdu.getBuffer();

      short length = (short) helloWorld.length;



      Util.arrayCopyNonAtomic(helloWorld, (short)0, buffer, (short)0, (short) length);



      apdu.setOutgoingAndSend((short)0, length);

  }

}
javac -g -d hello -classpath “.;%JC_HOME%\lib\api.jar;%JC_HOME%\lib\javacardframework.jar” HelloWorldApplet.java
//+

// Copyright © 2003 Sun Microsystems, Inc. All rights reserved.

// SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.

//-



//+

// Workfile:@(#)jcwde.app    1.4

// Version:1.4

// Date:07/16/03

//-



// applet                                        AID

com.sun.javacard.installer.InstallerApplet       0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0x8:0x1

com.sun.javacard.samples.JavaPurse.JavaPurse     0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x2:0x1

com.sun.javacard.samples.JavaLoyalty.JavaLoyalty 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x5:0x1

com.sun.javacard.samples.wallet.Wallet           0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x6:0x1

hello.HelloWorldApplet                           0x01:0x02:0x03:0x04:0x05:0x06:0x07:0x08:0x09:0x00:0x01 

我在命令行窗口(Windows7)中使用以下命令启动jcwde:

jcwde jcwde.app

然后我启动一个新的命令行窗口,并在那里启动apdutool:

apdutool -nobanner -noatr HelloWorldApplet.scr > hello.scr.jcwde.out

以下是。scr脚本文件:powerup;

// Select the installer applet
0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F;
// 90 00 = SW_NO_ERROR

// create Applet
0x80 0xB8 0x00 0x00 0x0d 0x0b 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x01 0x00 0x7F;

// Select Applet
0x00 0xa4 0x04 0x00 0x0b 0x01 0x02 0x03 0x04 0x05 0x6 0x07 0x08 0x09 0x00 0x01 0x7F;

// Send APDU command to get a Hello World message
0x80 0x00 0x00 0x00 0x00 0x00;

powerdown;
D:\jc221\samples\src\demo\jcwde>jcwde jcwde.app

Java Card 2.2.1 Workstation Development Environment, Version 1.3

Copyright 2003 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.

jcwde is listening for T=0 Apdu's on TCP/IP port 9á025.

Exception from the invoked install() method:public static void hello.HelloWorldApplet.install(byte[],short,byte)

jcwde exiting on receipt of power down command.



D:\jc221\samples\src\demo\jcwde>
CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 09, a0, 00, 00, 00, 62, 03, 01, 08, 01, Le: 00, SW1: 90, SW2: 00

CLA: 80, INS: b0, P1: 00, P2: 00, Lc: 00, Le: 00, SW1: 90, SW2: 00

CLA: 80, INS: b8, P1: 00, P2: 00, Lc: 0d, 0b, 01, 02, 03, 04, 05, 06, 07, 08, 09, 00, 01, 00, Le: 00, SW1: 64, SW2: 44

CLA: 80, INS: ba, P1: 00, P2: 00, Lc: 00, Le: 00, SW1: 90, SW2: 00

CLA: 00, INS: a4, P1: 04, P2: 00, Lc: 0b, 01, 02, 03, 04, 05, 06, 07, 08, 09, 00, 01, Le: 00, SW1: 6d, SW2: 00

CLA: 80, INS: 00, P1: 00, P2: 00, Lc: 00, Le: 00, SW1: 6d, SW2: 00

共有1个答案

喻渊
2023-03-14

这个问题的根源似乎是一个bug(?)在JCWDE。虽然Java Card规范要求install参数至少包含长度字节(即使用于指示零长度),但JCWDE似乎使用通过脚本获得的任何install参数。因此,如果不explcyly传入安装参数,字节数组Barray的长度将为零。因此,访问barray[bOffset]将导致indexoutofbounds异常。因此,检查barray/blength的长度并调用

register(bArray, (short) (bOffset + 1), bArray[bOffset]);

register();

相应地。

 类似资料:
  • 我试图在测试中模拟一个调用,但我得到了一个错误,因为它调用了真正的方法,而不是模拟它。 这是我的方法 } 这是我的测试课 测试实际上调用了受保护的方法config Setter,并在设置代理时失败。帮助我理解我在这里做错了什么。

  • 但是不知何故,method3()并没有被嘲笑,我仍然看到它打印的内容。但是,我可以成功地模拟method2()。也许是因为method2()是从method1()直接调用的,我正在测试的方法是什么?请建议我如何模拟方法3。 谢谢,梅赫

  • 我试图为一个类编写一个单元测试,这个类使用带有库中的的Google vision API。问题是,由于某种原因,我的模拟仍然调用真正的方法,然后抛出一个NPE,这破坏了我的测试。我以前从未在模拟上见过这种行为,我想知道我是不是做错了什么,是不是Spock/Groovy中有bug,还是与Google lib有关?

  • 问题内容: 这是我的代码- 我想在课堂上嘲笑。但是我找不到解决办法。仅禁止并返回默认值(在上述情况下为0)。事情就是这样,,只对静态方法的工作。 有没有办法在Powermock中做到这一点? 我正在使用Powermock 1.5和Mockito 1.9.5。 问题答案: 看来jMockit可以满足我的需求。也许我可以将这个问题发布到powermock邮件列表中。同时下面就足够了。包learning

  • 注意:这个示例非常简单,但它得到了我想要实现的跨越的想法。 我有一个类(称为),它接受作为构造函数参数;它有一个方法,该方法生成一个执行以下操作的新线程(为简洁起见,大大减少了): 在正常操作中,调用会阻塞,直到与建立连接为止。 但这让我产生了错误的感觉;我不是真的在寻找至少一个互动,我真的在寻找一个互动。 我可以这样做(返回一次模拟的套接字,然后返回null): 但是,我仍然有大量对的调用,这些