Exemplo n.º 1
0
        /// <summary>
        /// Decodes the object by BER.
        /// </summary>
        /// <param name="buffer">A buffer that contains a BER encoding result.</param>
        /// <param name="explicitTag">Indicates whether the tags should be encoded explicitly. In our Test Suites, it will always be true.</param>
        /// <returns>The number of the bytes consumed in the buffer to decode this object.</returns>
        /// <exception cref="Asn1ConstraintsNotSatisfied">
        /// Thrown when the constraints are not satisfied after decoding.
        /// </exception>
        /// <exception cref="Asn1DecodingUnexpectedData">
        /// Thrown when the data in the buffer can not be properly decoded.
        /// </exception>
        /// <remarks>Override this method in a user-defined class only if the procedure is not applicable in some special scenarios.</remarks>
        public override int BerDecode(IAsn1DecodingBuffer buffer, bool explicitTag = true)
        {
            int returnVal = 0, lengthAfterUniTag = 0, tagLength = 0;

            if (explicitTag)
            {
                //Decode the top most tag and universal class tag
                Asn1Tag topTag;
                returnVal += TagBerDecode(buffer, out topTag);
            }

            returnVal += LengthBerDecode(buffer, out lengthAfterUniTag);
            Asn1Tag valueTag;

            //Decode data
            valueTag = new Asn1Tag(Asn1TagType.Universal, 10)
            {
                EncodingWay = EncodingWay.Primitive
            };
            if (IsTagMatch(buffer, valueTag, out tagLength))
            {
                resultCode = new LDAPResult_resultCode();
                returnVal += resultCode.BerDecode(buffer, true);
            }

            valueTag = new Asn1Tag(Asn1TagType.Universal, 4)
            {
                EncodingWay = EncodingWay.Primitive
            };
            if (IsTagMatch(buffer, valueTag, out tagLength))
            {
                matchedDN  = new LDAPDN();
                returnVal += matchedDN.BerDecode(buffer, true);
            }

            // decode errorMessage
            valueTag = new Asn1Tag(Asn1TagType.Universal, 4)
            {
                EncodingWay = EncodingWay.Primitive
            };
            if (IsTagMatch(buffer, valueTag, out tagLength))
            {
                errorMessage = new LDAPString();
                returnVal   += errorMessage.BerDecode(buffer, true);
            }

            // decode referral
            valueTag = new Asn1Tag(Asn1TagType.Context, 3)
            {
                EncodingWay = EncodingWay.Constructed
            };
            if (IsTagMatch(buffer, valueTag, out tagLength))
            {
                referral   = new Referral();
                returnVal += referral.BerDecode(buffer, false);
            }

            // decode responseName
            valueTag = new Asn1Tag(Asn1TagType.Context, 10)
            {
                EncodingWay = EncodingWay.Primitive
            };
            if (IsTagMatch(buffer, valueTag, out tagLength, true))
            {
                responseName = new LDAPOID();
                returnVal   += responseName.BerDecode(buffer, false);
            }

            // decode response
            valueTag = new Asn1Tag(Asn1TagType.Context, 11)
            {
                EncodingWay = EncodingWay.Primitive
            };
            if (IsTagMatch(buffer, valueTag, out tagLength, true))
            {
                response   = new Asn1OctetString();
                returnVal += response.BerDecode(buffer, false);
            }

            return(returnVal);
        }