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/data/DataDemo.java 18    12.02.25 17:58 Dbratko $
059    // $Revision: 18 $
060    //
061    
062    package demo.cms.data;
063    
064    import iaik.cms.CMSException;
065    import iaik.cms.Data;
066    import iaik.cms.DataStream;
067    import iaik.utils.Util;
068    
069    import java.io.ByteArrayInputStream;
070    import java.io.ByteArrayOutputStream;
071    import java.io.IOException;
072    import java.io.InputStream;
073    
074    import demo.DemoUtil;
075    
076    
077    
078    /**
079     * Shows the usage of the IAIK-CMS Data(Stream) implementation.
080     */
081    public class DataDemo {
082    
083     
084      /**
085       * Default constructor.
086       */
087      public DataDemo() {
088        System.out.println();
089        System.out.println("**********************************************************************************");
090        System.out.println("*                                  DataDemo                                      *");
091        System.out.println("*             (shows the usage of the CMS Data type implementation)              *");
092        System.out.println("**********************************************************************************");
093        System.out.println();
094    
095      }
096      
097      /**
098       * Creates a CMS <code>Data</code> object.
099       * <p>
100       * @param message the message to be sent, as byte representation
101       * @return the BER encoding of the <code>Data</code> object just created
102       * @throws CMSException if the <code>Data</code> object cannot
103       *                          be created
104       * @throws IOException if an I/O error occurs
105       */
106      public byte[] createDataStream(byte[] message) throws CMSException, IOException  {
107    
108        System.out.println("Create a new Data message:");
109    
110        // we are testing the stream interface
111        ByteArrayInputStream is = new ByteArrayInputStream(message);
112    
113        // create a new Data object which includes the data
114        DataStream data = new DataStream(is, 2048);
115    
116    
117        // return the Data as BER encoded byte array with block size 2048
118        ByteArrayOutputStream os = new ByteArrayOutputStream();
119        data.writeTo(os);
120        return os.toByteArray();
121      }
122    
123      /**
124       * Parses a CMS <code>Data</code> object.
125       *
126       * @param data the <code>Data</code> object as BER encoded byte array
127       *
128       * @return the inherent content as byte array
129       *
130       * @throws CMSException if an parsing exception occurs
131       * @throws IOException if an I/O error occurs
132       */
133      public byte[] getDataStream(byte[] data) throws CMSException, IOException {
134    
135        // we are testing the stream interface
136        ByteArrayInputStream is = new ByteArrayInputStream(data);
137        // create the Data object
138        DataStream dataStream = new DataStream(is);
139    
140        // get an InputStream for reading the signed content
141        InputStream content = dataStream.getInputStream();
142        ByteArrayOutputStream os = new ByteArrayOutputStream();
143        Util.copyStream(content, os, null);
144    
145        return os.toByteArray();
146      }
147    
148    
149      /**
150       * Creates a CMS <code>Data</code> object.
151       * <p>
152       * @param message the message to be sent, as byte representation
153       * @return the the DER encoded <code>Data</code> object just created
154       * @throws CMSException if the <code>Data</code> object cannot
155       *                          be created
156       * @throws IOException if an I/O error occurs
157       */
158      public byte[] createData(byte[] message) throws CMSException, IOException  {
159    
160        System.out.println("Create a new Data message:");
161    
162        // create a new DigestedData object which includes the data
163        Data data = new Data(message);
164        // return the ASN.1 representation
165        return data.getEncoded();
166      }
167    
168      /**
169       * Parses a CMS <code>Data</code> object.
170       *
171       * @param encoding the DER encoded <code>Data</code> object
172       *
173       * @return the inherent content as byte array
174       *
175       * @throws CMSException if an parsing exception occurs
176       * @throws IOException if an I/O error occurs
177       */
178      public byte[] getData(byte[] encoding) throws CMSException, IOException {
179    
180        // create the Data object
181        Data data = new Data(new ByteArrayInputStream(encoding));
182    
183        // get and return the content
184        return data.getData();
185      }
186      
187     
188      /**
189       * Tests IAIK CMS Data(Stream).
190       */
191      public void start() {
192         // the test message
193        String m = "This is the test message.";
194        System.out.println("Test message: \""+m+"\"");
195        System.out.println();
196        byte[] message = m.getBytes();
197    
198        try {
199          byte[] encoding;
200          byte[] received_message = null;
201          System.out.println("Stream implementation demos");
202          System.out.println("===========================");
203    
204          // the stream implementation
205          //
206          // test CMS DataStream
207          //
208          System.out.println("\nDataStream demo [create]:\n");
209          encoding = createDataStream(message);
210          // transmit data
211          System.out.println("\nDataStream demo [parse]:\n");
212          received_message = getDataStream(encoding);
213          System.out.print("\nContent: ");
214          System.out.println(new String(received_message));
215          
216         
217          // the non-stream implementation
218          System.out.println("\nNon-stream implementation demos");
219          System.out.println("===============================");
220    
221          //
222          // test CMS Data
223          //
224         
225          System.out.println("\nData demo [create]:\n");
226          encoding = createData(message);
227          // transmit data
228          System.out.println("\nData demo [parse]:\n");
229    
230          received_message = getData(encoding);
231          System.out.print("\nContent: ");
232          System.out.println(new String(received_message));
233          
234            } catch (Exception ex) {
235              ex.printStackTrace();
236              throw new RuntimeException(ex.toString());
237            }
238      }
239    
240      /**
241       * Main method.
242       */
243      public static void main(String argv[]) throws Exception {
244    
245            (new DataDemo()).start();
246        System.out.println("\nReady!");
247        DemoUtil.waitKey();
248      }
249    }