blob: 3cfeefea1de4a03cda6b786de016a5c2cfb6f199 [file] [log] [blame]
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);
}
}