Beispiel #1
0
        internal void RetrieveMessages()
        {
            var decoder = new LBERDecoder();

            while (!_cts.IsCancellationRequested)
            {
                try
                {
                    var asn1Id = new Asn1Identifier(_conn.ActiveStream);

                    if (asn1Id.Tag != Asn1Sequence.Tag)
                    {
                        continue; // loop looking for an RfcLdapMessage identifier
                    }

                    // Turn the message into an RfcMessage class
                    var asn1Len = new Asn1Length(_conn.ActiveStream);

                    Messages.Add(new RfcLdapMessage(decoder, _conn.ActiveStream, asn1Len.Length));
                }
                catch (System.IO.IOException)
                {
                    // ignore
                }
            }

            // ReSharper disable once FunctionNeverReturns
        }
        public RfcExtendedResponse(Asn1Decoder dec, System.IO.Stream in_Renamed, int len) : base(dec, in_Renamed, len)
        {
            // decode optional tagged elements
            if (size() > 3)
            {
                for (int i = 3; i < size(); i++)
                {
                    Asn1Tagged     obj = (Asn1Tagged)get_Renamed(i);
                    Asn1Identifier id  = obj.getIdentifier();
                    switch (id.Tag)
                    {
                    case RfcLdapResult.REFERRAL:
                        sbyte[] content             = ((Asn1OctetString)obj.taggedValue()).byteValue();
                        System.IO.MemoryStream bais = new System.IO.MemoryStream(SupportClass.ToByteArray(content));
                        set_Renamed(i, new RfcReferral(dec, bais, content.Length));
                        referralIndex = i;
                        break;

                    case RESPONSE_NAME:
                        set_Renamed(i, new RfcLdapOID(((Asn1OctetString)obj.taggedValue()).byteValue()));
                        responseNameIndex = i;
                        break;

                    case RESPONSE:
                        set_Renamed(i, obj.taggedValue());
                        responseIndex = i;
                        break;
                    }
                }
            }
        }
 public RfcBindResponse(Asn1Decoder dec, System.IO.Stream in_Renamed, int len) : base(dec, in_Renamed, len)
 {
     // Decode optional referral from Asn1OctetString to Referral.
     if (size() > 3)
     {
         Asn1Tagged     obj = (Asn1Tagged)get_Renamed(3);
         Asn1Identifier id  = obj.getIdentifier();
         if (id.Tag == RfcLdapResult.REFERRAL)
         {
             sbyte[] content             = ((Asn1OctetString)obj.taggedValue()).byteValue();
             System.IO.MemoryStream bais = new System.IO.MemoryStream(SupportClass.ToByteArray(content));
             set_Renamed(3, new RfcReferral(dec, bais, content.Length));
         }
     }
 }
Beispiel #4
0
        /// <summary>
        /// Encode an Asn1Identifier directly into the specified outputstream.
        /// </summary>
        /// <param name="id">The Asn1Identifier object to encode</param>
        /// <param name="stream">The stream.</param>
        public void Encode(Asn1Identifier id, Stream stream)
        {
            var c   = (int)id.Asn1Class;
            var t   = id.Tag;
            var ccf = (sbyte)((c << 6) | (id.Constructed ? 0x20 : 0));

            if (t < 30)
            {
                stream.WriteByte((byte)(ccf | t));
            }
            else
            {
                stream.WriteByte((byte)(ccf | 0x1F));
                EncodeTagInteger(t, stream);
            }
        }
Beispiel #5
0
        /// <summary>
        ///     Decode an LBER encoded value into an Asn1Object from an InputStream.
        ///     This method also returns the total length of this encoded
        ///     Asn1Object (length of type + length of length + length of content)
        ///     in the parameter len. This information is helpful when decoding
        ///     structured types.
        /// </summary>
        /// <param name="stream">The stream.</param>
        /// <param name="len">The length.</param>
        /// <returns>
        ///     Decoded Asn1Obect.
        /// </returns>
        /// <exception cref="EndOfStreamException">Unknown tag.</exception>
        public static Asn1Object Decode(Stream stream, int[] len)
        {
            var asn1Id  = new Asn1Identifier(stream);
            var asn1Len = new Asn1Length(stream);

            var length = asn1Len.Length;

            len[0] = asn1Id.EncodedLength + asn1Len.EncodedLength + length;

            if (asn1Id.Universal == false)
            {
                return(new Asn1Tagged(stream, length, (Asn1Identifier)asn1Id.Clone()));
            }

            switch (asn1Id.Tag)
            {
            case Asn1Sequence.Tag:
                return(new Asn1Sequence(stream, length));

            case Asn1Set.Tag:
                return(new Asn1Set(stream, length));

            case Asn1Boolean.Tag:
                return(new Asn1Boolean(stream, length));

            case Asn1Integer.Tag:
                return(new Asn1Integer(stream, length));

            case Asn1OctetString.Tag:
                return(new Asn1OctetString(stream, length));

            case Asn1Enumerated.Tag:
                return(new Asn1Enumerated(stream, length));

            case Asn1Null.Tag:
                return(new Asn1Null());    // has no content to decode.

            default:
                throw new EndOfStreamException("Unknown tag");
            }
        }
Beispiel #6
0
        public RfcIntermediateResponse(Asn1Decoder dec, Stream in_Renamed, int len)
            : base(dec, in_Renamed, len)
            //		throws IOException
        {
            //		super(dec, in, len);

            int i = 0;

            m_responseNameIndex = m_responseValueIndex = 0;

            // decode optional tagged elements. The parent class constructor will
            // have decoded these elements as ASN1Tagged objects with the value
            // stored as an ASN1OctectString object.

            if (size() >= 3) //the incorrectly encoded case, LDAPResult contains
            {
                i = 3;       //at least 3 components
            }
            else
            {
                i = 0; //correctly encoded case, can have zero components
            }
            for (; i < size(); i++)
            {
                Asn1Tagged     obj = (Asn1Tagged)get_Renamed(i);
                Asn1Identifier id  = obj.getIdentifier();
                switch (id.Tag)
                {
                case TAG_RESPONSE_NAME:
                    set_Renamed(i, new RfcLdapOID(
                                    ((Asn1OctetString)obj.taggedValue()).byteValue()));
                    m_responseNameIndex = i;
                    break;

                case TAG_RESPONSE:
                    set_Renamed(i, obj.taggedValue());
                    m_responseValueIndex = i;
                    break;
                }
            }
        }
Beispiel #7
0
        public RfcLdapMessage(Asn1Decoder dec, Stream in_Renamed, int len) : base(dec, in_Renamed, len)
        {
            sbyte[]      content;
            MemoryStream bais;

            // Decode implicitly tagged protocol operation from an Asn1Tagged type
            // to its appropriate application type.
            Asn1Tagged     protocolOp   = (Asn1Tagged)get_Renamed(1);
            Asn1Identifier protocolOpId = protocolOp.getIdentifier();

            content = ((Asn1OctetString)protocolOp.taggedValue()).byteValue();
            bais    = new MemoryStream(SupportClass.ToByteArray(content));

            switch (protocolOpId.Tag)
            {
            case LdapMessage.SEARCH_RESPONSE:
                set_Renamed(1, new RfcSearchResultEntry(dec, bais, content.Length));
                break;

            case LdapMessage.SEARCH_RESULT:
                set_Renamed(1, new RfcSearchResultDone(dec, bais, content.Length));
                break;

            case LdapMessage.SEARCH_RESULT_REFERENCE:
                set_Renamed(1, new RfcSearchResultReference(dec, bais, content.Length));
                break;

            case LdapMessage.ADD_RESPONSE:
                set_Renamed(1, new RfcAddResponse(dec, bais, content.Length));
                break;

            case LdapMessage.BIND_RESPONSE:
                set_Renamed(1, new RfcBindResponse(dec, bais, content.Length));
                break;

            case LdapMessage.COMPARE_RESPONSE:
                set_Renamed(1, new RfcCompareResponse(dec, bais, content.Length));
                break;

            case LdapMessage.DEL_RESPONSE:
                set_Renamed(1, new RfcDelResponse(dec, bais, content.Length));
                break;

            case LdapMessage.EXTENDED_RESPONSE:
                set_Renamed(1, new RfcExtendedResponse(dec, bais, content.Length));
                break;

            case LdapMessage.INTERMEDIATE_RESPONSE:
                set_Renamed(1, new RfcIntermediateResponse(dec, bais, content.Length));
                break;

            case LdapMessage.MODIFY_RESPONSE:
                set_Renamed(1, new RfcModifyResponse(dec, bais, content.Length));
                break;

            case LdapMessage.MODIFY_RDN_RESPONSE:
                set_Renamed(1, new RfcModifyDNResponse(dec, bais, content.Length));
                break;

            default:
                throw new Exception("RfcLdapMessage: Invalid tag: " + protocolOpId.Tag);
            }

            // decode optional implicitly tagged controls from Asn1Tagged type to
            // to RFC 2251 types.
            if (size() > 2)
            {
                Asn1Tagged controls = (Asn1Tagged)get_Renamed(2);
                //   Asn1Identifier controlsId = protocolOp.getIdentifier();
                // we could check to make sure we have controls here....

                content = ((Asn1OctetString)controls.taggedValue()).byteValue();
                bais    = new MemoryStream(SupportClass.ToByteArray(content));
                set_Renamed(2, new RfcControls(dec, bais, content.Length));
            }
        }
Beispiel #8
0
 public LBERDecoder()
 {
     asn1ID  = new Asn1Identifier();
     asn1Len = new Asn1Length();
 }
Beispiel #9
0
 internal Asn1Numeric(Asn1Identifier id, long valueRenamed)
     : base(id)
 {
     _content = valueRenamed;
 }