package eu.europa.esig.dss.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import eu.europa.esig.dss.DigestAlgorithm; import eu.europa.esig.dss.FileDocument; import eu.europa.esig.dss.SignatureAlgorithm; import eu.europa.esig.dss.SignatureValue; import eu.europa.esig.dss.ToBeSigned; import eu.europa.esig.dss.test.gen.CertificateService; import eu.europa.esig.dss.test.mock.MockPrivateKeyEntry; import eu.europa.esig.dss.utils.Utils; @Ignore("Only performance/support check. No need to be executed all the time") public class SignatureTest { private CertificateService service = new CertificateService(); private static FileDocument dssDocument; private static Map<DigestAlgorithm, ToBeSigned> toBeSignedsByDigest; @BeforeClass public static void init() throws Exception { File original = new File("target/large-file.bin"); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(original)); byte[] data = new byte[1024]; for (int i = 0; i < 1024 * 1024; i++) { out.write(data); } out.close(); dssDocument = new FileDocument(original); toBeSignedsByDigest = new HashMap<DigestAlgorithm, ToBeSigned>(); } /* RSA */ @Test public void testRSASHA1() throws Exception { MockPrivateKeyEntry privateKeyEntry = service.generateCertificateChain(SignatureAlgorithm.RSA_SHA1); signRSAwithAllDigestAlgos(privateKeyEntry); } @Test public void testRSASHA224() throws Exception { MockPrivateKeyEntry privateKeyEntry = service.generateCertificateChain(SignatureAlgorithm.RSA_SHA224); signRSAwithAllDigestAlgos(privateKeyEntry); } @Test public void testRSASHA256() throws Exception { MockPrivateKeyEntry privateKeyEntry = service.generateCertificateChain(SignatureAlgorithm.RSA_SHA256); signRSAwithAllDigestAlgos(privateKeyEntry); } @Test public void testRSASHA384() throws Exception { MockPrivateKeyEntry privateKeyEntry = service.generateCertificateChain(SignatureAlgorithm.RSA_SHA384); signRSAwithAllDigestAlgos(privateKeyEntry); } @Test public void testRSASHA512() throws Exception { MockPrivateKeyEntry privateKeyEntry = service.generateCertificateChain(SignatureAlgorithm.RSA_SHA512); signRSAwithAllDigestAlgos(privateKeyEntry); } private void signRSAwithAllDigestAlgos(MockPrivateKeyEntry privateKeyEntry) { testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.SHA1); testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.SHA224); testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.SHA256); testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.SHA384); testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.SHA512); testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.RIPEMD160); // testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.MD2); not supported testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.MD5); } /* DSA */ @Test public void testDSASHA1() throws Exception { MockPrivateKeyEntry privateKeyEntry = service.generateCertificateChain(SignatureAlgorithm.DSA_SHA1); signDSAwithAllDigestAlgos(privateKeyEntry); } @Test public void testDSASHA256() throws Exception { MockPrivateKeyEntry privateKeyEntry = service.generateCertificateChain(SignatureAlgorithm.DSA_SHA256); signDSAwithAllDigestAlgos(privateKeyEntry); } private void signDSAwithAllDigestAlgos(MockPrivateKeyEntry privateKeyEntry) { testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.SHA1); testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.SHA256); } /* ECDSA */ @Test public void testECDSASHA1() throws Exception { MockPrivateKeyEntry privateKeyEntry = service.generateCertificateChain(SignatureAlgorithm.ECDSA_SHA1); signECDSAwithAllDigestAlgos(privateKeyEntry); } @Test public void testECDSASHA224() throws Exception { MockPrivateKeyEntry privateKeyEntry = service.generateCertificateChain(SignatureAlgorithm.ECDSA_SHA224); signECDSAwithAllDigestAlgos(privateKeyEntry); } @Test public void testECDSASHA256() throws Exception { MockPrivateKeyEntry privateKeyEntry = service.generateCertificateChain(SignatureAlgorithm.ECDSA_SHA256); signECDSAwithAllDigestAlgos(privateKeyEntry); } @Test public void testECDSASHA384() throws Exception { MockPrivateKeyEntry privateKeyEntry = service.generateCertificateChain(SignatureAlgorithm.ECDSA_SHA384); signECDSAwithAllDigestAlgos(privateKeyEntry); } @Test public void testECDSASHA512() throws Exception { MockPrivateKeyEntry privateKeyEntry = service.generateCertificateChain(SignatureAlgorithm.ECDSA_SHA512); signECDSAwithAllDigestAlgos(privateKeyEntry); } private void signECDSAwithAllDigestAlgos(MockPrivateKeyEntry privateKeyEntry) { testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.SHA1); testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.SHA224); testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.SHA256); testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.SHA384); testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.SHA512); testWithDigestAlgo(privateKeyEntry, DigestAlgorithm.RIPEMD160); } private void testWithDigestAlgo(MockPrivateKeyEntry privateKeyEntry, DigestAlgorithm digest) { ToBeSigned dataToSign = getToBeSigned(digest); SignatureAlgorithm sigAlgo = SignatureAlgorithm.getAlgorithm(privateKeyEntry.getEncryptionAlgorithm(), digest); SignatureValue signatureValue = TestUtils.sign(sigAlgo, privateKeyEntry, dataToSign); assertNotNull(signatureValue); assertTrue(Utils.isArrayNotEmpty(signatureValue.getValue())); assertEquals(sigAlgo, signatureValue.getAlgorithm()); } private ToBeSigned getToBeSigned(DigestAlgorithm digest) { if (toBeSignedsByDigest.containsKey(digest)) { return toBeSignedsByDigest.get(digest); } else { ToBeSigned dataToSign = new ToBeSigned(Utils.fromBase64(dssDocument.getDigest(digest))); toBeSignedsByDigest.put(digest, dataToSign); return dataToSign; } } }