blob: 8a34eb01fd66328c604696a0d94592e89c39b30a [file] [log] [blame]
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();
}
}
}