Exemplo n.º 1
0
        public void DnsRecordFactory_SRVRecordEmpty()
        {
            var data    = new byte[0];
            var factory = GetFactory(data);
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.SRV, QueryClass.IN, 0, data.Length);

            Action act = () => factory.GetRecord(info);

            Assert.ThrowsAny <IndexOutOfRangeException>(act);
        }
Exemplo n.º 2
0
        public void DnsRecordFactory_TXTRecordWrongTextLength()
        {
            var data    = new byte[0];
            var factory = GetFactory(data);
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.TXT, QueryClass.IN, 0, data.Length);

            var result = factory.GetRecord(info) as TxtRecord;

            Assert.Empty(result.EscapedText);
        }
        public void DnsRecordFactory_NSRecordNotEnoughData()
        {
            var data    = new byte[0];
            var factory = GetFactory(data);
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.NS, QueryClass.IN, 0, data.Length);

            var ex = Assert.ThrowsAny <DnsResponseParseException>(() => factory.GetRecord(info));

            Assert.Equal(0, ex.Index);
        }
Exemplo n.º 4
0
        private DnsResourceRecord ResolveDnsKeyRecord(ResourceRecordInfo info)
        {
            var startIndex = _reader.Index;
            int flags      = _reader.ReadUInt16NetworkOrder();
            var protocol   = _reader.ReadByte();
            var algorithm  = _reader.ReadByte();
            var publicKey  = _reader.ReadBytesToEnd(startIndex, info.RawDataLength).ToArray();

            return(new DnsKeyRecord(info, flags, protocol, algorithm, publicKey));
        }
Exemplo n.º 5
0
        private DnsResourceRecord ResolveTlsaRecord(ResourceRecordInfo info)
        {
            var startIndex                 = _reader.Index;
            var certificateUsage           = _reader.ReadByte();
            var selector                   = _reader.ReadByte();
            var matchingType               = _reader.ReadByte();
            var certificateAssociationData = _reader.ReadBytesToEnd(startIndex, info.RawDataLength).ToArray();

            return(new TlsaRecord(info, certificateUsage, selector, matchingType, certificateAssociationData));
        }
Exemplo n.º 6
0
        private DnsResourceRecord ResolveDsRecord(ResourceRecordInfo info)
        {
            var startIndex = _reader.Index;
            var keyTag     = _reader.ReadUInt16NetworkOrder();
            var algorithm  = _reader.ReadByte();
            var digestType = _reader.ReadByte();
            var digest     = _reader.ReadBytesToEnd(startIndex, info.RawDataLength).ToArray();

            return(new DsRecord(info, keyTag, algorithm, digestType, digest));
        }
Exemplo n.º 7
0
        public void DnsRecordFactory_PTRRecordEmptyName()
        {
            var data    = new byte[] { 0 };
            var factory = GetFactory(data);
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.PTR, QueryClass.IN, 0, data.Length);

            var result = factory.GetRecord(info) as PtrRecord;

            Assert.Equal(".", result.PtrDomainName.Value);
        }
Exemplo n.º 8
0
        public void DnsRecordFactory_ARecordNotEnoughData()
        {
            var data    = new byte[] { 23, 23, 23 };
            var factory = GetFactory(data);
            var info    = new ResourceRecordInfo("example.com", ResourceRecordType.A, QueryClass.IN, 0, data.Length);

            Action act = () => factory.GetRecord(info);

            Assert.ThrowsAny <IndexOutOfRangeException>(act);
        }
Exemplo n.º 9
0
        public void DnsRecordFactory_ARecord()
        {
            var data    = new byte[] { 23, 24, 25, 26 };
            var factory = GetFactory(data);
            var info    = new ResourceRecordInfo("example.com", ResourceRecordType.A, QueryClass.IN, 0, data.Length);

            var result = factory.GetRecord(info) as ARecord;

            Assert.Equal(result.Address, IPAddress.Parse("23.24.25.26"));
        }
Exemplo n.º 10
0
        public void DnsRecordFactory_NSRecordEmptyName()
        {
            var data    = new byte[] { 0 };
            var factory = GetFactory(data);
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.NS, QueryClass.IN, 0, data.Length);

            var result = factory.GetRecord(info) as NsRecord;

            Assert.Equal(result.NSDName.Value, ".");
        }
Exemplo n.º 11
0
        public void DnsRecordFactory_MXRecordEmptyName()
        {
            var data    = new byte[] { 1, 0, 0 };
            var factory = GetFactory(data);
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.MX, QueryClass.IN, 0, data.Length);

            var result = factory.GetRecord(info) as MxRecord;

            Assert.Equal(256, result.Preference);
            Assert.Equal(".", result.Exchange.Value);
        }
Exemplo n.º 12
0
        public void DnsRecordFactory_AAAARecord()
        {
            var data    = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
            var factory = GetFactory(data);
            var info    = new ResourceRecordInfo("example.com", ResourceRecordType.AAAA, QueryClass.IN, 0, data.Length);

            var result = factory.GetRecord(info) as AaaaRecord;

            Assert.Equal(result.Address, IPAddress.Parse("102:304:506:708:90a:b0c:d0e:f10"));
            Assert.Equal(result.Address.GetAddressBytes(), data);
        }
Exemplo n.º 13
0
        private DnsResourceRecord ResolveSoaRecord(ResourceRecordInfo info)
        {
            var mName   = _reader.ReadDnsName();
            var rName   = _reader.ReadDnsName();
            var serial  = _reader.ReadUInt32NetworkOrder();
            var refresh = _reader.ReadUInt32NetworkOrder();
            var retry   = _reader.ReadUInt32NetworkOrder();
            var expire  = _reader.ReadUInt32NetworkOrder();
            var minimum = _reader.ReadUInt32NetworkOrder();

            return(new SoaRecord(info, mName, rName, serial, refresh, retry, expire, minimum));
        }
        public void DnsRecordFactory_ARecordNotEnoughData()
        {
            var data    = new byte[] { 23, 23, 23 };
            var factory = GetFactory(data);
            var info    = new ResourceRecordInfo("example.com", ResourceRecordType.A, QueryClass.IN, 0, data.Length);

            var ex = Assert.ThrowsAny <DnsResponseParseException>(() => factory.GetRecord(info));

            Assert.Contains("IPv4", ex.Message);
            Assert.Equal(0, ex.Index);
            Assert.Equal(4, ex.ReadLength);
        }
Exemplo n.º 15
0
        public void DnsRecordFactory_PTRRecord()
        {
            var name   = DnsString.Parse("result.example.com");
            var writer = new DnsDatagramWriter();

            writer.WriteHostName(name.Value);
            var factory = GetFactory(writer.Data.ToArray());
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.PTR, QueryClass.IN, 0, writer.Data.Count);

            var result = factory.GetRecord(info) as PtrRecord;

            Assert.Equal(result.PtrDomainName, name);
        }
Exemplo n.º 16
0
        public void DnsRecordFactory_MBRecord()
        {
            var name   = DnsString.Parse("Müsli.de");
            var writer = new DnsDatagramWriter();

            writer.WriteHostName(name.Value);
            var factory = GetFactory(writer.Data.ToArray());
            var info    = new ResourceRecordInfo("Müsli.de", ResourceRecordType.MB, QueryClass.IN, 0, writer.Data.Count);

            var result = factory.GetRecord(info) as MbRecord;

            Assert.Equal(result.MadName, name);
            Assert.Equal("müsli.de.", result.MadName.Original);
        }
Exemplo n.º 17
0
        public void Test_CaaWorker_Scan_Records()
        {
            // Arrange
            var workerInformation = new WorkerInformation()
            {
                Hostname = "http://www.google.com"
            };
            var resourceRecord = new ResourceRecordInfo(DnsString.FromResponseQueryString(workerInformation.Hostname), ResourceRecordType.CAA, QueryClass.IN, 0, 0);

            var dnsRecords = new List <DnsResourceRecord>()
            {
                new CaaRecord(resourceRecord, 0, "issuewild", "pki.googl"),
                new CaaRecord(resourceRecord, 0, "issue", "letsencrypt.org"),
                new CaaRecord(resourceRecord, 0, "issuewild", "sslcerts.com"),
                new CaaRecord(resourceRecord, 0, "issue", "freecerts.com"),
            };

            var dnsResponse = new Mock <IDnsQueryResponse>();

            dnsResponse.Setup(x => x.Answers).Returns(dnsRecords);

            var lookupClientMock = new Mock <ILookupClient>(MockBehavior.Strict);

            lookupClientMock.Setup(x => x.QueryAsync(workerInformation.Hostname, QueryType.CAA, QueryClass.IN, null, default)).Returns(Task.FromResult(dnsResponse.Object));
            var previousWorkerMock = new Mock <IAsyncWorker>(MockBehavior.Strict);

            previousWorkerMock.Setup(x => x.Scan(workerInformation)).Returns(Task.FromResult(new List <ScanResult>()));

            var service = new CaaWorker(previousWorkerMock.Object, lookupClientMock.Object);

            // Act
            var rawCaaRecords = service.Scan(workerInformation);

            rawCaaRecords.Wait();

            // Assert
            var records = rawCaaRecords.Result;

            Assert.IsInstanceOfType(records.Single(), typeof(ParsedCaaResponse));
            var caaRecord = records.Single() as ParsedCaaResponse;

            Assert.IsTrue(caaRecord.HasCaaRecords);
            Assert.AreEqual(2, caaRecord.IssueCas.Count);
            Assert.AreEqual("letsencrypt.org", caaRecord.IssueCas[0]);
            Assert.AreEqual("freecerts.com", caaRecord.IssueCas[1]);
            Assert.AreEqual(2, caaRecord.IssueWildCas.Count);
            Assert.AreEqual("pki.googl", caaRecord.IssueWildCas[0]);
            Assert.AreEqual("sslcerts.com", caaRecord.IssueWildCas[1]);
        }
Exemplo n.º 18
0
        private DnsResourceRecord ResolveRRSigRecord(ResourceRecordInfo info)
        {
            var startIndex          = _reader.Index;
            var type                = _reader.ReadUInt16NetworkOrder();
            var algorithmNumber     = _reader.ReadByte();
            var labels              = _reader.ReadByte();
            var originalTtl         = _reader.ReadUInt32NetworkOrder();
            var signatureExpiration = _reader.ReadUInt32NetworkOrder();
            var signatureInception  = _reader.ReadUInt32NetworkOrder();
            var keyTag              = _reader.ReadUInt16NetworkOrder();
            var signersName         = _reader.ReadDnsName();
            var signature           = _reader.ReadBytesToEnd(startIndex, info.RawDataLength).ToArray();

            return(new RRSigRecord(info, type, algorithmNumber, labels, originalTtl, signatureExpiration, signatureInception, keyTag, signersName, signature));
        }
        public void DnsRecordFactory_TXTRecordEmpty()
        {
            var textA = "Some Text";
            var lineA = Encoding.ASCII.GetBytes(textA);
            var data  = new List <byte> {
                5
            };

            data.AddRange(lineA);

            var factory = GetFactory(data.ToArray());
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.TXT, QueryClass.IN, 0, data.Count);

            Assert.ThrowsAny <DnsResponseParseException>(() => factory.GetRecord(info));
        }
Exemplo n.º 20
0
        public void DnsRecordFactory_SOARecord()
        {
            var data    = new byte[] { 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5 };
            var factory = GetFactory(data);
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.SOA, QueryClass.IN, 0, data.Length);

            var result = factory.GetRecord(info) as SoaRecord;

            Assert.Equal(".", result.MName.Value);
            Assert.Equal(".", result.RName.Value);
            Assert.True(result.Serial == 1);
            Assert.True(result.Refresh == 2);
            Assert.True(result.Retry == 3);
            Assert.True(result.Expire == 4);
            Assert.True(result.Minimum == 5);
        }
Exemplo n.º 21
0
        public void DnsRecordFactory_MXRecord()
        {
            var name   = DnsString.Parse("result.example.com");
            var writer = new DnsDatagramWriter();

            writer.WriteByte(0);
            writer.WriteByte(1);
            writer.WriteHostName(name.Value);

            var factory = GetFactory(writer.Data.ToArray());
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.MX, QueryClass.IN, 0, writer.Data.Count);

            var result = factory.GetRecord(info) as MxRecord;

            Assert.Equal(1, result.Preference);
            Assert.Equal(result.Exchange, name);
        }
Exemplo n.º 22
0
        public void DnsRecordFactory_SRVRecord()
        {
            var name   = DnsString.Parse("result.example.com");
            var writer = new DnsDatagramWriter();

            writer.WriteBytes(new byte[] { 0, 1, 1, 0, 2, 3 }, 6);
            writer.WriteHostName(name.Value);
            var factory = GetFactory(writer.Data.ToArray());

            var info = new ResourceRecordInfo("query.example.com", ResourceRecordType.SRV, QueryClass.IN, 0, writer.Data.Count);

            var result = factory.GetRecord(info) as SrvRecord;

            Assert.Equal(result.Target, name);
            Assert.True(result.Priority == 1);
            Assert.True(result.Weight == 256);
            Assert.True(result.Port == 515);
        }
Exemplo n.º 23
0
        public void Test_DkimWorker_OneSelectors_Txt()
        {
            // Arrange
            var workerInformation    = MockWorkerInformation(hostname: "google.com");
            var hostnameWithSelector = "selector1._domainkey.google.com";

            var settingsMock = Utils.CreateMock <ISettings>();

            settingsMock.Setup(x => x.DkimSelectors).Returns(new List <string>()
            {
                "selector1._domainkey"
            });

            var lookupClientMock = Utils.CreateMock <ILookupClient>();

            var resourceRecord = new ResourceRecordInfo(DnsString.FromResponseQueryString(hostnameWithSelector), ResourceRecordType.TXT, QueryClass.IN, 0, 0);
            var txtRecords     = new[] { "v=DKIM <key>" };

            var dnsRecords = new List <TxtRecord>()
            {
                new TxtRecord(resourceRecord, txtRecords, txtRecords)
            };

            var dnsResponse = new Mock <IDnsQueryResponse>();

            dnsResponse.Setup(x => x.Answers).Returns(dnsRecords);

            lookupClientMock.Setup(x => x.QueryAsync(hostnameWithSelector, QueryType.TXT, QueryClass.IN, null, default)).Returns(Task.FromResult(dnsResponse.Object));

            var previousWorkerMock = MockPreviousWorker(workerInformation);
            var worker             = new DkimWorker(previousWorkerMock.Object, lookupClientMock.Object, settingsMock.Object);

            // Act
            var rawRecords = worker.Scan(workerInformation);

            rawRecords.Wait();

            // Assert
            var records = rawRecords.Result;

            Assert.AreEqual(3, records.Count);

            AssertPreviousScanResults(new[] { records[0], records[1] }.ToList());
            AssertDkimResponse(records[2], null, new[] { ("selector1._domainkey", QueryType.TXT, txtRecords.ToList()) }.ToList(), true);
Exemplo n.º 24
0
        private DnsResourceRecord ResolveTXTRecord(ResourceRecordInfo info)
        {
            int pos = _reader.Index;

            var values     = new List <string>();
            var utf8Values = new List <string>();

            while ((_reader.Index - pos) < info.RawDataLength)
            {
                var length  = _reader.ReadByte();
                var bytes   = _reader.ReadBytes(length);
                var escaped = DnsDatagramReader.ParseString(bytes);
                var utf     = DnsDatagramReader.ReadUTF8String(bytes);
                values.Add(escaped);
                utf8Values.Add(utf);
            }

            return(new TxtRecord(info, values.ToArray(), utf8Values.ToArray()));
        }
        public void DnsRecordFactory_RRSIGRecord()
        {
            var   type                = ResourceRecordType.NSEC;
            var   algorithmNumber     = DnsSecurityAlgorithm.ECDSAP256SHA256;
            var   labels              = 5;
            var   originalTtl         = 300;
            var   signatureExpiration = 1589414400;
            var   signatureInception  = 1587600000;
            short keytag              = 3942;
            var   signersName         = DnsString.Parse("result.example.com");
            var   signatureString     = "kfyyKQoPZJFyOFSDqav7wj5XNRPqZssV2K2k8MJun28QSsCMHyWOjw9Hk4KofnEIUWNui3mMgAEFYbwoeRKkMf5uDAh6ryJ4veQNj86mgYJrpJppUplqlqJE8o1bx0I1VfwheL+M23bL5MnqSGiI5igmMDyeVUraVOO4RQyfGN0=";
            var   signature           = Convert.FromBase64String(signatureString);

            var writer = new DnsDatagramWriter();

            writer.WriteInt16NetworkOrder((short)type);
            writer.WriteByte((byte)algorithmNumber);
            writer.WriteByte((byte)labels);
            writer.WriteInt32NetworkOrder(originalTtl);
            writer.WriteInt32NetworkOrder(signatureExpiration);
            writer.WriteInt32NetworkOrder(signatureInception);
            writer.WriteInt16NetworkOrder(keytag);
            writer.WriteHostName(signersName.Value);
            writer.WriteBytes(signature, signature.Length);

            var factory = GetFactory(writer.Data.ToArray());
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.RRSIG, QueryClass.IN, 0, writer.Data.Count);

            var result = factory.GetRecord(info) as RRSigRecord;

            Assert.Equal(type, result.CoveredType);
            Assert.Equal(algorithmNumber, result.Algorithm);
            Assert.Equal(labels, result.Labels);
            Assert.Equal(originalTtl, result.OriginalTtl);
            Assert.Equal(DateTimeOffset.FromUnixTimeSeconds(signatureExpiration), result.SignatureExpiration);
            Assert.Equal(DateTimeOffset.FromUnixTimeSeconds(signatureInception), result.SignatureInception);
            Assert.Equal(signersName.Value, result.SignersName);

            Assert.Equal(signature, result.Signature);
            Assert.Equal(signatureString, result.SignatureAsString);
        }
Exemplo n.º 26
0
        public void DnsRecordFactory_TXTRecord()
        {
            var textA = @"Some lines of text.";
            var textB = "Another line";
            var lineA = Encoding.ASCII.GetBytes(textA);
            var lineB = Encoding.ASCII.GetBytes(textB);
            var data  = new List <byte>();

            data.Add((byte)lineA.Length);
            data.AddRange(lineA);
            data.Add((byte)lineB.Length);
            data.AddRange(lineB);

            var factory = GetFactory(data.ToArray());
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.TXT, QueryClass.IN, 0, data.Count);

            var result = factory.GetRecord(info) as TxtRecord;

            Assert.Equal(2, result.EscapedText.Count);
            Assert.Equal(result.EscapedText.ElementAt(0), textA);
            Assert.Equal(result.EscapedText.ElementAt(1), textB);
        }
Exemplo n.º 27
0
        public void Test_MxWorker_Scan_MxRecords()
        {
            //Arrange
            var workerInformation = MockWorkerInformation(hostname: "google.com");
            var dnsString         = DnsString.FromResponseQueryString(workerInformation.Hostname);
            var resourceRecord    = new ResourceRecordInfo(dnsString, ResourceRecordType.MX, QueryClass.IN, 0, 0);

            var dnsResponse = new Mock <IDnsQueryResponse>();

            dnsResponse.Setup(x => x.Answers).Returns(new List <DnsResourceRecord>()
            {
                new MxRecord(resourceRecord, 0, dnsString)
            });

            var lookupClientMock = Utils.CreateMock <ILookupClient>();

            lookupClientMock.Setup(x => x.QueryAsync(workerInformation.Hostname, QueryType.MX, QueryClass.IN, null, default)).Returns(Task.FromResult(dnsResponse.Object));
            var previousWorkerMock = Utils.CreateMock <IAsyncWorker>();

            previousWorkerMock.Setup(x => x.Scan(workerInformation)).Returns(Task.FromResult(MockScanResults()));

            var service = new MxWorker(previousWorkerMock.Object, lookupClientMock.Object);

            //Act
            var rawMxRecords = service.Scan(workerInformation);

            rawMxRecords.Wait();

            // Assert
            var records = rawMxRecords.Result;

            Assert.AreEqual(3, records.Count);
            AssertPreviousScanResults(new[] { records[0], records[1] }.ToList());
            AssertMxResponse(records[2], new List <string>()
            {
                "google.com."
            }, true);
        }
        public void DnsRecordFactory_DnsKeyRecord()
        {
            var expectedPublicKey = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            var expectedBytes     = Encoding.UTF8.GetBytes(expectedPublicKey);
            var name   = DnsString.Parse("example.com");
            var writer = new DnsDatagramWriter();

            writer.WriteInt16NetworkOrder(256);
            writer.WriteByte(3);
            writer.WriteByte((byte)DnsSecurityAlgorithm.RSASHA256);
            writer.WriteBytes(expectedBytes, expectedBytes.Length);

            var factory = GetFactory(writer.Data.ToArray());

            var info = new ResourceRecordInfo(name, ResourceRecordType.DNSKEY, QueryClass.IN, 0, writer.Data.Count);

            var result = factory.GetRecord(info) as DnsKeyRecord;

            Assert.Equal(expectedBytes, result.PublicKey);
            Assert.Equal(256, result.Flags);
            Assert.Equal(3, result.Protocol);
            Assert.Equal(DnsSecurityAlgorithm.RSASHA256, result.Algorithm);
        }
        public void ResolveServiceProcessResultReturnAEntityList()
        {
            IDnsQueryResponse result         = null;
            var                mockResult    = new Mock <IDnsQueryResponse>();
            DnsString          canonicalName = DnsClient.DnsString.Parse("hostname.com");
            ResourceRecordInfo info          = new ResourceRecordInfo(canonicalName, DnsClient.Protocol.ResourceRecordType.SRV, DnsClient.QueryClass.IN, 10, 1);

            var record      = new SrvRecord(info, 1, 10, 443, canonicalName);
            var cNameRecord = new CNameRecord(info, canonicalName);

            List <SrvRecord> answers = new List <SrvRecord>()
            {
                record
            };

            mockResult.Setup(foo => foo.Answers).Returns(answers);
            mockResult.Setup(foo => foo.Additionals).Returns(new List <CNameRecord>()
            {
                cNameRecord
            });
            result = mockResult.Object;
            List <DnsSrvResultEntry> ret = ResolveServiceProcessResult(result);
        }
Exemplo n.º 30
0
        public void DnsRecordFactory_SpecialChars()
        {
            var textA = "\"äöü \\slash/! @bla.com \"";
            var textB = "(Another line)";
            var lineA = Encoding.UTF8.GetBytes(textA);
            var lineB = Encoding.UTF8.GetBytes(textB);
            var data  = new List <byte>();

            data.Add((byte)lineA.Length);
            data.AddRange(lineA);
            data.Add((byte)lineB.Length);
            data.AddRange(lineB);

            var factory = GetFactory(data.ToArray());
            var info    = new ResourceRecordInfo("query.example.com", ResourceRecordType.TXT, QueryClass.IN, 0, data.Count);

            var result = factory.GetRecord(info) as TxtRecord;

            Assert.Equal(2, result.EscapedText.Count);
            Assert.Equal(result.Text.ElementAt(0), textA);
            Assert.Equal("\\\"\\195\\164\\195\\182\\195\\188 \\\\slash/! @bla.com \\\"", result.EscapedText.ElementAt(0));
            Assert.Equal(result.Text.ElementAt(1), textB);
            Assert.Equal(result.EscapedText.ElementAt(1), textB);
        }