【发布时间】:2012-12-05 11:06:18
【问题描述】:
我有使用 BouncyCastle 的 SHA1withECDSA 算法签名的自签名证书。 在 BC 下,我可以轻松验证它,但是当我在 JavaCard 上进行验证时,它每次都会向我发送错误消息(来自 NIST 的曲线 secp192r1)。证书持有普通签名(非 X9.62 意味着只有 r+s 没有任何 TAG)。
有我的代码来验证它(将值设置为常量 - 当然用于测试)。
字节[] certdata = {...}
Signature signature = Signature.getInstance(Signature.ALG_ECDSA_SHA, false);
ECPublicKey ecpk = (ECPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PUBLIC, KeyBuilder.LENGTH_EC_FP_192, true);
ecpk.setA(new byte[]{...}, (short)0, (short)0x0018);
ecpk.setB(new byte[]{...}, (short)0, (short)0x0018);
ecpk.setG(new byte[]{...}, (short)0, (short)0x0031);
//Point format: uncompressed tag(0x04), x, y
ecpk.setK((short)0x0001);
ecpk.setR(new byte[]{}, (short)0, (short)0x0018);
ecpk.setW(new byte[]{}, (short)0, (short)0x31);
ecpk.setFieldFP(new byte[]{}, (short)0, (short)0x0018);
signature.init(ecpk, Signature.MODE_VERIFY);
boolean result = signature.verify(certdata, (short)0, (short)certdata.length, signtab, (short)0, (short)signtab.length);
if(result) ISOException.throwIt((short)0x0001);
else ISOException.throwIt((short)0x0002);
}
'...' 代替字节以获得清晰的视图(192 位曲线可能会造成很大的混乱)。
关于pastebin的标签说明证书:
感谢您的帮助
sevar
编辑: 新测试: 所有测试都基于相同的数据(PublicKey、PrivateKey、要签名的消息) 符号是随机的,所以我将使用 2 个符号(signT - 终端 (BC) 生成的符号,signC - 芯片生成的符号)
signT 无法在 CHIP 上验证,但可以在终端上验证。 signC 在芯片和终端上验证
所以我检查了 API 之间的交叉
指向 BC 的交叉关系运行良好
指向 CHIP 的交叉关系不起作用
生成的一对密钥很好,因为当我将 BC 生成的 PrivateKey 和 PublicKey 放入 CHIP 时,CHIP 上生成的签名可以被 CHIP 验证。
- KeyPair 生成良好
我不知道我现在应该检查什么。问题可能与在 ECDSA 步骤 e = SHA1(Message) 中填充数组有关。哈希后数组发生了什么(哈希比曲线短,卡片需要在复制前声明数组的大小)
【问题讨论】:
-
这个sevar你过得怎么样?如果您为 cmets/answers 等提供反馈,那就太好了。