验证Java Card签名

时间:2018-01-30 15:49:42

标签: c# javacard signing elliptic-curve

我正在NXP J3D081卡上编写Java Card 3.0.2应用程序。我有使用ALG_ECDSA_SHA_256签名和验证签名。我的测试应用程序已将密钥写入卡中。如果我签署了32个字节的数据并将签名传回卡,则验证代码会成功验证签名。如果我使用私钥在Bouncy Castle中签署32个字节并传递给卡上的验证,则它会成功验证签名。充气城堡验证码成功验证了从充气城堡签署程序中创建的签名。

但是如果我从Java卡中取回返回的签名并将其传递给C#bouncy城​​堡代码,则FAILS将验证签名。我检查了所有输入值,它们是正确的。我的代码在这里(注意我将公钥传递为64字节,并在其前面加上0x04)

public bool HashAndVerifyDSA(byte[] pb, byte[] inData, byte[] sig)
{
    byte[] pub = new byte[65];
    pub[0] = 0x4;
    Array.Copy(pb, 0, pub, 1, 64);
    ECCurve curve = parameters.Curve;
    ECPoint q = curve.DecodePoint(pub);
    ICipherParameters Public = new ECPublicKeyParameters(algorithm, q, parameters);
    ISigner bSigner = SignerUtilities.GetSigner("SHA-256withECDSA");

    bSigner.Init(false, Public);
    bSigner.BlockUpdate(inData, 0, inData.Length);
    return (bSigner.VerifySignature(sig));
}

我应该注意,这些参数指定了P-256曲线,并且在与卡的加密通信中成功使用。公钥已成功创建。

现在我的头发似乎比两天前少了。任何指针都会受到欢迎。

1 个答案:

答案 0 :(得分:0)

除了您为调试事物而执行的步骤外,您还可以检查以下内容: -

  1. 使用在线可用工具验证签名。不要忘记使用从javacard生成的相同曲线参数和公钥。
  2. 使用bouncy castle java library验证相同。我在其中一个工具中执行了相同的步骤,并且成功匹配。