Я пытаюсь внедрить ECDSA в JavaCard (Eclipse 4.4.2, JC 2.2.1). Моя карта - Gemalto IDCore 3010, или, по крайней мере, так должно быть (после проверки кода ATR похоже, что это WM GX4 72 DHS TSA...).
В любом случае, если я не окружу строку objECDSAKeyPair = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_192) с помощью try and catch, я получу неизвестную ошибку (send_APDU() возвращает 0x80206F00 (Unknown Ошибка ISO7816: 0x6F00)), но когда я его окружаю, он не возвращает ошибки (send_APDU() возвращает 0x80209000 (9000: Успех. Нет ошибки.)). Однако он должен перейти в блок catch, потому что остальные три строки в блоке try не выполняются.
Как я могу визуализировать сообщение об ошибке? Если я использую ISOException.throwIt(reason), я получаю сообщение Ошибка связи с интеллектуальной картой. Повторите попытку. несколько раз.
В этом потоке предлагается byte Reason = c. getReason(), но он не будет работать, даже если я приведу правую сторону к байту.
Благодарю вас!
Вот соответствующая часть моего кода.
public class ECDSATestApplet extends Applet {
private final static byte CLS = (byte) 0xE0;
private final static byte NOOP = (byte) 0x00;
private final static byte GEN = (byte) 0x01;
...
private final static byte[] HELLO_WORLD = new byte[] { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!' };
private ECPrivateKey objECDSAPriKey = null;
private ECPublicKey objECDSAPubKey = null;
private KeyPair objECDSAKeyPair = null;
private Signature objECDSASign = null;
final static short BAS = 0;
private ECDSATestApplet() {
}
public static void install(byte[] bArray, short bOffset, byte bLength) {
new ECDSATestApplet().register();
}
public void process(APDU apdu) {
if (this.selectingApplet())
return;
byte buffer[] = apdu.getBuffer();
if (buffer[ISO7816.OFFSET_CLA] != CLS)
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
switch (buffer[ISO7816.OFFSET_INS]) {
case NOOP:
break;
case GEN:
try {
// ------- ERROR LINE -------
objECDSAKeyPair = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_192);
// objECDSASign = Signature.getInstance(Signature.ALG_ECDSA_SHA, false);
// objECDSAKeyPair.genKeyPair();
// objECDSAPriKey = (ECPrivateKey) objECDSAKeyPair.getPrivate();
// objECDSAPubKey = (ECPublicKey) objECDSAKeyPair.getPublic();
apdu.setIncomingAndReceive();
Util.arrayCopyNonAtomic(HELLO_WORLD, (short) 0, buffer, (short) 0, (short) HELLO_WORLD.length);
apdu.setOutgoingAndSend((short) 0, (short) HELLO_WORLD.length);
} catch (CryptoException c) {
short reason = c.getReason();
// ISOException.throwIt(reason);
}
break;
}
return;
}
}
byte reason = c.getReason()
? Возвращает ли он какую-либо ошибку? когда? в процессе установки? или во время выполнения? - person Ebrahim Ghasemi   schedule 06.04.20150x0001
при ответе на команду APDU Select и загружает его на две разные карты. Теперь, когда я выбираю свой апплет на карте A, он успешно возвращает0x0001
, а когда я выбираю тот же апплет на второй карте и использую тот же считыватель, передача завершается неудачно. Поэтому я думаю, что иногда это также связано с картой. т.е. все сбои при использовании SW=0x0001 связаны не только со считывателем. Правильно? - person TheGoodUser   schedule 07.04.2015unsupported String type constant.
и это:unsupported parameter type String of invoked method <init>(java.lang.String) of class java.lang.Error.
. Eclipse предлагает мне добавить приведение к «байту». @vojta С твоей версией я получаю это:unsupported int type constant.
. - person bp14   schedule 07.04.2015KeyPair(KeyPair.ALG_RSA, KeyBuilder.LENGTH_RSA_512)
, и это сработало, поэтому похоже, что карта не поддерживает ECDSA. - person bp14   schedule 07.04.2015new KeyPair(KeyPair.ALG_EC_F2M , KeyBuilder.LENGTH_EC_F2M_113)
, и код ошибки снова 9C03. - person bp14   schedule 08.04.2015ISOException.throwIt((short) ((short) (0x9C00) | reason))
- person bp14   schedule 11.04.2015