package org.bouncycastle.jce.provider.test; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.SecureRandom; import java.security.Security; import java.security.Signature; import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec; import org.bouncycastle.jce.spec.GOST3410ParameterSpec; import org.bouncycastle.util.encoders.Hex; import org.bouncycastle.util.test.SimpleTest; public class SignatureTest extends SimpleTest { private static final byte[] DATA = Hex.decode("00000000deadbeefbeefdeadffffffff00000000"); private void checkSig(KeyPair kp, String name) throws Exception { Signature sig = Signature.getInstance(name, "BC"); sig.initSign(kp.getPrivate()); sig.update(DATA); byte[] signature1 = sig.sign(); sig.update(DATA); byte[] signature2 = sig.sign(); sig.initVerify(kp.getPublic()); sig.update(DATA); if (!sig.verify(signature1)) { fail("did not verify: " + name); } // After verify, should be reusable as if we are after initVerify sig.update(DATA); if (!sig.verify(signature1)) { fail("second verify failed: " + name); } sig.update(DATA); if (!sig.verify(signature2)) { fail("second verify failed (2): " + name); } } public void performTest() throws Exception { KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", "BC"); kpGen.initialize(2048); KeyPair kp = kpGen.generateKeyPair(); checkSig(kp, "SHA1withRSA"); checkSig(kp, "SHA224withRSA"); checkSig(kp, "SHA256withRSA"); checkSig(kp, "SHA384withRSA"); checkSig(kp, "SHA512withRSA"); checkSig(kp, "SHA3-224withRSA"); checkSig(kp, "SHA3-256withRSA"); checkSig(kp, "SHA3-384withRSA"); checkSig(kp, "SHA3-512withRSA"); checkSig(kp, "MD2withRSA"); checkSig(kp, "MD4withRSA"); checkSig(kp, "MD5withRSA"); checkSig(kp, "RIPEMD160withRSA"); checkSig(kp, "RIPEMD128withRSA"); checkSig(kp, "RIPEMD256withRSA"); checkSig(kp, "SHA1withRSAandMGF1"); checkSig(kp, "SHA1withRSAandMGF1"); checkSig(kp, "SHA224withRSAandMGF1"); checkSig(kp, "SHA256withRSAandMGF1"); checkSig(kp, "SHA384withRSAandMGF1"); checkSig(kp, "SHA512withRSAandMGF1"); checkSig(kp, "SHA1withRSA/ISO9796-2"); checkSig(kp, "MD5withRSA/ISO9796-2"); checkSig(kp, "RIPEMD160withRSA/ISO9796-2"); // checkSig(kp, "SHA1withRSA/ISO9796-2PSS"); // checkSig(kp, "MD5withRSA/ISO9796-2PSS"); // checkSig(kp, "RIPEMD160withRSA/ISO9796-2PSS"); checkSig(kp, "RIPEMD128withRSA/X9.31"); checkSig(kp, "RIPEMD160withRSA/X9.31"); checkSig(kp, "SHA1withRSA/X9.31"); checkSig(kp, "SHA224withRSA/X9.31"); checkSig(kp, "SHA256withRSA/X9.31"); checkSig(kp, "SHA384withRSA/X9.31"); checkSig(kp, "SHA512withRSA/X9.31"); checkSig(kp, "WhirlpoolwithRSA/X9.31"); kpGen = KeyPairGenerator.getInstance("DSA", "BC"); kpGen.initialize(2048); kp = kpGen.generateKeyPair(); checkSig(kp, "SHA1withDSA"); checkSig(kp, "SHA224withDSA"); checkSig(kp, "SHA256withDSA"); checkSig(kp, "SHA384withDSA"); checkSig(kp, "SHA512withDSA"); checkSig(kp, "NONEwithDSA"); kpGen = KeyPairGenerator.getInstance("EC", "BC"); kpGen.initialize(256); kp = kpGen.generateKeyPair(); checkSig(kp, "SHA1withECDSA"); checkSig(kp, "SHA224withECDSA"); checkSig(kp, "SHA256withECDSA"); checkSig(kp, "SHA384withECDSA"); checkSig(kp, "SHA512withECDSA"); checkSig(kp, "RIPEMD160withECDSA"); kpGen = KeyPairGenerator.getInstance("EC", "BC"); kpGen.initialize(521); kp = kpGen.generateKeyPair(); checkSig(kp, "SHA1withECNR"); checkSig(kp, "SHA224withECNR"); checkSig(kp, "SHA256withECNR"); checkSig(kp, "SHA384withECNR"); checkSig(kp, "SHA512withECNR"); kpGen = KeyPairGenerator.getInstance("ECGOST3410", "BC"); kpGen.initialize(new ECNamedCurveGenParameterSpec("GostR3410-2001-CryptoPro-A"), new SecureRandom()); kp = kpGen.generateKeyPair(); checkSig(kp, "GOST3411withECGOST3410"); kpGen = KeyPairGenerator.getInstance("GOST3410", "BC"); GOST3410ParameterSpec gost3410P = new GOST3410ParameterSpec(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_A.getId()); kpGen.initialize(gost3410P); kp = kpGen.generateKeyPair(); checkSig(kp, "GOST3411withGOST3410"); } public String getName() { return "SigNameTest"; } public static void main( String[] args) { Security.addProvider(new BouncyCastleProvider()); runTest(new SignatureTest()); } }