internal BerApplicationSpecificParser(
			int					tag,
			Asn1StreamParser	parser)
		{
			this.tag = tag;
			this.parser = parser;
		}
Esempio n. 2
0
		internal BerTaggedObjectParser(
			bool				constructed,
			int					tagNumber,
			Asn1StreamParser	parser)
		{
			_constructed = constructed;
			_tagNumber = tagNumber;
			_parser = parser;
		}
Esempio n. 3
0
        internal Asn1ObjectParser(
			int		baseTag,
			int		tagNumber,
			Stream	contentStream)
        {
            _baseTag = baseTag;
            _tagNumber = tagNumber;
            _aIn = new Asn1StreamParser(contentStream);
        }
Esempio n. 4
0
        public byte[] UnWrapCMS(byte[] cipher, out byte[] sessionKey, out byte[] IV)
        {
            //These method calls must remain in this order.

            //Content Info
            A.Asn1StreamParser strmParser = new A.Asn1StreamParser(cipher);
            A.Cms.ContentInfoParser cInfoParser = new A.Cms.ContentInfoParser((A.Asn1SequenceParser)strmParser.ReadObject());
            A.Asn1SequenceParser seqParser = (A.Asn1SequenceParser)cInfoParser.GetContent(A.Asn1Tags.Sequence);

            //Enveloped Data
            A.Cms.EnvelopedDataParser envDataParser = new A.Cms.EnvelopedDataParser(seqParser);

            //Recipent Info
            //GetOriginatorInfo() This method gets called from GetRecipientInfos
            A.DerSetParser rec = (A.DerSetParser)envDataParser.GetRecipientInfos();
            A.Asn1Object recInfoData = rec.ReadObject().ToAsn1Object();
            A.Cms.RecipientInfo recipInfo = new A.Cms.RecipientInfo(recInfoData);

            //Symmetric session key
            A.Cms.KeyTransRecipientInfo trans = (A.Cms.KeyTransRecipientInfo)recipInfo.Info;
            byte[] cipherSessionKey = trans.EncryptedKey.GetOctets();
            X509Certificate2 cert = this.Certificate;
            RSACryptoServiceProvider rsaCrypto = (RSACryptoServiceProvider)cert.PrivateKey;
            sessionKey = rsaCrypto.Decrypt(cipherSessionKey, false);

            //Encrypted Content Info
            A.Cms.EncryptedContentInfoParser encrContentInfoParser = envDataParser.GetEncryptedContentInfo();

            //Symmetric Initialization Vector
            A.X509.AlgorithmIdentifier aes = encrContentInfoParser.ContentEncryptionAlgorithm;
            A.DerOctetString initVector = (A.DerOctetString)aes.Parameters;
            IV = initVector.GetOctets();

            //Card data
            List<byte> cipherBytes = new List<byte>();
            A.DerOctetStringParser cipherContent = (A.DerOctetStringParser)encrContentInfoParser.GetEncryptedContent(A.Asn1Tags.OctetString);
            using (System.IO.Stream cipherStrm = cipherContent.GetOctetStream())
            {
                int b = cipherStrm.ReadByte();

                while (b > -1)
                {
                    cipherBytes.Add((byte)b);
                    b = cipherStrm.ReadByte();
                }
            }

            return cipherBytes.ToArray();
        }
Esempio n. 5
0
		protected CmsContentInfoParser(
			Stream data)
		{
			if (data == null)
				throw new ArgumentNullException("data");

			this.data = data;

			try
			{
				Asn1StreamParser inStream = new Asn1StreamParser(data);

				this.contentInfo = new ContentInfoParser((Asn1SequenceParser)inStream.ReadObject());
			}
			catch (IOException e)
			{
				throw new CmsException("IOException reading content.", e);
			}
			catch (InvalidCastException e)
			{
				throw new CmsException("Unexpected object reading content.", e);
			}
		}
        public Asn1Object ReadObject()
        {
            int tag = ReadByte();
            if (tag <= 0)
            {
                if (tag == 0)
                    throw new IOException("unexpected end-of-contents marker");

                return null;
            }

            //
            // calculate tag number
            //
            int tagNo = ReadTagNumber(this.s, tag);

            bool isConstructed = (tag & Asn1Tags.Constructed) != 0;

            //
            // calculate length
            //
            int length = ReadLength(this.s, limit);

            if (length < 0) // indefinite length method
            {
                if (!isConstructed)
                    throw new IOException("indefinite length primitive encoding encountered");

                IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(this.s, limit);
                Asn1StreamParser sp = new Asn1StreamParser(indIn, limit);

                if ((tag & Asn1Tags.Application) != 0)
                {
                    return new BerApplicationSpecificParser(tagNo, sp).ToAsn1Object();
                }

                if ((tag & Asn1Tags.Tagged) != 0)
                {
                    return new BerTaggedObjectParser(true, tagNo, sp).ToAsn1Object();
                }

                // TODO There are other tags that may be constructed (e.g. BitString)
                switch (tagNo)
                {
                    case Asn1Tags.OctetString:
                        return new BerOctetStringParser(sp).ToAsn1Object();
                    case Asn1Tags.Sequence:
                        return new BerSequenceParser(sp).ToAsn1Object();
                    case Asn1Tags.Set:
                        return new BerSetParser(sp).ToAsn1Object();
                    case Asn1Tags.External:
                        return new DerExternalParser(sp).ToAsn1Object();
                    default:
                        throw new IOException("unknown BER object encountered");
                }
            }
            else
            {
                try
                {
                    return BuildObject(tag, tagNo, length);
                }
                catch (ArgumentException e)
                {
                    throw new Asn1Exception("corrupted stream detected", e);
                }
            }
        }
        public virtual IAsn1Convertible ReadObject()
        {
            int tag = _in.ReadByte();
            if (tag == -1)
                return null;

            // turn of looking for "00" while we resolve the tag
            Set00Check(false);

            //
            // calculate tag number
            //
            int tagNo = Asn1InputStream.ReadTagNumber(_in, tag);

            bool isConstructed = (tag & Asn1Tags.Constructed) != 0;

            //
            // calculate length
            //
            int length = Asn1InputStream.ReadLength(_in, _limit);

            if (length < 0) // indefinite length method
            {
                if (!isConstructed)
                    throw new IOException("indefinite length primitive encoding encountered");

                IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(_in, _limit);
                Asn1StreamParser sp = new Asn1StreamParser(indIn, _limit);

                if ((tag & Asn1Tags.Application) != 0)
                {
                    return new BerApplicationSpecificParser(tagNo, sp);
                }

                if ((tag & Asn1Tags.Tagged) != 0)
                {
                    return new BerTaggedObjectParser(true, tagNo, sp);
                }

                return sp.ReadIndef(tagNo);
            }
            else
            {
                DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(_in, length);

                if ((tag & Asn1Tags.Application) != 0)
                {
                    return new DerApplicationSpecific(isConstructed, tagNo, defIn.ToArray());
                }

                if ((tag & Asn1Tags.Tagged) != 0)
                {
                    return new BerTaggedObjectParser(isConstructed, tagNo, new Asn1StreamParser(defIn));
                }

                if (isConstructed)
                {
                    // TODO There are other tags that may be constructed (e.g. BitString)
                    switch (tagNo)
                    {
                        case Asn1Tags.OctetString:
                            //
                            // yes, people actually do this...
                            //
                            return new BerOctetStringParser(new Asn1StreamParser(defIn));
                        case Asn1Tags.Sequence:
                            return new DerSequenceParser(new Asn1StreamParser(defIn));
                        case Asn1Tags.Set:
                            return new DerSetParser(new Asn1StreamParser(defIn));
                        case Asn1Tags.External:
                            return new DerExternalParser(new Asn1StreamParser(defIn));
                        default:
                            // TODO Add DerUnknownTagParser class?
                            return new DerUnknownTag(true, tagNo, defIn.ToArray());
                    }
                }

                // Some primitive encodings can be handled by parsers too...
                switch (tagNo)
                {
                    case Asn1Tags.OctetString:
                        return new DerOctetStringParser(defIn);
                }

                try
                {
                    return Asn1InputStream.CreatePrimitiveDerObject(tagNo, defIn.ToArray());
                }
                catch (ArgumentException e)
                {
                    throw new Asn1Exception("corrupted stream detected", e);
                }
            }
        }
Esempio n. 8
0
		internal BerOctetStringParser(
			Asn1StreamParser parser)
		{
			_parser = parser;
		}
        private Asn1EncodableVector loadVector(
			Stream inStream)
        {
            Asn1StreamParser aIn = new Asn1StreamParser(inStream);
            Asn1EncodableVector v = new Asn1EncodableVector();

            IAsn1Convertible obj;
            while ((obj = aIn.ReadObject()) != null)
            {
                v.Add(obj.ToAsn1Object());
            }

            return v;
        }
Esempio n. 10
0
        public Asn1Object ReadObject()
        {
            int num = ReadByte();

            if (num <= 0)
            {
                if (num == 0)
                {
                    throw new IOException("unexpected end-of-contents marker");
                }
                return(null);
            }
            int  num2 = ReadTagNumber(s, num);
            bool flag = (num & 0x20) != 0;
            int  num3 = ReadLength(s, limit);

            if (num3 >= 0)
            {
                try
                {
                    return(BuildObject(num, num2, num3));

IL_0130:
                    Asn1Object result;
                    return(result);
                }
                catch (ArgumentException exception)
                {
                    throw new Asn1Exception("corrupted stream detected", exception);
IL_0144:
                    Asn1Object result;
                    return(result);
                }
            }
            if (!flag)
            {
                throw new IOException("indefinite length primitive encoding encountered");
            }
            IndefiniteLengthInputStream inStream = new IndefiniteLengthInputStream(s, limit);
            Asn1StreamParser            parser   = new Asn1StreamParser(inStream, limit);

            if ((num & 0x40) != 0)
            {
                return(new BerApplicationSpecificParser(num2, parser).ToAsn1Object());
            }
            if ((num & 0x80) == 0)
            {
                switch (num2)
                {
                case 4:
                    return(new BerOctetStringParser(parser).ToAsn1Object());

                case 16:
                    return(new BerSequenceParser(parser).ToAsn1Object());

                case 17:
                    return(new BerSetParser(parser).ToAsn1Object());

                case 8:
                    return(new DerExternalParser(parser).ToAsn1Object());

                default:
                    throw new IOException("unknown BER object encountered");
                }
            }
            return(new BerTaggedObjectParser(constructed: true, num2, parser).ToAsn1Object());
        }
        public Asn1Object ReadObject()
        {
            int tag = ReadByte();

            if (tag <= 0)
            {
                if (tag == 0)
                {
                    throw new IOException("unexpected end-of-contents marker");
                }

                return(null);
            }

            //
            // calculate tag number
            //
            int tagNo = ReadTagNumber(this, tag);

            bool isConstructed = (tag & Asn1Tags.Constructed) != 0;

            //
            // calculate length
            //
            int length = ReadLength(this, limit);

            if (length < 0)             // indefinite length method
            {
                if (!isConstructed)
                {
                    throw new IOException("indefinite length primitive encoding encountered");
                }

                IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(this);

                if ((tag & Asn1Tags.Application) != 0)
                {
                    Asn1StreamParser sp2 = new Asn1StreamParser(indIn);

                    return(new BerApplicationSpecificParser(tagNo, sp2).ToAsn1Object());
                }

                if ((tag & Asn1Tags.Tagged) != 0)
                {
                    // TODO Investigate passing an Asn1StreamParser into this constructor
                    return(new BerTaggedObjectParser(tag, tagNo, indIn).ToAsn1Object());
                }

                Asn1StreamParser sp = new Asn1StreamParser(indIn);

                // TODO There are other tags that may be constructed (e.g. BitString)
                switch (tagNo)
                {
                case Asn1Tags.OctetString:
                    return(new BerOctetStringParser(sp).ToAsn1Object());

                case Asn1Tags.Sequence:
                    return(new BerSequenceParser(sp).ToAsn1Object());

                case Asn1Tags.Set:
                    return(new BerSetParser(sp).ToAsn1Object());

                default:
                    throw new IOException("unknown BER object encountered");
                }
            }
            else
            {
                DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(this, length);

                if ((tag & Asn1Tags.Application) != 0)
                {
                    return(new DerApplicationSpecific(isConstructed, tagNo, defIn.ToArray()));
                }

                if ((tag & Asn1Tags.Tagged) != 0)
                {
                    return(new BerTaggedObjectParser(tag, tagNo, defIn).ToAsn1Object());
                }

                if (isConstructed)
                {
                    // TODO There are other tags that may be constructed (e.g. BitString)
                    switch (tagNo)
                    {
                    case Asn1Tags.OctetString:
                        //
                        // yes, people actually do this...
                        //
                        return(new BerOctetString(BuildDerEncodableVector(defIn)));

                    case Asn1Tags.Sequence:
                        return(CreateDerSequence(defIn));

                    case Asn1Tags.Set:
                        return(CreateDerSet(defIn));

                    default:
                        return(new DerUnknownTag(true, tagNo, defIn.ToArray()));
                    }
                }

                return(CreatePrimitiveDerObject(tagNo, defIn.ToArray()));
            }
        }
		public DerExternalParser(Asn1StreamParser parser)
		{
			this._parser = parser;
		}
Esempio n. 13
0
 internal ConstructedOctetStream(
     Asn1StreamParser parser)
 {
     _parser = parser;
 }
Esempio n. 14
0
 internal DerSetParser(Asn1StreamParser parser)
 {
     this._parser = parser;
 }
Esempio n. 15
0
        /**
         * Replace the signerinformation store associated with the passed
         * in message contained in the stream original with the new one passed in.
         * You would probably only want to do this if you wanted to change the unsigned
         * attributes associated with a signer, or perhaps delete one.
         * <p>
         * The output stream is returned unclosed.
         * </p>
         * @param original the signed data stream to be used as a base.
         * @param signerInformationStore the new signer information store to use.
         * @param out the stream to Write the new signed data object to.
         * @return out.
         */
        public static Stream ReplaceSigners(
			Stream					original,
			SignerInformationStore	signerInformationStore,
			Stream					outStr)
        {
            Asn1StreamParser inStr = new Asn1StreamParser(original, CmsUtilities.MaximumMemory);
            ContentInfoParser contentInfo = new ContentInfoParser((Asn1SequenceParser)inStr.ReadObject());
            SignedDataParser signedData = SignedDataParser.GetInstance(contentInfo.GetContent(Asn1Tags.Sequence));

            BerSequenceGenerator sGen = new BerSequenceGenerator(outStr);

            sGen.AddObject(CmsObjectIdentifiers.SignedData);

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

            // version number
            sigGen.AddObject(signedData.Version);

            // digests
            signedData.GetDigestAlgorithms().ToAsn1Object();  // skip old ones

            Asn1EncodableVector digestAlgs = new Asn1EncodableVector();

            foreach (SignerInformation signer in signerInformationStore.GetSigners())
            {
                digestAlgs.Add(FixAlgID(signer.DigestAlgorithmID));
            }

            WriteToGenerator(sigGen, new DerSet(digestAlgs));

            // encap content info
            ContentInfoParser encapContentInfo = signedData.GetEncapContentInfo();

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

            eiGen.AddObject(encapContentInfo.ContentType);

            Asn1OctetStringParser octs = (Asn1OctetStringParser)encapContentInfo.GetContent(Asn1Tags.OctetString);

            if (octs != null)
            {
                BerOctetStringGenerator octGen = new BerOctetStringGenerator(
                    eiGen.GetRawOutputStream(), 0, true);
                byte[] inBuffer = new byte[4096];
                byte[] outBuffer = new byte[4096];
                Stream inOctets = octs.GetOctetStream();
                Stream outOctets = octGen.GetOctetOutputStream(outBuffer);

                int len;
                while ((len = inOctets.Read(inBuffer, 0, inBuffer.Length)) > 0)
                {
                    outOctets.Write(inBuffer, 0, len);
                }

                outOctets.Close();
            }

            eiGen.Close();

            WriteSetToGeneratorTagged(sigGen, signedData.GetCertificates(), 0);
            WriteSetToGeneratorTagged(sigGen, signedData.GetCrls(), 1);

            Asn1EncodableVector signerInfos = new Asn1EncodableVector();
            foreach (SignerInformation signer in signerInformationStore.GetSigners())
            {
                signerInfos.Add(signer.ToSignerInfo());
            }

            WriteToGenerator(sigGen, new DerSet(signerInfos));

            sigGen.Close();

            sGen.Close();

            return outStr;
        }
		internal ConstructedOctetStream(
			Asn1StreamParser parser)
		{
			_parser = parser;
		}
Esempio n. 17
0
        /**
         * Replace the certificate and CRL information associated with this
         * CMSSignedData object with the new one passed in.
         * <p>
         * The output stream is returned unclosed.
         * </p>
         * @param original the signed data stream to be used as a base.
         * @param certsAndCrls the new certificates and CRLs to be used.
         * @param out the stream to Write the new signed data object to.
         * @return out.
         * @exception CmsException if there is an error processing the CertStore
         */
        public static Stream ReplaceCertificatesAndCrls(
			Stream			original,
			IX509Store		x509Certs,
			IX509Store		x509Crls,
			IX509Store		x509AttrCerts,
			Stream			outStr)
        {
            if (x509AttrCerts != null)
                throw new NotImplementedException("Currently can't replace attribute certificates");

            Asn1StreamParser inStr = new Asn1StreamParser(original, CmsUtilities.MaximumMemory);
            ContentInfoParser contentInfo = new ContentInfoParser((Asn1SequenceParser)inStr.ReadObject());
            SignedDataParser signedData = SignedDataParser.GetInstance(contentInfo.GetContent(Asn1Tags.Sequence));

            BerSequenceGenerator sGen = new BerSequenceGenerator(outStr);

            sGen.AddObject(CmsObjectIdentifiers.SignedData);

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

            // version number
            sigGen.AddObject(signedData.Version);

            // digests
            WriteToGenerator(sigGen, signedData.GetDigestAlgorithms().ToAsn1Object());

            // encap content info
            ContentInfoParser encapContentInfo = signedData.GetEncapContentInfo();

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

            eiGen.AddObject(encapContentInfo.ContentType);

            Asn1OctetStringParser octs = (Asn1OctetStringParser)encapContentInfo.GetContent(Asn1Tags.OctetString);

            if (octs != null)
            {
                BerOctetStringGenerator octGen = new BerOctetStringGenerator(eiGen.GetRawOutputStream(), 0, true);
                byte[] inBuffer = new byte[4096];
                byte[] outBuffer = new byte[4096];
                Stream inOctets = octs.GetOctetStream();
                Stream outOctets = octGen.GetOctetOutputStream(outBuffer);

                int len;
                while ((len = inOctets.Read(inBuffer, 0, inBuffer.Length)) > 0)
                {
                    outOctets.Write(inBuffer, 0, len);
                }

                outOctets.Close();
            }

            eiGen.Close();

            //
            // skip existing certs and CRLs
            //
            GetAsn1Set(signedData.GetCertificates());
            GetAsn1Set(signedData.GetCrls());

            //
            // replace the certs and crls in the SignedData object
            //
            Asn1Set certs;
            try
            {
                certs = CmsUtilities.CreateDerSetFromList(
                    CmsUtilities.GetCertificatesFromStore(x509Certs));
            }
            catch (X509StoreException e)
            {
                throw new CmsException("error getting certs from certStore", e);
            }

            if (certs.Count > 0)
            {
                WriteToGenerator(sigGen, new DerTaggedObject(false, 0, certs));
            }

            Asn1Set crls;
            try
            {
                crls = CmsUtilities.CreateDerSetFromList(
                    CmsUtilities.GetCrlsFromStore(x509Crls));
            }
            catch (X509StoreException e)
            {
                throw new CmsException("error getting crls from certStore", e);
            }

            if (crls.Count > 0)
            {
                WriteToGenerator(sigGen, new DerTaggedObject(false, 1, crls));
            }

            WriteToGenerator(sigGen, signedData.GetSignerInfos().ToAsn1Object());

            sigGen.Close();

            sGen.Close();

            return outStr;
        }
 internal BerApplicationSpecificParser(int tag, Asn1StreamParser parser)
 {
     this.tag    = tag;
     this.parser = parser;
 }
Esempio n. 19
0
        public virtual IAsn1Convertible ReadObject()
        {
            int tag = _in.ReadByte();

            if (tag == -1)
            {
                return(null);
            }

            // turn of looking for "00" while we resolve the tag
            Set00Check(false);

            //
            // calculate tag number
            //
            int tagNo = Asn1InputStream.ReadTagNumber(_in, tag);

            bool isConstructed = (tag & Asn1Tags.Constructed) != 0;

            //
            // calculate length
            //
            int length = Asn1InputStream.ReadLength(_in, _limit);

            if (length < 0)             // indefinite length method
            {
                if (!isConstructed)
                {
                    throw new IOException("indefinite length primitive encoding encountered");
                }

                IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(_in);

                if ((tag & Asn1Tags.Application) != 0)
                {
                    Asn1StreamParser sp2 = new Asn1StreamParser(indIn, _limit);

                    return(new BerApplicationSpecificParser(tagNo, sp2));
                }

                if ((tag & Asn1Tags.Tagged) != 0)
                {
                    // TODO Investigate passing an Asn1StreamParser into this constructor
                    return(new BerTaggedObjectParser(tag, tagNo, indIn));
                }

                Asn1StreamParser sp = new Asn1StreamParser(indIn, _limit);

                // TODO There are other tags that may be constructed (e.g. BitString)
                switch (tagNo)
                {
                case Asn1Tags.OctetString:
                    return(new BerOctetStringParser(sp));

                case Asn1Tags.Sequence:
                    return(new BerSequenceParser(sp));

                case Asn1Tags.Set:
                    return(new BerSetParser(sp));

                case Asn1Tags.External:
                    return(new DerExternalParser(sp));

                default:
                    throw new IOException("unknown BER object encountered: 0x"
                                          + tagNo.ToString("X"));
                }
            }
            else
            {
                DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(_in, length);

                if ((tag & Asn1Tags.Application) != 0)
                {
                    return(new DerApplicationSpecific(isConstructed, tagNo, defIn.ToArray()));
                }

                if ((tag & Asn1Tags.Tagged) != 0)
                {
                    return(new BerTaggedObjectParser(tag, tagNo, defIn));
                }

                if (isConstructed)
                {
                    // TODO There are other tags that may be constructed (e.g. BitString)
                    switch (tagNo)
                    {
                    case Asn1Tags.OctetString:
                        //
                        // yes, people actually do this...
                        //
                        return(new BerOctetStringParser(new Asn1StreamParser(defIn)));

                    case Asn1Tags.Sequence:
                        return(new DerSequenceParser(new Asn1StreamParser(defIn)));

                    case Asn1Tags.Set:
                        return(new DerSetParser(new Asn1StreamParser(defIn)));

                    case Asn1Tags.External:
                        return(new DerExternalParser(new Asn1StreamParser(defIn)));

                    default:
                        // TODO Add DerUnknownTagParser class?
                        return(new DerUnknownTag(true, tagNo, defIn.ToArray()));
                    }
                }

                // Some primitive encodings can be handled by parsers too...
                switch (tagNo)
                {
                case Asn1Tags.OctetString:
                    return(new DerOctetStringParser(defIn));
                }

                return(Asn1InputStream.CreatePrimitiveDerObject(tagNo, defIn.ToArray()));
            }
        }
Esempio n. 20
0
 private static String FormatX509Name(X500DistinguishedName name)
 {
     Asn1StreamParser parser = new Asn1StreamParser(name.RawData);
     X509Name _name = X509Name.GetInstance(parser.ReadObject().ToAsn1Object());
     return _name.ToString(true, X509Name.RFC1779Symbols);
 }
Esempio n. 21
0
        public Asn1Object ReadObject()
        {
            //IL_0013: Unknown result type (might be due to invalid IL or missing references)
            //IL_0054: Unknown result type (might be due to invalid IL or missing references)
            //IL_0102: Unknown result type (might be due to invalid IL or missing references)
            //IL_0117: Expected O, but got Unknown
            int num = ((Stream)this).ReadByte();

            if (num <= 0)
            {
                if (num == 0)
                {
                    throw new IOException("unexpected end-of-contents marker");
                }
                return(null);
            }
            int  num2 = ReadTagNumber(s, num);
            bool flag = (num & 0x20) != 0;
            int  num3 = ReadLength(s, limit);

            if (num3 < 0)
            {
                if (!flag)
                {
                    throw new IOException("indefinite length primitive encoding encountered");
                }
                IndefiniteLengthInputStream inStream = new IndefiniteLengthInputStream(s, limit);
                Asn1StreamParser            parser   = new Asn1StreamParser((Stream)(object)inStream, limit);
                if (((uint)num & 0x40u) != 0)
                {
                    return(new BerApplicationSpecificParser(num2, parser).ToAsn1Object());
                }
                if (((uint)num & 0x80u) != 0)
                {
                    return(new BerTaggedObjectParser(constructed: true, num2, parser).ToAsn1Object());
                }
                switch (num2)
                {
                case 4:
                    return(new BerOctetStringParser(parser).ToAsn1Object());

                case 16:
                    return(new BerSequenceParser(parser).ToAsn1Object());

                case 17:
                    return(new BerSetParser(parser).ToAsn1Object());

                case 8:
                    return(new DerExternalParser(parser).ToAsn1Object());

                default:
                    throw new IOException("unknown BER object encountered");
                }
            }
            try
            {
                return(BuildObject(num, num2, num3));
            }
            catch (ArgumentException val)
            {
                ArgumentException exception = val;
                throw new Asn1Exception("corrupted stream detected", (global::System.Exception)(object) exception);
            }
        }
 public DerExternalParser(Asn1StreamParser parser)
 {
     this._parser = parser;
 }
Esempio n. 23
0
 internal BerTaggedObjectParser(bool constructed, int tagNumber, Asn1StreamParser parser)
 {
     this._constructed = constructed;
     this._tagNumber   = tagNumber;
     this._parser      = parser;
 }
Esempio n. 24
0
        public Asn1Object ReadObject()
        {
            int tag = ReadByte();
            if (tag <= 0)
            {
                if (tag == 0)
                    throw new IOException("unexpected end-of-contents marker");

                return null;
            }

            //
            // calculate tag number
            //
            int tagNo = ReadTagNumber(this, tag);

            bool isConstructed = (tag & Asn1Tags.Constructed) != 0;

            //
            // calculate length
            //
            int length = ReadLength(this, limit);

            if (length < 0) // indefinite length method
            {
                if (!isConstructed)
                    throw new IOException("indefinite length primitive encoding encountered");

                IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(this);

                if ((tag & Asn1Tags.Application) != 0)
                {
                    Asn1StreamParser sp2 = new Asn1StreamParser(indIn);

                    return new BerApplicationSpecificParser(tagNo, sp2).ToAsn1Object();
                }

                if ((tag & Asn1Tags.Tagged) != 0)
                {
                    // TODO Investigate passing an Asn1StreamParser into this constructor
                    return new BerTaggedObjectParser(tag, tagNo, indIn).ToAsn1Object();
                }

                Asn1StreamParser sp = new Asn1StreamParser(indIn);

                // TODO There are other tags that may be constructed (e.g. BitString)
                switch (tagNo)
                {
                    case Asn1Tags.OctetString:
                        return new BerOctetStringParser(sp).ToAsn1Object();
                    case Asn1Tags.Sequence:
                        return new BerSequenceParser(sp).ToAsn1Object();
                    case Asn1Tags.Set:
                        return new BerSetParser(sp).ToAsn1Object();
                    default:
                        throw new IOException("unknown BER object encountered");
                }
            }
            else
            {
                DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(this, length);

                if ((tag & Asn1Tags.Application) != 0)
                {
                    return new DerApplicationSpecific(isConstructed, tagNo, defIn.ToArray());
                }

                if ((tag & Asn1Tags.Tagged) != 0)
                {
                    return new BerTaggedObjectParser(tag, tagNo, defIn).ToAsn1Object();
                }

                if (isConstructed)
                {
                    // TODO There are other tags that may be constructed (e.g. BitString)
                    switch (tagNo)
                    {
                        case Asn1Tags.OctetString:
                            //
                            // yes, people actually do this...
                            //
                            return new BerOctetString(BuildDerEncodableVector(defIn));
                        case Asn1Tags.Sequence:
                            return CreateDerSequence(defIn);
                        case Asn1Tags.Set:
                            return CreateDerSet(defIn);
                        default:
                            return new DerUnknownTag(true, tagNo, defIn.ToArray());
                    }
                }

                return CreatePrimitiveDerObject(tagNo, defIn.ToArray());
            }
        }
Esempio n. 25
0
 internal BerOctetStringParser(
     Asn1StreamParser parser)
 {
     _parser = parser;
 }
Esempio n. 26
0
        public Asn1Object ReadObject()
        {
            int tag = ReadByte();

            if (tag <= 0)
            {
                if (tag == 0)
                {
                    throw new IOException("unexpected end-of-contents marker");
                }

                return(null);
            }

            //
            // calculate tag number
            //
            int tagNo = ReadTagNumber(this.s, tag);

            bool isConstructed = (tag & Asn1Tags.Constructed) != 0;

            //
            // calculate length
            //
            int length = ReadLength(this.s, limit);

            if (length < 0) // indefinite length method
            {
                if (!isConstructed)
                {
                    throw new IOException("indefinite length primitive encoding encountered");
                }

                IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(this.s, limit);
                Asn1StreamParser            sp    = new Asn1StreamParser(indIn, limit);

                if ((tag & Asn1Tags.Application) != 0)
                {
                    return(new BerApplicationSpecificParser(tagNo, sp).ToAsn1Object());
                }

                if ((tag & Asn1Tags.Tagged) != 0)
                {
                    return(new BerTaggedObjectParser(true, tagNo, sp).ToAsn1Object());
                }

                // TODO There are other tags that may be constructed (e.g. BitString)
                switch (tagNo)
                {
                case Asn1Tags.OctetString:
                    return(new BerOctetStringParser(sp).ToAsn1Object());

                case Asn1Tags.Sequence:
                    return(new BerSequenceParser(sp).ToAsn1Object());

                case Asn1Tags.Set:
                    return(new BerSetParser(sp).ToAsn1Object());

                case Asn1Tags.External:
                    return(new DerExternalParser(sp).ToAsn1Object());

                default:
                    throw new IOException("unknown BER object encountered");
                }
            }
            else
            {
                try
                {
                    return(BuildObject(tag, tagNo, length));
                }
                catch (ArgumentException e)
                {
                    throw new Asn1Exception("corrupted stream detected", e);
                }
            }
        }
Esempio n. 27
0
        public virtual IAsn1Convertible ReadObject()
        {
            int num = _in.ReadByte();

            if (num == -1)
            {
                return(null);
            }
            Set00Check(enabled: false);
            int  num2 = Asn1InputStream.ReadTagNumber(_in, num);
            bool flag = (num & 0x20) != 0;
            int  num3 = Asn1InputStream.ReadLength(_in, _limit);

            if (num3 < 0)
            {
                if (!flag)
                {
                    throw new IOException("indefinite length primitive encoding encountered");
                }
                IndefiniteLengthInputStream inStream         = new IndefiniteLengthInputStream(_in, _limit);
                Asn1StreamParser            asn1StreamParser = new Asn1StreamParser(inStream, _limit);
                if ((num & 0x40) != 0)
                {
                    return(new BerApplicationSpecificParser(num2, asn1StreamParser));
                }
                if ((num & 0x80) != 0)
                {
                    return(new BerTaggedObjectParser(constructed: true, num2, asn1StreamParser));
                }
                return(asn1StreamParser.ReadIndef(num2));
            }
            DefiniteLengthInputStream definiteLengthInputStream = new DefiniteLengthInputStream(_in, num3);

            if ((num & 0x40) != 0)
            {
                return(new DerApplicationSpecific(flag, num2, definiteLengthInputStream.ToArray()));
            }
            if ((num & 0x80) != 0)
            {
                return(new BerTaggedObjectParser(flag, num2, new Asn1StreamParser(definiteLengthInputStream)));
            }
            if (flag)
            {
                switch (num2)
                {
                case 4:
                    return(new BerOctetStringParser(new Asn1StreamParser(definiteLengthInputStream)));

                case 16:
                    return(new DerSequenceParser(new Asn1StreamParser(definiteLengthInputStream)));

                case 17:
                    return(new DerSetParser(new Asn1StreamParser(definiteLengthInputStream)));

                case 8:
                    return(new DerExternalParser(new Asn1StreamParser(definiteLengthInputStream)));

                default:
                    throw new IOException("unknown tag " + num2 + " encountered");
                }
            }
            int num4 = num2;

            if (num4 != 4)
            {
                try
                {
                    return(Asn1InputStream.CreatePrimitiveDerObject(num2, definiteLengthInputStream, tmpBuffers));

IL_019e:
                    IAsn1Convertible result;
                    return(result);
                }
                catch (ArgumentException exception)
                {
                    throw new Asn1Exception("corrupted stream detected", exception);
IL_01b2:
                    IAsn1Convertible result;
                    return(result);
                }
            }
            return(new DerOctetStringParser(definiteLengthInputStream));
        }