生成ECC密钥对时获取CryptoException.ILLEGAL_VALUE
Get CryptoException.ILLEGAL_VALUE when generating ECC key pair
我使用 JCOP 卡生成 ECC 密钥对。我可以创建 ECPrivateKey
、ECPublicKey
、KeyPair
w/o 任何问题,但它会在 genKeyPair()
时抛出异常 CryptoException.ILLEGAL_VALUE
。我的卡或操作有什么问题?我不知道。你能告诉我我在哪里犯了错误吗?非常感谢!
顺便说一句,我发现JCAlgTest也遇到了同样的问题,请查看测试报告here。
这是我的代码。
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte[] buf = apdu.getBuffer();
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0x00:
JCSystem.requestObjectDeletion();
break;
case (byte)0x01:
ecPubKey = (ECPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PUBLIC, KeyBuilder.LENGTH_EC_FP_160, false);
ecPriKey = (ECPrivateKey) KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PRIVATE, KeyBuilder.LENGTH_EC_FP_160, false);
break;
case (byte) 0x02:
kp = new KeyPair(ecPubKey, ecPriKey);
break;
case (byte) 0x03:
try {
kp.genKeyPair();
} catch (CryptoException e) {
short reason = e.getReason();
apdu.setOutgoing();
apdu.setOutgoingLength((short) 2);
Util.setShort(buf, (short) 0, reason);
apdu.sendBytes((short) 0, (short) 2);
ISOException.throwIt((short) 0x6F00);
}
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
你需要设置ECC域参数,否则它不知道使用哪个(而且让一张卡承载所有已知的命名曲线有点棘手,space很珍贵) .您至少需要为 public 密钥设置它们,并且 - 如果是 NXP 卡 - 可能还需要为私钥设置它们。
我使用 JCOP 卡生成 ECC 密钥对。我可以创建 ECPrivateKey
、ECPublicKey
、KeyPair
w/o 任何问题,但它会在 genKeyPair()
时抛出异常 CryptoException.ILLEGAL_VALUE
。我的卡或操作有什么问题?我不知道。你能告诉我我在哪里犯了错误吗?非常感谢!
顺便说一句,我发现JCAlgTest也遇到了同样的问题,请查看测试报告here。
这是我的代码。
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte[] buf = apdu.getBuffer();
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0x00:
JCSystem.requestObjectDeletion();
break;
case (byte)0x01:
ecPubKey = (ECPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PUBLIC, KeyBuilder.LENGTH_EC_FP_160, false);
ecPriKey = (ECPrivateKey) KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PRIVATE, KeyBuilder.LENGTH_EC_FP_160, false);
break;
case (byte) 0x02:
kp = new KeyPair(ecPubKey, ecPriKey);
break;
case (byte) 0x03:
try {
kp.genKeyPair();
} catch (CryptoException e) {
short reason = e.getReason();
apdu.setOutgoing();
apdu.setOutgoingLength((short) 2);
Util.setShort(buf, (short) 0, reason);
apdu.sendBytes((short) 0, (short) 2);
ISOException.throwIt((short) 0x6F00);
}
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
你需要设置ECC域参数,否则它不知道使用哪个(而且让一张卡承载所有已知的命名曲线有点棘手,space很珍贵) .您至少需要为 public 密钥设置它们,并且 - 如果是 NXP 卡 - 可能还需要为私钥设置它们。