import java.io.*; import java.util.*; import java.security.*; import java.security.cert.*; import javax.activation.*; import javax.mail.*; import javax.mail.internet.*; import com.dstc.security.smime.*; public class SMIMESender { private static final char[] ksPasswd = {'a', 'b', 'c', 'd', 'e', 'f'}; private static final char[] keyPasswd = {'f', 'e', 'd', 'c', 'b', 'a'}; private static final char[] passwd = {}; public static void main(String[] args) { Security.addProvider(new com.dstc.security.provider.DSTC()); Security.addProvider(new com.dstc.security.keymanage.keystore.DSTC()); try { // Skapa ett mime-meddelande MimeMessage msg1 = setMessage(args[0], args[1], args[2], args[3], args[4]); System.out.println("DONE MAKING MIME MESSAGE"); //The following example parses a PKCS#7-formatted certificate reply stored in a file and extracts all the certificates from it: // Läs in publika nyckeln PublicKey publicKey = null; FileInputStream fis = new FileInputStream(filename); CertificateFactory cf = CertificateFactory.getInstance("X.509"); Collection c = cf.generateCertificates(fis); Iterator i = c.iterator(); while (i.hasNext()) { Certificate cert = (Certificate)i.next(); System.out.println(cert); publicKey = cert.getPublicKey(); System.out.println("DONE LOADING PUBLIC KEY FROM CERTIFICATE"); } KeyStore keystore = KeyStore.getInstance("pkcs12"); BufferedInputStream bis = new BufferedInputStream(new FileInputStream("pierre_all.pfx")); keystore.load(bis, null); PrivateKey privateKey = (PrivateKey) keystore.getKey("", passwd); X509Certificate cert = (X509Certificate) keystore.getCertificate(""); // Läs in privata certifikatet - twarte! :-) //FileInputStream fis = new FileInputStream(args[5]); //CertificateFactory cf = CertificateFactory.getInstance("X509"); //X509Certificate myCert = (X509Certificate)cf.generateCertificate(fis); X509Certificate[] certs = {cert}; System.out.println("DONE LOADING CERTIFICATE"); // Signera SMIMESignature sig = new SMIMESignature(); sig.initSign("SHA-1", privateKey, certs, true); sig.setMessage(msg1); MimeMessage msg2 = sig.sign(); System.out.println("DONE SIGNING"); // Kryptera - Pierre fuskar lite med init av rand så går det fortare :) /* SecureRandom rand = new SecureRandom(new Long(System.currentTimeMillis()).toString().getBytes()); SMIMECipher cipher = new SMIMECipher(); cipher.initEncrypt(rand, "RC2", certs); cipher.setMessage(msg2); MimeMessage msg3 = cipher.encrypt(); System.out.println("DONE ENCRYPTING"); */ // Sänd //Transport.send(msg3); Transport.send(msg2); System.out.println("DONE MAKING TRANSPORT"); } catch (Exception e) { e.printStackTrace(); } } private static MimeMessage setMessage(String host, String from, String subject, String to, String content) { try { // Skapa en session Properties props = new Properties(); props.put("mail.smtp.host", host); Session session = Session.getDefaultInstance(props, null); MimeMessage msg = new MimeMessage(Session.getDefaultInstance(null, null)); InternetHeaders hdrs = new InternetHeaders(); hdrs.addHeader("Content-Type", "text/plain; charset=us-ascii"); hdrs.addHeader("Content-Transfer-Encoding", "7bit"); MimeBodyPart part = new MimeBodyPart(hdrs, content.getBytes()); msg.setContent(part.getContent(), "text/plain"); msg.setHeader("Content-Type", "text/plain; charset=us-ascii"); msg.setHeader("Content-Transfer-Encoding", "7bit"); msg.setSubject(subject); msg.setFrom(new InternetAddress(from)); InternetAddress[] address = {new InternetAddress(to)}; msg.setRecipients(Message.RecipientType.TO, address); return msg; } catch (Exception e) { e.printStackTrace(); return null; } } }