001 // Copyright (C) 2002 IAIK 002 // https://jce.iaik.tugraz.at 003 // 004 // Copyright (C) 2003 - 2025 Stiftung Secure Information and 005 // Communication Technologies SIC 006 // https://sic.tech 007 // 008 // All rights reserved. 009 // 010 // Redistribution and use in source and binary forms, with or without 011 // modification, are permitted provided that the following conditions 012 // are met: 013 // 1. Redistributions of source code must retain the above copyright 014 // notice, this list of conditions and the following disclaimer. 015 // 2. Redistributions in binary form must reproduce the above copyright 016 // notice, this list of conditions and the following disclaimer in the 017 // documentation and/or other materials provided with the distribution. 018 // 019 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 020 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 021 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 022 // ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 023 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 024 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 025 // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 026 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 027 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 028 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 029 // SUCH DAMAGE. 030 031 // Copyright (C) 2002 IAIK 032 // https://sic.tech/ 033 // 034 // Copyright (C) 2003 - 2025 Stiftung Secure Information and 035 // Communication Technologies SIC 036 // https://sic.tech/ 037 // 038 // All rights reserved. 039 // 040 // This source is provided for inspection purposes and recompilation only, 041 // unless specified differently in a contract with IAIK. This source has to 042 // be kept in strict confidence and must not be disclosed to any third party 043 // under any circumstances. Redistribution in source and binary forms, with 044 // or without modification, are <not> permitted in any case! 045 // 046 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 047 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 048 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 049 // ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 050 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 051 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 052 // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 053 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 054 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 055 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 056 // SUCH DAMAGE. 057 // 058 // $Header: /IAIK-CMS/current/src/demo/smime/basic/SMimeV3CamelliaDemo.java 10 12.02.25 17:58 Dbratko $ 059 // $Revision: 10 $ 060 // 061 062 package demo.smime.basic; 063 064 import iaik.asn1.structures.AlgorithmID; 065 import iaik.cms.CMSAlgorithmID; 066 import iaik.smime.SMimeBodyPart; 067 import iaik.smime.SMimeMultipart; 068 069 import java.io.ByteArrayInputStream; 070 import java.io.ByteArrayOutputStream; 071 import java.io.IOException; 072 073 import javax.activation.DataHandler; 074 import javax.activation.FileDataSource; 075 import javax.mail.Message; 076 import javax.mail.Multipart; 077 import javax.mail.Session; 078 import javax.mail.internet.MimeBodyPart; 079 import javax.mail.internet.MimeMessage; 080 081 import demo.DemoSMimeUtil; 082 import demo.DemoUtil; 083 import demo.smime.DumpMessage; 084 085 /** 086 * This class demonstrates the usage of the IAIK S/MIME implementation with the Camellia 087 * encryption algorithm. It shows how to create encrypted S/MIMEv3 messages and how to parse 088 * them and decrypt the content. 089 * <p> 090 * To run this demo the following packages are required: 091 * <ul> 092 * <li> 093 * <code>iaik_cms.jar</code> (IAIK-CMS/SMIME) 094 * </li> 095 * <li> 096 * <code>iaik_jce(_full).jar</code> (<a href="https://sic.tech/products/core-crypto-toolkits/jca-jce/" target="_blank">IAIK-JCE Core Crypto Library</a>). 097 * </li> 098 * <li> 099 * <code>mail.jar</code> (<a href="http://www.oracle.com/technetwork/java/javamail/index.html" target="_blank">JavaMail API</a>). 100 * </li> 101 * <li> 102 * <code>activation.jar</code> (<a href="http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html" target="_blank">Java Activation Framework</a>; required for JDK versions < 1.6). 103 * </li> 104 * </ul> 105 */ 106 public class SMimeV3CamelliaDemo extends SMimeV3Demo { 107 108 /** 109 * Default constructor. Reads certificates and keys from the demo keystore. 110 */ 111 public SMimeV3CamelliaDemo() { 112 super(); 113 } 114 115 /** 116 * Starts the demo. 117 * 118 * @throws IOException if an I/O related error occurs 119 */ 120 public void start() throws IOException { 121 122 // get the default Session 123 Session session = DemoSMimeUtil.getSession(); 124 125 try { 126 // Create a demo Multipart 127 MimeBodyPart mbp1 = new SMimeBodyPart(); 128 mbp1.setText("This is a Test of the IAIK S/MIME implementation!\n\n"); 129 // attachment 130 MimeBodyPart attachment = new SMimeBodyPart(); 131 attachment.setDataHandler(new DataHandler(new FileDataSource("test.html"))); 132 attachment.setFileName("test.html"); 133 134 Multipart mp = new SMimeMultipart(); 135 mp.addBodyPart(mbp1); 136 mp.addBodyPart(attachment); 137 138 Message msg; // the message to send 139 ByteArrayOutputStream baos = new ByteArrayOutputStream(); // we write to a stream 140 ByteArrayInputStream bais; // we read from a stream 141 142 // Camellia-128 143 144 msg = createEncryptedMessage(session, (AlgorithmID)AlgorithmID.camellia128_CBC.clone(), 128, 145 (AlgorithmID)AlgorithmID.esdhKeyAgreement.clone(), (AlgorithmID)CMSAlgorithmID.cms_camellia128_wrap.clone(), 128); 146 System.out.println("creating encrypted message [Camellia/128]..."); 147 baos.reset(); 148 msg.saveChanges(); 149 msg.writeTo(baos); 150 bais = new ByteArrayInputStream(baos.toByteArray()); 151 msg = new MimeMessage(session, bais); 152 if (PRINT_MESSAGES) { 153 printMessage(msg); 154 } 155 DumpMessage.dumpMsg(msg); 156 157 System.out.println("\n\n*****************************************\n\n"); 158 159 // Camellia-192 160 161 msg = createEncryptedMessage(session, (AlgorithmID)AlgorithmID.camellia192_CBC.clone(), 192, 162 (AlgorithmID)AlgorithmID.esdhKeyAgreement.clone(), (AlgorithmID)CMSAlgorithmID.cms_camellia192_wrap.clone(), 192); 163 System.out.println("creating encrypted message [Camellia/192]..."); 164 baos.reset(); 165 msg.saveChanges(); 166 msg.writeTo(baos); 167 bais = new ByteArrayInputStream(baos.toByteArray()); 168 msg = new MimeMessage(session, bais); 169 if (PRINT_MESSAGES) { 170 printMessage(msg); 171 } 172 DumpMessage.dumpMsg(msg); 173 174 System.out.println("\n\n*****************************************\n\n"); 175 176 // Camellia-256 177 178 msg = createEncryptedMessage(session, (AlgorithmID)AlgorithmID.camellia256_CBC.clone(), 256, 179 (AlgorithmID)AlgorithmID.esdhKeyAgreement.clone(), (AlgorithmID)CMSAlgorithmID.cms_camellia256_wrap.clone(), 256); 180 System.out.println("creating encrypted message [Camellia/256]..."); 181 baos.reset(); 182 msg.saveChanges(); 183 msg.writeTo(baos); 184 bais = new ByteArrayInputStream(baos.toByteArray()); 185 msg = new MimeMessage(session, bais); 186 if (PRINT_MESSAGES) { 187 printMessage(msg); 188 } 189 DumpMessage.dumpMsg(msg); 190 191 192 } catch (Exception ex) { 193 ex.printStackTrace(); 194 throw new RuntimeException(ex.toString()); 195 } 196 } 197 198 199 /** 200 * The main method. 201 */ 202 public static void main(String[] argv) throws IOException { 203 double iaikProviderVersion = DemoUtil.getIaikProviderVersion(); 204 if (iaikProviderVersion <= 3.18) { 205 System.err.println("This demo requires a IAIK provider version > 3.18! Your IAIK provider version is " + iaikProviderVersion + "."); 206 } else { 207 DemoSMimeUtil.initDemos(); 208 (new SMimeV3CamelliaDemo()).start(); 209 System.out.println("\nReady!"); 210 } 211 DemoUtil.waitKey(); 212 } 213 }