// Verify signature protection
AlgorithmIdentifier algId = msg.getMessage().getProtectedPart().getHeader().getProtectionAlg();
String oid = algId.getObjectId().getId();
assertEquals(PKCSObjectIdentifiers.sha1WithRSAEncryption.getId(), oid);
// Check that this is an old message, created before ECA-2104, using null instead of DERNull as algorithm parameters.
DEREncodable pp = algId.getParameters();
assertNull(pp);
// Try to verify, it should work good even though the small bug in ECA-2104, since we don't use algorithm parameters for RSA-PKCS signatures
PublicKey pubKey = msg.getRequestPublicKey();
assertTrue(CmpMessageHelper.verifyCertBasedPKIProtection(msg.getMessage(), pubKey));
// Verify that our verification routine does not give positive result for any other keys
KeyPair keys = KeyTools.genKeys("512", "RSA");
assertFalse(CmpMessageHelper.verifyCertBasedPKIProtection(msg.getMessage(), keys.getPublic()));
}
// Re-protect the message, now fixed by ECA-2104
{
ASN1InputStream in = new ASN1InputStream(novosecsigpopir);
DERObject derObject = in.readObject();
PKIMessage myPKIMessage = PKIMessage.getInstance(derObject);
KeyPair keys = KeyTools.genKeys("512", "RSA");
X509Certificate signCert = CertTools.genSelfCert("CN=CMP Sign Test", 3650, null, keys.getPrivate(), keys.getPublic(), "SHA1WithRSA", false);
// Re-sign the message
byte[] newmsg = CmpMessageHelper.signPKIMessage(myPKIMessage, signCert, keys.getPrivate(), CMSSignedGenerator.DIGEST_SHA1, "BC");
in = new ASN1InputStream(newmsg);
derObject = in.readObject();
PKIMessage pkimsg = PKIMessage.getInstance(derObject);
// We have to do this twice, because Novosec caches ProtectedBytes in the PKIMessage object, so we need to
// encode it and re-decode it again to get the changes from ECA-2104 encoded correctly.
// Not needed when simply signing a new message that you create, only when re-signing
newmsg = CmpMessageHelper.signPKIMessage(pkimsg, signCert, keys.getPrivate(), CMSSignedGenerator.DIGEST_SHA1, "BC");
in = new ASN1InputStream(newmsg);
derObject = in.readObject();
pkimsg = PKIMessage.getInstance(derObject);
AlgorithmIdentifier algId = pkimsg.getProtectedPart().getHeader().getProtectionAlg();
String oid = algId.getObjectId().getId();
assertEquals(PKCSObjectIdentifiers.sha1WithRSAEncryption.getId(), oid);
// Check that we have DERNull and not plain java null as algorithm parameters.
DEREncodable pp = algId.getParameters();
assertNotNull(pp);
assertEquals(DERNull.class.getName(), pp.getClass().getName());
// Try to verify, also verify at the same time that encoding decoding of the signature works
assertTrue(CmpMessageHelper.verifyCertBasedPKIProtection(pkimsg, keys.getPublic()));
// Verify that our verification routine does not give positive result for any other keys
CrmfRequestMessage msg = new CrmfRequestMessage(pkimsg, "CN=AdminCA1", false, "CN");
assertTrue(msg.verify());