Я пытаюсь внедрить ECDSA в JavaCard (Eclipse 4.4.2, JC 2.2.1). Моя карта Gemalto IDCore 3010, или, по крайней мере, она должна быть (после проверки кода ATR, похоже, что это WM GX4 72 DHS TSA ...).Получить причину CryptoException в JavaCard
Во всяком случае, если я не окружаю objECDSAKeyPair = новый KeyPair (KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_192) линии с попытаться поймать я получаю неизвестную ошибку (send_APDU() возвращает ошибку 0x80206F00 (Неизвестно ISO7816: 0x6F00)), но когда я его окружаю, он не возвращает ошибку (send_APDU() возвращает 0x80209000 (9000: Успех. Ошибка.)). Однако он должен перейти в блок catch, потому что остальные три строки в блоке try не выполняются.
Как я могу визуализировать сообщение об ошибке? Если я иду с ISOException.throwIt (причина), я получаю Ошибка связи с интеллектуальной картой. Повторите попытку. несколько раз.
this В потоке он предлагает байт причина = 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()'? Он возвращает какую-либо ошибку? когда? в процессе установки? или во время выполнения? – Abraham
Причина - это число от 0 до 5. Это может ввести в заблуждение для читателя, если ваша карта возвращает 0x0001 в качестве слова состояния, например. Попробуйте бросить ISOException.throwIt ((короткий) (0x9C00 + причина)). – vojta
В моем предыдущем комментарии должно быть «от 1 до 5», извините. – vojta