Search in sources :

Example 6 with Data

use of org.minidns.record.Data in project minidns by MiniDNS.

the class DNSMessageTest method testComNsec3Lookup.

@Test
public void testComNsec3Lookup() throws Exception {
    DNSMessage m = getMessageFromResource("com-nsec3");
    assertEquals(0, m.answerSection.size());
    List<Record<? extends Data>> records = m.authoritySection;
    assertEquals(8, records.size());
    for (Record<? extends Data> record : records) {
        if (record.type == TYPE.NSEC3) {
            assertEquals(TYPE.NSEC3, record.getPayload().getType());
            NSEC3 nsec3 = (NSEC3) record.payloadData;
            assertEquals(HashAlgorithm.SHA1, nsec3.hashAlgorithm);
            assertEquals(1, nsec3.flags);
            assertEquals(0, nsec3.iterations);
            assertEquals(0, nsec3.salt.length);
            switch(record.name.ace) {
                case "CK0POJMG874LJREF7EFN8430QVIT8BSM.com":
                    assertCsEquals("CK0QFMDQRCSRU0651QLVA1JQB21IF7UR", Base32.encodeToString(nsec3.nextHashed));
                    assertArrayContentEquals(new TYPE[] { TYPE.NS, TYPE.SOA, TYPE.RRSIG, TYPE.DNSKEY, TYPE.NSEC3PARAM }, nsec3.types);
                    break;
                case "V2I33UBTHNVNSP9NS85CURCLSTFPTE24.com":
                    assertCsEquals("V2I4KPUS7NGDML5EEJU3MVHO26GKB6PA", Base32.encodeToString(nsec3.nextHashed));
                    assertArrayContentEquals(new TYPE[] { TYPE.NS, TYPE.DS, TYPE.RRSIG }, nsec3.types);
                    break;
                case "3RL20VCNK6KV8OT9TDIJPI0JU1SS6ONS.com":
                    assertCsEquals("3RL3UFVFRUE94PV5888AIC2TPS0JA9V2", Base32.encodeToString(nsec3.nextHashed));
                    assertArrayContentEquals(new TYPE[] { TYPE.NS, TYPE.DS, TYPE.RRSIG }, nsec3.types);
                    break;
            }
        }
    }
}
Also used : NSEC3(org.minidns.record.NSEC3) Record(org.minidns.record.Record) Data(org.minidns.record.Data) DNSMessage(org.minidns.dnsmessage.DNSMessage) Test(org.junit.Test)

Example 7 with Data

use of org.minidns.record.Data in project minidns by MiniDNS.

the class DNSMessageTest method testSoaLookup.

@Test
public void testSoaLookup() throws Exception {
    DNSMessage m = getMessageFromResource("oracle-soa");
    assertFalse(m.authoritativeAnswer);
    List<Record<? extends Data>> answers = m.answerSection;
    assertEquals(1, answers.size());
    Record<? extends Data> answer = answers.get(0);
    assertTrue(answer.getPayload() instanceof SOA);
    assertEquals(TYPE.SOA, answer.getPayload().getType());
    SOA soa = (SOA) answer.getPayload();
    assertCsEquals("orcldns1.ultradns.com", soa.mname);
    assertCsEquals("hostmaster\\@oracle.com", soa.rname);
    assertEquals(2015032404L, soa.serial);
    assertEquals(10800, soa.refresh);
    assertEquals(3600, soa.retry);
    assertEquals(1209600, soa.expire);
    assertEquals(900L, soa.minimum);
}
Also used : SOA(org.minidns.record.SOA) Record(org.minidns.record.Record) Data(org.minidns.record.Data) DNSMessage(org.minidns.dnsmessage.DNSMessage) Test(org.junit.Test)

Example 8 with Data

use of org.minidns.record.Data in project minidns by MiniDNS.

the class DNSMessageTest method testALookup.

@Test
public void testALookup() throws Exception {
    DNSMessage m = getMessageFromResource("sun-a");
    assertFalse(m.authoritativeAnswer);
    List<Record<? extends Data>> answers = m.answerSection;
    assertEquals(2, answers.size());
    Record<? extends Data> cname = answers.get(0);
    Record<? extends Data> a = answers.get(1);
    assertTrue(cname.getPayload() instanceof RRWithTarget);
    assertEquals(TYPE.CNAME, cname.getPayload().getType());
    assertCsEquals("legacy-sun.oraclegha.com", ((RRWithTarget) (cname.getPayload())).target);
    assertCsEquals("legacy-sun.oraclegha.com", a.name);
    assertTrue(a.getPayload() instanceof A);
    assertEquals(TYPE.A, a.getPayload().getType());
    assertCsEquals("156.151.59.35", a.getPayload().toString());
}
Also used : AAAA(org.minidns.record.AAAA) SOA(org.minidns.record.SOA) A(org.minidns.record.A) RRWithTarget(org.minidns.record.RRWithTarget) Record(org.minidns.record.Record) Data(org.minidns.record.Data) DNSMessage(org.minidns.dnsmessage.DNSMessage) Test(org.junit.Test)

Example 9 with Data

use of org.minidns.record.Data in project minidns by MiniDNS.

the class DNSSECClient method verifySignedRecords.

private Set<UnverifiedReason> verifySignedRecords(Question q, RRSIG rrsig, List<Record<? extends Data>> records) throws IOException {
    Set<UnverifiedReason> result = new HashSet<>();
    DNSKEY dnskey = null;
    if (rrsig.typeCovered == TYPE.DNSKEY) {
        // Key must be present
        for (Record<? extends Data> record : records) {
            Record<DNSKEY> dnsKeyRecord = record.ifPossibleAs(DNSKEY.class);
            if (dnsKeyRecord == null)
                continue;
            if (dnsKeyRecord.payloadData.getKeyTag() == rrsig.keyTag) {
                dnskey = dnsKeyRecord.payloadData;
                break;
            }
        }
    } else if (q.type == TYPE.DS && rrsig.signerName.equals(q.name)) {
        // We should not probe for the self signed DS negative response, as it will be an endless loop.
        result.add(new NoTrustAnchorReason(q.name.ace));
        return result;
    } else {
        DNSSECMessage dnskeyRes = queryDnssec(rrsig.signerName, TYPE.DNSKEY);
        if (dnskeyRes == null) {
            throw new DNSSECValidationFailedException(q, "There is no DNSKEY " + rrsig.signerName + ", but it is used");
        }
        result.addAll(dnskeyRes.getUnverifiedReasons());
        for (Record<? extends Data> record : dnskeyRes.answerSection) {
            Record<DNSKEY> dnsKeyRecord = record.ifPossibleAs(DNSKEY.class);
            if (dnsKeyRecord == null)
                continue;
            if (dnsKeyRecord.payloadData.getKeyTag() == rrsig.keyTag) {
                dnskey = dnsKeyRecord.payloadData;
            }
        }
    }
    if (dnskey == null) {
        throw new DNSSECValidationFailedException(q, records.size() + " " + rrsig.typeCovered + " record(s) are signed using an unknown key.");
    }
    UnverifiedReason unverifiedReason = verifier.verify(records, rrsig, dnskey);
    if (unverifiedReason != null) {
        result.add(unverifiedReason);
    }
    return result;
}
Also used : Record(org.minidns.record.Record) Data(org.minidns.record.Data) NoTrustAnchorReason(org.minidns.dnssec.UnverifiedReason.NoTrustAnchorReason) DNSKEY(org.minidns.record.DNSKEY) HashSet(java.util.HashSet)

Example 10 with Data

use of org.minidns.record.Data in project minidns by MiniDNS.

the class DNSSECClient method verifyAnswer.

private Set<UnverifiedReason> verifyAnswer(DNSMessage dnsMessage) throws IOException {
    Question q = dnsMessage.questions.get(0);
    List<Record<? extends Data>> answers = dnsMessage.answerSection;
    List<Record<? extends Data>> toBeVerified = dnsMessage.copyAnswers();
    VerifySignaturesResult verifiedSignatures = verifySignatures(q, answers, toBeVerified);
    Set<UnverifiedReason> result = verifiedSignatures.reasons;
    if (!result.isEmpty()) {
        return result;
    }
    // Keep SEPs separated, we only need one valid SEP.
    boolean sepSignatureValid = false;
    Set<UnverifiedReason> sepReasons = new HashSet<>();
    for (Iterator<Record<? extends Data>> iterator = toBeVerified.iterator(); iterator.hasNext(); ) {
        Record<DNSKEY> record = iterator.next().ifPossibleAs(DNSKEY.class);
        if (record == null) {
            continue;
        }
        // Verify all DNSKEYs as if it was a SEP. If we find a single SEP we are safe.
        Set<UnverifiedReason> reasons = verifySecureEntryPoint(q, record);
        if (reasons.isEmpty()) {
            sepSignatureValid = true;
        } else {
            sepReasons.addAll(reasons);
        }
        if (!verifiedSignatures.sepSignaturePresent) {
            LOGGER.finer("SEP key is not self-signed.");
        }
        iterator.remove();
    }
    if (verifiedSignatures.sepSignaturePresent && !sepSignatureValid) {
        result.addAll(sepReasons);
    }
    if (verifiedSignatures.sepSignatureRequired && !verifiedSignatures.sepSignaturePresent) {
        result.add(new NoSecureEntryPointReason(q.name.ace));
    }
    if (!toBeVerified.isEmpty()) {
        if (toBeVerified.size() != answers.size()) {
            throw new DNSSECValidationFailedException(q, "Only some records are signed!");
        } else {
            result.add(new NoSignaturesReason(q));
        }
    }
    return result;
}
Also used : Data(org.minidns.record.Data) DNSKEY(org.minidns.record.DNSKEY) NoSignaturesReason(org.minidns.dnssec.UnverifiedReason.NoSignaturesReason) Question(org.minidns.dnsmessage.Question) Record(org.minidns.record.Record) NoSecureEntryPointReason(org.minidns.dnssec.UnverifiedReason.NoSecureEntryPointReason) HashSet(java.util.HashSet)

Aggregations

Data (org.minidns.record.Data)22 Record (org.minidns.record.Record)21 DNSMessage (org.minidns.dnsmessage.DNSMessage)16 Test (org.junit.Test)14 HashSet (java.util.HashSet)5 DNSName (org.minidns.dnsname.DNSName)4 DNSKEY (org.minidns.record.DNSKEY)4 ArrayList (java.util.ArrayList)3 Question (org.minidns.dnsmessage.Question)3 EDNS (org.minidns.edns.EDNS)3 IOException (java.io.IOException)2 LinkedList (java.util.LinkedList)2 LRUCache (org.minidns.cache.LRUCache)2 NoSignaturesReason (org.minidns.dnssec.UnverifiedReason.NoSignaturesReason)2 AAAA (org.minidns.record.AAAA)2 RRSIG (org.minidns.record.RRSIG)2 SOA (org.minidns.record.SOA)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 DataOutputStream (java.io.DataOutputStream)1 InetAddress (java.net.InetAddress)1