NSEC and NSEC3 parsing support

Needs some work, but it is working
This commit is contained in:
Miek Gieben 2011-07-22 20:23:36 +02:00
parent 412a3a3f3e
commit b03994e257
4 changed files with 1196 additions and 396 deletions

View File

@ -552,7 +552,6 @@ func (rr *RR_LOC) String() string {
return rr.Hdr.String() + "TODO"
}
// DNSSEC types
type RR_RRSIG struct {
Hdr RR_Header
TypeCovered uint16

View File

@ -75,6 +75,30 @@
z.Push(rr)
}
action setDLV {
rdf := fields(data[mark:p], 4)
rr := new(RR_DLV)
rr.Hdr = *hdr
rr.Hdr.Rrtype = TypeDLV
rr.KeyTag = uint16(atoi(rdf[0]))
rr.Algorithm = uint8(atoi(rdf[1]))
rr.DigestType = uint8(atoi(rdf[2]))
rr.Digest = rdf[3]
z.Push(rr)
}
action setTA {
rdf := fields(data[mark:p], 4)
rr := new(RR_TA)
rr.Hdr = *hdr
rr.Hdr.Rrtype = TypeTA
rr.KeyTag = uint16(atoi(rdf[0]))
rr.Algorithm = uint8(atoi(rdf[1]))
rr.DigestType = uint8(atoi(rdf[2]))
rr.Digest = rdf[3]
z.Push(rr)
}
action setDNSKEY {
rdf := fields(data[mark:p], 4)
rr := new(RR_DNSKEY)
@ -104,4 +128,63 @@
z.Push(rr)
}
action setNSEC {
rdf := fields(data[mark:p], 0)
rr := new(RR_NSEC)
rr.Hdr = *hdr
rr.Hdr.Rrtype = TypeNSEC
rr.NextDomain = rdf[0]
rr.TypeBitMap = make([]uint16, len(rdf)-1)
// Fill the Type Bit Map
for i := 1; i < len(rdf); i++ {
// Check if its there in the map TODO
rr.TypeBitMap[i-1] = Str_rr[rdf[i]]
}
z.Push(rr)
}
action setNSEC3 {
rdf := fields(data[mark:p], 0)
rr := new(RR_NSEC3)
rr.Hdr = *hdr
rr.Hdr.Rrtype = TypeNSEC3
rr.Hash = uint8(atoi(rdf[0]))
rr.Flags = uint8(atoi(rdf[1]))
rr.Iterations = uint16(atoi(rdf[2]))
rr.SaltLength = uint8(atoi(rdf[3]))
rr.Salt = rdf[4]
rr.HashLength = uint8(atoi(rdf[4]))
rr.NextDomain = rdf[5]
rr.TypeBitMap = make([]uint16, len(rdf)-6)
// Fill the Type Bit Map
for i := 6; i < len(rdf); i++ {
// Check if its there in the map TODO
rr.TypeBitMap[i-6] = Str_rr[rdf[i]]
}
z.Push(rr)
}
action setNSEC3PARAM {
}
action setPRT {
}
action setTXT {
}
action setSRV {
}
action setCERT {
}
action setPTR {
}
action setDNAME {
}
action setNAPTR {
}
}%%

1494
zparse.go

File diff suppressed because it is too large Load Diff

View File

@ -16,12 +16,13 @@ const _IOBUF = 3e7
// Return the rdata fields as a string slice.
// All starting whitespace is deleted.
// If i is 0 no space are deleted from the final rdfs
func fields(s string, i int) (rdf []string) {
rdf = strings.Fields(strings.TrimSpace(s))
for i, _ := range rdf {
rdf[i] = strings.TrimSpace(rdf[i])
}
if len(rdf) > i {
if i > 0 && len(rdf) > i {
// The last rdf contained embedded spaces, glue it back together.
for j := i; j < len(rdf); j++ {
rdf[i-1] += rdf[j]
@ -104,14 +105,25 @@ func Zparse(q io.Reader) (z *Zone, err os.Error) {
rhs = (
( 'A'i rdata ) %setA
| ( 'PTR'i rdata ) %setPTR
| ( 'TXT'i rdata ) %setTXT
| ( 'SRV'i rdata ) %setSRV
| ( 'CERT'i rdata ) %setCERT
| ( 'NAPTR'i rdata ) %setNAPTR
| ( 'AAAA'i rdata ) %setAAAA
| ( 'SOA'i rdata ) %setSOA
| ( 'CNAME'i rdata ) %setCNAME
| ( 'DNAME'i rdata ) %setDNAME
| ( 'NS'i rdata ) %setNS
| ( 'MX'i rdata ) %setMX
| ( 'DS'i rdata ) %setDS
| ( 'DLV'i rdata ) %setDLV
| ( 'TA'i rdata ) %setTA
| ( 'DNSKEY'i rdata ) %setDNSKEY
| ( 'RRSIG'i rdata ) %setRRSIG
| ( 'NSEC'i rdata ) %setNSEC
| ( 'NSEC3'i rdata ) %setNSEC3
| ( 'NSEC3PARAM'i rdata ) %setNSEC3PARAM
);
rr = lhs rhs;