org.bouncycastle.cms.CMSCompressedDataStreamGenerator.java Source code

Java tutorial

Introduction

Here is the source code for org.bouncycastle.cms.CMSCompressedDataStreamGenerator.java

Source

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();
        }
    }
}