private Asn1Object BuildObject(int tag, int tagNo, int length)
    {
        bool flag = (tag & 0x20) != 0;
        DefiniteLengthInputStream definiteLengthInputStream = new DefiniteLengthInputStream(s, length);

        if ((tag & 0x40) != 0)
        {
            return(new DerApplicationSpecific(flag, tagNo, definiteLengthInputStream.ToArray()));
        }
        if ((tag & 0x80) != 0)
        {
            return(new Asn1StreamParser(definiteLengthInputStream).ReadTaggedObject(flag, tagNo));
        }
        if (flag)
        {
            switch (tagNo)
            {
            case 4:
                return(new BerOctetString(BuildDerEncodableVector(definiteLengthInputStream)));

            case 16:
                return(CreateDerSequence(definiteLengthInputStream));

            case 17:
                return(CreateDerSet(definiteLengthInputStream));

            case 8:
                return(new DerExternal(BuildDerEncodableVector(definiteLengthInputStream)));

            default:
                throw new IOException("unknown tag " + tagNo + " encountered");
            }
        }
        return(CreatePrimitiveDerObject(tagNo, definiteLengthInputStream, tmpBuffers));
    }
    internal static byte[] GetBuffer(DefiniteLengthInputStream defIn, byte[][] tmpBuffers)
    {
        int remaining = defIn.GetRemaining();

        if (remaining >= tmpBuffers.Length)
        {
            return(defIn.ToArray());
        }
        byte[] array = tmpBuffers[remaining];
        if (array == null)
        {
            array = (tmpBuffers[remaining] = new byte[remaining]);
        }
        defIn.ReadAllIntoByteArray(array);
        return(array);
    }
    internal Asn1Object ReadTaggedObject(bool constructed, int tag)
    {
        if (!constructed)
        {
            DefiniteLengthInputStream definiteLengthInputStream = (DefiniteLengthInputStream)_in;
            return(new DerTaggedObject(explicitly: false, tag, new DerOctetString(definiteLengthInputStream.ToArray())));
        }
        Asn1EncodableVector asn1EncodableVector = ReadVector();

        if (_in is IndefiniteLengthInputStream)
        {
            if (asn1EncodableVector.Count != 1)
            {
                return(new BerTaggedObject(explicitly: false, tag, BerSequence.FromVector(asn1EncodableVector)));
            }
            return(new BerTaggedObject(explicitly: true, tag, asn1EncodableVector[0]));
        }
        if (asn1EncodableVector.Count != 1)
        {
            return(new DerTaggedObject(explicitly: false, tag, DerSequence.FromVector(asn1EncodableVector)));
        }
        return(new DerTaggedObject(explicitly: true, tag, asn1EncodableVector[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)
        {
            return(new DerOctetStringParser(definiteLengthInputStream));
        }
        try
        {
            return(Asn1InputStream.CreatePrimitiveDerObject(num2, definiteLengthInputStream, tmpBuffers));
        }
        catch (ArgumentException exception)
        {
            throw new Asn1Exception("corrupted stream detected", exception);
        }
    }
 internal virtual DerSequence CreateDerSequence(DefiniteLengthInputStream dIn)
 {
     return(DerSequence.FromVector(BuildDerEncodableVector(dIn)));
 }
 internal virtual Asn1EncodableVector BuildDerEncodableVector(DefiniteLengthInputStream dIn)
 {
     return(new Asn1InputStream(dIn).BuildEncodableVector());
 }
    internal static Asn1Object CreatePrimitiveDerObject(int tagNo, DefiniteLengthInputStream defIn, byte[][] tmpBuffers)
    {
        switch (tagNo)
        {
        case 1:
            return(DerBoolean.FromOctetString(GetBuffer(defIn, tmpBuffers)));

        case 10:
            return(DerEnumerated.FromOctetString(GetBuffer(defIn, tmpBuffers)));

        case 6:
            return(DerObjectIdentifier.FromOctetString(GetBuffer(defIn, tmpBuffers)));

        default:
        {
            byte[] array = defIn.ToArray();
            switch (tagNo)
            {
            case 3:
                return(DerBitString.FromAsn1Octets(array));

            case 30:
                return(new DerBmpString(array));

            case 24:
                return(new DerGeneralizedTime(array));

            case 27:
                return(new DerGeneralString(array));

            case 25:
                return(new DerGraphicString(array));

            case 22:
                return(new DerIA5String(array));

            case 2:
                return(new DerInteger(array));

            case 5:
                return(DerNull.Instance);

            case 18:
                return(new DerNumericString(array));

            case 4:
                return(new DerOctetString(array));

            case 19:
                return(new DerPrintableString(array));

            case 20:
                return(new DerT61String(array));

            case 28:
                return(new DerUniversalString(array));

            case 23:
                return(new DerUtcTime(array));

            case 12:
                return(new DerUtf8String(array));

            case 21:
                return(new DerVideotexString(array));

            case 26:
                return(new DerVisibleString(array));

            default:
                throw new IOException("unknown tag " + tagNo + " encountered");
            }
        }
        }
    }
 internal virtual DerSet CreateDerSet(DefiniteLengthInputStream dIn)
 {
     return(DerSet.FromVector(BuildDerEncodableVector(dIn), needsSorting: false));
 }
 internal DerOctetStringParser(DefiniteLengthInputStream stream)
 {
     this.stream = stream;
 }
Example #10
0
 internal override DerSet CreateDerSet(DefiniteLengthInputStream dIn)
 {
     return(new LazyDerSet(dIn.ToArray()));
 }