diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/testutils/X509CertificateTestUtils.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/testutils/X509CertificateTestUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..05efb297f6e9ec2672160c3f2fb9ee2f2a658f7a --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/testutils/X509CertificateTestUtils.java @@ -0,0 +1,86 @@ +package eu.europa.ec.edelivery.smp.testutils; + +import org.bouncycastle.asn1.x500.X500Name; +import org.bouncycastle.asn1.x509.*; +import org.bouncycastle.cert.X509v3CertificateBuilder; +import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; +import org.bouncycastle.operator.ContentSigner; +import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; + +import java.math.BigInteger; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +public class X509CertificateTestUtils { + + public static X509Certificate createX509CertificateForTest( String subject) throws Exception { + return createX509CertificateForTest("1234321", subject); + } + + public static X509Certificate createX509CertificateForTest(String serialNumber, String subject) throws Exception { + Calendar from = Calendar.getInstance(); + Calendar to = Calendar.getInstance(); + to.add(Calendar.DAY_OF_YEAR, 1); + from.add(Calendar.DAY_OF_YEAR, -1); + return createX509CertificateForTest(serialNumber, subject, subject, from.getTime(), to.getTime(), Collections.emptyList()); + } + + public static X509Certificate createX509CertificateForTest(String serialNumber, String issuer, String subject, Date startDate, Date expiryDate, List<String> distributionList) throws Exception { + + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(1024); + KeyPair key = keyGen.generateKeyPair(); + X509v3CertificateBuilder certBuilder = new X509v3CertificateBuilder(new X500Name(issuer), + new BigInteger(serialNumber, 16), startDate, expiryDate, new X500Name(subject), + SubjectPublicKeyInfo.getInstance(key.getPublic().getEncoded())); + if (!distributionList.isEmpty()) { + + List<DistributionPoint> distributionPoints = distributionList.stream().map(url -> { + DistributionPointName distPointOne = new DistributionPointName(new GeneralNames( + new GeneralName(GeneralName.uniformResourceIdentifier, url))); + + return new DistributionPoint(distPointOne, null, null); + }).collect(Collectors.toList()); + + certBuilder.addExtension(Extension.cRLDistributionPoints, false, new CRLDistPoint(distributionPoints.toArray(new DistributionPoint[]{}))); + } + + ContentSigner sigGen = new JcaContentSignerBuilder("SHA1WithRSAEncryption").setProvider("BC").build(key.getPrivate()); + return new JcaX509CertificateConverter().setProvider("BC").getCertificate(certBuilder.build(sigGen)); + } + + public static X509Certificate[] createCertificateChain(String[] subjects, Date startDate, Date expiryDate) throws Exception { + + String issuer = null; + PrivateKey issuerKey = null; + long iSerial = 10000; + X509Certificate[] certs = new X509Certificate[subjects.length]; + + int index = subjects.length; + for (String sbj: subjects){ + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(1024); + KeyPair key = keyGen.generateKeyPair(); + + X509v3CertificateBuilder certBuilder = new X509v3CertificateBuilder(new X500Name(issuer ==null? sbj:issuer), + BigInteger.valueOf(iSerial++), startDate, expiryDate, new X500Name(sbj), + SubjectPublicKeyInfo.getInstance(key.getPublic().getEncoded())); + + ContentSigner sigGen = new JcaContentSignerBuilder("SHA1WithRSAEncryption") + .setProvider("BC").build(issuerKey ==null?key.getPrivate():issuerKey); + + certs[--index] = new JcaX509CertificateConverter().setProvider("BC").getCertificate(certBuilder.build(sigGen)); + issuer= sbj; + issuerKey = key.getPrivate(); + + } + return certs; + } +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/UserResourceTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/UserResourceTest.java index 0911d0541e096365e825d195fab99779eea3b9b2..eb0485282c2c05833bc790eb38f10e90e09455e6 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/UserResourceTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/UserResourceTest.java @@ -9,6 +9,7 @@ import eu.europa.ec.edelivery.smp.data.ui.CertificateRO; import eu.europa.ec.edelivery.smp.data.ui.ServiceGroupRO; import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; import eu.europa.ec.edelivery.smp.data.ui.UserRO; +import eu.europa.ec.edelivery.smp.testutils.X509CertificateTestUtils; import org.apache.commons.io.IOUtils; import org.junit.Before; import org.junit.Test; @@ -31,6 +32,8 @@ import org.springframework.web.context.WebApplicationContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; +import java.security.cert.X509Certificate; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; @@ -119,7 +122,26 @@ public class UserResourceTest { assertEquals("3", res.getSerialNumber()); assertEquals("CN=SMP test,O=DIGIT,C=BE:0000000000000003", res.getCertificateId()); assertEquals("sno=3&subject=C%3DBE%2CO%3DDIGIT%2CCN%3DSMP+test%2CE%3Dsmp%40test.com&validfrom=May+22+20%3A59%3A00+2018+GMT&validto=May+22+20%3A56%3A00+2019+GMT&issuer=C%3DBE%2CO%3DDIGIT%2CCN%3DIntermediate+CA", res.getBlueCoatHeader()); + } + + @Test + public void uploadCertificateIdWithEmailSerialNumberInSubjectCertIdTest() throws Exception { + String subject = "CN=common name,emailAddress=CEF-EDELIVERY-SUPPORT@ec.europa.eu,serialNumber=1,O=org,ST=My town,postalCode=2151, L=GreatTown,street=My Street. 20, C=BE"; + String serialNumber = "1234321"; + X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(serialNumber, subject); + byte[] buff = certificate.getEncoded(); + // given when + MvcResult result = mvc.perform(post(PATH+"/1098765430/certdata") + .with(SYSTEM_CREDENTIALS) + .content(buff)) + .andExpect(status().isOk()).andReturn(); + + //them + ObjectMapper mapper = new ObjectMapper(); + CertificateRO res = mapper.readValue(result.getResponse().getContentAsString(), CertificateRO.class); + + assertEquals("CN=common name,O=org,C=BE:0000000001234321", res.getCertificateId()); } @Test