diff --git a/dnssec_test.go b/dnssec_test.go index 7c6fdf70..56bbefd5 100644 --- a/dnssec_test.go +++ b/dnssec_test.go @@ -197,6 +197,43 @@ func TestSignVerify(t *testing.T) { } } +func Test65534(t *testing.T) { + t6 := new(GENERIC) + t6.Hdr = RR_Header{"miek.nl.", 65534, ClassINET, 14400, 0} + t6.Rdata = `\# 505D8700001` + key := new(DNSKEY) + key.Hdr.Rrtype = TypeDNSKEY + key.Hdr.Name = "miek.nl." + key.Hdr.Class = ClassINET + key.Hdr.Ttl = 14400 + key.Flags = 256 + key.Protocol = 3 + key.Algorithm = RSASHA256 + privkey, _ := key.Generate(512) + + sig := new(RRSIG) + sig.Hdr = RR_Header{"miek.nl.", TypeRRSIG, ClassINET, 14400, 0} + sig.TypeCovered = t6.Hdr.Rrtype + sig.Labels = uint8(CountLabel(t6.Hdr.Name)) + sig.OrigTtl = t6.Hdr.Ttl + sig.Expiration = 1296534305 // date -u '+%s' -d"2011-02-01 04:25:05" + sig.Inception = 1293942305 // date -u '+%s' -d"2011-01-02 04:25:05" + sig.KeyTag = key.KeyTag() // Get the keyfrom the Key + sig.SignerName = key.Hdr.Name + sig.Algorithm = RSASHA256 + if err := sig.Sign(privkey, []RR{t6}); err != nil { + t.Log(err) + t.Log("Failure to sign the TYPE65534 record") + t.Fail() + } + if err := sig.Verify(key, []RR{t6}); err != nil { + t.Log(err) + t.Log("Failure to validate") + t.Fail() + } + t.Logf("Validated: %s\n", t6.Header().Name) +} + func TestDnskey(t *testing.T) { // f, _ := os.Open("t/Kmiek.nl.+010+05240.key") pubkey, _ := ReadRR(strings.NewReader(` diff --git a/types.go b/types.go index 335acc29..38de81f2 100644 --- a/types.go +++ b/types.go @@ -199,6 +199,16 @@ func (rr *ANY) copy() RR { return &ANY{*rr.Hdr.copyHeader()} } func (rr *ANY) String() string { return rr.Hdr.String() } func (rr *ANY) len() int { return rr.Hdr.len() } +type GENERIC struct { + Hdr RR_Header + Rdata string +} + +func (rr *GENERIC) Header() *RR_Header { return &rr.Hdr } +func (rr *GENERIC) copy() RR { return &GENERIC{*rr.Hdr.copyHeader(), rr.Rdata} } +func (rr *GENERIC) String() string { return rr.Hdr.String() + " " + string(rr.Rdata) } +func (rr *GENERIC) len() int { return rr.Hdr.len() + len(rr.Rdata) + 1 } + type CNAME struct { Hdr RR_Header Target string `dns:"cdomain-name"` @@ -474,7 +484,11 @@ type TXT struct { } func (rr *TXT) Header() *RR_Header { return &rr.Hdr } -func (rr *TXT) copy() RR { return &TXT{*rr.Hdr.copyHeader(), rr.Txt} } // this doesn't really copy Txt does it? TODO(mg) +func (rr *TXT) copy() RR { + cp := make([]string, len(rr.Txt), cap(rr.Txt)) + copy(cp, rr.Txt) + return &TXT{*rr.Hdr.copyHeader(), cp} +} func (rr *TXT) String() string { s := rr.Hdr.String() @@ -502,7 +516,11 @@ type SPF struct { } func (rr *SPF) Header() *RR_Header { return &rr.Hdr } -func (rr *SPF) copy() RR { return &SPF{*rr.Hdr.copyHeader(), rr.Txt} } +func (rr *SPF) copy() RR { + cp := make([]string, len(rr.Txt), cap(rr.Txt)) + copy(cp, rr.Txt) + return &SPF{*rr.Hdr.copyHeader(), cp} +} func (rr *SPF) String() string { s := rr.Hdr.String() @@ -794,7 +812,11 @@ type NSEC struct { } func (rr *NSEC) Header() *RR_Header { return &rr.Hdr } -func (rr *NSEC) copy() RR { return &NSEC{*rr.Hdr.copyHeader(), rr.NextDomain, rr.TypeBitMap} } +func (rr *NSEC) copy() RR { + cp := make([]uint16, len(rr.TypeBitMap), cap(rr.TypeBitMap)) + copy(cp, rr.TypeBitMap) + return &NSEC{*rr.Hdr.copyHeader(), rr.NextDomain, cp} +} func (rr *NSEC) String() string { s := rr.Hdr.String() + rr.NextDomain @@ -1083,7 +1105,9 @@ type NSEC3 struct { func (rr *NSEC3) Header() *RR_Header { return &rr.Hdr } func (rr *NSEC3) copy() RR { - return &NSEC3{*rr.Hdr.copyHeader(), rr.Hash, rr.Flags, rr.Iterations, rr.SaltLength, rr.Salt, rr.HashLength, rr.NextDomain, rr.TypeBitMap} + cp := make([]uint16, len(rr.TypeBitMap), cap(rr.TypeBitMap)) + copy(cp, rr.TypeBitMap) + return &NSEC3{*rr.Hdr.copyHeader(), rr.Hash, rr.Flags, rr.Iterations, rr.SaltLength, rr.Salt, rr.HashLength, rr.NextDomain, cp} } func (rr *NSEC3) String() string { @@ -1194,7 +1218,11 @@ type URI struct { } func (rr *URI) Header() *RR_Header { return &rr.Hdr } -func (rr *URI) copy() RR { return &URI{*rr.Hdr.copyHeader(), rr.Weight, rr.Priority, rr.Target} } +func (rr *URI) copy() RR { + cp := make([]string, len(rr.Target), cap(rr.Target)) + copy(cp, rr.Target) + return &URI{*rr.Hdr.copyHeader(), rr.Weight, rr.Priority, cp} +} func (rr *URI) String() string { s := rr.Hdr.String() + strconv.Itoa(int(rr.Priority)) + @@ -1267,7 +1295,9 @@ type HIP struct { func (rr *HIP) Header() *RR_Header { return &rr.Hdr } func (rr *HIP) copy() RR { - return &HIP{*rr.Hdr.copyHeader(), rr.HitLength, rr.PublicKeyAlgorithm, rr.PublicKeyLength, rr.Hit, rr.PublicKey, rr.RendezvousServers} + cp := make([]string, len(rr.RendezvousServers), cap(rr.RendezvousServers)) + copy(cp, rr.RendezvousServers) + return &HIP{*rr.Hdr.copyHeader(), rr.HitLength, rr.PublicKeyAlgorithm, rr.PublicKeyLength, rr.Hit, rr.PublicKey, cp} } func (rr *HIP) String() string { @@ -1297,7 +1327,11 @@ type NINFO struct { } func (rr *NINFO) Header() *RR_Header { return &rr.Hdr } -func (rr *NINFO) copy() RR { return &NINFO{*rr.Hdr.copyHeader(), rr.ZSData} } +func (rr *NINFO) copy() RR { + cp := make([]string, len(rr.ZSData), cap(rr.ZSData)) + copy(cp, rr.ZSData) + return &NINFO{*rr.Hdr.copyHeader(), cp} +} func (rr *NINFO) String() string { s := rr.Hdr.String() @@ -1327,7 +1361,11 @@ type WKS struct { } func (rr *WKS) Header() *RR_Header { return &rr.Hdr } -func (rr *WKS) copy() RR { return &WKS{*rr.Hdr.copyHeader(), rr.Address, rr.Protocol, rr.BitMap} } +func (rr *WKS) copy() RR { + cp := make([]uint16, len(rr.BitMap), cap(rr.BitMap)) + copy(cp, rr.BitMap) + return &WKS{*rr.Hdr.copyHeader(), rr.Address, rr.Protocol, cp} +} func (rr *WKS) String() (s string) { s = rr.Hdr.String() diff --git a/zscan_rr.go b/zscan_rr.go index a2fd759b..7c9f2226 100644 --- a/zscan_rr.go +++ b/zscan_rr.go @@ -1126,7 +1126,15 @@ func setRRSIG(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { rr.Hdr = h l := <-c if t, ok := StringToType[strings.ToUpper(l.token)]; !ok { - return nil, &ParseError{f, "bad RRSIG Typecovered", l}, "" + if strings.HasPrefix(strings.ToUpper(l.token), "TYPE") { + if t, ok = typeToInt(l.token); !ok { + return nil, &ParseError{f, "bad RRSIG Typecovered", l}, "" + } else { + rr.TypeCovered = t + } + } else { + return nil, &ParseError{f, "bad RRSIG Typecovered", l}, "" + } } else { rr.TypeCovered = t }