diff options
Diffstat (limited to 'pkix/src/main/java/org/spongycastle/cms/CMSCompressedDataStreamGenerator.java')
-rw-r--r-- | pkix/src/main/java/org/spongycastle/cms/CMSCompressedDataStreamGenerator.java | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/pkix/src/main/java/org/spongycastle/cms/CMSCompressedDataStreamGenerator.java b/pkix/src/main/java/org/spongycastle/cms/CMSCompressedDataStreamGenerator.java new file mode 100644 index 00000000..47af9b4f --- /dev/null +++ b/pkix/src/main/java/org/spongycastle/cms/CMSCompressedDataStreamGenerator.java @@ -0,0 +1,165 @@ +package org.spongycastle.cms; + +import java.io.IOException; +import java.io.OutputStream; + +import org.spongycastle.asn1.ASN1Integer; +import org.spongycastle.asn1.ASN1ObjectIdentifier; +import org.spongycastle.asn1.BERSequenceGenerator; +import org.spongycastle.asn1.cms.CMSObjectIdentifiers; +import org.spongycastle.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(); + } + } +} |