public static AttributeValueAssertion Extract(ICollection <byte> buffer, bool isTagIncluded = false)
        {
            var result = new AttributeValueAssertion();

            if (isTagIncluded)
            {
                result.ExtractTagAndLength(buffer);
            }

            result.AttributeDescription = DEROctetString.Extract(buffer);
            result.AssertionValue       = DEROctetString.Extract(buffer);
            return(result);
        }
        public static SearchRequestFilter Extract(ICollection <byte> buffer)
        {
            var result = new SearchRequestFilter();

            result.ExtractTagAndLength(buffer);
            result.Type = (SearchRequestFilterTypes)result.Tag.TagNumber;
            switch (result.Type)
            {
            case SearchRequestFilterTypes.Present:
                var valueBuffer = buffer.Dequeue(result.Length);
                result.Value = Encoding.ASCII.GetString(valueBuffer.ToArray());
                break;

            case SearchRequestFilterTypes.GreaterOrEqual:
            case SearchRequestFilterTypes.LessOrEqual:
            case SearchRequestFilterTypes.ApproxMatch:
            case SearchRequestFilterTypes.EqualityMatch:
                result.Attribute = AttributeValueAssertion.Extract(buffer);
                break;

            case SearchRequestFilterTypes.Or:
            case SearchRequestFilterTypes.And:
                int i       = 0;
                var filters = new List <SearchRequestFilter>();
                while (i < result.Length)
                {
                    var searchRequestFilter = SearchRequestFilter.Extract(buffer);
                    if (searchRequestFilter == null)
                    {
                        break;
                    }

                    filters.Add(searchRequestFilter);
                    i += searchRequestFilter.Serialize().Count;
                }

                result.Filters = filters;
                break;
            }

            return(result);
        }