апплет не устанавливается при использовании javacardx.framework.math.BigNumber

Я столкнулся с проблемой при объявлении типа данных BigNumber в моем апплете javacard. Апплет правильно загружается в симулятор, если я просто прокомментирую объявление. Если быть точным, проблема возникает при загрузке файла import.cap (jcshell: код ошибки: 6a80 (неверные данные))

набор карт Java 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);
}

}


person Rakesh    schedule 12.03.2015    source источник
comment
Не могли бы вы также добавить вывод процесса установки? Вы уверены, что ваша карта совместима с Java Card 2.2.2?   -  person Ebrahim Ghasemi    schedule 12.03.2015
comment
@Abraham Я работаю над симулятором jcop, и создается файл .cap, совместимый с java-картой 2.2.2. Header.cap загружен, Directory.cap загружен, загрузка Import.cap не удалась. статус: Неверные данные. jcshell: код ошибки: 6a80 (неверные данные) jcshell: неверный ответ APDU: 6A80   -  person Rakesh    schedule 12.03.2015
comment
Я успешно загрузил вашу программу в симулятор NetBeans! И это работает нормально. Итак, как упомянул г-н Роланд в своем ответе, я думаю, что это связано с совместимостью вашего симулятора/карты с пакетом математической библиотеки.   -  person Ebrahim Ghasemi    schedule 12.03.2015
comment
Я думаю, что ответ Майкла - правильный ответ. Так что вы можете проверить это, используя знак v рядом с вопросом.   -  person Ebrahim Ghasemi    schedule 14.03.2015


Ответы (1)


javacardx.framework.math — это необязательный пакет. Таким образом, не все карты/эмуляторы реализуют это. В вашем случае похоже, что карта не реализует javacardx.framework.math.BigNumber. Следовательно, он отказывается загружать/устанавливать апплет.

Из Спецификации среды выполнения, платформа Java Card, версия 2.2.2 (раздел 9.7):

Дополнительные пакеты расширения

Некоторые пакеты API в технологии Java Card обозначаются как пакеты расширения и могут дополнительно поддерживаться реализацией. Но, если они поддерживаются, все классы в пакете и его подпакетах должны быть реализованы платформой и находиться на карте.

Ниже приведены дополнительные пакеты расширения технологии Java Card:

  • javacardx.apdu [...]
  • javacardx.biometry [...]
  • javacardx.crypto [...]
  • javacardx.external [...]
  • javacardx.framework [...] Если этот пакет реализован, он должен включать все содержащиеся подпакеты — util, math и tlv.
person Michael Roland    schedule 12.03.2015
comment
Является ли if (buffer[ISO7816.OFFSET_P1] == BigNumber.FORMAT_BCD) правильным выражением? Я думаю в левом у него значение типа byte, а в правом его нет, да? В чем смысл этой строки? - person Ebrahim Ghasemi; 12.03.2015
comment
@Abraham Сравнение байта с байтом является совершенно допустимым выражением (buffer[ISO7816.OFFSET_P1] имеет тип byte, а FORMAT_BCD определяется как public static final byte FORMAT_BCD = 1). - person Michael Roland; 12.03.2015
comment
@MichaelRoland У вас есть какая-либо информация, чтобы проверить, какие дополнительные пакеты работают с картами/эмуляторами. - person Rakesh; 12.03.2015
comment
Нет, я предлагаю вам запросить такую ​​информацию непосредственно у производителя карты/чипа/ОС. - person Michael Roland; 12.03.2015
comment
@MichaelRoland Где в спецификациях JavaCard 2.2 перечислены дополнительные пакеты? Я пытаюсь найти документацию, чтобы подтвердить, что javacardfx.framework.math фактически помечен Oracle/Sun как необязательный, а не просто часто не учитывается. Я не нашел ничего в спецификации JCVM, которая, похоже, описывает другие необязательные компоненты, такие как тип int и сборка мусора. - person BrianHVB; 01.02.2019
comment
Спасибо! Я искал BigNumber (и другие классы) в документации вместо того, чтобы искать имя пакета. - person BrianHVB; 02.02.2019