我正在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曲线,并且在与卡的加密通信中成功使用。公钥已成功创建。
现在我的头发似乎比两天前少了。任何指针都会受到欢迎。
答案 0 :(得分:0)
除了您为调试事物而执行的步骤外,您还可以检查以下内容: -