Actually copy the RR for DNSSEC validation.

This is needed because we need to fiddle with the TTL and sometimes
even need to lowercase the rdata. We dont want this to propagate
to the original RRs
This commit is contained in:
Miek Gieben 2012-06-20 19:16:54 +02:00
parent 01442e58af
commit e6fca0be3f
5 changed files with 106 additions and 129 deletions

11
dns.go
View File

@ -105,8 +105,8 @@ type RR interface {
String() string
// Len returns the length (in octects) of the uncompressed RR in wire format.
Len() int
// Copy returns a copy of the RR
// Copy() RR
// Copy returns a copy of the RR
Copy() RR
}
// Exchange is used in (asynchronous) communication with the resolver. If the
@ -135,7 +135,7 @@ func (h *RR_Header) Header() *RR_Header {
return h
}
func (h *RR_Header) Copy() *RR_Header {
func (h *RR_Header) CopyHeader() *RR_Header {
r := new(RR_Header)
r.Name = h.Name
r.Rrtype = h.Rrtype
@ -145,6 +145,11 @@ func (h *RR_Header) Copy() *RR_Header {
return r
}
// Just to imlement the RR interface
func (h *RR_Header) Copy() RR {
return nil
}
func (h *RR_Header) String() string {
var s string

View File

@ -637,85 +637,53 @@ func (p wireSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func rawSignatureData(rrset []RR, s *RR_RRSIG) (buf []byte) {
wires := make(wireSlice, len(rrset))
for i, r := range rrset {
h := r.Header().Copy()
h.Ttl = s.OrigTtl
labels := SplitLabels(h.Name)
r1 := r.Copy()
r1.Header().Ttl = s.OrigTtl
labels := SplitLabels(r1.Header().Name)
// 6.2. Canonical RR Form. (4) - wildcards
if len(labels) > int(s.Labels) {
// Wildcard
h.Name = "*." + strings.Join(labels[len(labels)-int(s.Labels):], ".") + "."
r1.Header().Name = "*." + strings.Join(labels[len(labels)-int(s.Labels):], ".") + "."
}
// RFC 4034: 6.2. Canonical RR Form. (2) - domain name to lowercase
h.Name = strings.ToLower(h.Name)
r1.Header().Name = strings.ToLower(r1.Header().Name)
// 6.2. Canonical RR Form. (3) - domain rdata to lowercase.
// NS, MD, MF, CNAME, SOA, MB, MG, MR, PTR,
// HINFO, MINFO, MX, RP, AFSDB, RT, SIG, PX, NXT, NAPTR, KX,
// SRV, DNAME, A6
// TODO(mg): copy the rdata here?
switch x := r.(type) {
case *RR_NS:
p := x.Ns
defer func() { x.Ns = p }()
x.Ns = strings.ToLower(x.Ns)
case *RR_CNAME:
p := x.Target
defer func() { x.Target = p }()
x.Target = strings.ToLower(x.Target)
case *RR_SOA:
x.Hdr = *h // NO NO NO need to copy each RR
p := x.Ns
q := x.Mbox
defer func() { x.Ns = p }()
defer func() { x.Mbox = q }()
x.Ns = strings.ToLower(x.Ns)
x.Mbox = strings.ToLower(x.Mbox)
case *RR_MB:
p := x.Mb
defer func() { x.Mb = p }()
x.Mb = strings.ToLower(x.Mb)
case *RR_MG:
p := x.Mg
defer func() { x.Mg = p }()
x.Mg = strings.ToLower(x.Mg)
case *RR_MR:
p := x.Mr
defer func() { x.Mr = p }()
x.Mr = strings.ToLower(x.Mr)
case *RR_PTR:
p := x.Ptr
defer func() { x.Ptr = p }()
x.Ptr = strings.ToLower(x.Ptr)
case *RR_MINFO:
p := x.Rmail
q := x.Email
defer func() { x.Rmail = p }()
defer func() { x.Email = q }()
x.Rmail = strings.ToLower(x.Rmail)
x.Email = strings.ToLower(x.Email)
case *RR_MX:
p := x.Mx
defer func() { x.Mx = p }()
x.Mx = strings.ToLower(x.Mx)
case *RR_NAPTR:
p := x.Replacement
defer func() { x.Replacement = p }()
x.Replacement = strings.ToLower(x.Replacement)
case *RR_KX:
p := x.Exchanger
defer func() { x.Exchanger = p }()
x.Exchanger = strings.ToLower(x.Exchanger)
case *RR_SRV:
p := x.Target
defer func() { x.Target = p }()
x.Target = strings.ToLower(x.Target)
case *RR_DNAME:
p := x.Target
defer func() { x.Target = p }()
x.Target = strings.ToLower(x.Target)
}
// 6.2. Canonical RR Form. (5) - origTTL
wire := make([]byte, r.Len()*2)
off, ok1 := packRR(r, wire, 0, nil, false)
off, ok1 := packRR(r1, wire, 0, nil, false)
if !ok1 {
return nil
}

View File

@ -83,8 +83,8 @@ func (rr *RR_OPT) Len() int {
return l
}
func (rr *RR_OPT) Copy() *RR_OPT {
return &RR_OPT{*rr.Hdr.Copy(), rr.Option}
func (rr *RR_OPT) Copy() RR {
return &RR_OPT{*rr.Hdr.CopyHeader(), rr.Option}
}
// Version returns the EDNS version used. Only zero is defined.

View File

@ -110,8 +110,8 @@ func (rr *RR_TSIG) Len() int {
4 + len(rr.MAC)/2 + 1 + 6 + len(rr.OtherData)/2 + 1
}
func (rr *RR_TSIG) Copy() *RR_TSIG {
return &RR_TSIG{*rr.Hdr.Copy(), rr.Algorithm, rr.TimeSigned, rr.Fudge, rr.MACSize, rr.MAC, rr.OrigId, rr.Error, rr.OtherLen, rr.OtherData}
func (rr *RR_TSIG) Copy() RR {
return &RR_TSIG{*rr.Hdr.CopyHeader(), rr.Algorithm, rr.TimeSigned, rr.Fudge, rr.MACSize, rr.MAC, rr.OrigId, rr.Error, rr.OtherLen, rr.OtherData}
}
// The following values must be put in wireformat, so that the MAC can be calculated.

172
types.go
View File

@ -182,6 +182,10 @@ func (rr *RR_ANY) Len() int {
return rr.Hdr.Len()
}
func (rr *RR_ANY) Copy() RR {
return &RR_ANY{*rr.Hdr.CopyHeader()}
}
type RR_CNAME struct {
Hdr RR_Header
Target string `dns:"cdomain-name"`
@ -200,8 +204,8 @@ func (rr *RR_CNAME) Len() int {
return rr.Hdr.Len() + l
}
func (rr *RR_CNAME) Copy() *RR_CNAME {
return &RR_CNAME{*rr.Hdr.Copy(), rr.Target}
func (rr *RR_CNAME) Copy() RR {
return &RR_CNAME{*rr.Hdr.CopyHeader(), rr.Target}
}
type RR_HINFO struct {
@ -222,8 +226,8 @@ func (rr *RR_HINFO) Len() int {
return rr.Hdr.Len() + len(rr.Cpu) + len(rr.Os)
}
func (rr *RR_HINFO) Copy() *RR_HINFO {
return &RR_HINFO{*rr.Hdr.Copy(), rr.Cpu, rr.Os}
func (rr *RR_HINFO) Copy() RR {
return &RR_HINFO{*rr.Hdr.CopyHeader(), rr.Cpu, rr.Os}
}
type RR_MB struct {
@ -244,8 +248,8 @@ func (rr *RR_MB) Len() int {
return rr.Hdr.Len() + l
}
func (rr *RR_MB) Copy() *RR_MB {
return &RR_MB{*rr.Hdr.Copy(), rr.Mb}
func (rr *RR_MB) Copy() RR {
return &RR_MB{*rr.Hdr.CopyHeader(), rr.Mb}
}
type RR_MG struct {
@ -266,8 +270,8 @@ func (rr *RR_MG) Len() int {
return rr.Hdr.Len() + l
}
func (rr *RR_MG) Copy() *RR_MG {
return &RR_MG{*rr.Hdr.Copy(), rr.Mg}
func (rr *RR_MG) Copy() RR {
return &RR_MG{*rr.Hdr.CopyHeader(), rr.Mg}
}
type RR_MINFO struct {
@ -290,8 +294,8 @@ func (rr *RR_MINFO) Len() int {
return rr.Hdr.Len() + l + n
}
func (rr *RR_MINFO) Copy() *RR_MINFO {
return &RR_MINFO{*rr.Hdr.Copy(), rr.Rmail, rr.Email}
func (rr *RR_MINFO) Copy() RR {
return &RR_MINFO{*rr.Hdr.CopyHeader(), rr.Rmail, rr.Email}
}
type RR_MR struct {
@ -312,8 +316,8 @@ func (rr *RR_MR) Len() int {
return rr.Hdr.Len() + l
}
func (rr *RR_MR) Copy() *RR_MR {
return &RR_MR{*rr.Hdr.Copy(), rr.Mr}
func (rr *RR_MR) Copy() RR {
return &RR_MR{*rr.Hdr.CopyHeader(), rr.Mr}
}
type RR_MF struct {
@ -333,8 +337,8 @@ func (rr *RR_MF) Len() int {
return rr.Hdr.Len() + len(rr.Mf) + 1
}
func (rr *RR_MF) Copy() *RR_MF {
return &RR_MF{*rr.Hdr.Copy(), rr.Mf}
func (rr *RR_MF) Copy() RR {
return &RR_MF{*rr.Hdr.CopyHeader(), rr.Mf}
}
type RR_MD struct {
@ -354,8 +358,8 @@ func (rr *RR_MD) Len() int {
return rr.Hdr.Len() + len(rr.Md) + 1
}
func (rr *RR_MD) Copy() *RR_MD {
return &RR_MD{*rr.Hdr.Copy(), rr.Md}
func (rr *RR_MD) Copy() RR {
return &RR_MD{*rr.Hdr.CopyHeader(), rr.Md}
}
type RR_MX struct {
@ -377,8 +381,8 @@ func (rr *RR_MX) Len() int {
return rr.Hdr.Len() + l + 2
}
func (rr *RR_MX) Copy() *RR_MX {
return &RR_MX{*rr.Hdr.Copy(), rr.Pref, rr.Mx}
func (rr *RR_MX) Copy() RR {
return &RR_MX{*rr.Hdr.CopyHeader(), rr.Pref, rr.Mx}
}
type RR_AFSDB struct {
@ -400,8 +404,8 @@ func (rr *RR_AFSDB) Len() int {
return rr.Hdr.Len() + l + 2
}
func (rr *RR_AFSDB) Copy() *RR_AFSDB {
return &RR_AFSDB{*rr.Hdr.Copy(), rr.Subtype, rr.Hostname}
func (rr *RR_AFSDB) Copy() RR {
return &RR_AFSDB{*rr.Hdr.CopyHeader(), rr.Subtype, rr.Hostname}
}
type RR_NS struct {
@ -422,8 +426,8 @@ func (rr *RR_NS) Len() int {
return rr.Hdr.Len() + l
}
func (rr *RR_NS) Copy() *RR_NS {
return &RR_NS{*rr.Hdr.Copy(), rr.Ns}
func (rr *RR_NS) Copy() RR {
return &RR_NS{*rr.Hdr.CopyHeader(), rr.Ns}
}
type RR_PTR struct {
@ -444,8 +448,8 @@ func (rr *RR_PTR) Len() int {
return rr.Hdr.Len() + l
}
func (rr *RR_PTR) Copy() *RR_PTR {
return &RR_PTR{*rr.Hdr.Copy(), rr.Ptr}
func (rr *RR_PTR) Copy() RR {
return &RR_PTR{*rr.Hdr.CopyHeader(), rr.Ptr}
}
type RR_RP struct {
@ -466,8 +470,8 @@ func (rr *RR_RP) Len() int {
return rr.Hdr.Len() + len(rr.Mbox) + 1 + len(rr.Txt) + 1
}
func (rr *RR_RP) Copy() *RR_RP {
return &RR_RP{*rr.Hdr.Copy(), rr.Mbox, rr.Txt}
func (rr *RR_RP) Copy() RR {
return &RR_RP{*rr.Hdr.CopyHeader(), rr.Mbox, rr.Txt}
}
type RR_SOA struct {
@ -500,8 +504,8 @@ func (rr *RR_SOA) Len() int {
return rr.Hdr.Len() + l + n + 20
}
func (rr *RR_SOA) Copy() *RR_SOA {
return &RR_SOA{*rr.Hdr.Copy(), rr.Ns, rr.Mbox, rr.Serial, rr.Refresh, rr.Retry, rr.Expire, rr.Minttl}
func (rr *RR_SOA) Copy() RR {
return &RR_SOA{*rr.Hdr.CopyHeader(), rr.Ns, rr.Mbox, rr.Serial, rr.Refresh, rr.Retry, rr.Expire, rr.Minttl}
}
type RR_TXT struct {
@ -533,8 +537,8 @@ func (rr *RR_TXT) Len() int {
return l
}
func (rr *RR_TXT) Copy() *RR_TXT {
return &RR_TXT{*rr.Hdr.Copy(), rr.Txt}
func (rr *RR_TXT) Copy() RR {
return &RR_TXT{*rr.Hdr.CopyHeader(), rr.Txt}
}
type RR_SPF struct {
@ -566,8 +570,8 @@ func (rr *RR_SPF) Len() int {
return l
}
func (rr *RR_SPF) Copy() *RR_SPF {
return &RR_SPF{*rr.Hdr.Copy(), rr.Txt}
func (rr *RR_SPF) Copy() RR {
return &RR_SPF{*rr.Hdr.CopyHeader(), rr.Txt}
}
type RR_SRV struct {
@ -594,8 +598,8 @@ func (rr *RR_SRV) Len() int {
return rr.Hdr.Len() + l + 6
}
func (rr *RR_SRV) Copy() *RR_SRV {
return &RR_SRV{*rr.Hdr.Copy(), rr.Priority, rr.Weight, rr.Port, rr.Target}
func (rr *RR_SRV) Copy() RR {
return &RR_SRV{*rr.Hdr.CopyHeader(), rr.Priority, rr.Weight, rr.Port, rr.Target}
}
type RR_NAPTR struct {
@ -627,8 +631,8 @@ func (rr *RR_NAPTR) Len() int {
len(rr.Regexp) + len(rr.Replacement) + 1
}
func (rr *RR_NAPTR) Copy() *RR_NAPTR {
return &RR_NAPTR{*rr.Hdr.Copy(), rr.Order, rr.Pref, rr.Flags, rr.Service, rr.Regexp, rr.Replacement}
func (rr *RR_NAPTR) Copy() RR {
return &RR_NAPTR{*rr.Hdr.CopyHeader(), rr.Order, rr.Pref, rr.Flags, rr.Service, rr.Regexp, rr.Replacement}
}
// See RFC 4398.
@ -656,8 +660,8 @@ func (rr *RR_CERT) Len() int {
base64.StdEncoding.DecodedLen(len(rr.Certificate))
}
func (rr *RR_CERT) Copy() *RR_CERT {
return &RR_CERT{*rr.Hdr.Copy(), rr.Type, rr.KeyTag, rr.Algorithm, rr.Certificate}
func (rr *RR_CERT) Copy() RR {
return &RR_CERT{*rr.Hdr.CopyHeader(), rr.Type, rr.KeyTag, rr.Algorithm, rr.Certificate}
}
// See RFC 2672.
@ -679,8 +683,8 @@ func (rr *RR_DNAME) Len() int {
return rr.Hdr.Len() + l
}
func (rr *RR_DNAME) Copy() *RR_DNAME {
return &RR_DNAME{*rr.Hdr.Copy(), rr.Target}
func (rr *RR_DNAME) Copy() RR {
return &RR_DNAME{*rr.Hdr.CopyHeader(), rr.Target}
}
type RR_A struct {
@ -700,8 +704,8 @@ func (rr *RR_A) Len() int {
return rr.Hdr.Len() + net.IPv4len
}
func (rr *RR_A) Copy() *RR_A {
return &RR_A{*rr.Hdr.Copy(), rr.A}
func (rr *RR_A) Copy() RR {
return &RR_A{*rr.Hdr.CopyHeader(), rr.A}
}
type RR_AAAA struct {
@ -721,8 +725,8 @@ func (rr *RR_AAAA) Len() int {
return rr.Hdr.Len() + net.IPv6len
}
func (rr *RR_AAAA) Copy() *RR_AAAA {
return &RR_AAAA{*rr.Hdr.Copy(), rr.AAAA}
func (rr *RR_AAAA) Copy() RR {
return &RR_AAAA{*rr.Hdr.CopyHeader(), rr.AAAA}
}
type RR_LOC struct {
@ -789,8 +793,8 @@ func (rr *RR_LOC) Len() int {
return rr.Hdr.Len() + 4 + 12
}
func (rr *RR_LOC) Copy() *RR_LOC {
return &RR_LOC{*rr.Hdr.Copy(), rr.Version, rr.Size, rr.HorizPre, rr.VertPre, rr.Latitude, rr.Longitude, rr.Altitude}
func (rr *RR_LOC) Copy() RR {
return &RR_LOC{*rr.Hdr.CopyHeader(), rr.Version, rr.Size, rr.HorizPre, rr.VertPre, rr.Latitude, rr.Longitude, rr.Altitude}
}
type RR_RRSIG struct {
@ -827,8 +831,8 @@ func (rr *RR_RRSIG) Len() int {
base64.StdEncoding.DecodedLen(len(rr.Signature)) + 18
}
func (rr *RR_RRSIG) Copy() *RR_RRSIG {
return &RR_RRSIG{*rr.Hdr.Copy(), rr.TypeCovered, rr.Algorithm, rr.Labels, rr.OrigTtl, rr.Expiration, rr.Inception, rr.KeyTag, rr.SignerName, rr.Signature}
func (rr *RR_RRSIG) Copy() RR {
return &RR_RRSIG{*rr.Hdr.CopyHeader(), rr.TypeCovered, rr.Algorithm, rr.Labels, rr.OrigTtl, rr.Expiration, rr.Inception, rr.KeyTag, rr.SignerName, rr.Signature}
}
type RR_NSEC struct {
@ -859,8 +863,8 @@ func (rr *RR_NSEC) Len() int {
// TODO: +32 is max type bitmap
}
func (rr *RR_NSEC) Copy() *RR_NSEC {
return &RR_NSEC{*rr.Hdr.Copy(), rr.NextDomain, rr.TypeBitMap}
func (rr *RR_NSEC) Copy() RR {
return &RR_NSEC{*rr.Hdr.CopyHeader(), rr.NextDomain, rr.TypeBitMap}
}
type RR_DS struct {
@ -886,8 +890,8 @@ func (rr *RR_DS) Len() int {
return rr.Hdr.Len() + 4 + len(rr.Digest)/2
}
func (rr *RR_DS) Copy() *RR_DS {
return &RR_DS{*rr.Hdr.Copy(), rr.KeyTag, rr.Algorithm, rr.DigestType, rr.Digest}
func (rr *RR_DS) Copy() RR {
return &RR_DS{*rr.Hdr.CopyHeader(), rr.KeyTag, rr.Algorithm, rr.DigestType, rr.Digest}
}
type RR_DLV struct {
@ -913,8 +917,8 @@ func (rr *RR_DLV) Len() int {
return rr.Hdr.Len() + 4 + len(rr.Digest)/2
}
func (rr *RR_DLV) Copy() *RR_DLV {
return &RR_DLV{*rr.Hdr.Copy(), rr.KeyTag, rr.Algorithm, rr.DigestType, rr.Digest}
func (rr *RR_DLV) Copy() RR {
return &RR_DLV{*rr.Hdr.CopyHeader(), rr.KeyTag, rr.Algorithm, rr.DigestType, rr.Digest}
}
type RR_KX struct {
@ -936,8 +940,8 @@ func (rr *RR_KX) Len() int {
return 0
}
func (rr *RR_KX) Copy() *RR_KX {
return &RR_KX{*rr.Hdr.Copy(), rr.Pref, rr.Exchanger}
func (rr *RR_KX) Copy() RR {
return &RR_KX{*rr.Hdr.CopyHeader(), rr.Pref, rr.Exchanger}
}
type RR_TA struct {
@ -963,8 +967,8 @@ func (rr *RR_TA) Len() int {
return rr.Hdr.Len() + 4 + len(rr.Digest)/2
}
func (rr *RR_TA) Copy() *RR_TA {
return &RR_TA{*rr.Hdr.Copy(), rr.KeyTag, rr.Algorithm, rr.DigestType, rr.Digest}
func (rr *RR_TA) Copy() RR {
return &RR_TA{*rr.Hdr.CopyHeader(), rr.KeyTag, rr.Algorithm, rr.DigestType, rr.Digest}
}
type RR_TALINK struct {
@ -986,8 +990,8 @@ func (rr *RR_TALINK) Len() int {
return rr.Hdr.Len() + len(rr.PreviousName) + len(rr.NextName) + 2
}
func (rr *RR_TALINK) Copy() *RR_TALINK {
return &RR_TALINK{*rr.Hdr.Copy(), rr.PreviousName, rr.NextName}
func (rr *RR_TALINK) Copy() RR {
return &RR_TALINK{*rr.Hdr.CopyHeader(), rr.PreviousName, rr.NextName}
}
type RR_SSHFP struct {
@ -1011,8 +1015,8 @@ func (rr *RR_SSHFP) Len() int {
return rr.Hdr.Len() + 2 + len(rr.FingerPrint)/2
}
func (rr *RR_SSHFP) Copy() *RR_SSHFP {
return &RR_SSHFP{*rr.Hdr.Copy(), rr.Algorithm, rr.Type, rr.FingerPrint}
func (rr *RR_SSHFP) Copy() RR {
return &RR_SSHFP{*rr.Hdr.CopyHeader(), rr.Algorithm, rr.Type, rr.FingerPrint}
}
type RR_IPSECKEY struct {
@ -1041,8 +1045,8 @@ func (rr *RR_IPSECKEY) Len() int {
base64.StdEncoding.DecodedLen(len(rr.PublicKey))
}
func (rr *RR_IPSECKEY) Copy() *RR_IPSECKEY {
return &RR_IPSECKEY{*rr.Hdr.Copy(), rr.Precedence, rr.GatewayType, rr.Algorithm, rr.Gateway, rr.PublicKey}
func (rr *RR_IPSECKEY) Copy() RR {
return &RR_IPSECKEY{*rr.Hdr.CopyHeader(), rr.Precedence, rr.GatewayType, rr.Algorithm, rr.Gateway, rr.PublicKey}
}
type RR_DNSKEY struct {
@ -1069,8 +1073,8 @@ func (rr *RR_DNSKEY) Len() int {
base64.StdEncoding.DecodedLen(len(rr.PublicKey))
}
func (rr *RR_DNSKEY) Copy() *RR_DNSKEY {
return &RR_DNSKEY{*rr.Hdr.Copy(), rr.Flags, rr.Protocol, rr.Algorithm, rr.PublicKey}
func (rr *RR_DNSKEY) Copy() RR {
return &RR_DNSKEY{*rr.Hdr.CopyHeader(), rr.Flags, rr.Protocol, rr.Algorithm, rr.PublicKey}
}
type RR_NSEC3 struct {
@ -1111,8 +1115,8 @@ func (rr *RR_NSEC3) Len() int {
// TODO: +32 is MAX type bit map
}
func (rr *RR_NSEC3) Copy() *RR_NSEC3 {
return &RR_NSEC3{*rr.Hdr.Copy(), rr.Hash, rr.Flags, rr.Iterations, rr.SaltLength, rr.Salt, rr.HashLength, rr.NextDomain, rr.TypeBitMap}
func (rr *RR_NSEC3) Copy() RR {
return &RR_NSEC3{*rr.Hdr.CopyHeader(), rr.Hash, rr.Flags, rr.Iterations, rr.SaltLength, rr.Salt, rr.HashLength, rr.NextDomain, rr.TypeBitMap}
}
type RR_NSEC3PARAM struct {
@ -1141,8 +1145,8 @@ func (rr *RR_NSEC3PARAM) Len() int {
return rr.Hdr.Len() + 2 + 4 + 1 + len(rr.Salt)/2
}
func (rr *RR_NSEC3PARAM) Copy() *RR_NSEC3PARAM {
return &RR_NSEC3PARAM{*rr.Hdr.Copy(), rr.Hash, rr.Flags, rr.Iterations, rr.SaltLength, rr.Salt}
func (rr *RR_NSEC3PARAM) Copy() RR {
return &RR_NSEC3PARAM{*rr.Hdr.CopyHeader(), rr.Hash, rr.Flags, rr.Iterations, rr.SaltLength, rr.Salt}
}
type RR_TKEY struct {
@ -1172,8 +1176,8 @@ func (rr *RR_TKEY) Len() int {
len(rr.Key) + 2 + len(rr.OtherData)
}
func (rr *RR_TKEY) Copy() *RR_TKEY {
return &RR_TKEY{*rr.Hdr.Copy(), rr.Algorithm, rr.Inception, rr.Expiration, rr.Mode, rr.Error, rr.KeySize, rr.Key, rr.OtherLen, rr.OtherData}
func (rr *RR_TKEY) Copy() RR {
return &RR_TKEY{*rr.Hdr.CopyHeader(), rr.Algorithm, rr.Inception, rr.Expiration, rr.Mode, rr.Error, rr.KeySize, rr.Key, rr.OtherLen, rr.OtherData}
}
// Unknown RR representation
@ -1196,8 +1200,8 @@ func (rr *RR_RFC3597) Len() int {
return rr.Hdr.Len() + len(rr.Rdata)/2
}
func (rr *RR_RFC3597) Copy() *RR_RFC3597 {
return &RR_RFC3597{*rr.Hdr.Copy(), rr.Rdata}
func (rr *RR_RFC3597) Copy() RR {
return &RR_RFC3597{*rr.Hdr.CopyHeader(), rr.Rdata}
}
type RR_URI struct {
@ -1221,8 +1225,8 @@ func (rr *RR_URI) Len() int {
return rr.Hdr.Len() + 4 + len(rr.Target) + 1
}
func (rr *RR_URI) Copy() *RR_URI {
return &RR_URI{*rr.Hdr.Copy(), rr.Weight, rr.Priority, rr.Target}
func (rr *RR_URI) Copy() RR {
return &RR_URI{*rr.Hdr.CopyHeader(), rr.Weight, rr.Priority, rr.Target}
}
type RR_DHCID struct {
@ -1243,8 +1247,8 @@ func (rr *RR_DHCID) Len() int {
base64.StdEncoding.DecodedLen(len(rr.Digest))
}
func (rr *RR_DHCID) Copy() *RR_DHCID {
return &RR_DHCID{*rr.Hdr.Copy(), rr.Digest}
func (rr *RR_DHCID) Copy() RR {
return &RR_DHCID{*rr.Hdr.CopyHeader(), rr.Digest}
}
type RR_TLSA struct {
@ -1271,8 +1275,8 @@ func (rr *RR_TLSA) Len() int {
return rr.Hdr.Len() + 3 + len(rr.Certificate)/2
}
func (rr *RR_TLSA) Copy() *RR_TLSA {
return &RR_TLSA{*rr.Hdr.Copy(), rr.Usage, rr.Selector, rr.MatchingType, rr.Certificate}
func (rr *RR_TLSA) Copy() RR {
return &RR_TLSA{*rr.Hdr.CopyHeader(), rr.Usage, rr.Selector, rr.MatchingType, rr.Certificate}
}
type RR_HIP struct {
@ -1310,8 +1314,8 @@ func (rr *RR_HIP) Len() int {
return l
}
func (rr *RR_HIP) Copy() *RR_HIP {
return &RR_HIP{*rr.Hdr.Copy(), rr.HitLength, rr.PublicKeyAlgorithm, rr.PublicKeyLength, rr.Hit, rr.PublicKey, rr.RendezvousServers}
func (rr *RR_HIP) Copy() RR {
return &RR_HIP{*rr.Hdr.CopyHeader(), rr.HitLength, rr.PublicKeyAlgorithm, rr.PublicKeyLength, rr.Hit, rr.PublicKey, rr.RendezvousServers}
}
type RR_WKS struct {
@ -1338,8 +1342,8 @@ func (rr *RR_WKS) Len() int {
return rr.Hdr.Len() + net.IPv4len + 1
}
func (rr *RR_WKS) Copy() *RR_WKS {
return &RR_WKS{*rr.Hdr.Copy(), rr.Address, rr.Protocol, rr.BitMap}
func (rr *RR_WKS) Copy() RR {
return &RR_WKS{*rr.Hdr.CopyHeader(), rr.Address, rr.Protocol, rr.BitMap}
}
// TimeToDate translates the RRSIG's incep. and expir. times to the