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/pkcs7cms/PKCS7CMSDataDemo.java 16 12.02.25 17:58 Dbratko $
059 // $Revision: 16 $
060 //
061
062 package demo.cms.pkcs7cms;
063
064 import iaik.asn1.ASN1Object;
065 import iaik.cms.CMSException;
066 import iaik.cms.Data;
067 import iaik.cms.DataStream;
068 import iaik.pkcs.PKCSException;
069 import iaik.utils.Util;
070
071 import java.io.ByteArrayInputStream;
072 import java.io.ByteArrayOutputStream;
073 import java.io.IOException;
074 import java.io.InputStream;
075
076 import demo.DemoUtil;
077
078
079
080 /**
081 * Compares the usage of IAIK CMS Data(Stream) with IAIK PKCS7 Data(Stream).
082 */
083 public class PKCS7CMSDataDemo {
084
085
086 /**
087 * Default constructor.
088 */
089 public PKCS7CMSDataDemo() {
090 System.out.println();
091 System.out.println("**********************************************************************************");
092 System.out.println("* PKCS7CMSDataDemo demo *");
093 System.out.println("* (tests the CMS Data against the IAIK-JCE PKCS#7 Data type implementation) *");
094 System.out.println("**********************************************************************************");
095 System.out.println();
096
097 }
098
099 /**
100 * Creates a CMS <code>Data</code> object.
101 * <p>
102 * @param message the message to be sent, as byte representation
103 * @return the DER encoding of the <code>Data</code> object just created
104 * @throws CMSException if the <code>Data</code> object cannot
105 * be created
106 * @throws IOException if an I/O error occurs
107 */
108 public byte[] createDataStream(byte[] message) throws CMSException, IOException {
109
110 System.out.println("Create a new Data message:");
111
112 // we are testing the stream interface
113 ByteArrayInputStream is = new ByteArrayInputStream(message);
114
115 // create a new Data object which includes the data
116 DataStream data = new DataStream(is, 2048);
117
118 // return the Data as BER encoded byte array with block size 2048
119 ByteArrayOutputStream os = new ByteArrayOutputStream();
120 data.writeTo(os);
121 return os.toByteArray();
122 }
123
124 /**
125 * Parses a CMS <code>Data</code> object.
126 *
127 * @param data the <code>Data</code> object as DER encoded byte array
128 *
129 * @return the inherent message as byte array
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 ASN.1 representation of the <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 ASN1Object 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.toASN1Object();
166 }
167
168 /**
169 * Parses a CMS <code>Data</code> object.
170 *
171 * @param asn1Object the <code>Data</code> object as ASN.1 object
172 *
173 * @return the inherent message as byte array
174 * @throws CMSException if an parsing exception occurs
175 * @throws IOException if an I/O error occurs
176 */
177 public byte[] getData(ASN1Object asn1Object) throws CMSException, IOException {
178
179 // create the Data object
180 Data data = new Data(asn1Object);
181
182 // get and return the content
183 return data.getData();
184 }
185
186 // PKCS#7
187
188 /**
189 * Creates a PKCS#7 <code>Data</code> object.
190 * <p>
191 * @param message the message to be sent, as byte representation
192 * @return the DER encoding of the <code>Data</code> object just created
193 * @throws PKCSException if the <code>Data</code> object cannot
194 * be created
195 * @throws IOException if an I/O error occurs
196 */
197 public byte[] createPKCS7DataStream(byte[] message)
198 throws iaik.pkcs.PKCSException, IOException {
199
200 System.out.println("Create a new Data message:");
201
202 // we are testing the stream interface
203 ByteArrayInputStream is = new ByteArrayInputStream(message);
204
205 // create a new Data object which includes the data
206 iaik.pkcs.pkcs7.DataStream data = new iaik.pkcs.pkcs7.DataStream(is, 2048);
207
208 // return the Data as BER encoded byte array with block size 2048
209 ByteArrayOutputStream os = new ByteArrayOutputStream();
210 data.writeTo(os);
211 return os.toByteArray();
212 }
213
214 /**
215 * Parses a PKCS#7 <code>Data</code> object.
216 *
217 * @param data the <code>Data</code> object as DER encoded byte array
218 *
219 * @return the inherent message as byte array, or <code>null</code> if there
220 * is no message included into the supplied <code>data</code>
221 * object
222 * @throws PKCSException if an parsing exception occurs
223 * @throws IOException if an I/O error occurs
224 */
225 public byte[] getPKCS7DataStream(byte[] data) throws iaik.pkcs.PKCSException, IOException {
226
227 // we are testing the stream interface
228 ByteArrayInputStream is = new ByteArrayInputStream(data);
229 // create the Data object
230 iaik.pkcs.pkcs7.DataStream dataStream = new iaik.pkcs.pkcs7.DataStream(is);
231
232 // get an InputStream for reading the signed content
233 InputStream content = dataStream.getInputStream();
234 ByteArrayOutputStream os = new ByteArrayOutputStream();
235 Util.copyStream(content, os, null);
236
237 return os.toByteArray();
238 }
239
240
241 /**
242 * Creates a PKCS#7 <code>Data</code> object.
243 * <p>
244 * @param message the message to be sent, as byte representation
245 * @return the ASN.1 representation of the <code>Data</code> object just created
246 * @throws PKCSException if the <code>Data</code> object cannot
247 * be created
248 * @throws IOException if an I/O error occurs
249 */
250 public ASN1Object createPKCS7Data(byte[] message) throws iaik.pkcs.PKCSException, IOException {
251
252 System.out.println("Create a new Data message:");
253
254 // create a new DigestedData object which includes the data
255 iaik.pkcs.pkcs7.Data data = new iaik.pkcs.pkcs7.Data(message);
256 // return the ASN.1 representation
257 return data.toASN1Object();
258 }
259
260 /**
261 * Parses a PKCS#7 <code>Data</code> object.
262 *
263 * @param asn1Object the <code>Data</code> object as ASN.1 object
264 *
265 * @return the inherent message as byte array
266 * @throws PKCSException if an parsing exception occurs
267 * @throws IOException if an IOException occurs
268 */
269 public byte[] getPKCS7Data(ASN1Object asn1Object) throws iaik.pkcs.PKCSException, IOException {
270
271 // create the Data object
272 iaik.pkcs.pkcs7.Data data = new iaik.pkcs.pkcs7.Data(asn1Object);
273
274 // get and return the content
275 return data.getData();
276 }
277
278
279 /**
280 * Tests IAIK CMS Data(Stream) against IAIK PKCS7 Data(Stream).
281 */
282 public void start() {
283 // the test message
284 String m = "This is the test message.";
285 System.out.println("Test message: \""+m+"\"");
286 System.out.println();
287 byte[] message = m.getBytes();
288
289 try {
290 byte[] data;
291 byte[] received_message = null;
292 System.out.println("Stream implementation demos");
293 System.out.println("===========================");
294
295 // the stream implementation
296 //
297 // test CMS DataStream
298 //
299 System.out.println("\nDataStream demo [create]:\n");
300 data = createDataStream(message);
301 // transmit data
302 System.out.println("\nDataStream demo [parse]:\n");
303 received_message = getDataStream(data);
304 System.out.print("\nContent: ");
305 System.out.println(new String(received_message));
306
307 System.out.println("Testing CMS against PKCS#7...\n");
308
309 System.out.println("\nCMS DataStream demo [create]:\n");
310 data = createDataStream(message);
311 // transmit data
312 System.out.println("\nPKCS7 DataStream demo [parse]:\n");
313 received_message = getPKCS7DataStream(data);
314 System.out.print("\nContent: ");
315 System.out.println(new String(received_message));
316
317 System.out.println("\nPKCS#7 DataStream demo [create]:\n");
318 data = createPKCS7DataStream(message);
319 // transmit data
320 System.out.println("\nCMS DataStream demo [parse]:\n");
321 received_message = getDataStream(data);
322 System.out.print("\nContent: ");
323 System.out.println(new String(received_message));
324
325 // the non-stream implementation
326 System.out.println("\nNon-stream implementation demos");
327 System.out.println("===============================");
328
329 //
330 // test CMS Data
331 //
332 ASN1Object obj = null;
333
334 System.out.println("\nData demo [create]:\n");
335 obj = createData(message);
336 // transmit data
337 System.out.println("\nData demo [parse]:\n");
338
339 received_message = getData(obj);
340 System.out.print("\nContent: ");
341 System.out.println(new String(received_message));
342
343 System.out.println("Testing CMS against PKCS#7...\n");
344
345 System.out.println("\nCMS Data demo [create]:\n");
346 obj = createData(message);
347 // transmit data
348 System.out.println("\nPKCS#7 Data demo [parse]:\n");
349
350 received_message = getPKCS7Data(obj);
351 System.out.print("\nContent: ");
352 System.out.println(new String(received_message));
353
354 System.out.println("\nPKCS#7 Data demo [create]:\n");
355 obj = createPKCS7Data(message);
356 // transmit data
357 System.out.println("\nCMS Data demo [parse]:\n");
358
359 received_message = getData(obj);
360 System.out.print("\nContent: ");
361 System.out.println(new String(received_message));
362
363 } catch (Exception ex) {
364 ex.printStackTrace();
365 throw new RuntimeException(ex.toString());
366 }
367 }
368
369 /**
370 * Starts the CMS - PKCS#7 tests.
371 */
372 public static void main(String argv[]) throws Exception {
373
374 (new PKCS7CMSDataDemo()).start();
375 System.out.println("\nReady!");
376 DemoUtil.waitKey();
377 }
378 }