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/cms/envelopedData/CamelliaEnvelopedDataDemo.java 7     12.02.25 17:58 Dbratko $
059    // $Revision: 7 $
060    //
061    
062    
063    package demo.cms.envelopedData;
064    
065    import iaik.asn1.structures.AlgorithmID;
066    
067    import java.io.IOException;
068    import java.security.NoSuchAlgorithmException;
069    
070    import demo.DemoUtil;
071    
072    
073    /**
074     * Demonstrates the usage of class {@link iaik.cms.EnvelopedDataStream} and
075     * {@link iaik.cms.EnvelopedData} for encrypting data using the CMS type
076     * EnvelopedData with the Camellia cipher algorithm.
077     * <br>
078     * Camellia is used for both content encryption and content encryption key 
079     * wrapping (according to RFC 3657).
080     * <p>
081     * This demo creates an EnvelopedData object and subsequently shows several
082     * ways that may be used for decrypting the content for some particular 
083     * recipient.
084     * <p>
085     * Keys and certificates are retrieved from the demo KeyStore ("cms.keystore") 
086     * which has to be located in your current working directory and may be
087     * created by running the {@link demo.keystore.SetupCMSKeyStore
088     * SetupCMSKeyStore} program.
089     * <p>
090     * 
091     * @see iaik.cms.EnvelopedDataStream
092     * @see iaik.cms.EnvelopedData
093     * @see iaik.cms.RecipientInfo
094     * @see iaik.cms.KeyTransRecipientInfo
095     * @see iaik.cms.KeyAgreeRecipientInfo
096     * @see iaik.cms.KEKRecipientInfo
097     */
098    public class CamelliaEnvelopedDataDemo extends EnvelopedDataDemo {
099    
100      
101      /**
102       * Creates an CamelliaEnvelopedDataDemo and setups the demo certificates.
103       * <br>
104       * Keys and certificates are retrieved from the demo KeyStore ("cms.keystore")
105       * file which has to be located in your current working directory and may be
106       * created by running {@link demo.keystore.SetupCMSKeyStore
107       * SetupCMSKeyStore}.
108       * <br>
109       * Camellia and Camellia KeyWrap are used for content encryption and
110       * content encryption key wrapping.
111       *
112       * @throws IOException if an file read error occurs
113       * @throws NoSuchAlgorithmException if the requested algorithms are not supported
114       */
115      public CamelliaEnvelopedDataDemo() throws IOException, NoSuchAlgorithmException {
116        super((AlgorithmID)AlgorithmID.camellia128_CBC.clone(),
117             (AlgorithmID)AlgorithmID.cms_camellia128_wrap.clone(),
118             128);
119      }
120          
121      /**
122       * Main method.
123       *
124       * @throws IOException
125       *            if an I/O error occurs when reading required keys
126       *            and certificates from files
127       */
128      public static void main(String argv[]) throws Exception {
129        double iaikProviderVersion = DemoUtil.getIaikProviderVersion();
130        if (iaikProviderVersion <= 3.18) {
131          System.err.println("This demo requires a IAIK provider version > 3.18! Your IAIK provider version is " + iaikProviderVersion + ".");
132        } else {  
133            DemoUtil.initDemos();
134          // Camellia with 128 bit keys 
135          System.out.println("\n***** Camellia-128 demo *****\n");
136          (new CamelliaEnvelopedDataDemo()).start();
137          // Camellia with 192 bit keys
138          System.out.println("\n***** Camellia-192 demo *****\n");
139          (new EnvelopedDataDemo((AlgorithmID)AlgorithmID.camellia192_CBC.clone(),
140                                 (AlgorithmID)AlgorithmID.cms_camellia192_wrap.clone(),
141                                  192)).start();
142          // Camellia with 256 bit keys
143          System.out.println("\n***** Camellia-256 demo *****\n");
144          (new EnvelopedDataDemo((AlgorithmID)AlgorithmID.camellia256_CBC.clone(),
145                                 (AlgorithmID)AlgorithmID.cms_camellia256_wrap.clone(),
146                                  256)).start();
147      
148          System.out.println("\nReady!");
149        }  
150        DemoUtil.waitKey();
151      }
152    }