using System; using System.IO; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Cms; using Org.BouncyCastle.Utilities.IO.Compression; namespace Org.BouncyCastle.Cms { /** * Class for reading a CMS Compressed Data stream. *
    *     CMSCompressedDataParser cp = new CMSCompressedDataParser(inputStream);
    *
    *     process(cp.GetContent().GetContentStream());
    * 
* Note: this class does not introduce buffering - if you are processing large files you should create * the parser with: *
    *      CMSCompressedDataParser     ep = new CMSCompressedDataParser(new BufferedInputStream(inputStream, bufSize));
    *  
* where bufSize is a suitably large buffer size. */ public class CmsCompressedDataParser : CmsContentInfoParser { public CmsCompressedDataParser( byte[] compressedData) : this(new MemoryStream(compressedData, false)) { } public CmsCompressedDataParser( Stream compressedData) : base(compressedData) { } public CmsTypedStream GetContent() { try { CompressedDataParser comData = new CompressedDataParser((Asn1SequenceParser)this.contentInfo.GetContent(Asn1Tags.Sequence)); ContentInfoParser content = comData.GetEncapContentInfo(); Asn1OctetStringParser bytes = (Asn1OctetStringParser)content.GetContent(Asn1Tags.OctetString); Stream zIn = ZLib.DecompressInput(bytes.GetOctetStream()); return new CmsTypedStream(content.ContentType.Id, zIn); } catch (IOException e) { throw new CmsException("IOException reading compressed content.", e); } } } }