package org.bouncycastle.dvcs.test; import java.io.IOException; import java.security.KeyPair; import java.security.Security; import java.security.cert.CertificateEncodingException; import java.security.cert.X509Certificate; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.bouncycastle.asn1.dvcs.CertEtcToken; import org.bouncycastle.asn1.dvcs.TargetEtcChain; import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder; import org.bouncycastle.cms.CMSSignedData; import org.bouncycastle.cms.CMSSignedDataGenerator; import org.bouncycastle.cms.SignerId; import org.bouncycastle.cms.SignerInformationVerifier; import org.bouncycastle.cms.SignerInformationVerifierProvider; import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder; import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoVerifierBuilder; import org.bouncycastle.cms.test.CMSTestUtil; import org.bouncycastle.dvcs.CCPDRequestBuilder; import org.bouncycastle.dvcs.CCPDRequestData; import org.bouncycastle.dvcs.CPDRequestBuilder; import org.bouncycastle.dvcs.CPDRequestData; import org.bouncycastle.dvcs.DVCSException; import org.bouncycastle.dvcs.DVCSRequest; import org.bouncycastle.dvcs.MessageImprint; import org.bouncycastle.dvcs.MessageImprintBuilder; import org.bouncycastle.dvcs.SignedDVCSMessageGenerator; import org.bouncycastle.dvcs.TargetChain; import org.bouncycastle.dvcs.VPKCRequestBuilder; import org.bouncycastle.dvcs.VPKCRequestData; import org.bouncycastle.dvcs.VSDRequestBuilder; import org.bouncycastle.dvcs.VSDRequestData; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.operator.ContentSigner; import org.bouncycastle.operator.OperatorCreationException; import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder; import org.bouncycastle.util.Arrays; import org.bouncycastle.util.io.Streams; public class AllTests extends TestCase { private static final String BC = BouncyCastleProvider.PROVIDER_NAME; private static boolean initialised = false; private static String origDN; private static KeyPair origKP; private static X509Certificate origCert; private static String signDN; private static KeyPair signKP; private static X509Certificate signCert; private static void init() throws Exception { if (!initialised) { initialised = true; if (Security.getProvider(BC) == null) { Security.addProvider(new BouncyCastleProvider()); } origDN = "O=Bouncy Castle, C=AU"; origKP = CMSTestUtil.makeKeyPair(); origCert = CMSTestUtil.makeCertificate(origKP, origDN, origKP, origDN); signDN = "CN=Bob, OU=Sales, O=Bouncy Castle, C=AU"; signKP = CMSTestUtil.makeKeyPair(); signCert = CMSTestUtil.makeCertificate(signKP, signDN, origKP, origDN); } } public void setUp() throws Exception { init(); } private byte[] getInput(String name) throws IOException { return Streams.readAll(getClass().getResourceAsStream(name)); } public void testCCPDRequest() throws Exception { SignedDVCSMessageGenerator gen = getSignedDVCSMessageGenerator(); CCPDRequestBuilder reqBuilder = new CCPDRequestBuilder(); MessageImprintBuilder imprintBuilder = new MessageImprintBuilder(new SHA1DigestCalculator()); MessageImprint messageImprint = imprintBuilder.build(new byte[100]); CMSSignedData reqMsg = gen.build(reqBuilder.build(messageImprint)); assertTrue(reqMsg.verifySignatures(new SignerInformationVerifierProvider() { public SignerInformationVerifier get(SignerId sid) throws OperatorCreationException { return new JcaSimpleSignerInfoVerifierBuilder().setProvider(BC).build(signCert); } })); DVCSRequest request = new DVCSRequest(reqMsg); CCPDRequestData reqData = (CCPDRequestData)request.getData(); assertEquals(messageImprint, reqData.getMessageImprint()); } private CMSSignedData getWrappedCPDRequest() throws OperatorCreationException, CertificateEncodingException, DVCSException, IOException { SignedDVCSMessageGenerator gen = getSignedDVCSMessageGenerator(); CPDRequestBuilder reqBuilder = new CPDRequestBuilder(); return gen.build(reqBuilder.build(new byte[100])); } public void testCPDRequest() throws Exception { CMSSignedData reqMsg = getWrappedCPDRequest(); assertTrue(reqMsg.verifySignatures(new SignerInformationVerifierProvider() { public SignerInformationVerifier get(SignerId sid) throws OperatorCreationException { return new JcaSimpleSignerInfoVerifierBuilder().setProvider(BC).build(signCert); } })); DVCSRequest request = new DVCSRequest(reqMsg); CPDRequestData reqData = (CPDRequestData)request.getData(); assertTrue(Arrays.areEqual(new byte[100], reqData.getMessage())); } public void testVPKCRequest() throws Exception { SignedDVCSMessageGenerator gen = getSignedDVCSMessageGenerator(); VPKCRequestBuilder reqBuilder = new VPKCRequestBuilder(); reqBuilder.addTargetChain(new JcaX509CertificateHolder(signCert)); CMSSignedData reqMsg = gen.build(reqBuilder.build()); assertTrue(reqMsg.verifySignatures(new SignerInformationVerifierProvider() { public SignerInformationVerifier get(SignerId sid) throws OperatorCreationException { return new JcaSimpleSignerInfoVerifierBuilder().setProvider(BC).build(signCert); } })); DVCSRequest request = new DVCSRequest(reqMsg); VPKCRequestData reqData = (VPKCRequestData)request.getData(); assertEquals(new TargetEtcChain(new CertEtcToken(CertEtcToken.TAG_CERTIFICATE, new JcaX509CertificateHolder(signCert).toASN1Structure())), ((TargetChain)reqData.getCerts().get(0)).toASN1Structure()); } public void testVSDRequest() throws Exception { CMSSignedData message = getWrappedCPDRequest(); SignedDVCSMessageGenerator gen = getSignedDVCSMessageGenerator(); VSDRequestBuilder reqBuilder = new VSDRequestBuilder(); CMSSignedData reqMsg = gen.build(reqBuilder.build(message)); assertTrue(reqMsg.verifySignatures(new SignerInformationVerifierProvider() { public SignerInformationVerifier get(SignerId sid) throws OperatorCreationException { return new JcaSimpleSignerInfoVerifierBuilder().setProvider(BC).build(signCert); } })); DVCSRequest request = new DVCSRequest(reqMsg); VSDRequestData reqData = (VSDRequestData)request.getData(); assertEquals(message.toASN1Structure().getContentType(), reqData.getParsedMessage().toASN1Structure().getContentType()); } private SignedDVCSMessageGenerator getSignedDVCSMessageGenerator() throws OperatorCreationException, CertificateEncodingException { CMSSignedDataGenerator sigDataGen = new CMSSignedDataGenerator(); JcaDigestCalculatorProviderBuilder calculatorProviderBuilder = new JcaDigestCalculatorProviderBuilder().setProvider(BC); ContentSigner contentSigner = new JcaContentSignerBuilder("SHA1withRSA").setProvider(BC).build(signKP.getPrivate()); sigDataGen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(calculatorProviderBuilder.build()).build(contentSigner, signCert)); return new SignedDVCSMessageGenerator(sigDataGen); } public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); junit.textui.TestRunner.run(suite()); } public static Test suite() throws Exception { TestSuite suite= new TestSuite("EAC tests"); suite.addTestSuite(AllTests.class); suite.addTestSuite(DVCSParseTest.class); return new DVCSTestSetup(suite); } }