Smartcard 获取JavaCard中CryptoException的原因
我试图在JavaCard(Eclipse4.4.2,JC2.2.1)中实现ECDSA。我的卡是Gemalto IDCore 3010,或者至少应该是(在检查ATR代码后,它看起来像是WM GX4 72 DHS TSA…) 无论如何,如果我没有用try-and-catch环绕objECDSAKeyPair=newkeypair(KeyPair.ALG_-EC_-FP,KeyBuilder.LENGTH_-EC_-FP_-192)行,我会得到一个未知错误(send_-APDU()返回0x80206F00(未知ISO7816错误:0x6F00)),但当我环绕它时,它不会返回任何错误(send_-APDU()返回0x80209000(9000:Success.no error.))。但是,它必须转到catch块,因为try块中的其他三行没有执行 如何可视化错误消息?如果使用ISOException.throwIt(原因),智能卡会出现通信错误。请再试一次。多次 在线程中,它建议使用byte reason=c.getReason()代码,但即使我将右侧转换为byte,它也不会工作 谢谢大家! 这是我代码的相关部分Smartcard 获取JavaCard中CryptoException的原因,smartcard,javacard,ecdsa,Smartcard,Javacard,Ecdsa,我试图在JavaCard(Eclipse4.4.2,JC2.2.1)中实现ECDSA。我的卡是Gemalto IDCore 3010,或者至少应该是(在检查ATR代码后,它看起来像是WM GX4 72 DHS TSA…) 无论如何,如果我没有用try-and-catch环绕objECDSAKeyPair=newkeypair(KeyPair.ALG_-EC_-FP,KeyBuilder.LENGTH_-EC_-FP_-192)行,我会得到一个未知错误(send_-APDU()返回0x80206F
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;
}
}
您的问题可能有两个原因:
ISOException.throwIt((short) ((short) (0x9C00) | reason));
而不是
ISOException.throwIt(reason);
KeyPair keyPair = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_192);
ECPrivateKey privKey = (ECPrivateKey) keyPair.getPrivate();
ECPublicKey pubKey = (ECPublicKey) keyPair.getPublic();
initDomainParams(pubKey);
initDomainParams(privKey);
keyPair.genKeyPair();
在哪里
使用您为签名选择的椭圆曲线的F
,A
,B
,G
,R
参数。请参见此处的推荐曲线列表:使用
byte reason=c.getReason()时会发生什么情况?它是否返回任何错误?什么时候在安装过程中?或者在运行时?原因是一个介于0和5之间的数字。例如,如果您的卡返回0x0001作为状态字,则读卡器可能会感到困惑。请尝试抛出ISOException.throwIt((短)(0x9C00+reason))。在我之前的评论中应该有“介于1和5之间”,对不起。@TheGoodUser是的,你是对的。我只是想说,在标准(ISO,ETSI)中提到的时间间隔之外使用状态词是不明智的,因为它会导致一些依赖于读卡器(我的经验)和卡片(你的经验)的神秘错误。@bp14抱歉,这应该有效:ISOException.throwIt((短)((短)(0x9C00)|原因))
private void initDomainParams(ECKey key) {
key.setFieldFP(F, (short)0, (short)F.length);
key.setA(A, (short)0, (short)A.length);
key.setB(B, (short)0, (short)B.length);
key.setG(G, (short)0, (short)G.length);
key.setR(R, (short)0, (short)R.length);
}