예제 #1
0
 public static MXResource Unserialize(DNSInputStream stream, UInt16 size)
 {
     return(new MXResource(
                stream.ReadUInt16()
                , stream.ReadDomain()
                ));
 }
예제 #2
0
        public static DNSQuestion Unserialize(DNSInputStream stream)
        {
            var name          = stream.ReadDomain();
            var query_type    = (ResourceRecordType)stream.ReadUInt16();
            var address_class = (AddressClass)stream.ReadUInt16();

            return(new DNSQuestion(name, query_type, address_class));
        }
예제 #3
0
        /**
         * A convenience wrapper around Unserialize.
         */
        public static DNSPacket FromBytes(byte[] bytes)
        {
            var buffer_stream = new MemoryStream(bytes);
            var compress      = new CompressionInputContext(bytes);
            var dns_in        = new DNSInputStream(buffer_stream, compress);

            return(Unserialize(dns_in));
        }
예제 #4
0
        /**
         * Decodes the raw bytes of a DNS resource record into an
         * object.
         */
        public static DNSRecord Unserialize(DNSInputStream stream)
        {
            var name        = stream.ReadDomain();
            var record_type = (ResourceRecordType)stream.ReadUInt16();
            var class_type  = (AddressClass)stream.ReadUInt16();
            var ttl         = stream.ReadUInt32();

            var          record_size = stream.ReadUInt16();
            IDNSResource resource    = null;

            switch (record_type.Normalize())
            {
            case ResourceRecordType.HOST_ADDRESS:
                resource = AResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.NAME_SERVER:
                resource = NSResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.START_OF_AUTHORITY:
                resource = SOAResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.CANONICAL_NAME:
                resource = CNAMEResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.MAIL_EXCHANGE:
                resource = MXResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.POINTER:
                resource = PTRResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.HOST_6ADDRESS:
                resource = AAAAResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.UNSUPPORTED:
                // Advance the byte counter - even if we can't parse it,
                // we have to properly ignore it
                stream.ReadBytes(record_size);
                resource = null;
                break;
            }

            return(new DNSRecord(name, class_type.Normalize(), ttl, resource));
        }
예제 #5
0
        public static DNSPacket Unserialize(DNSInputStream stream)
        {
            var id = stream.ReadUInt16();

            var is_query_bit          = new Field(1);
            var query_type_flag       = new Field(4);
            var is_authority_bit      = new Field(1);
            var is_truncated_bit      = new Field(1);
            var recursive_request_bit = new Field(1);

            new FieldGroup()
            .Add(is_query_bit)
            .Add(query_type_flag)
            .Add(is_authority_bit)
            .Add(is_truncated_bit)
            .Add(recursive_request_bit)
            .Unpack(stream.ReadByte());

            var is_query          = is_query_bit.Value == 0;
            var query_type        = (QueryType)query_type_flag.Value;
            var is_authority      = is_authority_bit.Value == 1;
            var is_truncated      = is_truncated_bit.Value == 1;
            var recursive_request = recursive_request_bit.Value == 1;

            var recursion_availble_bit = new Field(1);
            var zeroes             = new Field(3);
            var response_type_flag = new Field(4);

            new FieldGroup()
            .Add(recursion_availble_bit)
            .Add(zeroes)
            .Add(response_type_flag)
            .Unpack(stream.ReadByte());

            var recursive_response = recursion_availble_bit.Value == 1;
            var response_type      = (ResponseType)response_type_flag.Value;

            var question_count   = stream.ReadUInt16();
            var answer_count     = stream.ReadUInt16();
            var authority_count  = stream.ReadUInt16();
            var additional_count = stream.ReadUInt16();

            var questions = new DNSQuestion[question_count];

            for (int i = 0; i < question_count; i++)
            {
                questions[i] = DNSQuestion.Unserialize(stream);
                if (questions[i] == null)
                {
                    throw new InvalidDataException("null Question " + i);
                }
            }

            var answers = new DNSRecord[answer_count];

            for (int i = 0; i < answer_count; i++)
            {
                answers[i] = DNSRecord.Unserialize(stream);
                if (answers[i] == null)
                {
                    throw new InvalidDataException("null Answer " + i);
                }
            }

            var authority = new DNSRecord[authority_count];

            for (int i = 0; i < authority_count; i++)
            {
                authority[i] = DNSRecord.Unserialize(stream);
                if (authority[i] == null)
                {
                    throw new InvalidDataException("null Authority " + i);
                }
            }

            var additional = new DNSRecord[additional_count];

            for (int i = 0; i < additional_count; i++)
            {
                additional[i] = DNSRecord.Unserialize(stream);
                if (additional[i] == null)
                {
                    throw new InvalidDataException("null Additional " + i);
                }
            }

            return(new DNSPacket(id, is_query, query_type.Normalize(), is_authority, is_truncated,
                                 recursive_request, recursive_response, response_type.Normalize(),
                                 questions, answers, authority, additional));
        }
예제 #6
0
 public static AResource Unserialize(DNSInputStream stream, UInt16 size)
 {
     return(new AResource(
                stream.ReadIPv4Address()
                ));
 }
예제 #7
0
 public static CNAMEResource Unserialize(DNSInputStream stream, UInt16 size)
 {
     return(new CNAMEResource(
                stream.ReadDomain()
                ));
 }