protected Stream Open( Stream outStream, string encryptionOid, KeyParameter encKey, Asn1Encodable asn1Params, Asn1EncodableVector recipientInfos) { Asn1Object asn1Object; ICipherParameters cipherParameters; if (asn1Params != null) { asn1Object = asn1Params.ToAsn1Object(); cipherParameters = ParameterUtilities.GetCipherParameters( encryptionOid, encKey, asn1Object); } else { asn1Object = DerNull.Instance; cipherParameters = encKey; } try { AlgorithmIdentifier encAlgId = new AlgorithmIdentifier( new DerObjectIdentifier(encryptionOid), asn1Object); // // ContentInfo // BerSequenceGenerator cGen = new BerSequenceGenerator(outStream); cGen.AddObject(CmsObjectIdentifiers.EnvelopedData); // // Encrypted Data // BerSequenceGenerator envGen = new BerSequenceGenerator( cGen.GetRawOutputStream(), 0, true); envGen.AddObject(this.Version); DerSet derSet = _berEncodeRecipientSet ? new BerSet(recipientInfos) : new DerSet(recipientInfos); byte[] derSetEncoding = derSet.GetEncoded(); envGen.GetRawOutputStream().Write(derSetEncoding, 0, derSetEncoding.Length); IBufferedCipher cipher = CipherUtilities.GetCipher(encryptionOid); cipher.Init(true, cipherParameters); BerSequenceGenerator eiGen = new BerSequenceGenerator( envGen.GetRawOutputStream()); eiGen.AddObject(PkcsObjectIdentifiers.Data); byte[] tmp = encAlgId.GetEncoded(); eiGen.GetRawOutputStream().Write(tmp, 0, tmp.Length); BerOctetStringGenerator octGen = new BerOctetStringGenerator( eiGen.GetRawOutputStream(), 0, false); Stream octetOutputStream = _bufferSize != 0 ? octGen.GetOctetOutputStream(new byte[_bufferSize]) : octGen.GetOctetOutputStream(); CipherStream cOut = new CipherStream(octetOutputStream, null, cipher); return(new CmsEnvelopedDataOutputStream(cOut, cGen, envGen, eiGen)); } catch (SecurityUtilityException e) { throw new CmsException("couldn't create cipher.", e); } catch (InvalidKeyException e) { throw new CmsException("key invalid in message.", e); } catch (IOException e) { throw new CmsException("exception decoding algorithm parameters.", e); } }