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/ecc/SimpleSMimeV4EdDemo.java 5     12.02.25 17:59 Dbratko $
059    // $Revision: 5 $
060    //
061    
062    package demo.smime.ecc;
063    
064    import demo.DemoSMimeUtil;
065    import demo.DemoUtil;
066    import demo.cms.ecc.ECCDemoUtil;
067    import demo.cms.ecc.keystore.CMSEccKeyStore;
068    import iaik.asn1.structures.AlgorithmID;
069    import iaik.utils.KeyAndCertificate;
070    import iaik.x509.X509Certificate;
071    
072    /**
073     * This class demonstrates the usage of the IAIK S/MIME implementation. It shows how to create
074     * signed and/or (authenticated) encrypted S/MIMEv4 messages using Ed keys and how to parse them
075     * and verify the signatures and decrypt the content, respectively.
076     * <p>
077     * This demo uses one set of cryptographic algorithms. A demo that uses several combinations of algorithms
078     * is shown in {@link SMimeV4EccDemo SMimeV4EccDemo}.
079     * <p>
080     * Additionally to <code>iaik_cms.jar</code> you also must have 
081     * <code>iaik_jce_(full).jar</code> (IAIK-JCE, <a href =
082     * "https://sic.tech/products/core-crypto-toolkits/jca-jce/" target="_blank">
083     * https://sic.tech/products/core-crypto-toolkits/jca-jce/</a>),
084     * and <code>iaik_eccelarate.jar</code> (IAIK-ECCelerate<sup><small>TM</small></sup>, <a href =
085     * "https://sic.tech/products/core-crypto-toolkits/eccelerate/" target="_blank">
086     * https://sic.tech/products/core-crypto-toolkits/eccelerate/</a>)
087     * in your classpath.
088     * <p>
089     * To run this demo the following packages are required:
090     * <ul>
091     *    <li>
092     *       <code>iaik_cms.jar</code>
093     *    </li>
094     *    <li>
095     *       <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>).
096     *    </li>
097     *    <li>
098     *       <code>iaik_eccelerate.jar</code> (<a href="https://sic.tech/products/core-crypto-toolkits/eccelerate/" target="_blank">IAIK ECC Library</a>).
099     *    </li>   
100     *    <li>
101     *       <code>mail.jar</code> (<a href="http://www.oracle.com/technetwork/java/javamail/index.html" target="_blank">JavaMail API</a>).
102     *    </li>   
103     *    <li>
104     *       <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 &lt; 1.6).
105     *    </li> 
106     * </ul>
107     */
108    public class SimpleSMimeV4EdDemo extends SimpleSMimeV4EcDemo {
109     
110      /**
111       * Default constructor. 
112       */
113      public SimpleSMimeV4EdDemo() {
114        
115        System.out.println();
116        System.out.println("********************************************************************************************");
117        System.out.println("*                                SimpleSMimeV4EdDemo demo                                  *");
118        System.out.println("* (shows how to create and parse (verify, decrypt) signed and encrypted S/MIMEv4 messages) *");
119        System.out.println("********************************************************************************************");
120        System.out.println();
121    
122      }
123      
124      /**
125       * Gets signing key and certificate.
126       * 
127       * @return signing key and certificate
128       */
129      protected KeyAndCertificate getSignerKeyAndCert() {
130        return new KeyAndCertificate(
131            CMSEccKeyStore.getPrivateKey(CMSEccKeyStore.ECDSA, 
132                CMSEccKeyStore.SZ_ED25519),
133            CMSEccKeyStore.getCertificateChain(CMSEccKeyStore.ECDSA, 
134                CMSEccKeyStore.SZ_ED25519));
135      }
136      
137      /**
138       * Gets the digest algorithm used for signing.
139       * 
140       * @return the digest algorithm
141       */
142      protected AlgorithmID getDigestAlgorithm() {
143        return AlgorithmID.sha512;
144      }
145      
146      /**
147       * Gets the signature algorithm.
148       * 
149       * @return the signature algorithm
150       */
151      protected AlgorithmID getSignatureAlgorithm() {
152        return AlgorithmID.ed25519;
153      }
154      
155      /**
156       * Gets the recipient certificates.
157       * 
158       * @return the certificates of the recipients
159       */
160      protected X509Certificate[] getRecipientCerts() {
161        X509Certificate[] recipientCerts = {
162            CMSEccKeyStore.getCertificateChain(CMSEccKeyStore.ECDH,
163                    CMSEccKeyStore.SZ_X25519)[0],
164            CMSEccKeyStore.getCertificateChain(CMSEccKeyStore.ECDH,
165                    CMSEccKeyStore.SZ_X448)[0],
166        };
167        return recipientCerts;
168      }
169      
170       
171      
172      /**
173       * The main method.
174       */
175      public static void main(String[] argv) throws Exception {
176         
177        DemoSMimeUtil.initDemos();
178        //  add ECC provider    
179        ECCDemoUtil.installIaikEccProvider();
180        
181            (new SimpleSMimeV4EdDemo()).start();
182        System.out.println("\nReady!");
183        DemoUtil.waitKey();
184      }
185    }