예제 #1
0
        /**
         * build an object given its tag and the number of bytes to construct it from.
         */
        private Asn1Object BuildObject(
            int tag,
            int tagNo,
            int length)
        {
            bool isConstructed = (tag & Asn1Tags.Constructed) != 0;

            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 Asn1StreamParser(defIn).ReadTaggedObject(isConstructed, tagNo));
            }

            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));

                case Asn1Tags.External:
                    return(new DerExternal(BuildDerEncodableVector(defIn)));

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

            return(CreatePrimitiveDerObject(tagNo, defIn.ToArray()));
        }
예제 #2
0
 public Asn1Object ToAsn1Object()
 {
     try
     {
         return(new DerOctetString(stream.ToArray()));
     }
     catch (IOException e)
     {
         throw new InvalidOperationException("IOException converting stream to byte array: " + e.Message, e);
     }
 }
예제 #3
0
        internal Asn1Object ReadTaggedObject(bool constructed, int tag)
        {
            if (!constructed)
            {
                // Note: !CONSTRUCTED => IMPLICIT
                DefiniteLengthInputStream defIn = (DefiniteLengthInputStream)_in;
                return(new DerTaggedObject(false, tag, new DerOctetString(defIn.ToArray())));
            }

            Asn1EncodableVector v = ReadVector();

            if (_in is IndefiniteLengthInputStream)
            {
                return(v.Count == 1
                                        ?   new BerTaggedObject(true, tag, v[0])
                                        :   new BerTaggedObject(false, tag, BerSequence.FromVector(v)));
            }

            return(v.Count == 1
                                ?   new DerTaggedObject(true, tag, v[0])
                                :   new DerTaggedObject(false, tag, DerSequence.FromVector(v)));
        }
예제 #4
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, _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);
                }
            }
        }
예제 #5
0
 internal override DerSet CreateDerSet(
     DefiniteLengthInputStream dIn)
 {
     return(new LazyDerSet(dIn.ToArray()));
 }