001: package org.bouncycastle.mail.smime.test;
002:
003: import junit.framework.Test;
004: import junit.framework.TestCase;
005: import junit.framework.TestSuite;
006: import org.bouncycastle.asn1.ASN1EncodableVector;
007: import org.bouncycastle.asn1.cms.AttributeTable;
008: import org.bouncycastle.asn1.smime.SMIMECapabilitiesAttribute;
009: import org.bouncycastle.asn1.smime.SMIMECapability;
010: import org.bouncycastle.asn1.smime.SMIMECapabilityVector;
011: import org.bouncycastle.cms.SignerInformation;
012: import org.bouncycastle.cms.SignerInformationStore;
013: import org.bouncycastle.cms.test.CMSTestUtil;
014: import org.bouncycastle.mail.smime.SMIMECompressed;
015: import org.bouncycastle.mail.smime.SMIMECompressedGenerator;
016: import org.bouncycastle.mail.smime.SMIMECompressedParser;
017: import org.bouncycastle.mail.smime.SMIMESigned;
018: import org.bouncycastle.mail.smime.SMIMESignedGenerator;
019: import org.bouncycastle.mail.smime.SMIMEUtil;
020: import org.bouncycastle.util.Arrays;
021:
022: import javax.mail.Session;
023: import javax.mail.internet.MimeBodyPart;
024: import javax.mail.internet.MimeMessage;
025: import javax.mail.internet.MimeMultipart;
026: import java.io.ByteArrayOutputStream;
027: import java.io.InputStream;
028: import java.security.KeyPair;
029: import java.security.cert.CertStore;
030: import java.security.cert.CollectionCertStoreParameters;
031: import java.security.cert.X509Certificate;
032: import java.util.ArrayList;
033: import java.util.Collection;
034: import java.util.Iterator;
035: import java.util.List;
036:
037: public class SMIMECompressedTest extends TestCase {
038: private static final String COMPRESSED_CONTENT_TYPE = "application/pkcs7-mime; name=\"smime.p7z\"; smime-type=compressed-data";
039:
040: boolean DEBUG = true;
041:
042: MimeBodyPart msg;
043:
044: String signDN;
045: KeyPair signKP;
046: X509Certificate signCert;
047:
048: String origDN;
049: KeyPair origKP;
050: X509Certificate origCert;
051:
052: String reciDN;
053: KeyPair reciKP;
054: X509Certificate reciCert;
055:
056: KeyPair dsaSignKP;
057: X509Certificate dsaSignCert;
058:
059: KeyPair dsaOrigKP;
060: X509Certificate dsaOrigCert;
061:
062: /*
063: *
064: * INFRASTRUCTURE
065: *
066: */
067:
068: public SMIMECompressedTest(String name) throws Exception {
069: super (name);
070:
071: msg = SMIMETestUtil.makeMimeBodyPart("Hello world!");
072:
073: signDN = "O=Bouncy Castle, C=AU";
074: signKP = CMSTestUtil.makeKeyPair();
075: signCert = CMSTestUtil.makeCertificate(signKP, signDN, signKP,
076: signDN);
077:
078: origDN = "CN=Eric H. Echidna, E=eric@bouncycastle.org, O=Bouncy Castle, C=AU";
079: origKP = CMSTestUtil.makeKeyPair();
080: origCert = CMSTestUtil.makeCertificate(origKP, origDN, signKP,
081: signDN);
082: }
083:
084: public static void main(String args[]) {
085: junit.textui.TestRunner.run(SMIMECompressedTest.class);
086: }
087:
088: public static Test suite() {
089: return new SMIMETestSetup(new TestSuite(
090: SMIMECompressedTest.class));
091: }
092:
093: public void testHeaders() throws Exception {
094: SMIMECompressedGenerator cgen = new SMIMECompressedGenerator();
095:
096: MimeBodyPart cbp = cgen.generate(msg,
097: SMIMECompressedGenerator.ZLIB);
098:
099: assertEquals(COMPRESSED_CONTENT_TYPE, cbp
100: .getHeader("Content-Type")[0]);
101: assertEquals("attachment; filename=\"smime.p7z\"", cbp
102: .getHeader("Content-Disposition")[0]);
103: assertEquals("S/MIME Compressed Message", cbp
104: .getHeader("Content-Description")[0]);
105: }
106:
107: public void testBasic() throws Exception {
108: SMIMECompressedGenerator cgen = new SMIMECompressedGenerator();
109: ByteArrayOutputStream bOut = new ByteArrayOutputStream();
110: MimeBodyPart cbp = cgen.generate(msg,
111: SMIMECompressedGenerator.ZLIB);
112:
113: SMIMECompressed sc = new SMIMECompressed(cbp);
114:
115: msg.writeTo(bOut);
116:
117: assertTrue(Arrays.areEqual(bOut.toByteArray(), sc.getContent()));
118: }
119:
120: public void testParser() throws Exception {
121: SMIMECompressedGenerator cgen = new SMIMECompressedGenerator();
122: ByteArrayOutputStream bOut1 = new ByteArrayOutputStream();
123: ByteArrayOutputStream bOut2 = new ByteArrayOutputStream();
124: MimeBodyPart cbp = cgen.generate(msg,
125: SMIMECompressedGenerator.ZLIB);
126: SMIMECompressedParser sc = new SMIMECompressedParser(cbp);
127:
128: msg.writeTo(bOut1);
129:
130: InputStream in = sc.getContent().getContentStream();
131: int ch;
132:
133: while ((ch = in.read()) >= 0) {
134: bOut2.write(ch);
135: }
136:
137: assertTrue(Arrays.areEqual(bOut1.toByteArray(), bOut2
138: .toByteArray()));
139: }
140:
141: /*
142: * test compressing and uncompressing of a multipart-signed message.
143: */
144: public void testCompressedSHA1WithRSA() throws Exception {
145: List certList = new ArrayList();
146:
147: certList.add(origCert);
148: certList.add(signCert);
149:
150: CertStore certs = CertStore.getInstance("Collection",
151: new CollectionCertStoreParameters(certList), "BC");
152:
153: ASN1EncodableVector signedAttrs = new ASN1EncodableVector();
154: SMIMECapabilityVector caps = new SMIMECapabilityVector();
155:
156: caps.addCapability(SMIMECapability.dES_EDE3_CBC);
157: caps.addCapability(SMIMECapability.rC2_CBC, 128);
158: caps.addCapability(SMIMECapability.dES_CBC);
159:
160: signedAttrs.add(new SMIMECapabilitiesAttribute(caps));
161:
162: SMIMESignedGenerator gen = new SMIMESignedGenerator();
163:
164: gen.addSigner(origKP.getPrivate(), origCert,
165: SMIMESignedGenerator.DIGEST_SHA1, new AttributeTable(
166: signedAttrs), null);
167:
168: gen.addCertificatesAndCRLs(certs);
169:
170: MimeMultipart smp = gen.generate(msg, "BC");
171:
172: MimeMessage bp2 = new MimeMessage((Session) null);
173:
174: bp2.setContent(smp);
175:
176: bp2.saveChanges();
177:
178: SMIMECompressedGenerator cgen = new SMIMECompressedGenerator();
179:
180: MimeBodyPart cbp = cgen.generate(bp2,
181: SMIMECompressedGenerator.ZLIB);
182:
183: SMIMECompressed cm = new SMIMECompressed(cbp);
184:
185: MimeMultipart mm = (MimeMultipart) SMIMEUtil.toMimeBodyPart(
186: cm.getContent()).getContent();
187:
188: SMIMESigned s = new SMIMESigned(mm);
189:
190: ByteArrayOutputStream _baos = new ByteArrayOutputStream();
191: msg.writeTo(_baos);
192: _baos.close();
193: byte[] _msgBytes = _baos.toByteArray();
194: _baos = new ByteArrayOutputStream();
195: s.getContent().writeTo(_baos);
196: _baos.close();
197: byte[] _resBytes = _baos.toByteArray();
198:
199: assertEquals(true, Arrays.areEqual(_msgBytes, _resBytes));
200:
201: certs = s.getCertificatesAndCRLs("Collection", "BC");
202:
203: SignerInformationStore signers = s.getSignerInfos();
204: Collection c = signers.getSigners();
205: Iterator it = c.iterator();
206:
207: while (it.hasNext()) {
208: SignerInformation signer = (SignerInformation) it.next();
209: Collection certCollection = certs.getCertificates(signer
210: .getSID());
211:
212: Iterator certIt = certCollection.iterator();
213: X509Certificate cert = (X509Certificate) certIt.next();
214:
215: assertEquals(true, signer.verify(cert, "BC"));
216: }
217: }
218: }
|