| package org.bouncycastle.cms; |
| |
| import java.io.IOException; |
| import java.io.OutputStream; |
| |
| import org.bouncycastle.asn1.ASN1Integer; |
| import org.bouncycastle.asn1.ASN1ObjectIdentifier; |
| import org.bouncycastle.asn1.BERSequenceGenerator; |
| import org.bouncycastle.asn1.cms.CMSObjectIdentifiers; |
| import org.bouncycastle.operator.OutputCompressor; |
| |
| /** |
| * General class for generating a compressed CMS message stream. |
| * <p> |
| * A simple example of usage. |
| * </p> |
| * <pre> |
| * CMSCompressedDataStreamGenerator gen = new CMSCompressedDataStreamGenerator(); |
| * |
| * OutputStream cOut = gen.open(outputStream, new ZlibCompressor()); |
| * |
| * cOut.write(data); |
| * |
| * cOut.close(); |
| * </pre> |
| */ |
| public class CMSCompressedDataStreamGenerator |
| { |
| public static final String ZLIB = "1.2.840.113549.1.9.16.3.8"; |
| |
| private int _bufferSize; |
| |
| /** |
| * base constructor |
| */ |
| public CMSCompressedDataStreamGenerator() |
| { |
| } |
| |
| /** |
| * Set the underlying string size for encapsulated data |
| * |
| * @param bufferSize length of octet strings to buffer the data. |
| */ |
| public void setBufferSize( |
| int bufferSize) |
| { |
| _bufferSize = bufferSize; |
| } |
| |
| /** |
| * Open a compressing output stream with the PKCS#7 content type OID of "data". |
| * |
| * @param out the stream to encode to. |
| * @param compressor the type of compressor to use. |
| * @return an output stream to write the data be compressed to. |
| * @throws IOException |
| */ |
| public OutputStream open( |
| OutputStream out, |
| OutputCompressor compressor) |
| throws IOException |
| { |
| return open(CMSObjectIdentifiers.data, out, compressor); |
| } |
| |
| /** |
| * Open a compressing output stream. |
| * |
| * @param contentOID the content type OID. |
| * @param out the stream to encode to. |
| * @param compressor the type of compressor to use. |
| * @return an output stream to write the data be compressed to. |
| * @throws IOException |
| */ |
| public OutputStream open( |
| ASN1ObjectIdentifier contentOID, |
| OutputStream out, |
| OutputCompressor compressor) |
| throws IOException |
| { |
| BERSequenceGenerator sGen = new BERSequenceGenerator(out); |
| |
| sGen.addObject(CMSObjectIdentifiers.compressedData); |
| |
| // |
| // Compressed Data |
| // |
| BERSequenceGenerator cGen = new BERSequenceGenerator(sGen.getRawOutputStream(), 0, true); |
| |
| cGen.addObject(new ASN1Integer(0)); |
| |
| // |
| // AlgorithmIdentifier |
| // |
| cGen.addObject(compressor.getAlgorithmIdentifier()); |
| |
| // |
| // Encapsulated ContentInfo |
| // |
| BERSequenceGenerator eiGen = new BERSequenceGenerator(cGen.getRawOutputStream()); |
| |
| eiGen.addObject(contentOID); |
| |
| OutputStream octetStream = CMSUtils.createBEROctetOutputStream( |
| eiGen.getRawOutputStream(), 0, true, _bufferSize); |
| |
| return new CmsCompressedOutputStream( |
| compressor.getOutputStream(octetStream), sGen, cGen, eiGen); |
| } |
| |
| private class CmsCompressedOutputStream |
| extends OutputStream |
| { |
| private OutputStream _out; |
| private BERSequenceGenerator _sGen; |
| private BERSequenceGenerator _cGen; |
| private BERSequenceGenerator _eiGen; |
| |
| CmsCompressedOutputStream( |
| OutputStream out, |
| BERSequenceGenerator sGen, |
| BERSequenceGenerator cGen, |
| BERSequenceGenerator eiGen) |
| { |
| _out = out; |
| _sGen = sGen; |
| _cGen = cGen; |
| _eiGen = eiGen; |
| } |
| |
| public void write( |
| int b) |
| throws IOException |
| { |
| _out.write(b); |
| } |
| |
| |
| public void write( |
| byte[] bytes, |
| int off, |
| int len) |
| throws IOException |
| { |
| _out.write(bytes, off, len); |
| } |
| |
| public void write( |
| byte[] bytes) |
| throws IOException |
| { |
| _out.write(bytes); |
| } |
| |
| public void close() |
| throws IOException |
| { |
| _out.close(); |
| _eiGen.close(); |
| _cGen.close(); |
| _sGen.close(); |
| } |
| } |
| } |