private static Stream AttachDigestsToOutputStream(ICollection digests, Stream s)
        {
            Stream stream = s;

            foreach (IDigest dig in digests)
            {
                stream = CmsSignedDataStreamGenerator.GetSafeTeeOutputStream(stream, new DigOutputStream(dig));
            }
            return(stream);
        }
        public Stream Open(Stream outStream, string signedContentType, bool encapsulate, Stream dataOutputStream)
        {
            if (outStream == null)
            {
                throw new ArgumentNullException("outStream");
            }
            if (!outStream.CanWrite)
            {
                throw new ArgumentException("Expected writeable stream", "outStream");
            }
            if (dataOutputStream != null && !dataOutputStream.CanWrite)
            {
                throw new ArgumentException("Expected writeable stream", "dataOutputStream");
            }
            this._messageDigestsLocked = true;
            BerSequenceGenerator berSequenceGenerator = new BerSequenceGenerator(outStream);

            berSequenceGenerator.AddObject(CmsObjectIdentifiers.SignedData);
            BerSequenceGenerator berSequenceGenerator2 = new BerSequenceGenerator(berSequenceGenerator.GetRawOutputStream(), 0, true);
            DerObjectIdentifier  derObjectIdentifier   = (signedContentType == null) ? null : new DerObjectIdentifier(signedContentType);

            berSequenceGenerator2.AddObject(this.CalculateVersion(derObjectIdentifier));
            Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(new Asn1Encodable[0]);

            foreach (string identifier in this._messageDigestOids)
            {
                asn1EncodableVector.Add(new Asn1Encodable[]
                {
                    new AlgorithmIdentifier(new DerObjectIdentifier(identifier), DerNull.Instance)
                });
            }
            byte[] encoded = new DerSet(asn1EncodableVector).GetEncoded();
            berSequenceGenerator2.GetRawOutputStream().Write(encoded, 0, encoded.Length);
            BerSequenceGenerator berSequenceGenerator3 = new BerSequenceGenerator(berSequenceGenerator2.GetRawOutputStream());

            berSequenceGenerator3.AddObject(derObjectIdentifier);
            Stream s = encapsulate ? CmsUtilities.CreateBerOctetOutputStream(berSequenceGenerator3.GetRawOutputStream(), 0, true, this._bufferSize) : null;
            Stream safeTeeOutputStream = CmsSignedDataStreamGenerator.GetSafeTeeOutputStream(dataOutputStream, s);
            Stream outStream2          = CmsSignedDataStreamGenerator.AttachDigestsToOutputStream(this._messageDigests.Values, safeTeeOutputStream);

            return(new CmsSignedDataStreamGenerator.CmsSignedDataOutputStream(this, outStream2, signedContentType, berSequenceGenerator, berSequenceGenerator2, berSequenceGenerator3));
        }