【问题标题】:Verify SHA1withECDSA signature on javacard验证 javacard 上的 SHA1withECDSA 签名
【发布时间】: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的标签说明证书:

http://pastebin.com/gvqYzm2g

感谢您的帮助

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 等提供反馈,那就太好了。

标签: signature javacard


【解决方案1】:

使用 Prime192v1 从 Bouncy Castle 到 JavaCard 对 ECDSAwithSHA-1 进行签名和验证对我来说效果很好。

您的问题可能是签名本身的格式。

签名是 DER 编码结构,它是两个整数(标签 0x02)的序列(标签 0x30)。在 JavaCard 中,总是需要 56 个字节:两个长度为 25 的坐标加上 6 个字节的 DER 标头。 JavaCard 总是期望每个坐标中有前导零。但是,BC 生成的签名通常在坐标中没有前导零,因此签名可以短于 56 字节,这就是 JavaCard 混淆的原因。

相反的方向总是可以的,因为 BC 可以处理前导零,尽管它在创建签名时不会添加它们。

您应该做什么:用您自己的代码封装 BC 签名机制,并始终在您的 BC 签名中的坐标中添加前导零。如果这样做,您将能够在 BC 和 JavaCard 中验证签名。

我想发布我的代码,但不幸的是它是商业安全项目的一部分...

【讨论】:

    【解决方案2】:

    我在使用 BouncyCastle 验证 ECDSA 签名(在 JavaCard 192r1 上生成)时遇到问题,我找到了解决方案。希望对你有用

    Verify javacard signature ALG_ECDSA_SHA on bouncy castle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 2021-06-19
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多