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/authenticatedData/HMACwithAESAuthenticatedDataDemo.java 8     12.02.25 17:58 Dbratko $
059    // $Revision: 8 $
060    
061    package demo.cms.authenticatedData;
062    
063    import iaik.asn1.structures.AlgorithmID;
064    import iaik.cms.CMSAlgorithmID;
065    
066    import java.io.IOException;
067    import java.security.NoSuchAlgorithmException;
068    
069    import demo.DemoUtil;
070    
071    /**
072     * Demonstrates the usage of class {@link iaik.cms.AuthenticatedDataStream} and
073     * {@link iaik.cms.AuthenticatedData} for recipient-specific protecting the 
074     * integrity of a message using the CMS type AuthenticatedData with the
075     * <code>HMACwithAESwrap</code> algorithm for wrapping the HMAC key.
076     * <p>
077     * 
078     * <b>Attention:</b> This demo uses Static-Static Diffie-Hellman as key management 
079     * technique for providing origin authentication. The mac key is wrapped by
080     * using the HMACwithAESwrap algorithm as specified by RFC 3537.
081     * <p>
082     * This demo requires that you have <code>iaik_esdh.jar</code>
083     * (or <code>iaik_jce_full.jar</code>) in your classpath.
084     * You can download it from <a href="https://sic.tech/products/core-crypto-toolkits/jca-jce/" target="_blank">
085     * https://sic.tech/products/core-crypto-toolkits/jca-jce/</a>.
086     *
087     * @see iaik.cms.AuthenticatedDataStream
088     * @see iaik.cms.AuthenticatedData
089     */
090    public class HMACwithAESAuthenticatedDataDemo extends AuthenticatedDataDemo {
091    
092      /**
093       * Creates an HMACwithAESAuthenticatedDataDemo and setups the demo certificates.
094       * <br>
095       * Keys and certificates are retrieved from the demo KeyStore ("cms.keystore")
096       * file which has to be located in your current working directory and may be
097       * created by running {@link demo.keystore.SetupCMSKeyStore
098       * SetupCMSKeyStore}.
099       * <br>
100       * HMACwithAESwrap is used as key wrap algorithm.
101       *
102       * @throws IOException if an file read error occurs
103       * @throws NoSuchAlgorithmException if no implementation for the requested key wrap algorithm is available
104       */
105      public HMACwithAESAuthenticatedDataDemo() throws IOException, NoSuchAlgorithmException {
106        super((AlgorithmID)CMSAlgorithmID.cms_HMACwithAES_wrap.clone(),
107              128);
108      }
109          
110      /**
111       * Main method.
112       *
113       * @throws IOException
114       *            if an I/O error occurs when reading required keys
115       *            and certificates from files
116       */
117      public static void main(String argv[]) throws Exception {
118    
119        DemoUtil.initDemos();
120        (new HMACwithAESAuthenticatedDataDemo()).start();
121        System.out.println("\nReady!");
122        DemoUtil.waitKey();
123      }
124    }
125    
126