最后一段时间,我一直在尝试构建一个Java库来解释和验证NZ新冠肺炎通行证。在签名验证(这个过程中一个稍微重要的部分(之前,我已经有了更好或更坏的代码。这里提供了完整的代码,但仍然相当粗糙。
验证器本身在这里可用,还有一个配套的测试。新冠肺炎通行证的技术规范在这里。至少有一个相关部分。
在与另一位开发人员合作后,我想我已经确定要解释所提供的公钥。下面的代码(已删除调试输出(。公钥详细信息来自这里
private PublicKey extractPublicKey(PublicKeysDetails publicKeyDetails) throws NoSuchAlgorithmException, InvalidParameterSpecException, InvalidKeySpecException {
byte[] xBytes = Base64.getDecoder().decode(publicKeyDetails.x().replace('-', '+').replace('_', '/'));
byte[] yBytes = Base64.getDecoder().decode(publicKeyDetails.y().replace('-', '+').replace('_', '/'));
BigInteger x = new BigInteger(xBytes);
BigInteger y = new BigInteger(yBytes);
ECPoint ecPoint = new ECPoint(x, y);
ECGenParameterSpec parameterSpec = new ECGenParameterSpec("secp256r1");//publicKeyDetails.crv() Should always come from the endpoint as "P-256", java wants to know exactly secp256r1, or NIST P-256
AlgorithmParameters parameters = AlgorithmParameters.getInstance("EC");//publicKeyDetails.kty() Should always come from the endpoint as "EC"
parameters.init(parameterSpec);
ECParameterSpec ecParameters = parameters.getParameterSpec(ECParameterSpec.class);
ECPublicKeySpec pubSpec = new ECPublicKeySpec(ecPoint, ecParameters);
KeyFactory kf = KeyFactory.getInstance("EC");
return kf.generatePublic(pubSpec);
}
这个错误可能存在于该文件的其他地方,但我现在很不清楚它可能是什么
请帮我堆叠溢出你我唯一的希望?
连续几天的回答我的问题特别是将字节处理成大整数。
BigInteger x = new BigInteger(xBytes);
BigInteger y = new BigInteger(yBytes);
应该是
BigInteger x = new BigInteger(1, xBytes);
BigInteger y = new BigInteger(1, yBytes);
也就是说这个数字应该是正数。