Я должен подтвердить сертификат. Я не специалист по криптографии, поэтому, вероятно, я сделал что-то (или все :)) неправильно.
Когда код достигает последнего шага (boolean b = sig.verify(CertSign);
), он генерирует исключение: java.security.SignatureException: ошибка при декодировании байтов подписи .
Может ли кто-нибудь помочь мне понять, что я делаю неправильно?
Ниже приведен тестовый код, показывающий проблему:
private void test() {
byte [] CertBody = new byte[]{(byte)0x7F,(byte)0x4E,(byte)0x81,(byte)0x82,
(byte)0x5F,(byte)0x29,(byte)0x01,(byte)0x00,
(byte)0x42,(byte)0x08,(byte)0xFB,(byte)0x55,
(byte)0x54,(byte)0x4F,(byte)0x02,(byte)0xFF,
(byte)0xFF,(byte)0x01,(byte)0x5F,(byte)0x4C,
(byte)0x07,(byte)0xFF,(byte)0x53,(byte)0x4D,
(byte)0x52,(byte)0x44,(byte)0x54,(byte)0x02,
(byte)0x7F,(byte)0x49,(byte)0x4E,(byte)0x06,
(byte)0x09,(byte)0x2B,(byte)0x24,(byte)0x03,
(byte)0x03,(byte)0x02,(byte)0x08,(byte)0x01,
(byte)0x01,(byte)0x07,(byte)0x86,(byte)0x41,
(byte)0x04,(byte)0x6C,(byte)0x17,(byte)0x5B,
(byte)0xB9,(byte)0xEF,(byte)0x5D,(byte)0x02,
(byte)0x20,(byte)0x51,(byte)0xCC,(byte)0xB2,
(byte)0x89,(byte)0x09,(byte)0x42,(byte)0x15,
(byte)0x85,(byte)0xD3,(byte)0x1A,(byte)0xCD,
(byte)0xA7,(byte)0x1B,(byte)0x08,(byte)0x4A,
(byte)0x48,(byte)0x8F,(byte)0x7B,(byte)0x77,
(byte)0x5B,(byte)0x57,(byte)0x9B,(byte)0xB7,
(byte)0x41,(byte)0x3B,(byte)0xDA,(byte)0x4C,
(byte)0xDE,(byte)0x70,(byte)0x11,(byte)0x17,
(byte)0xE0,(byte)0xD9,(byte)0xD1,(byte)0x0F,
(byte)0x74,(byte)0xD6,(byte)0x25,(byte)0xB2,
(byte)0x86,(byte)0xCA,(byte)0x04,(byte)0x64,
(byte)0x54,(byte)0x4F,(byte)0x1B,(byte)0x53,
(byte)0xF3,(byte)0x24,(byte)0x02,(byte)0xD3,
(byte)0xB3,(byte)0x74,(byte)0xEF,(byte)0xA6,
(byte)0xC7,(byte)0x5F,(byte)0x20,(byte)0x08,
(byte)0xEA,(byte)0xF4,(byte)0xBE,(byte)0xCC,
(byte)0x03,(byte)0x18,(byte)0x02,(byte)0xA3,
(byte)0x5F,(byte)0x25,(byte)0x04,(byte)0x5A,
(byte)0xAF,(byte)0xA9,(byte)0xDF,(byte)0x5F,
(byte)0x24,(byte)0x04,(byte)0x5C,(byte)0x90,
(byte)0xDD,(byte)0x5F};
byte [] CertSign = new byte[]{(byte)0x3D,(byte)0x61,(byte)0x23,
(byte)0xBE,(byte)0x6C,(byte)0x0B,
(byte)0xC1,(byte)0x3E,(byte)0x7A,
(byte)0x2D,(byte)0x60,(byte)0x3D,
(byte)0x28,(byte)0xF0,(byte)0x29,
(byte)0xCC,(byte)0x8C,(byte)0x55,
(byte)0xF1,(byte)0x9A,(byte)0x5C,
(byte)0x7E,(byte)0xBE,(byte)0xFD,
(byte)0x43,(byte)0x27,(byte)0x1A,
(byte)0x9D,(byte)0xA1,(byte)0x7C,
(byte)0x81,(byte)0x09,(byte)0x5C,
(byte)0x1D,(byte)0x26,(byte)0x27,
(byte)0x76,(byte)0x73,(byte)0x74,
(byte)0x87,(byte)0xF9,(byte)0x6C,
(byte)0x2A,(byte)0xC9,(byte)0xA3,
(byte)0x32,(byte)0x3C,(byte)0x60,
(byte)0x51,(byte)0x71,(byte)0x6D,
(byte)0x2F,(byte)0xC0,(byte)0xF6,
(byte)0x89,(byte)0x14,(byte)0x93,
(byte)0xB2,(byte)0xB6,(byte)0x87,
(byte)0x21,(byte)0xAF,(byte)0x01,
(byte)0x42};
String Algorithm = "brainpoolP256r1";
byte [] PublicPoint = new byte[]{(byte)0x04,(byte)0x68,(byte)0xF8,
(byte)0xD6,(byte)0xB3,(byte)0x94,
(byte)0xD2,(byte)0x8E,(byte)0x2B,
(byte)0x4D,(byte)0xFA,(byte)0x36,
(byte)0x52,(byte)0xAE,(byte)0xAC,
(byte)0xDA,(byte)0xD3,(byte)0x19,
(byte)0x21,(byte)0xC2,(byte)0x12,
(byte)0x8D,(byte)0x58,(byte)0x9F,
(byte)0x4E,(byte)0xF1,(byte)0xB1,
(byte)0xC4,(byte)0x10,(byte)0x97,
(byte)0x29,(byte)0xDC,(byte)0xA8,
(byte)0xA1,(byte)0xC9,(byte)0x53,
(byte)0x04,(byte)0xC8,(byte)0x77,
(byte)0x4F,(byte)0x57,(byte)0xFA,
(byte)0xFB,(byte)0x15,(byte)0x59,
(byte)0xB9,(byte)0x2F,(byte)0x72,
(byte)0x6A,(byte)0xE4,(byte)0x22,
(byte)0x64,(byte)0x3E,(byte)0x1B,
(byte)0x11,(byte)0x8D,(byte)0x69,
(byte)0xAC,(byte)0x36,(byte)0x25,
(byte)0xAD,(byte)0x1C,(byte)0x30,
(byte)0x04,(byte)0xA9};
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
Security.addProvider(new BouncyCastleProvider());
}
ECNamedCurveParameterSpec params1 = ECNamedCurveTable.getParameterSpec(Algorithm);
try {
KeyFactory fact = KeyFactory.getInstance("ECDSA", "BC");
ECCurve curve = params1.getCurve();
java.security.spec.EllipticCurve ellipticCurve = EC5Util.convertCurve(curve, params1.getSeed());
java.security.spec.ECPoint point=ECPointUtil.decodePoint(ellipticCurve, PublicPoint);
java.security.spec.ECParameterSpec params2=EC5Util.convertSpec(ellipticCurve, params1);
java.security.spec.ECPublicKeySpec keySpec = new java.security.spec.ECPublicKeySpec(point,params2);
ECPublicKey PK = (ECPublicKey)fact.generatePublic(keySpec);
Signature sig;
sig = Signature.getInstance("ECDSA", "BC");
sig.initVerify(PK);
sig.update(CertBody);
boolean b = sig.verify(CertSign);
if (b)
{
Logger.getLogger(CardManager.class.getName()).log(Level.INFO, "verificato");
}
} catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidKeySpecException | InvalidKeyException | SignatureException ex) {
Logger.getLogger("test").log(Level.SEVERE, null, ex);
}
}
Я ожидал, что b равно true (или false), но вместо этого я получаю следующее исключение:
_java.security.SignatureException: error decoding signature bytes.
at org.bouncycastle.jcajce.provider.asymmetric.util.DSABase.engineVerify(DSABase.java:80)
at java.security.Signature$Delegate.engineVerify(Signature.java:1223)
at java.security.Signature.verify(Signature.java:656)_