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/DataOutputStreamDemo.java 6 12.02.25 17:58 Dbratko $
059 // $Revision: 6 $
060 //
061
062 package demo.cms.data;
063
064 import iaik.asn1.ObjectID;
065 import iaik.cms.CMSException;
066 import iaik.cms.ContentInfoOutputStream;
067 import iaik.cms.DataOutputStream;
068 import iaik.cms.DataStream;
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 * Demonstrates the usage of class {@link iaik.cms.DataOutputStream}.
080 */
081 public class DataOutputStreamDemo {
082
083 /**
084 * Default constructor.
085 */
086 public DataOutputStreamDemo() throws IOException {
087 System.out.println();
088 System.out.println("**********************************************************************************");
089 System.out.println("* DataOutputStream demo *");
090 System.out.println("* (shows the usage of the DataOutputStream implementation) *");
091 System.out.println("**********************************************************************************");
092 System.out.println();
093 }
094
095
096 /**
097 * Uses the IAIK-CMS DataOutputStream class to encode the given data.
098 *
099 * @param message the message to be encoded, as byte representation
100 *
101 * @return the BER encoding of the <code>Data</code> object just created,
102 * wrapped in a ContentInfo
103 *
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[] createData(byte[] message) throws CMSException, IOException {
109
110 System.out.println("Create a new Data message:");
111
112 // the stream from which to read the content
113 ByteArrayInputStream is = new ByteArrayInputStream(message);
114
115 // the stream to which to write the Data object
116 ByteArrayOutputStream resultStream = new ByteArrayOutputStream();
117
118 // wrap Data into a ContentInfo
119 ContentInfoOutputStream contentInfoStream =
120 new ContentInfoOutputStream(ObjectID.cms_data, resultStream);
121 // create a new DataOutputStream object
122 DataOutputStream data = new DataOutputStream(contentInfoStream);
123
124
125 int blockSize = 8; // in real world we would use a block size like 2048
126 // write the data
127 byte[] buffer = new byte[blockSize];
128 int bytesRead;
129 while ((bytesRead = is.read(buffer)) != -1) {
130 data.write(buffer, 0, bytesRead);
131 }
132
133 // closing the stream
134 data.close();
135 return resultStream.toByteArray();
136 }
137
138 /**
139 * Parses a CMS <code>Data</code> object.
140 *
141 * @param data the <code>Data</code> object as BER encoded byte array
142 *
143 * @return the inherent content as byte array
144 *
145 * @throws CMSException if an parsing exception occurs
146 * @throws IOException if an I/O error occurs
147 */
148 public byte[] getData(byte[] data) throws CMSException, IOException {
149
150 // we are testing the stream interface
151 ByteArrayInputStream is = new ByteArrayInputStream(data);
152 // create the Data object
153 DataStream dataStream = new DataStream(is);
154
155 // get an InputStream for reading the signed content
156 InputStream content = dataStream.getInputStream();
157 ByteArrayOutputStream os = new ByteArrayOutputStream();
158 Util.copyStream(content, os, null);
159
160 return os.toByteArray();
161 }
162
163
164
165 /**
166 * Starts the tests.
167 */
168 public void start() {
169 // the test message
170 String m = "This is the test message.";
171 System.out.println("Test message: \""+m+"\"");
172 System.out.println();
173 byte[] message = m.getBytes();
174
175 try {
176 byte[] encoding;
177 byte[] received_message = null;
178
179 System.out.println("\nDataOutputStream demo [create]:\n");
180 encoding = createData(message);
181 // transmit data
182 System.out.println("\nDataOutputStream demo [parse]:\n");
183 received_message = getData(encoding);
184 System.out.print("\nContent: ");
185 System.out.println(new String(received_message));
186
187 } catch (Exception ex) {
188 ex.printStackTrace();
189 throw new RuntimeException(ex.toString());
190 }
191 }
192
193 /**
194 * Main method.
195 */
196 public static void main(String argv[]) throws Exception {
197
198 DemoUtil.initDemos();
199
200 (new DataOutputStreamDemo()).start();
201 System.out.println("\nReady!");
202 DemoUtil.waitKey();
203 }
204 }