【问题标题】:applet not installing when using javacardx.framework.math.BigNumber使用 javacardx.framework.math.BigNumber 时无法安装小程序
【发布时间】:2019-02-01 19:11:53
【问题描述】:

我在 javacard 小程序中声明 BigNumber 数据类型时遇到了问题。如果我只是评论声明,小程序会正确加载到模拟器中。准确的问题是在加载 import.cap 文件时 (jcshell:错误代码:6a80(错误数据))

java card kit 2.2.2 使用

  import javacard.framework.APDU;
  import javacard.framework.Applet;
  import javacard.framework.ISO7816;
  import javacard.framework.ISOException;
  import javacard.framework.JCSystem;
  import javacardx.framework.math.BigNumber;

 public class LargeBal extends Applet {

 // CLA byte
public static final byte BANK_CLA = (byte) 0x80;

// INS byte
public static final byte INS_GET_BALANCE = 0X02;
public static final byte INS_CREDIT = 0X04;
public static final byte INS_DEBIT = 0X06;

/**
 * SW bytes for Arithmetic exception
 */
final static short INVALID_NUMBER_FORMAT = 0x6308;

/**
 * Initial account balance
 */
final static byte[] INITIAL_ACCOUNT_BALANCE = { (byte) 0x01, (byte) 0x00,
        (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 };

// Amount of money in user's account

private BigNumber accountBalance;

// Big number for temporary calculation
BigNumber tempBigNum;

// temporary buffer used as scratch space

byte[] scratchSpace;

private LargeBal() {

     accountBalance = new BigNumber((byte) 8);

    // initialize account balance to 100,000.00
     accountBalance.init(INITIAL_ACCOUNT_BALANCE, (byte) 0,
     (byte) INITIAL_ACCOUNT_BALANCE.length, BigNumber.FORMAT_BCD);

    // initialize the temporary big number
     tempBigNum = new BigNumber(BigNumber.getMaxBytesSupported());

    // initialize the scratchSpace
    scratchSpace = JCSystem.makeTransientByteArray((short) 10,
            JCSystem.CLEAR_ON_DESELECT);
    register();
}

public static void install(byte[] bArray, short bOffset, byte bLength) {
    // GP-compliant JavaCard applet registration
    new LargeBal();
}

public void process(APDU apdu) {
    // Good practice: Return 9000 on SELECT
    if (selectingApplet()) {
        return;
    }

    byte[] buf = apdu.getBuffer();
    switch (buf[ISO7816.OFFSET_INS]) {
    case INS_GET_BALANCE:
         getBalance(apdu, buf);
        break;
    case INS_CREDIT:

        break;
    case INS_DEBIT:

        break;
    default:
        // good practice: If you don't know the INStruction, say so:
        ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
    }
}

private void getBalance(APDU apdu, byte[] buffer) {

    if (buffer[ISO7816.OFFSET_P1] == BigNumber.FORMAT_BCD) {
        accountBalance.toBytes(buffer, (short) 0, (short) 8,
                BigNumber.FORMAT_BCD);
    } else if (buffer[ISO7816.OFFSET_P1] == BigNumber.FORMAT_HEX) {
        accountBalance.toBytes(buffer, (short) 0, (short) 8,
                BigNumber.FORMAT_HEX);
    } else
        ISOException.throwIt(INVALID_NUMBER_FORMAT);

    apdu.setOutgoingAndSend((short) 0, (short) 8);
}

}

【问题讨论】:

  • 请您也添加安装过程输出吗?您确定您的卡与 Java Card 2.2.2 兼容吗?
  • @Abraham 我正在开发 jcop 模拟器,它是 java card 2.2.2 compatible.cap 文件。已加载 Header.cap,已加载 Directory.cap,加载 Import.cap 失败。状态:错误的数据。 jcshell:错误代码:6a80(错误数据) jcshell:错误响应 APDU:6A80
  • 我在NetBeans模拟器上成功加载了你的程序!它工作正常。所以,正如 Roland 先生在他的回答中提到的,我认为这与您的模拟器/卡与数学库包的兼容性有关。
  • 我认为迈克尔的答案是正确的答案。因此,您可以使用问题旁边的“v”标记进行检查。

标签: applet smartcard javacard jcop


【解决方案1】:

javacardx.framework.math 是一个可选 包。因此,并非所有卡/模拟器都实现了这一点。在您的情况下,该卡似乎没有实现javacardx.framework.math.BigNumber。因此它拒绝加载/安装小程序。

来自运行时环境规范,Java Card 平台,版本 2.2.2(第 9.7 节):

可选扩展包

Java Card 技术中的一些 API 包被指定为扩展 包,并且可以选择由实现支持。但是,如果支持, 包及其子包中的所有类必须由 平台并驻留在卡上。

以下是可选的 Java Card 技术扩展包:

  • javacardx.apdu [...]
  • javacardx.biometry [...]
  • javacardx.crypto [...]
  • javacardx.external [...]
  • javacardx.framework [...] 如果实施,此包必须包含所有包含的子包 - utilmathtlv

【讨论】:

  • if (buffer[ISO7816.OFFSET_P1] == BigNumber.FORMAT_BCD) 是正确的表达方式吗?我认为在左边他有一个byte 类型值,而在右边不是,对吧?这条线是什么意思?
  • @Abraham 将一个字节与一个字节进行比较是一个完全有效的表达式(buffer[ISO7816.OFFSET_P1]byte 类型,FORMAT_BCD 定义为 public static final byte FORMAT_BCD = 1).
  • @MichaelRoland 你有什么信息可以检查哪些可选包适用于卡/模拟器。
  • 不,我建议您直接向卡/芯片/操作系统制造商索取此类信息。
  • @MichaelRoland JavaCard 2.2 规范在哪里列出了可选包?我正在尝试查找文档以确认 javacardfx.framework.math 实际上被 Oracle/Sun 标记为可选,而不是经常被遗漏。我在 JCVM 规范中没有找到任何内容,它似乎描述了其他可选组件,例如 int 类型和垃圾收集。
猜你喜欢
  • 1970-01-01
  • 2019-12-13
  • 2016-08-04
  • 2012-05-10
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多