1
package org.bouncycastle.cms;
3
import java.io.IOException;
4
import java.io.OutputStream;
5
import java.util.zip.DeflaterOutputStream;
7
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
8
import org.bouncycastle.asn1.BERSequenceGenerator;
9
import org.bouncycastle.asn1.DERInteger;
10
import org.bouncycastle.asn1.DERObjectIdentifier;
11
import org.bouncycastle.asn1.DERSequenceGenerator;
12
import org.bouncycastle.asn1.cms.CMSObjectIdentifiers;
13
import org.bouncycastle.operator.OutputCompressor;
16
* General class for generating a compressed CMS message stream.
18
* A simple example of usage.
21
* CMSCompressedDataStreamGenerator gen = new CMSCompressedDataStreamGenerator();
23
* OutputStream cOut = gen.open(outputStream, new ZlibCompressor());
30
public class CMSCompressedDataStreamGenerator
32
public static final String ZLIB = "1.2.840.113549.1.9.16.3.8";
34
private int _bufferSize;
39
public CMSCompressedDataStreamGenerator()
44
* Set the underlying string size for encapsulated data
46
* @param bufferSize length of octet strings to buffer the data.
48
public void setBufferSize(
51
_bufferSize = bufferSize;
55
* @deprecated use open(OutputStream, ContentCompressor)
57
public OutputStream open(
59
String compressionOID)
62
return open(out, CMSObjectIdentifiers.data.getId(), compressionOID);
66
* @deprecated use open(OutputStream, ASN1ObjectIdentifier, ContentCompressor)
68
public OutputStream open(
71
String compressionOID)
74
BERSequenceGenerator sGen = new BERSequenceGenerator(out);
76
sGen.addObject(CMSObjectIdentifiers.compressedData);
81
BERSequenceGenerator cGen = new BERSequenceGenerator(sGen.getRawOutputStream(), 0, true);
83
cGen.addObject(new DERInteger(0));
86
// AlgorithmIdentifier
88
DERSequenceGenerator algGen = new DERSequenceGenerator(cGen.getRawOutputStream());
90
algGen.addObject(new DERObjectIdentifier(ZLIB));
95
// Encapsulated ContentInfo
97
BERSequenceGenerator eiGen = new BERSequenceGenerator(cGen.getRawOutputStream());
99
eiGen.addObject(new DERObjectIdentifier(contentOID));
101
OutputStream octetStream = CMSUtils.createBEROctetOutputStream(
102
eiGen.getRawOutputStream(), 0, true, _bufferSize);
104
return new CmsCompressedOutputStream(
105
new DeflaterOutputStream(octetStream), sGen, cGen, eiGen);
108
public OutputStream open(
110
OutputCompressor compressor)
113
return open(CMSObjectIdentifiers.data, out, compressor);
117
* Open a compressing output stream.
123
* @throws IOException
125
public OutputStream open(
126
ASN1ObjectIdentifier contentOID,
128
OutputCompressor compressor)
131
BERSequenceGenerator sGen = new BERSequenceGenerator(out);
133
sGen.addObject(CMSObjectIdentifiers.compressedData);
138
BERSequenceGenerator cGen = new BERSequenceGenerator(sGen.getRawOutputStream(), 0, true);
140
cGen.addObject(new DERInteger(0));
143
// AlgorithmIdentifier
145
cGen.addObject(compressor.getAlgorithmIdentifier());
148
// Encapsulated ContentInfo
150
BERSequenceGenerator eiGen = new BERSequenceGenerator(cGen.getRawOutputStream());
152
eiGen.addObject(contentOID);
154
OutputStream octetStream = CMSUtils.createBEROctetOutputStream(
155
eiGen.getRawOutputStream(), 0, true, _bufferSize);
157
return new CmsCompressedOutputStream(
158
compressor.getOutputStream(octetStream), sGen, cGen, eiGen);
161
private class CmsCompressedOutputStream
164
private OutputStream _out;
165
private BERSequenceGenerator _sGen;
166
private BERSequenceGenerator _cGen;
167
private BERSequenceGenerator _eiGen;
169
CmsCompressedOutputStream(
171
BERSequenceGenerator sGen,
172
BERSequenceGenerator cGen,
173
BERSequenceGenerator eiGen)
195
_out.write(bytes, off, len);