~brian-thomason/+junk/bouncycastle

« back to all changes in this revision

Viewing changes to test/src/org/bouncycastle/mail/smime/test/SMIMECompressedTest.java

  • Committer: Brian Thomason
  • Date: 2011-12-20 17:20:32 UTC
  • Revision ID: brian.thomason@canonical.com-20111220172032-rdtm13jgdxtksacr
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package org.bouncycastle.mail.smime.test;
 
2
 
 
3
import junit.framework.Test;
 
4
import junit.framework.TestCase;
 
5
import junit.framework.TestSuite;
 
6
import org.bouncycastle.asn1.ASN1EncodableVector;
 
7
import org.bouncycastle.asn1.cms.AttributeTable;
 
8
import org.bouncycastle.asn1.smime.SMIMECapabilitiesAttribute;
 
9
import org.bouncycastle.asn1.smime.SMIMECapability;
 
10
import org.bouncycastle.asn1.smime.SMIMECapabilityVector;
 
11
import org.bouncycastle.cms.SignerInformation;
 
12
import org.bouncycastle.cms.SignerInformationStore;
 
13
import org.bouncycastle.cms.test.CMSTestUtil;
 
14
import org.bouncycastle.mail.smime.SMIMECompressed;
 
15
import org.bouncycastle.mail.smime.SMIMECompressedGenerator;
 
16
import org.bouncycastle.mail.smime.SMIMECompressedParser;
 
17
import org.bouncycastle.mail.smime.SMIMESigned;
 
18
import org.bouncycastle.mail.smime.SMIMESignedGenerator;
 
19
import org.bouncycastle.mail.smime.SMIMEUtil;
 
20
import org.bouncycastle.util.Arrays;
 
21
 
 
22
import javax.mail.Session;
 
23
import javax.mail.internet.MimeBodyPart;
 
24
import javax.mail.internet.MimeMessage;
 
25
import javax.mail.internet.MimeMultipart;
 
26
import java.io.ByteArrayOutputStream;
 
27
import java.io.InputStream;
 
28
import java.security.KeyPair;
 
29
import java.security.cert.CertStore;
 
30
import java.security.cert.CollectionCertStoreParameters;
 
31
import java.security.cert.X509Certificate;
 
32
import java.util.ArrayList;
 
33
import java.util.Collection;
 
34
import java.util.Iterator;
 
35
import java.util.List;
 
36
 
 
37
public class SMIMECompressedTest
 
38
    extends TestCase
 
39
{
 
40
    private static final String COMPRESSED_CONTENT_TYPE = "application/pkcs7-mime; name=\"smime.p7z\"; smime-type=compressed-data";
 
41
 
 
42
    boolean DEBUG = true;
 
43
 
 
44
    MimeBodyPart    msg;
 
45
 
 
46
    String          signDN;
 
47
    KeyPair         signKP;
 
48
    X509Certificate signCert;
 
49
 
 
50
    String          origDN;
 
51
    KeyPair         origKP;
 
52
    X509Certificate origCert;
 
53
 
 
54
    String          reciDN;
 
55
    KeyPair         reciKP;
 
56
    X509Certificate reciCert;
 
57
 
 
58
    KeyPair         dsaSignKP;
 
59
    X509Certificate dsaSignCert;
 
60
 
 
61
    KeyPair         dsaOrigKP;
 
62
    X509Certificate dsaOrigCert;
 
63
 
 
64
    /*
 
65
     *
 
66
     *  INFRASTRUCTURE
 
67
     *
 
68
     */
 
69
 
 
70
    public SMIMECompressedTest(
 
71
         String name)
 
72
        throws Exception
 
73
    {
 
74
        super(name);
 
75
        
 
76
        msg      = SMIMETestUtil.makeMimeBodyPart("Hello world!");
 
77
 
 
78
        signDN   = "O=Bouncy Castle, C=AU";
 
79
        signKP   = CMSTestUtil.makeKeyPair();
 
80
        signCert = CMSTestUtil.makeCertificate(signKP, signDN, signKP, signDN);
 
81
 
 
82
        origDN   = "CN=Eric H. Echidna, E=eric@bouncycastle.org, O=Bouncy Castle, C=AU";
 
83
        origKP   = CMSTestUtil.makeKeyPair();
 
84
        origCert = CMSTestUtil.makeCertificate(origKP, origDN, signKP, signDN);
 
85
    }
 
86
 
 
87
    public static void main(String args[]) 
 
88
    {
 
89
        junit.textui.TestRunner.run(SMIMECompressedTest.class);
 
90
    }
 
91
 
 
92
    public static Test suite() 
 
93
    {
 
94
        return new SMIMETestSetup(new TestSuite(SMIMECompressedTest.class));
 
95
    }
 
96
 
 
97
    public void testHeaders()
 
98
        throws Exception
 
99
    {
 
100
        SMIMECompressedGenerator    cgen = new SMIMECompressedGenerator();
 
101
 
 
102
        MimeBodyPart cbp = cgen.generate(msg, SMIMECompressedGenerator.ZLIB);
 
103
        
 
104
        assertEquals(COMPRESSED_CONTENT_TYPE, cbp.getHeader("Content-Type")[0]);
 
105
        assertEquals("attachment; filename=\"smime.p7z\"", cbp.getHeader("Content-Disposition")[0]);
 
106
        assertEquals("S/MIME Compressed Message", cbp.getHeader("Content-Description")[0]);
 
107
    }
 
108
 
 
109
    public void testBasic()
 
110
        throws Exception
 
111
    {
 
112
        SMIMECompressedGenerator    cgen = new SMIMECompressedGenerator();
 
113
        ByteArrayOutputStream       bOut = new ByteArrayOutputStream();
 
114
        MimeBodyPart cbp = cgen.generate(msg, SMIMECompressedGenerator.ZLIB);
 
115
        
 
116
        SMIMECompressed sc = new SMIMECompressed(cbp);
 
117
        
 
118
        msg.writeTo(bOut);
 
119
 
 
120
        assertTrue(Arrays.areEqual(bOut.toByteArray(), sc.getContent()));
 
121
    }
 
122
    
 
123
    public void testParser()
 
124
        throws Exception
 
125
    {
 
126
        SMIMECompressedGenerator    cgen = new SMIMECompressedGenerator();
 
127
        ByteArrayOutputStream       bOut1 = new ByteArrayOutputStream();
 
128
        ByteArrayOutputStream       bOut2 = new ByteArrayOutputStream();
 
129
        MimeBodyPart                cbp = cgen.generate(msg, SMIMECompressedGenerator.ZLIB);
 
130
        SMIMECompressedParser       sc = new SMIMECompressedParser(cbp);
 
131
        
 
132
        msg.writeTo(bOut1);
 
133
    
 
134
        InputStream in = sc.getContent().getContentStream();
 
135
        int ch;
 
136
        
 
137
        while ((ch = in.read()) >= 0)
 
138
        {
 
139
            bOut2.write(ch);
 
140
        }
 
141
        
 
142
        assertTrue(Arrays.areEqual(bOut1.toByteArray(), bOut2.toByteArray()));
 
143
    }
 
144
    
 
145
    /*
 
146
     * test compressing and uncompressing of a multipart-signed message.
 
147
     */
 
148
    public void testCompressedSHA1WithRSA()
 
149
        throws Exception
 
150
    {
 
151
        List           certList = new ArrayList();
 
152
 
 
153
        certList.add(origCert);
 
154
        certList.add(signCert);
 
155
 
 
156
        CertStore      certs = CertStore.getInstance("Collection",
 
157
                                       new CollectionCertStoreParameters(certList), "BC");
 
158
 
 
159
        ASN1EncodableVector         signedAttrs = new ASN1EncodableVector();
 
160
        SMIMECapabilityVector       caps = new SMIMECapabilityVector();
 
161
 
 
162
        caps.addCapability(SMIMECapability.dES_EDE3_CBC);
 
163
        caps.addCapability(SMIMECapability.rC2_CBC, 128);
 
164
        caps.addCapability(SMIMECapability.dES_CBC);
 
165
 
 
166
        signedAttrs.add(new SMIMECapabilitiesAttribute(caps));
 
167
 
 
168
        SMIMESignedGenerator gen = new SMIMESignedGenerator();
 
169
 
 
170
        gen.addSigner(origKP.getPrivate(), origCert, SMIMESignedGenerator.DIGEST_SHA1, new AttributeTable(signedAttrs), null);
 
171
 
 
172
        gen.addCertificatesAndCRLs(certs);
 
173
 
 
174
        MimeMultipart smp = gen.generate(msg, "BC");
 
175
 
 
176
        MimeMessage bp2 = new MimeMessage((Session)null);                          
 
177
 
 
178
        bp2.setContent(smp);
 
179
 
 
180
        bp2.saveChanges();
 
181
 
 
182
        SMIMECompressedGenerator    cgen = new SMIMECompressedGenerator();
 
183
 
 
184
        MimeBodyPart cbp = cgen.generate(bp2, SMIMECompressedGenerator.ZLIB);
 
185
 
 
186
        SMIMECompressed cm = new SMIMECompressed(cbp);
 
187
 
 
188
        MimeMultipart mm = (MimeMultipart)SMIMEUtil.toMimeBodyPart(cm.getContent()).getContent();
 
189
        
 
190
        SMIMESigned s = new SMIMESigned(mm);
 
191
 
 
192
        ByteArrayOutputStream _baos = new ByteArrayOutputStream();
 
193
        msg.writeTo(_baos);
 
194
        _baos.close();
 
195
        byte[] _msgBytes = _baos.toByteArray();
 
196
        _baos = new ByteArrayOutputStream();
 
197
        s.getContent().writeTo(_baos);
 
198
        _baos.close();
 
199
        byte[] _resBytes = _baos.toByteArray();
 
200
        
 
201
        assertEquals(true, Arrays.areEqual(_msgBytes, _resBytes));
 
202
 
 
203
        certs = s.getCertificatesAndCRLs("Collection", "BC");
 
204
 
 
205
        SignerInformationStore  signers = s.getSignerInfos();
 
206
        Collection              c = signers.getSigners();
 
207
        Iterator                it = c.iterator();
 
208
 
 
209
        while (it.hasNext())
 
210
        {
 
211
            SignerInformation   signer = (SignerInformation)it.next();
 
212
            Collection          certCollection = certs.getCertificates(signer.getSID());
 
213
 
 
214
            Iterator            certIt = certCollection.iterator();
 
215
            X509Certificate     cert = (X509Certificate)certIt.next();
 
216
 
 
217
            assertEquals(true, signer.verify(cert, "BC"));
 
218
        }
 
219
    }
 
220
}