aboutsummaryrefslogtreecommitdiffstats
path: root/libraries/spongycastle/mail/src/main/java/org/spongycastle/mail/smime/examples/ReadSignedMail.java
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/spongycastle/mail/src/main/java/org/spongycastle/mail/smime/examples/ReadSignedMail.java')
-rw-r--r--libraries/spongycastle/mail/src/main/java/org/spongycastle/mail/smime/examples/ReadSignedMail.java176
1 files changed, 176 insertions, 0 deletions
diff --git a/libraries/spongycastle/mail/src/main/java/org/spongycastle/mail/smime/examples/ReadSignedMail.java b/libraries/spongycastle/mail/src/main/java/org/spongycastle/mail/smime/examples/ReadSignedMail.java
new file mode 100644
index 000000000..370106d96
--- /dev/null
+++ b/libraries/spongycastle/mail/src/main/java/org/spongycastle/mail/smime/examples/ReadSignedMail.java
@@ -0,0 +1,176 @@
+package org.bouncycastle.mail.smime.examples;
+
+import java.io.FileInputStream;
+import java.security.cert.X509Certificate;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Properties;
+
+import javax.mail.BodyPart;
+import javax.mail.Multipart;
+import javax.mail.Session;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+
+import org.bouncycastle.cert.X509CertificateHolder;
+import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
+import org.bouncycastle.cms.SignerInformation;
+import org.bouncycastle.cms.SignerInformationStore;
+import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoVerifierBuilder;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.mail.smime.SMIMESigned;
+import org.bouncycastle.util.Store;
+
+/**
+ * a simple example that reads a basic SMIME signed mail file.
+ */
+public class ReadSignedMail
+{
+ private static final String BC = BouncyCastleProvider.PROVIDER_NAME;
+
+ /**
+ * verify the signature (assuming the cert is contained in the message)
+ */
+ private static void verify(
+ SMIMESigned s)
+ throws Exception
+ {
+ //
+ // extract the information to verify the signatures.
+ //
+
+ //
+ // certificates and crls passed in the signature
+ //
+ Store certs = s.getCertificates();
+
+ //
+ // SignerInfo blocks which contain the signatures
+ //
+ SignerInformationStore signers = s.getSignerInfos();
+
+ Collection c = signers.getSigners();
+ Iterator it = c.iterator();
+
+ //
+ // check each signer
+ //
+ while (it.hasNext())
+ {
+ SignerInformation signer = (SignerInformation)it.next();
+ Collection certCollection = certs.getMatches(signer.getSID());
+
+ Iterator certIt = certCollection.iterator();
+ X509Certificate cert = new JcaX509CertificateConverter().setProvider(BC).getCertificate((X509CertificateHolder)certIt.next());
+
+ //
+ // verify that the sig is correct and that it was generated
+ // when the certificate was current
+ //
+ if (signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider(BC).build(cert)))
+ {
+ System.out.println("signature verified");
+ }
+ else
+ {
+ System.out.println("signature failed!");
+ }
+ }
+ }
+
+ public static void main(
+ String[] args)
+ throws Exception
+ {
+ //
+ // Get a Session object with the default properties.
+ //
+ Properties props = System.getProperties();
+
+ Session session = Session.getDefaultInstance(props, null);
+
+ MimeMessage msg = new MimeMessage(session, new FileInputStream("signed.message"));
+
+ //
+ // make sure this was a multipart/signed message - there should be
+ // two parts as we have one part for the content that was signed and
+ // one part for the actual signature.
+ //
+ if (msg.isMimeType("multipart/signed"))
+ {
+ SMIMESigned s = new SMIMESigned(
+ (MimeMultipart)msg.getContent());
+
+ //
+ // extract the content
+ //
+ MimeBodyPart content = s.getContent();
+
+ System.out.println("Content:");
+
+ Object cont = content.getContent();
+
+ if (cont instanceof String)
+ {
+ System.out.println((String)cont);
+ }
+ else if (cont instanceof Multipart)
+ {
+ Multipart mp = (Multipart)cont;
+ int count = mp.getCount();
+ for (int i = 0; i < count; i++)
+ {
+ BodyPart m = mp.getBodyPart(i);
+ Object part = m.getContent();
+
+ System.out.println("Part " + i);
+ System.out.println("---------------------------");
+
+ if (part instanceof String)
+ {
+ System.out.println((String)part);
+ }
+ else
+ {
+ System.out.println("can't print...");
+ }
+ }
+ }
+
+ System.out.println("Status:");
+
+ verify(s);
+ }
+ else if (msg.isMimeType("application/pkcs7-mime")
+ || msg.isMimeType("application/x-pkcs7-mime"))
+ {
+ //
+ // in this case the content is wrapped in the signature block.
+ //
+ SMIMESigned s = new SMIMESigned(msg);
+
+ //
+ // extract the content
+ //
+ MimeBodyPart content = s.getContent();
+
+ System.out.println("Content:");
+
+ Object cont = content.getContent();
+
+ if (cont instanceof String)
+ {
+ System.out.println((String)cont);
+ }
+
+ System.out.println("Status:");
+
+ verify(s);
+ }
+ else
+ {
+ System.err.println("Not a signed message!");
+ }
+ }
+}