Advertisement
Guest User

Prob BouncyCastle

a guest
Nov 4th, 2016
394
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.81 KB | None | 0 0
  1. import java.io.BufferedInputStream;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.security.KeyStore;
  8. import java.security.Principal;
  9. import java.security.PrivateKey;
  10. import java.security.Security;
  11. import java.security.cert.CertStore;
  12. import java.security.cert.Certificate;
  13. import java.security.cert.CertificateFactory;
  14. import java.security.cert.CollectionCertStoreParameters;
  15. import java.security.cert.X509Certificate;
  16. import java.util.ArrayList;
  17. import java.util.Enumeration;
  18. import java.util.List;
  19. import java.util.Properties;
  20.  
  21. import javax.activation.CommandMap;
  22. import javax.activation.MailcapCommandMap;
  23. import javax.mail.Message;
  24. import javax.mail.Session;
  25. import javax.mail.Transport;
  26. import javax.mail.internet.InternetAddress;
  27. import javax.mail.internet.MimeBodyPart;
  28. import javax.mail.internet.MimeMessage;
  29. import javax.mail.internet.MimeMultipart;
  30.  
  31. import org.bouncycastle.asn1.ASN1EncodableVector;
  32. import org.bouncycastle.asn1.ASN1Sequence;
  33. import org.bouncycastle.asn1.DEROutputStream;
  34. import org.bouncycastle.asn1.cms.AttributeTable;
  35. import org.bouncycastle.asn1.cms.IssuerAndSerialNumber;
  36. import org.bouncycastle.asn1.cms.PasswordRecipientInfo;
  37. import org.bouncycastle.asn1.cms.RecipientInfo;
  38. import org.bouncycastle.asn1.smime.SMIMECapabilitiesAttribute;
  39. import org.bouncycastle.asn1.smime.SMIMECapability;
  40. import org.bouncycastle.asn1.smime.SMIMECapabilityVector;
  41. import org.bouncycastle.asn1.smime.SMIMEEncryptionKeyPreferenceAttribute;
  42. import org.bouncycastle.asn1.x509.SubjectKeyIdentifier;
  43. import org.bouncycastle.asn1.x509.X509Name;
  44. import org.bouncycastle.cms.CMSEnvelopedGenerator;
  45. import org.bouncycastle.cms.CMSException;
  46. import org.bouncycastle.cms.RecipientInfoGenerator;
  47. import org.bouncycastle.cms.jcajce.JceKeyTransRecipientInfoGenerator;
  48. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  49. import org.bouncycastle.mail.smime.SMIMEEnvelopedGenerator;
  50. import org.bouncycastle.mail.smime.SMIMEException;
  51. import org.bouncycastle.mail.smime.SMIMESignedGenerator;
  52. import org.bouncycastle.operator.GenericKey;
  53. import org.bouncycastle.util.Strings;
  54.  
  55. import oracle.security.crypto.smime.SmimeEnveloped;
  56. import usto.re.smime.utils.ConvertCertificates;
  57.  
  58. /**
  59.  * Example that sends a signed and encrypted mail message.
  60.  */
  61. public class SendSignedAndEncryptedMail {
  62.     private static RecipientInfoGenerator recipientInfoGen;
  63.  
  64.     @SuppressWarnings("deprecation")
  65.     public static void main(String args[]) {
  66.         // if (args.length != 5) {
  67.         // System.err.println(
  68.         // "usage: SendSignedAndEncryptedMail <pkcs12Keystore> <password>
  69.         // <keyalias> <smtp server> <email address>");
  70.         // System.exit(0);
  71.         // }
  72.  
  73.         try {
  74.             MailcapCommandMap mailcap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
  75.  
  76.             mailcap.addMailcap(
  77.                     "application/pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_signature");
  78.             mailcap.addMailcap(
  79.                     "application/pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_mime");
  80.             mailcap.addMailcap(
  81.                     "application/x-pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_signature");
  82.             mailcap.addMailcap(
  83.                     "application/x-pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_mime");
  84.             mailcap.addMailcap(
  85.                     "multipart/signed;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.multipart_signed");
  86.  
  87.             CommandMap.setDefaultCommandMap(mailcap);
  88.  
  89.             /* Add BC */
  90.             Security.addProvider(new BouncyCastleProvider());
  91.  
  92.             /* Open the keystore */
  93.             KeyStore keystore = KeyStore.getInstance("PKCS12", "BC");
  94.             keystore.load(new FileInputStream("/home/daniel/Downloads/meucertificado.p12"), "mypass".toCharArray());
  95.  
  96.             String alias = "";
  97.             Enumeration elem = keystore.aliases();
  98.             X509Certificate c = null;
  99.             while (elem.hasMoreElements()) {
  100.                 alias = (String) elem.nextElement();
  101.                 // System.out.println("alias:" + alias);
  102.                 // System.out.println(" >>> ");
  103.                 c = (X509Certificate) keystore.getCertificate(alias);
  104.                 Principal subject = c.getSubjectDN();
  105.                 String subjectArray[] = subject.toString().split(",");
  106.                 for (String s : subjectArray) {
  107.                     String[] str = s.trim().split("=");
  108.                     String key = str[0];
  109.                     String value = str[1];
  110.                     // System.out.println(key + " - " + value);
  111.                 }
  112.             }
  113.  
  114.             Certificate[] chain = keystore.getCertificateChain(alias);
  115.  
  116.             /* Get the private key to sign the message with */
  117.             PrivateKey privateKey = (PrivateKey) keystore.getKey(alias, "mypass".toCharArray());
  118.             if (privateKey == null) {
  119.                 throw new Exception("cannot find private key for alias: " + alias);
  120.             }
  121.  
  122.             /* Create the message to sign and encrypt */
  123.             Properties props = System.getProperties();
  124.             props.put("mail.smtp.host", "10.0.1.163");
  125.             Session session = Session.getDefaultInstance(props, null);
  126.             session.setDebug(true);
  127.             MimeMessage body = new MimeMessage(session);
  128.             body.setFrom(new InternetAddress("daniel@teste.re"));
  129.             body.setRecipient(Message.RecipientType.TO, new InternetAddress("eudes@teste.re"));
  130.             body.setSubject("example encrypted message");
  131.             body.setContent("Mensagem ultramegapower criptografada", "text/plain");
  132.             body.saveChanges();
  133.  
  134.             /* Create the SMIMESignedGenerator */
  135.             SMIMECapabilityVector capabilities = new SMIMECapabilityVector();
  136.             capabilities.addCapability(SMIMECapability.dES_EDE3_CBC);
  137.             capabilities.addCapability(SMIMECapability.rC2_CBC, 128);
  138.             capabilities.addCapability(SMIMECapability.dES_CBC);
  139.  
  140.             ASN1EncodableVector attributes = new ASN1EncodableVector();
  141.             attributes.add(new SMIMEEncryptionKeyPreferenceAttribute(
  142.                     new IssuerAndSerialNumber(new X509Name(((X509Certificate) chain[0]).getIssuerDN().getName()),
  143.                             ((X509Certificate) chain[0]).getSerialNumber())));
  144.             attributes.add(new SMIMECapabilitiesAttribute(capabilities));
  145.  
  146.             SMIMESignedGenerator signer = new SMIMESignedGenerator();
  147.             signer.addSigner(privateKey,
  148.                     (X509Certificate) chain[0], "RSA".equals(privateKey.getAlgorithm())
  149.                             ? SMIMESignedGenerator.DIGEST_SHA1 : SMIMESignedGenerator.DIGEST_MD5,
  150.                     new AttributeTable(attributes), null);
  151.  
  152.             /* Add the list of certs to the generator */
  153.             String path = "/home/daniel/Downloads/eudes@teste.re.p12";
  154.             String pwd = "mypass";
  155.             ConvertCertificates conv = new ConvertCertificates();
  156.             conv.decryptCert(path, pwd);
  157.             List certList = new ArrayList();
  158.             certList.add(chain[0]);
  159.             certList.add(conv.getCertificate());
  160.             CertStore certs = CertStore.getInstance("Collection", new CollectionCertStoreParameters(certList), "BC");
  161.             signer.addCertificatesAndCRLs(certs);
  162.  
  163.             /* Sign the message */
  164.             MimeMultipart mm = signer.generate(body, "BC");
  165.             MimeMessage signedMessage = new MimeMessage(session);
  166.  
  167.             /* Set all original MIME headers in the signed message */
  168.             Enumeration headers = body.getAllHeaderLines();
  169.             while (headers.hasMoreElements()) {
  170.                 signedMessage.addHeaderLine((String) headers.nextElement());
  171.             }
  172.  
  173.             /* Set the content of the signed message */
  174.             signedMessage.setContent(mm);
  175.             signedMessage.saveChanges();
  176.  
  177.             /* Create the encrypter */
  178.            
  179.             SMIMEEnvelopedGenerator encrypter = new SMIMEEnvelopedGenerator();
  180.              
  181.            
  182.             encrypter.addKeyTransRecipient(conv.getCertificate());
  183.            
  184.                
  185.             encrypter.addKeyTransRecipient((X509Certificate) chain[0]);
  186.             //encrypter.addRecipientInfoGenerator(
  187.          // new JceKeyTransRecipientInfoGenerator(conv.getCertificate().getExtensionValue("2.5.29.14"), conv.getPubKey()));
  188.            
  189.  
  190.             // encrypter.addKeyTransRecipient(c);
  191.             /* Encrypt the message */
  192.             MimeBodyPart encryptedPart = encrypter.generate(signedMessage, SMIMEEnvelopedGenerator.RC2_CBC, "BC");
  193.  
  194.             /*
  195.              * Create a new MimeMessage that contains the encrypted and signed
  196.              * content
  197.              */
  198.             ByteArrayOutputStream out = new ByteArrayOutputStream();
  199.             encryptedPart.writeTo(out);
  200.  
  201.             MimeMessage encryptedMessage = new MimeMessage(session, new ByteArrayInputStream(out.toByteArray()));
  202.  
  203.             /* Set all original MIME headers in the encrypted message */
  204.             headers = body.getAllHeaderLines();
  205.             while (headers.hasMoreElements()) {
  206.                 String headerLine = (String) headers.nextElement();
  207.                 /*
  208.                  * Make sure not to override any content-* headers from the
  209.                  * original message
  210.                  */
  211.                 if (!Strings.toLowerCase(headerLine).startsWith("content-")) {
  212.                     encryptedMessage.addHeaderLine(headerLine);
  213.                 }
  214.             }
  215.             // ReadEncryptedMail.decrypt(encryptedMessage);
  216.             Transport.send(encryptedMessage);
  217.         } catch (SMIMEException ex) {
  218.             ex.getUnderlyingException().printStackTrace(System.err);
  219.             ex.printStackTrace(System.err);
  220.         } catch (Exception ex) {
  221.             ex.printStackTrace(System.err);
  222.         }
  223.     }
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement