Enable CAA parsing
This commit is contained in:
parent
7864d445e5
commit
522331911d
|
@ -118,6 +118,7 @@ Example programs can be found in the `github.com/miekg/exdns` repository.
|
||||||
* 6605 - ECDSA
|
* 6605 - ECDSA
|
||||||
* 6725 - IANA Registry Update
|
* 6725 - IANA Registry Update
|
||||||
* 6742 - ILNP DNS
|
* 6742 - ILNP DNS
|
||||||
|
* 6844 - CAA record
|
||||||
* 6891 - EDNS0 update
|
* 6891 - EDNS0 update
|
||||||
* 6895 - DNS IANA considerations
|
* 6895 - DNS IANA considerations
|
||||||
* 6975 - Algorithm Understanding in DNSSEC
|
* 6975 - Algorithm Understanding in DNSSEC
|
||||||
|
@ -138,6 +139,5 @@ Example programs can be found in the `github.com/miekg/exdns` repository.
|
||||||
* privatekey.Precompute() when signing?
|
* privatekey.Precompute() when signing?
|
||||||
* Last remaining RRs: APL, ATMA, A6 and NXT and IPSECKEY;
|
* Last remaining RRs: APL, ATMA, A6 and NXT and IPSECKEY;
|
||||||
* Missing in parsing: ISDN, UNSPEC, ATMA;
|
* Missing in parsing: ISDN, UNSPEC, ATMA;
|
||||||
* CAA parsing is broken;
|
|
||||||
* NSEC(3) cover/match/closest enclose;
|
* NSEC(3) cover/match/closest enclose;
|
||||||
* Replies with TC bit are not parsed to the end;
|
* Replies with TC bit are not parsed to the end;
|
||||||
|
|
|
@ -429,9 +429,6 @@ func TestToRFC3597(t *testing.T) {
|
||||||
func TestNoRdataPack(t *testing.T) {
|
func TestNoRdataPack(t *testing.T) {
|
||||||
data := make([]byte, 1024)
|
data := make([]byte, 1024)
|
||||||
for typ, fn := range typeToRR {
|
for typ, fn := range typeToRR {
|
||||||
if typ == TypeCAA {
|
|
||||||
continue // TODO(miek): known omission
|
|
||||||
}
|
|
||||||
r := fn()
|
r := fn()
|
||||||
*r.Header() = RR_Header{Name: "miek.nl.", Rrtype: typ, Class: ClassINET, Ttl: 3600}
|
*r.Header() = RR_Header{Name: "miek.nl.", Rrtype: typ, Class: ClassINET, Ttl: 3600}
|
||||||
_, err := PackRR(r, data, 0, nil, false)
|
_, err := PackRR(r, data, 0, nil, false)
|
||||||
|
|
2
msg.go
2
msg.go
|
@ -100,7 +100,7 @@ var TypeToString = map[uint16]string{
|
||||||
TypeANY: "ANY", // Meta RR
|
TypeANY: "ANY", // Meta RR
|
||||||
TypeATMA: "ATMA",
|
TypeATMA: "ATMA",
|
||||||
TypeAXFR: "AXFR", // Meta RR
|
TypeAXFR: "AXFR", // Meta RR
|
||||||
TypeCAA: "CAA",
|
TypeCAA: "TYPE257",
|
||||||
TypeCDNSKEY: "CDNSKEY",
|
TypeCDNSKEY: "CDNSKEY",
|
||||||
TypeCDS: "CDS",
|
TypeCDS: "CDS",
|
||||||
TypeCERT: "CERT",
|
TypeCERT: "CERT",
|
||||||
|
|
22
types.go
22
types.go
|
@ -1527,25 +1527,25 @@ func (rr *EUI64) copy() RR { return &EUI64{*rr.Hdr.copyHeader(), rr.Ad
|
||||||
func (rr *EUI64) String() string { return rr.Hdr.String() + euiToString(rr.Address, 64) }
|
func (rr *EUI64) String() string { return rr.Hdr.String() + euiToString(rr.Address, 64) }
|
||||||
func (rr *EUI64) len() int { return rr.Hdr.len() + 8 }
|
func (rr *EUI64) len() int { return rr.Hdr.len() + 8 }
|
||||||
|
|
||||||
// Support in incomplete - just handle it as unknown record
|
|
||||||
/*
|
|
||||||
type CAA struct {
|
type CAA struct {
|
||||||
Hdr RR_Header
|
Hdr RR_Header
|
||||||
Flag uint8
|
Flag uint8
|
||||||
Tag string
|
Tag string
|
||||||
Value string `dns:"octet"`
|
Value string `dns:"hex"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rr *CAA) Header() *RR_Header { return &rr.Hdr }
|
func (rr *CAA) Header() *RR_Header { return &rr.Hdr }
|
||||||
func (rr *CAA) copy() RR { return &CAA{*rr.Hdr.copyHeader(), rr.Flag, rr.Tag, rr.Value} }
|
func (rr *CAA) copy() RR { return &CAA{*rr.Hdr.copyHeader(), rr.Flag, rr.Tag, rr.Value} }
|
||||||
func (rr *CAA) len() int { return rr.Hdr.len() + 1 + len(rr.Tag) + 1 + len(rr.Value) }
|
func (rr *CAA) len() int { return rr.Hdr.len() + 1 + len(rr.Tag) + len(rr.Value)/2 }
|
||||||
|
|
||||||
func (rr *CAA) String() string {
|
func (rr *CAA) String() string {
|
||||||
s := rr.Hdr.String() + strconv.FormatInt(int64(rr.Flag), 10) + " " + rr.Tag
|
s := rr.Hdr.String()
|
||||||
s += strconv.QuoteToASCII(rr.Value)
|
|
||||||
|
s += "\\# " + strconv.Itoa(2 + len(rr.Tag) + len(rr.Value)) + " "
|
||||||
|
s += fmt.Sprintf("%02X%02X%X%s", rr.Flag, len(rr.Tag), rr.Tag, strings.ToUpper(rr.Value))
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
type UID struct {
|
type UID struct {
|
||||||
Hdr RR_Header
|
Hdr RR_Header
|
||||||
|
@ -1668,10 +1668,10 @@ func copyIP(ip net.IP) net.IP {
|
||||||
|
|
||||||
// Map of constructors for each RR type.
|
// Map of constructors for each RR type.
|
||||||
var typeToRR = map[uint16]func() RR{
|
var typeToRR = map[uint16]func() RR{
|
||||||
TypeA: func() RR { return new(A) },
|
TypeA: func() RR { return new(A) },
|
||||||
TypeAAAA: func() RR { return new(AAAA) },
|
TypeAAAA: func() RR { return new(AAAA) },
|
||||||
TypeAFSDB: func() RR { return new(AFSDB) },
|
TypeAFSDB: func() RR { return new(AFSDB) },
|
||||||
// TypeCAA: func() RR { return new(CAA) },
|
TypeCAA: func() RR { return new(CAA) },
|
||||||
TypeCDS: func() RR { return new(CDS) },
|
TypeCDS: func() RR { return new(CDS) },
|
||||||
TypeCERT: func() RR { return new(CERT) },
|
TypeCERT: func() RR { return new(CERT) },
|
||||||
TypeCNAME: func() RR { return new(CNAME) },
|
TypeCNAME: func() RR { return new(CNAME) },
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
func TestDynamicUpdateParsing(t *testing.T) {
|
func TestDynamicUpdateParsing(t *testing.T) {
|
||||||
prefix := "example.com. IN "
|
prefix := "example.com. IN "
|
||||||
for _, typ := range TypeToString {
|
for _, typ := range TypeToString {
|
||||||
if typ == "CAA" || typ == "OPT" || typ == "AXFR" || typ == "IXFR" || typ == "ANY" || typ == "TKEY" ||
|
if typ == "TYPE257" || typ == "OPT" || typ == "AXFR" || typ == "IXFR" || typ == "ANY" || typ == "TKEY" ||
|
||||||
typ == "TSIG" || typ == "ISDN" || typ == "UNSPEC" || typ == "NULL" || typ == "ATMA" {
|
typ == "TSIG" || typ == "ISDN" || typ == "UNSPEC" || typ == "NULL" || typ == "ATMA" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
48
zscan_rr.go
48
zscan_rr.go
|
@ -2,6 +2,7 @@ package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"encoding/hex"
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -2170,10 +2171,57 @@ func setIPSECKEY(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string)
|
||||||
return rr, nil, c1
|
return rr, nil, c1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setCAA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
|
||||||
|
rr := new(CAA)
|
||||||
|
rr.Hdr = h
|
||||||
|
l := <-c
|
||||||
|
if l.token != "\\#" {
|
||||||
|
return nil, &ParseError{f, "bad CAA Rdata", l}, ""
|
||||||
|
}
|
||||||
|
<-c // zBlank
|
||||||
|
l = <-c
|
||||||
|
rdlength, e := strconv.Atoi(l.token)
|
||||||
|
if e != nil {
|
||||||
|
return nil, &ParseError{f, "bad CAA Rdata", l}, ""
|
||||||
|
}
|
||||||
|
s, e1, c1 := endingToString(c, "bad CAA Rdata", f)
|
||||||
|
if e1 != nil {
|
||||||
|
return nil, e1, c1
|
||||||
|
}
|
||||||
|
if rdlength*2 != len(s) || rdlength*2 < 4 {
|
||||||
|
return nil, &ParseError{f, "bad CAA Rdata", l}, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
flagbyte, e := hex.DecodeString(s[0:2])
|
||||||
|
if e != nil {
|
||||||
|
return nil, &ParseError{f, "bad CAA Flag", l}, ""
|
||||||
|
}
|
||||||
|
rr.Flag = uint8(flagbyte[0])
|
||||||
|
|
||||||
|
tagbyte, e := hex.DecodeString(s[2:4])
|
||||||
|
if e != nil {
|
||||||
|
return nil, &ParseError{f, "bad CAA Tag length", l}, ""
|
||||||
|
}
|
||||||
|
taglength := int(tagbyte[0])
|
||||||
|
|
||||||
|
if rdlength*2 < (4 + taglength) {
|
||||||
|
return nil, &ParseError{f, "bad CAA Tag length", l}, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
tag, e := hex.DecodeString(s[4:4+taglength])
|
||||||
|
if e != nil {
|
||||||
|
return nil, &ParseError{f, "bad CAA Tag", l}, ""
|
||||||
|
}
|
||||||
|
rr.Tag = string(tag)
|
||||||
|
|
||||||
|
return rr, nil, c1
|
||||||
|
}
|
||||||
|
|
||||||
var typeToparserFunc = map[uint16]parserFunc{
|
var typeToparserFunc = map[uint16]parserFunc{
|
||||||
TypeAAAA: parserFunc{setAAAA, false},
|
TypeAAAA: parserFunc{setAAAA, false},
|
||||||
TypeAFSDB: parserFunc{setAFSDB, false},
|
TypeAFSDB: parserFunc{setAFSDB, false},
|
||||||
TypeA: parserFunc{setA, false},
|
TypeA: parserFunc{setA, false},
|
||||||
|
TypeCAA: parserFunc{setCAA, true},
|
||||||
TypeCDS: parserFunc{setCDS, true},
|
TypeCDS: parserFunc{setCDS, true},
|
||||||
TypeCDNSKEY: parserFunc{setCDNSKEY, true},
|
TypeCDNSKEY: parserFunc{setCDNSKEY, true},
|
||||||
TypeCERT: parserFunc{setCERT, true},
|
TypeCERT: parserFunc{setCERT, true},
|
||||||
|
|
Loading…
Reference in New Issue