Example #1
0
        public Stream Open(
            Stream outStream,
            string contentOID,
            string compressionOID)
        {
            BerSequenceGenerator sGen = new BerSequenceGenerator(outStream);

            sGen.AddObject(CmsObjectIdentifiers.CompressedData);

            //
            // Compressed Data
            //
            BerSequenceGenerator cGen = new BerSequenceGenerator(
                sGen.GetRawOutputStream(), 0, true);

            // CMSVersion
            cGen.AddObject(new DerInteger(0));

            // CompressionAlgorithmIdentifier
            cGen.AddObject(new AlgorithmIdentifier(new DerObjectIdentifier(ZLib)));

            //
            // Encapsulated ContentInfo
            //
            BerSequenceGenerator eiGen = new BerSequenceGenerator(cGen.GetRawOutputStream());

            eiGen.AddObject(new DerObjectIdentifier(contentOID));

            Stream octetStream = CmsUtilities.CreateBerOctetOutputStream(
                eiGen.GetRawOutputStream(), 0, true, _bufferSize);

            return(new CmsCompressedOutputStream(
                       new ZOutputStream(octetStream, JZlib.Z_DEFAULT_COMPRESSION), sGen, cGen, eiGen));
        }
        public Stream Open(Stream outStream, string signedContentType, bool encapsulate, Stream dataOutputStream)
        {
            //IL_0008: Unknown result type (might be due to invalid IL or missing references)
            //IL_0020: Unknown result type (might be due to invalid IL or missing references)
            //IL_003d: Unknown result type (might be due to invalid IL or missing references)
            if (outStream == null)
            {
                throw new ArgumentNullException("outStream");
            }
            if (!outStream.get_CanWrite())
            {
                throw new ArgumentException("Expected writeable stream", "outStream");
            }
            if (dataOutputStream != null && !dataOutputStream.get_CanWrite())
            {
                throw new ArgumentException("Expected writeable stream", "dataOutputStream");
            }
            _messageDigestsLocked = true;
            BerSequenceGenerator berSequenceGenerator = new BerSequenceGenerator(outStream);

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

            berSequenceGenerator2.AddObject(CalculateVersion(derObjectIdentifier));
            Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector();

            global::System.Collections.IEnumerator enumerator = ((global::System.Collections.IEnumerable)_messageDigestOids).GetEnumerator();
            try
            {
                while (enumerator.MoveNext())
                {
                    string identifier = (string)enumerator.get_Current();
                    asn1EncodableVector.Add(new AlgorithmIdentifier(new DerObjectIdentifier(identifier), DerNull.Instance));
                }
            }
            finally
            {
                global::System.IDisposable disposable = enumerator as global::System.IDisposable;
                if (disposable != null)
                {
                    disposable.Dispose();
                }
            }
            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, isExplicit: true, _bufferSize) : null);
            Stream safeTeeOutputStream = GetSafeTeeOutputStream(dataOutputStream, s);
            Stream outStream2          = AttachDigestsToOutputStream(_messageDigests.get_Values(), safeTeeOutputStream);

            return((Stream)(object)new CmsSignedDataOutputStream(this, outStream2, signedContentType, berSequenceGenerator, berSequenceGenerator2, berSequenceGenerator3));
        }
 private Stream Open(Stream outStream, AlgorithmIdentifier encAlgID, ICipherParameters cipherParameters, Asn1EncodableVector recipientInfos)
 {
     //IL_0120: Expected O, but got Unknown
     try
     {
         BerSequenceGenerator berSequenceGenerator = new BerSequenceGenerator(outStream);
         berSequenceGenerator.AddObject(CmsObjectIdentifiers.EnvelopedData);
         BerSequenceGenerator berSequenceGenerator2 = new BerSequenceGenerator(berSequenceGenerator.GetRawOutputStream(), 0, isExplicit: true);
         berSequenceGenerator2.AddObject(Version);
         Stream        rawOutputStream = berSequenceGenerator2.GetRawOutputStream();
         Asn1Generator asn1Generator   = (_berEncodeRecipientSet ? ((Asn1Generator) new BerSetGenerator(rawOutputStream)) : ((Asn1Generator) new DerSetGenerator(rawOutputStream)));
         global::System.Collections.IEnumerator enumerator = recipientInfos.GetEnumerator();
         try
         {
             while (enumerator.MoveNext())
             {
                 Asn1Encodable obj = (Asn1Encodable)enumerator.get_Current();
                 asn1Generator.AddObject(obj);
             }
         }
         finally
         {
             global::System.IDisposable disposable = enumerator as global::System.IDisposable;
             if (disposable != null)
             {
                 disposable.Dispose();
             }
         }
         asn1Generator.Close();
         BerSequenceGenerator berSequenceGenerator3 = new BerSequenceGenerator(rawOutputStream);
         berSequenceGenerator3.AddObject(CmsObjectIdentifiers.Data);
         berSequenceGenerator3.AddObject(encAlgID);
         Stream          stream = CmsUtilities.CreateBerOctetOutputStream(berSequenceGenerator3.GetRawOutputStream(), 0, isExplicit: false, _bufferSize);
         IBufferedCipher cipher = CipherUtilities.GetCipher(encAlgID.Algorithm);
         cipher.Init(forEncryption: true, new ParametersWithRandom(cipherParameters, rand));
         CipherStream outStream2 = new CipherStream(stream, null, cipher);
         return((Stream)(object)new CmsEnvelopedDataOutputStream(this, outStream2, berSequenceGenerator, berSequenceGenerator2, berSequenceGenerator3));
     }
     catch (SecurityUtilityException e)
     {
         throw new CmsException("couldn't create cipher.", e);
     }
     catch (InvalidKeyException e2)
     {
         throw new CmsException("key invalid in message.", e2);
     }
     catch (IOException val)
     {
         IOException e3 = val;
         throw new CmsException("exception decoding algorithm parameters.", (global::System.Exception)(object) e3);
     }
 }
 protected Stream Open(Stream outStr, AlgorithmIdentifier macAlgId, ICipherParameters cipherParameters, Asn1EncodableVector recipientInfos)
 {
     //IL_011d: Expected O, but got Unknown
     try
     {
         BerSequenceGenerator berSequenceGenerator = new BerSequenceGenerator(outStr);
         berSequenceGenerator.AddObject(CmsObjectIdentifiers.AuthenticatedData);
         BerSequenceGenerator berSequenceGenerator2 = new BerSequenceGenerator(berSequenceGenerator.GetRawOutputStream(), 0, isExplicit: true);
         berSequenceGenerator2.AddObject(new DerInteger(AuthenticatedData.CalculateVersion(null)));
         Stream        rawOutputStream = berSequenceGenerator2.GetRawOutputStream();
         Asn1Generator asn1Generator   = (_berEncodeRecipientSet ? ((Asn1Generator) new BerSetGenerator(rawOutputStream)) : ((Asn1Generator) new DerSetGenerator(rawOutputStream)));
         global::System.Collections.IEnumerator enumerator = recipientInfos.GetEnumerator();
         try
         {
             while (enumerator.MoveNext())
             {
                 Asn1Encodable obj = (Asn1Encodable)enumerator.get_Current();
                 asn1Generator.AddObject(obj);
             }
         }
         finally
         {
             global::System.IDisposable disposable = enumerator as global::System.IDisposable;
             if (disposable != null)
             {
                 disposable.Dispose();
             }
         }
         asn1Generator.Close();
         berSequenceGenerator2.AddObject(macAlgId);
         BerSequenceGenerator berSequenceGenerator3 = new BerSequenceGenerator(rawOutputStream);
         berSequenceGenerator3.AddObject(CmsObjectIdentifiers.Data);
         Stream output = CmsUtilities.CreateBerOctetOutputStream(berSequenceGenerator3.GetRawOutputStream(), 0, isExplicit: false, _bufferSize);
         IMac   mac    = MacUtilities.GetMac(macAlgId.Algorithm);
         mac.Init(cipherParameters);
         Stream macStream = (Stream)(object)new TeeOutputStream(output, (Stream)(object)new MacOutputStream(mac));
         return((Stream)(object)new CmsAuthenticatedDataOutputStream(macStream, mac, berSequenceGenerator, berSequenceGenerator2, berSequenceGenerator3));
     }
     catch (SecurityUtilityException e)
     {
         throw new CmsException("couldn't create cipher.", e);
     }
     catch (InvalidKeyException e2)
     {
         throw new CmsException("key invalid in message.", e2);
     }
     catch (IOException val)
     {
         IOException e3 = val;
         throw new CmsException("exception decoding algorithm parameters.", (global::System.Exception)(object) e3);
     }
 }
        public Stream Open(Stream outStream, string contentOID, string compressionOID)
        {
            BerSequenceGenerator berSequenceGenerator = new BerSequenceGenerator(outStream);

            berSequenceGenerator.AddObject(CmsObjectIdentifiers.CompressedData);
            BerSequenceGenerator berSequenceGenerator2 = new BerSequenceGenerator(berSequenceGenerator.GetRawOutputStream(), 0, isExplicit: true);

            berSequenceGenerator2.AddObject(new DerInteger(0));
            berSequenceGenerator2.AddObject(new AlgorithmIdentifier(new DerObjectIdentifier("1.2.840.113549.1.9.16.3.8")));
            BerSequenceGenerator berSequenceGenerator3 = new BerSequenceGenerator(berSequenceGenerator2.GetRawOutputStream());

            berSequenceGenerator3.AddObject(new DerObjectIdentifier(contentOID));
            Stream output = CmsUtilities.CreateBerOctetOutputStream(berSequenceGenerator3.GetRawOutputStream(), 0, isExplicit: true, _bufferSize);

            return((Stream)(object)new CmsCompressedOutputStream(new ZOutputStream(output, -1), berSequenceGenerator, berSequenceGenerator2, berSequenceGenerator3));
        }
        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));
        }
        private Stream Open(Stream outStream, AlgorithmIdentifier encAlgID, ICipherParameters cipherParameters, Asn1EncodableVector recipientInfos)
        {
            Stream result;

            try
            {
                BerSequenceGenerator berSequenceGenerator = new BerSequenceGenerator(outStream);
                berSequenceGenerator.AddObject(CmsObjectIdentifiers.EnvelopedData);
                BerSequenceGenerator berSequenceGenerator2 = new BerSequenceGenerator(berSequenceGenerator.GetRawOutputStream(), 0, true);
                berSequenceGenerator2.AddObject(this.Version);
                Stream        rawOutputStream = berSequenceGenerator2.GetRawOutputStream();
                Asn1Generator asn1Generator   = this._berEncodeRecipientSet ? new BerSetGenerator(rawOutputStream) : new DerSetGenerator(rawOutputStream);
                foreach (Asn1Encodable obj in recipientInfos)
                {
                    asn1Generator.AddObject(obj);
                }
                asn1Generator.Close();
                BerSequenceGenerator berSequenceGenerator3 = new BerSequenceGenerator(rawOutputStream);
                berSequenceGenerator3.AddObject(CmsObjectIdentifiers.Data);
                berSequenceGenerator3.AddObject(encAlgID);
                Stream          stream = CmsUtilities.CreateBerOctetOutputStream(berSequenceGenerator3.GetRawOutputStream(), 0, false, this._bufferSize);
                IBufferedCipher cipher = CipherUtilities.GetCipher(encAlgID.ObjectID);
                cipher.Init(true, new ParametersWithRandom(cipherParameters, this.rand));
                CipherStream outStream2 = new CipherStream(stream, null, cipher);
                result = new CmsEnvelopedDataStreamGenerator.CmsEnvelopedDataOutputStream(this, outStream2, berSequenceGenerator, berSequenceGenerator2, berSequenceGenerator3);
            }
            catch (SecurityUtilityException e)
            {
                throw new CmsException("couldn't create cipher.", e);
            }
            catch (InvalidKeyException e2)
            {
                throw new CmsException("key invalid in message.", e2);
            }
            catch (IOException e3)
            {
                throw new CmsException("exception decoding algorithm parameters.", e3);
            }
            return(result);
        }
Example #8
0
        protected Stream Open(Stream outStr, AlgorithmIdentifier macAlgId, ICipherParameters cipherParameters, Asn1EncodableVector recipientInfos)
        {
            Stream result;

            try
            {
                BerSequenceGenerator berSequenceGenerator = new BerSequenceGenerator(outStr);
                berSequenceGenerator.AddObject(CmsObjectIdentifiers.AuthenticatedData);
                BerSequenceGenerator berSequenceGenerator2 = new BerSequenceGenerator(berSequenceGenerator.GetRawOutputStream(), 0, true);
                berSequenceGenerator2.AddObject(new DerInteger(AuthenticatedData.CalculateVersion(null)));
                Stream        rawOutputStream = berSequenceGenerator2.GetRawOutputStream();
                Asn1Generator asn1Generator   = this._berEncodeRecipientSet ? new BerSetGenerator(rawOutputStream) : new DerSetGenerator(rawOutputStream);
                foreach (Asn1Encodable obj in recipientInfos)
                {
                    asn1Generator.AddObject(obj);
                }
                asn1Generator.Close();
                berSequenceGenerator2.AddObject(macAlgId);
                BerSequenceGenerator berSequenceGenerator3 = new BerSequenceGenerator(rawOutputStream);
                berSequenceGenerator3.AddObject(CmsObjectIdentifiers.Data);
                Stream output = CmsUtilities.CreateBerOctetOutputStream(berSequenceGenerator3.GetRawOutputStream(), 0, false, this._bufferSize);
                IMac   mac    = MacUtilities.GetMac(macAlgId.ObjectID);
                mac.Init(cipherParameters);
                Stream macStream = new TeeOutputStream(output, new MacOutputStream(mac));
                result = new CmsAuthenticatedDataStreamGenerator.CmsAuthenticatedDataOutputStream(macStream, mac, berSequenceGenerator, berSequenceGenerator2, berSequenceGenerator3);
            }
            catch (SecurityUtilityException e)
            {
                throw new CmsException("couldn't create cipher.", e);
            }
            catch (InvalidKeyException e2)
            {
                throw new CmsException("key invalid in message.", e2);
            }
            catch (IOException e3)
            {
                throw new CmsException("exception decoding algorithm parameters.", e3);
            }
            return(result);
        }
        /**
         * generate a signed object that for a CMS Signed Data
         * object using the given provider - if encapsulate is true a copy
         * of the message will be included in the signature. The content type
         * is set according to the OID represented by the string signedContentType.
         * @param out stream the CMS object is to be written to.
         * @param signedContentType OID for data to be signed.
         * @param encapsulate true if data should be encapsulated.
         * @param dataOutputStream output stream to copy the data being signed to.
         */
        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");
            }

            _messageDigestsLocked = true;

            //
            // ContentInfo
            //
            BerSequenceGenerator sGen = new BerSequenceGenerator(outStream);

            sGen.AddObject(CmsObjectIdentifiers.SignedData);

            //
            // Signed Data
            //
            BerSequenceGenerator sigGen = new BerSequenceGenerator(
                sGen.GetRawOutputStream(), 0, true);

            bool isCounterSignature = (signedContentType == null);

            DerObjectIdentifier contentTypeOid = isCounterSignature
                ? null
                : new DerObjectIdentifier(signedContentType);

            sigGen.AddObject(CalculateVersion(contentTypeOid));

            Asn1EncodableVector digestAlgs = new Asn1EncodableVector();

            foreach (string digestOid in _messageDigestOids)
            {
                digestAlgs.Add(
                    new AlgorithmIdentifier(new DerObjectIdentifier(digestOid), DerNull.Instance));
            }

            {
                byte[] tmp = new DerSet(digestAlgs).GetEncoded();
                sigGen.GetRawOutputStream().Write(tmp, 0, tmp.Length);
            }

            BerSequenceGenerator eiGen = new BerSequenceGenerator(sigGen.GetRawOutputStream());

            eiGen.AddObject(contentTypeOid);

            // If encapsulating, add the data as an octet string in the sequence
            Stream encapStream = encapsulate
                                ?       CmsUtilities.CreateBerOctetOutputStream(eiGen.GetRawOutputStream(), 0, true, _bufferSize)
                                :       null;

            // Also send the data to 'dataOutputStream' if necessary
            Stream teeStream = GetSafeTeeOutputStream(dataOutputStream, encapStream);

            // Let all the digests see the data as it is written
            Stream digStream = AttachDigestsToOutputStream(_messageDigests.Values, teeStream);

            return(new CmsSignedDataOutputStream(this, digStream, signedContentType, sGen, sigGen, eiGen));
        }
Example #10
0
		protected Stream Open(
			Stream        			outStr,
			AlgorithmIdentifier		macAlgId,
			ICipherParameters		cipherParameters,
			Asn1EncodableVector		recipientInfos)
		{
			try
			{
				//
				// ContentInfo
				//
				BerSequenceGenerator cGen = new BerSequenceGenerator(outStr);

				cGen.AddObject(CmsObjectIdentifiers.AuthenticatedData);

				//
				// Authenticated Data
				//
				BerSequenceGenerator authGen = new BerSequenceGenerator(
					cGen.GetRawOutputStream(), 0, true);

				authGen.AddObject(new DerInteger(AuthenticatedData.CalculateVersion(null)));

				Stream authRaw = authGen.GetRawOutputStream();
				Asn1Generator recipGen = _berEncodeRecipientSet
					?	(Asn1Generator) new BerSetGenerator(authRaw)
					:	new DerSetGenerator(authRaw);

				foreach (Asn1Encodable ae in recipientInfos)
				{
					recipGen.AddObject(ae);
				}

				recipGen.Close();

				authGen.AddObject(macAlgId);

				BerSequenceGenerator eiGen = new BerSequenceGenerator(authRaw);
				eiGen.AddObject(CmsObjectIdentifiers.Data);

				Stream octetOutputStream = CmsUtilities.CreateBerOctetOutputStream(
					eiGen.GetRawOutputStream(), 0, false, _bufferSize);

				IMac mac = MacUtilities.GetMac(macAlgId.ObjectID);
				// TODO Confirm no ParametersWithRandom needed
	            mac.Init(cipherParameters);
				Stream mOut = new TeeOutputStream(octetOutputStream, new MacOutputStream(mac));

				return new CmsAuthenticatedDataOutputStream(mOut, mac, cGen, authGen, 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);
			}
		}
Example #11
0
        private Stream Open(
            Stream outStream,
            AlgorithmIdentifier encAlgID,
            ICipherParameters cipherParameters,
            Asn1EncodableVector recipientInfos)
        {
            try
            {
                //
                // ContentInfo
                //
                BerSequenceGenerator cGen = new BerSequenceGenerator(outStream);

                cGen.AddObject(CmsObjectIdentifiers.EnvelopedData);

                //
                // Encrypted Data
                //
                BerSequenceGenerator envGen = new BerSequenceGenerator(
                    cGen.GetRawOutputStream(), 0, true);

                envGen.AddObject(this.Version);

                Stream        envRaw   = envGen.GetRawOutputStream();
                Asn1Generator recipGen = _berEncodeRecipientSet
                                        ?       (Asn1Generator) new BerSetGenerator(envRaw)
                                        :       new DerSetGenerator(envRaw);

                foreach (Asn1Encodable ae in recipientInfos)
                {
                    recipGen.AddObject(ae);
                }

                recipGen.Close();

                BerSequenceGenerator eiGen = new BerSequenceGenerator(envRaw);
                eiGen.AddObject(CmsObjectIdentifiers.Data);
                eiGen.AddObject(encAlgID);

                Stream octetOutputStream = CmsUtilities.CreateBerOctetOutputStream(
                    eiGen.GetRawOutputStream(), 0, false, _bufferSize);

                IBufferedCipher cipher = CipherUtilities.GetCipher(encAlgID.ObjectID);
                cipher.Init(true, new ParametersWithRandom(cipherParameters, rand));
                CipherStream cOut = new CipherStream(octetOutputStream, null, cipher);

                return(new CmsEnvelopedDataOutputStream(this, 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);
            }
        }