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/DemoAll.java 64    12.02.25 17:58 Dbratko $
059    // $Revision: 64 $
060    //
061    
062    package demo;
063    
064    import java.io.File;
065    import java.io.IOException;
066    
067    import demo.cms.authEnvelopedData.AuthEnvelopedDataDemo;
068    import demo.cms.authEnvelopedData.AuthEnvelopedDataOutputStreamDemo;
069    import demo.cms.authenticatedData.AuthenticatedDataDemo;
070    import demo.cms.authenticatedData.AuthenticatedDataOutputStreamDemo;
071    import demo.cms.authenticatedData.HMACwith3DESAuthenticatedDataDemo;
072    import demo.cms.authenticatedData.HMACwithAESAuthenticatedDataDemo;
073    import demo.cms.basic.CMSDemo;
074    import demo.cms.compressedData.CompressedDataDemo;
075    import demo.cms.compressedData.CompressedDataOutputStreamDemo;
076    import demo.cms.data.DataDemo;
077    import demo.cms.digestedData.DigestedDataDemo;
078    import demo.cms.digestedData.DigestedDataOutputStreamDemo;
079    import demo.cms.ecc.ECCDemoUtil;
080    import demo.cms.ecc.EckaEGAuthEnvelopedDataDemo;
081    import demo.cms.encryptedData.EncryptedDataDemo;
082    import demo.cms.encryptedData.EncryptedDataOutputStreamDemo;
083    import demo.cms.envelopedData.ArcFourEnvelopedDataDemo;
084    import demo.cms.envelopedData.CAST128EnvelopedDataDemo;
085    import demo.cms.envelopedData.EncryptedContentInfoDemo;
086    import demo.cms.envelopedData.EnvelopedDataDemo;
087    import demo.cms.envelopedData.EnvelopedDataDemoAEAD;
088    import demo.cms.envelopedData.EnvelopedDataOutputStreamDemo;
089    import demo.cms.envelopedData.ExplicitEnvelopedDataDemo;
090    import demo.cms.envelopedData.OaepEnvelopedDataDemo;
091    import demo.cms.envelopedData.RC2EnvelopedDataDemo;
092    import demo.cms.pkcs7cms.PKCS7CMSDataDemo;
093    import demo.cms.pkcs7cms.PKCS7CMSDigestedDataDemo;
094    import demo.cms.pkcs7cms.PKCS7CMSEncryptedContentInfoDemo;
095    import demo.cms.pkcs7cms.PKCS7CMSEncryptedDataDemo;
096    import demo.cms.pkcs7cms.PKCS7CMSEnvelopedDataDemo;
097    import demo.cms.pkcs7cms.PKCS7CMSSignedDataDemo;
098    import demo.cms.signedAndEnvelopedData.SignedAndEnvelopedDataDemo;
099    import demo.cms.signedData.CounterSignatureDemo;
100    import demo.cms.signedData.PssSignedDataDemo;
101    import demo.cms.signedData.SignedDataDemo;
102    import demo.cms.signedData.SignedDataDemoWithAdditionalSignerInfo;
103    import demo.cms.signedData.SignedDataInOutStreamDemoWithAdditionalSignerInfo;
104    import demo.cms.signedData.SignedDataOutputStreamDemo;
105    import demo.cms.signedData.SignedDataStreamDemoWithAdditionalSignerInfo;
106    import demo.keystore.CMSKeyStoreConstants;
107    import demo.keystore.SetupCMSKeyStore;
108    import demo.smime.basic.BinarySignedDemo;
109    import demo.smime.basic.CMSStreamDemo;
110    import demo.smime.basic.ProcessMessageDemo;
111    import demo.smime.basic.SMimeDemo;
112    import demo.smime.basic.SMimeEnvelopedDemoAEAD;
113    import demo.smime.basic.SMimeV3Demo;
114    import demo.smime.basic.SMimeV4Demo;
115    import demo.smime.ecc.SMimeV4BrainpoolDemo;
116    import demo.smime.ess.MLADemo;
117    import demo.smime.ess.SignedReceiptDemo;
118    import demo.smime.ess.SigningCertificateDemo;
119    import demo.smime.ess.TripleWrappingDemo;
120    import iaik.asn1.structures.AlgorithmID;
121    import iaik.cms.SecurityProvider;
122    import iaik.cms.Utils;
123    
124    /**
125     * This class runs all available demos.
126     */
127    public class DemoAll implements CMSKeyStoreConstants {
128    
129      /**
130       * Start all tests.
131       */
132      public void start() throws Exception {
133        
134        File keystore = new File(CMSKeyStoreConstants.KS_FILENAME);
135        if (!keystore.exists()) {
136          System.out.println("Can't find '"+CMSKeyStoreConstants.KS_FILENAME+"'!");
137          System.out.println("Create new keystore...");
138    
139          SetupCMSKeyStore.start();
140        }
141        
142        String jdkVersion = (String) System.getProperty("java.version");
143        
144        // cms demos
145        (new CMSDemo()).start();
146        (new DataDemo()).start();
147        (new DigestedDataDemo()).start();
148        (new EncryptedDataDemo()).start();
149        if (Utils.isClassAvailable("iaik.security.dh.ESDHPublicKey")) {
150          // require ESDH
151          (new EnvelopedDataDemo()).start();
152          if ((jdkVersion != null) && (jdkVersion.compareTo("1.7") >= 0)) {
153            // EnvelopedData with GCM only available for JDK versions >= 1.7
154            (new EnvelopedDataDemoAEAD()).start();
155          }  
156          (new ExplicitEnvelopedDataDemo()).start();
157          if (DemoUtil.getIaikProviderVersion() >= 3.12) { 
158            (new AuthenticatedDataDemo()).start();
159            (new HMACwith3DESAuthenticatedDataDemo()).start();
160            (new HMACwithAESAuthenticatedDataDemo()).start();
161          }
162          if (DemoUtil.getIaikProviderVersion() >= 3.14) {
163            (new demo.cms.envelopedData.AESEnvelopedDataDemo()).start();
164            (new EnvelopedDataDemo((AlgorithmID)AlgorithmID.aes192_CBC.clone(),
165                                   (AlgorithmID)AlgorithmID.cms_aes192_wrap.clone(),
166                                   192)).start();
167            (new EnvelopedDataDemo((AlgorithmID)AlgorithmID.aes256_CBC.clone(),
168                                   (AlgorithmID)AlgorithmID.cms_aes256_wrap.clone(),
169                                   256)).start();
170            
171            (new demo.cms.envelopedData.ExplicitAESEnvelopedDataDemo()).start();
172            (new ExplicitEnvelopedDataDemo((AlgorithmID)AlgorithmID.aes192_CBC.clone(),
173                                   (AlgorithmID)AlgorithmID.cms_aes192_wrap.clone(),
174                                   192)).start();
175            (new ExplicitEnvelopedDataDemo((AlgorithmID)AlgorithmID.aes256_CBC.clone(),
176                                   (AlgorithmID)AlgorithmID.cms_aes256_wrap.clone(),
177                                   256)).start();
178          }
179          if (DemoUtil.getIaikProviderVersion() > 3.18) {
180            (new demo.cms.envelopedData.CamelliaEnvelopedDataDemo()).start();
181            (new EnvelopedDataDemo((AlgorithmID)AlgorithmID.camellia192_CBC.clone(),
182                                   (AlgorithmID)AlgorithmID.cms_camellia192_wrap.clone(),
183                                    192)).start();
184            (new EnvelopedDataDemo((AlgorithmID)AlgorithmID.camellia256_CBC.clone(),
185                                   (AlgorithmID)AlgorithmID.cms_camellia256_wrap.clone(),
186                                   256)).start();
187            
188            (new ExplicitEnvelopedDataDemo((AlgorithmID)AlgorithmID.camellia128_CBC.clone(),
189                                   (AlgorithmID)AlgorithmID.cms_camellia128_wrap.clone(),
190                                   128)).start();
191            (new ExplicitEnvelopedDataDemo((AlgorithmID)AlgorithmID.camellia192_CBC.clone(),
192                                   (AlgorithmID)AlgorithmID.cms_camellia192_wrap.clone(),
193                                    192)).start();
194            (new ExplicitEnvelopedDataDemo((AlgorithmID)AlgorithmID.camellia256_CBC.clone(),
195                                   (AlgorithmID)AlgorithmID.cms_camellia256_wrap.clone(),
196                                   256)).start();
197            
198            
199            (new demo.cms.authenticatedData.HMACwithAESAuthenticatedDataDemo()).start();
200          }
201        }
202        (new SignedDataDemo()).start();
203        (new CompressedDataDemo()).start();
204        (new EncryptedContentInfoDemo()).start();
205        (new SignedAndEnvelopedDataDemo()).start();
206        (new CAST128EnvelopedDataDemo()).start();
207        (new RC2EnvelopedDataDemo()).start();
208        (new ArcFourEnvelopedDataDemo()).start();
209        
210        // run separatly since stores encryption result to a file   
211        //(new FileEncryptionDemo()).start();
212        
213        (new PKCS7CMSDataDemo()).start();
214        (new PKCS7CMSDigestedDataDemo()).start();
215        (new PKCS7CMSEncryptedDataDemo()).start();
216        (new PKCS7CMSEnvelopedDataDemo()).start();
217        (new PKCS7CMSSignedDataDemo()).start();
218        (new PKCS7CMSEncryptedContentInfoDemo()).start();
219        (new PssSignedDataDemo()).start();
220        (new OaepEnvelopedDataDemo()).start();
221        (new SignedDataDemoWithAdditionalSignerInfo()).start();
222        (new SignedDataStreamDemoWithAdditionalSignerInfo()).start();
223        if (DemoUtil.getIaikProviderVersion() >= 3.16) {
224          (new SignedDataInOutStreamDemoWithAdditionalSignerInfo()).start();
225        }  
226        (new CounterSignatureDemo()).start();
227        (new EnvelopedDataOutputStreamDemo()).start();
228        (new SignedDataOutputStreamDemo()).start();
229        (new EncryptedDataOutputStreamDemo()).start();
230        (new DigestedDataOutputStreamDemo()).start();
231        if (Utils.isClassAvailable("iaik.security.dh.ESDHPublicKey")) {
232          if (DemoUtil.getIaikProviderVersion() >= 3.12) {
233            (new AuthenticatedDataOutputStreamDemo()).start();
234          }
235          if (DemoUtil.getIaikProviderVersion() >= 3.17) {
236            (new AuthEnvelopedDataDemo()).start();
237            (new AuthEnvelopedDataOutputStreamDemo()).start();
238          }
239        }  
240        (new CompressedDataOutputStreamDemo()).start();
241        
242        if (Utils.isClassAvailable("iaik.security.dh.ESDHPublicKey")) {
243          // requires ESDH
244          (new CMSStreamDemo()).start();
245        }  
246        
247        // smime demos
248        (new SMimeDemo()).start();
249        if (Utils.isClassAvailable("iaik.security.dh.ESDHPublicKey")) {
250          // requires ESDH
251          (new SMimeV3Demo()).start();
252          (new SMimeV4Demo()).start();
253        }
254        if ((jdkVersion != null) && (jdkVersion.compareTo("1.7") >= 0)) {
255          // S/MIME EnvelopedData with GCM only available for JDK versions >= 1.7
256          (new SMimeEnvelopedDemoAEAD()).start();
257        }  
258        if (DemoUtil.getIaikProviderVersion() > 3.18) {
259          (new demo.smime.basic.SMimeCamelliaDemo()).start();
260          (new demo.smime.basic.SMimeV3CamelliaDemo()).start();
261        }
262        (new ProcessMessageDemo()).start();
263        (new BinarySignedDemo()).start();
264        
265        // run separatly because it creates big (temporary) files
266        // (new BigSMimeMailDemo()).start();
267        
268        (new SigningCertificateDemo()).start();
269        (new TripleWrappingDemo()).start();
270        (new SignedReceiptDemo()).start();
271    
272        // run separatly (uses Swing Dialog)
273        //    
274        //    if (Utils.isClassAvailable("javax.swing.JOptionPane")) {
275        //      (new SecurityLabelDemo()).start();
276        //    }
277        
278        (new MLADemo()).start();
279        
280        
281        // TSP demos (the IAIK TSP library must be in the classpath)
282        if ((Utils.isClassAvailable("iaik.tsp.TimeStampReq")) && (DemoUtil.getIaikProviderVersion() >= 3.14)  ) {
283          (new demo.cms.tsp.TimeStampDemo()).start();
284        }
285        
286        // ECC demos (IAIK ECC provider must be in the classpath)
287        if ((Utils.isClassAvailable("iaik.security.ecc.provider.ECCProvider")) ||
288            (Utils.isClassAvailable("iaik.security.ec.provider.ECCelerate"))) {
289          // add ECC provider    
290          SecurityProvider securityProvider = ECCDemoUtil.installIaikEccProvider();
291          // CMS
292          (new demo.cms.ecc.ECDSASignedDataDemo()).start();
293          (new demo.cms.ecc.ECDSASignedDataOutputStreamDemo()).start();
294          (new demo.cms.ecc.ECDHEnvelopedDataDemo()).start();
295          if (DemoUtil.getIaikProviderVersion() >= 5.4) {
296            (new EckaEGAuthEnvelopedDataDemo()).start();
297          }
298          if ((securityProvider.getClass().getName().equals("iaik.cms.ecc.ECCelerateProvider")) &&
299              (ECCDemoUtil.getECCelerateVersion() > 6.02)) {
300            (new demo.cms.ecc.EdDSASignedDataDemo()).start();
301            (new demo.cms.ecc.EdDSASignedDataOutputStreamDemo()).start();
302            (new demo.cms.ecc.EdDHEnvelopedDataDemo()).start();
303            (new demo.cms.ecc.EdDHAuthEnvelopedDataDemo()).start();
304            (new demo.cms.ecc.EdDHAuthenticatedDataDemo()).start();
305          }
306          // S/MIME
307          (new demo.smime.ecc.SMimeEccDemo()).start();
308          if (DemoUtil.getIaikProviderVersion() > 3.13) {
309            (new demo.smime.ecc.SMimeEccSuiteBDemo()).start();
310          } 
311          if ((securityProvider.getClass().getName().equals("iaik.cms.ecc.ECCelerateProvider")) &&
312              (DemoUtil.getIaikProviderVersion() > 5.62) &&
313              (ECCDemoUtil.getECCelerateVersion() > 6.1)) {
314            (new demo.smime.ecc.SMimeV4EccDemo()).start();
315            (new demo.smime.ecc.SimpleSMimeV4EcDemo()).start();
316            (new demo.smime.ecc.SimpleSMimeV4EdDemo()).start();
317            if ((jdkVersion != null) && (jdkVersion.compareTo("1.7") >= 0)) {
318              // EnvelopedData with GCM only available for JDK versions >= 1.7
319              (new SMimeV4BrainpoolDemo()).start();
320            }  
321    
322          }
323        }  
324        
325      }
326    
327      /**
328       * Performs all tests.
329       */
330      public static void main(String arg[]) throws IOException {
331    
332        DemoSMimeUtil.initDemos();
333    
334        try {
335          (new DemoAll()).start();
336          System.out.println("All demos O.K.!!!");
337        } catch(Exception ex) {
338          System.out.println("There were errors: " + ex.toString());
339          ex.printStackTrace();
340        }
341        
342      //  DemoUtil.waitKey();
343       
344        
345      }
346    }