formatting and documentation

This commit is contained in:
Miek Gieben 2011-02-24 16:22:14 +01:00
parent 77348913dd
commit 98e4b33cb5
7 changed files with 179 additions and 179 deletions

46
dns.go
View File

@ -99,36 +99,36 @@ func (h *RR_Header) String() string {
} }
s = s + strconv.Itoa(int(h.Ttl)) + "\t" s = s + strconv.Itoa(int(h.Ttl)) + "\t"
if _, ok := Class_str[h.Class]; ok { if _, ok := Class_str[h.Class]; ok {
s += Class_str[h.Class] + "\t" s += Class_str[h.Class] + "\t"
} else { } else {
s += "CLASS" + strconv.Itoa(int(h.Class)) + "\t" s += "CLASS" + strconv.Itoa(int(h.Class)) + "\t"
} }
if _, ok := Rr_str[h.Rrtype]; ok { if _, ok := Rr_str[h.Rrtype]; ok {
s += Rr_str[h.Rrtype] + "\t" s += Rr_str[h.Rrtype] + "\t"
} else { } else {
s += "TYPE" + strconv.Itoa(int(h.Rrtype)) + "\t" s += "TYPE" + strconv.Itoa(int(h.Rrtype)) + "\t"
} }
return s return s
} }
// Return the number of labels in a domain name. // Return the number of labels in a domain name.
func LabelCount(a string) (c uint8) { func LabelCount(a string) (c uint8) {
// walk the string and count the dots // walk the string and count the dots
// except when it is escaped // except when it is escaped
esc := false esc := false
for _, v := range a { for _, v := range a {
switch v { switch v {
case '.': case '.':
if esc { if esc {
esc = !esc esc = !esc
continue continue
} }
c++ c++
case '\\': case '\\':
esc = true esc = true
} }
} }
return return
} }

View File

@ -1,7 +1,7 @@
package dns package dns
import ( import (
"crypto" "crypto"
"crypto/md5" "crypto/md5"
"crypto/sha1" "crypto/sha1"
"crypto/sha256" "crypto/sha256"
@ -57,7 +57,7 @@ type dnskeyWireFmt struct {
Flags uint16 Flags uint16
Protocol uint8 Protocol uint8
Algorithm uint8 Algorithm uint8
PublicKey string "base64" PublicKey string "base64"
/* Nothing is left out */ /* Nothing is left out */
} }
@ -157,8 +157,8 @@ func (s *RR_RRSIG) Sign(k PrivateKey, rrset RRset) bool {
} }
// s.Inception and s.Expiration may be 0 (rollover etc.), the rest must be set // s.Inception and s.Expiration may be 0 (rollover etc.), the rest must be set
if s.KeyTag == 0 || len(s.SignerName) == 0 || s.Algorithm == 0 { if s.KeyTag == 0 || len(s.SignerName) == 0 || s.Algorithm == 0 {
return false return false
} }
s.Hdr.Rrtype = TypeRRSIG s.Hdr.Rrtype = TypeRRSIG
s.Hdr.Name = rrset[0].Header().Name s.Hdr.Name = rrset[0].Header().Name
@ -167,11 +167,11 @@ func (s *RR_RRSIG) Sign(k PrivateKey, rrset RRset) bool {
s.TypeCovered = rrset[0].Header().Rrtype s.TypeCovered = rrset[0].Header().Rrtype
s.TypeCovered = rrset[0].Header().Rrtype s.TypeCovered = rrset[0].Header().Rrtype
s.Labels = LabelCount(rrset[0].Header().Name) s.Labels = LabelCount(rrset[0].Header().Name)
if strings.HasPrefix(rrset[0].Header().Name, "*") { if strings.HasPrefix(rrset[0].Header().Name, "*") {
s.Labels-- // wildcards, remove from label count s.Labels-- // wildcards, remove from label count
} }
sort.Sort(rrset) sort.Sort(rrset)
sigwire := new(rrsigWireFmt) sigwire := new(rrsigWireFmt)
sigwire.TypeCovered = s.TypeCovered sigwire.TypeCovered = s.TypeCovered
@ -190,10 +190,10 @@ func (s *RR_RRSIG) Sign(k PrivateKey, rrset RRset) bool {
return false return false
} }
signdata = signdata[:n] signdata = signdata[:n]
wire := rawSignatureData(rrset, s) wire := rawSignatureData(rrset, s)
if wire == nil { if wire == nil {
return false return false
} }
signdata = append(signdata, wire...) signdata = append(signdata, wire...)
var signature []byte var signature []byte
@ -269,8 +269,8 @@ func (s *RR_RRSIG) Verify(k *RR_DNSKEY, rrset RRset) bool {
if r.Header().Rrtype != s.TypeCovered { if r.Header().Rrtype != s.TypeCovered {
return false return false
} }
//wildcards! //wildcards!
//if LabelCount(r.Header().Name) > s.Labels //if LabelCount(r.Header().Name) > s.Labels
} }
sort.Sort(rrset) sort.Sort(rrset)
@ -292,11 +292,11 @@ func (s *RR_RRSIG) Verify(k *RR_DNSKEY, rrset RRset) bool {
return false return false
} }
signeddata = signeddata[:n] signeddata = signeddata[:n]
wire := rawSignatureData(rrset, s) wire := rawSignatureData(rrset, s)
if wire == nil { if wire == nil {
return false return false
} }
signeddata = append(signeddata, wire...) signeddata = append(signeddata, wire...)
sigbuf := s.sigBuf() // Get the binary signature data sigbuf := s.sigBuf() // Get the binary signature data
@ -424,7 +424,7 @@ func rawSignatureData(rrset RRset, s *RR_RRSIG) (buf []byte) {
} }
// 6.2. Canonical RR Form. (4) - wildcards // 6.2. Canonical RR Form. (4) - wildcards
// dont have to do anything // dont have to do anything
// 6.2. Canonical RR Form. (5) - origTTL // 6.2. Canonical RR Form. (5) - origTTL
ttl := h.Ttl ttl := h.Ttl
@ -440,9 +440,9 @@ func rawSignatureData(rrset RRset, s *RR_RRSIG) (buf []byte) {
if !ok1 { if !ok1 {
return nil return nil
} }
buf = append(buf, wire...) buf = append(buf, wire...)
} }
return return
} }
// Map for algorithm names. // Map for algorithm names.

View File

@ -2,27 +2,27 @@ package dns
import ( import (
"testing" "testing"
"strings" "strings"
) )
func TestSecure(t *testing.T) { func TestSecure(t *testing.T) {
soa := new(RR_SOA) soa := new(RR_SOA)
soa.Hdr = RR_Header{"miek.nl.", TypeSOA, ClassINET, 14400, 0} soa.Hdr = RR_Header{"miek.nl.", TypeSOA, ClassINET, 14400, 0}
soa.Ns = "open.nlnetlabs.nl." soa.Ns = "open.nlnetlabs.nl."
soa.Mbox = "miekg.atoom.net." soa.Mbox = "miekg.atoom.net."
soa.Serial = 1293945905 soa.Serial = 1293945905
soa.Refresh = 14400 soa.Refresh = 14400
soa.Retry = 3600 soa.Retry = 3600
soa.Expire = 604800 soa.Expire = 604800
soa.Minttl = 86400 soa.Minttl = 86400
sig := new(RR_RRSIG) sig := new(RR_RRSIG)
sig.Hdr = RR_Header{"miek.nl.", TypeRRSIG, ClassINET, 14400, 0} sig.Hdr = RR_Header{"miek.nl.", TypeRRSIG, ClassINET, 14400, 0}
sig.TypeCovered = TypeSOA sig.TypeCovered = TypeSOA
sig.Algorithm = AlgRSASHA256 sig.Algorithm = AlgRSASHA256
sig.Labels = 2 sig.Labels = 2
sig.Expiration = 1296534305 // date -u '+%s' -d"2011-02-01 04:25:05" 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.Inception = 1293942305 // date -u '+%s' -d"2011-01-02 04:25:05"
sig.OrigTtl = 14400 sig.OrigTtl = 14400
sig.KeyTag = 12051 sig.KeyTag = 12051
sig.SignerName = "miek.nl." sig.SignerName = "miek.nl."
@ -37,11 +37,11 @@ func TestSecure(t *testing.T) {
key.Algorithm = AlgRSASHA256 key.Algorithm = AlgRSASHA256
key.PublicKey = "AwEAAcNEU67LJI5GEgF9QLNqLO1SMq1EdoQ6E9f85ha0k0ewQGCblyW2836GiVsm6k8Kr5ECIoMJ6fZWf3CQSQ9ycWfTyOHfmI3eQ/1Covhb2y4bAmL/07PhrL7ozWBW3wBfM335Ft9xjtXHPy7ztCbV9qZ4TVDTW/Iyg0PiwgoXVesz" key.PublicKey = "AwEAAcNEU67LJI5GEgF9QLNqLO1SMq1EdoQ6E9f85ha0k0ewQGCblyW2836GiVsm6k8Kr5ECIoMJ6fZWf3CQSQ9ycWfTyOHfmI3eQ/1Covhb2y4bAmL/07PhrL7ozWBW3wBfM335Ft9xjtXHPy7ztCbV9qZ4TVDTW/Iyg0PiwgoXVesz"
// It should validate. Period is checked seperately, so this will keep on working // It should validate. Period is checked seperately, so this will keep on working
if ! sig.Verify(key, []RR{soa}) { if !sig.Verify(key, []RR{soa}) {
t.Log("Failure to validate") t.Log("Failure to validate")
t.Fail() t.Fail()
} }
} }
func TestSignature(t *testing.T) { func TestSignature(t *testing.T) {
@ -87,7 +87,7 @@ func TestSignVerify(t *testing.T) {
// With this key // With this key
key := new(RR_DNSKEY) key := new(RR_DNSKEY)
key.Hdr.Rrtype = TypeDNSKEY key.Hdr.Rrtype = TypeDNSKEY
key.Hdr.Name = "miek.nl." key.Hdr.Name = "miek.nl."
key.Hdr.Class = ClassINET key.Hdr.Class = ClassINET
key.Hdr.Ttl = 14400 key.Hdr.Ttl = 14400
@ -116,7 +116,7 @@ func TestSignVerify(t *testing.T) {
if !sig.Verify(key, []RR{soa}) { if !sig.Verify(key, []RR{soa}) {
t.Log("Failure to validate") t.Log("Failure to validate")
t.Fail() t.Fail()
} }
} }
func TestKeyGen(t *testing.T) { func TestKeyGen(t *testing.T) {
@ -128,7 +128,7 @@ func TestKeyGen(t *testing.T) {
key.Flags = 256 key.Flags = 256
key.Protocol = 3 key.Protocol = 3
key.Algorithm = AlgRSASHA256 key.Algorithm = AlgRSASHA256
key.Generate(512) key.Generate(512)
} }
@ -183,7 +183,7 @@ func TestDnskey(t *testing.T) {
func TestTag(t *testing.T) { func TestTag(t *testing.T) {
key := new(RR_DNSKEY) key := new(RR_DNSKEY)
key.Hdr.Name = "miek.nl." key.Hdr.Name = "miek.nl."
key.Hdr.Rrtype = TypeDNSKEY key.Hdr.Rrtype = TypeDNSKEY
key.Hdr.Class = ClassINET key.Hdr.Class = ClassINET
key.Hdr.Ttl = 3600 key.Hdr.Ttl = 3600
key.Flags = 256 key.Flags = 256
@ -191,57 +191,57 @@ func TestTag(t *testing.T) {
key.Algorithm = AlgRSASHA256 key.Algorithm = AlgRSASHA256
key.PublicKey = "AwEAAcNEU67LJI5GEgF9QLNqLO1SMq1EdoQ6E9f85ha0k0ewQGCblyW2836GiVsm6k8Kr5ECIoMJ6fZWf3CQSQ9ycWfTyOHfmI3eQ/1Covhb2y4bAmL/07PhrL7ozWBW3wBfM335Ft9xjtXHPy7ztCbV9qZ4TVDTW/Iyg0PiwgoXVesz" key.PublicKey = "AwEAAcNEU67LJI5GEgF9QLNqLO1SMq1EdoQ6E9f85ha0k0ewQGCblyW2836GiVsm6k8Kr5ECIoMJ6fZWf3CQSQ9ycWfTyOHfmI3eQ/1Covhb2y4bAmL/07PhrL7ozWBW3wBfM335Ft9xjtXHPy7ztCbV9qZ4TVDTW/Iyg0PiwgoXVesz"
tag := key.KeyTag() tag := key.KeyTag()
if tag != 12051 { if tag != 12051 {
t.Logf("%v\n", key) t.Logf("%v\n", key)
t.Logf("Wrong key tag: %d\n", tag) t.Logf("Wrong key tag: %d\n", tag)
t.Fail() t.Fail()
} }
} }
func TestKeyGenRSA(t *testing.T) { func TestKeyGenRSA(t *testing.T) {
return // Tijdelijk uit TODO(mg) return // Tijdelijk uit TODO(mg)
key := new(RR_DNSKEY) key := new(RR_DNSKEY)
key.Hdr.Name = "miek.nl." key.Hdr.Name = "miek.nl."
key.Hdr.Rrtype = TypeDNSKEY key.Hdr.Rrtype = TypeDNSKEY
key.Hdr.Class = ClassINET key.Hdr.Class = ClassINET
key.Hdr.Ttl = 3600 key.Hdr.Ttl = 3600
key.Flags = 256 key.Flags = 256
key.Protocol = 3 key.Protocol = 3
key.Algorithm = AlgRSASHA256 key.Algorithm = AlgRSASHA256
length := 2048 length := 2048
priv, _ := key.Generate(length) priv, _ := key.Generate(length)
soa := new(RR_SOA) soa := new(RR_SOA)
soa.Hdr = RR_Header{"miek.nl.", TypeSOA, ClassINET, 14400, 0} soa.Hdr = RR_Header{"miek.nl.", TypeSOA, ClassINET, 14400, 0}
soa.Ns = "open.nlnetlabs.nl." soa.Ns = "open.nlnetlabs.nl."
soa.Mbox = "miekg.atoom.net." soa.Mbox = "miekg.atoom.net."
soa.Serial = 1293945905 soa.Serial = 1293945905
soa.Refresh = 14400 soa.Refresh = 14400
soa.Retry = 3600 soa.Retry = 3600
soa.Expire = 604800 soa.Expire = 604800
soa.Minttl = 86400 soa.Minttl = 86400
sig := new(RR_RRSIG) sig := new(RR_RRSIG)
sig.Hdr = RR_Header{"miek.nl.", TypeRRSIG, ClassINET, 14400, 0} sig.Hdr = RR_Header{"miek.nl.", TypeRRSIG, ClassINET, 14400, 0}
sig.TypeCovered = TypeSOA sig.TypeCovered = TypeSOA
sig.Algorithm = AlgRSASHA256 sig.Algorithm = AlgRSASHA256
sig.Labels = 2 sig.Labels = 2
sig.Expiration = 1296534305 // date -u '+%s' -d"2011-02-01 04:25:05" 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.Inception = 1293942305 // date -u '+%s' -d"2011-01-02 04:25:05"
sig.OrigTtl = 14400 sig.OrigTtl = 14400
sig.KeyTag = key.KeyTag() sig.KeyTag = key.KeyTag()
sig.SignerName = "miek.nl." sig.SignerName = "miek.nl."
sig.Sign(priv, []RR{soa}) sig.Sign(priv, []RR{soa})
//s := key.PrivateKeyString(priv) //s := key.PrivateKeyString(priv)
} }
func TestKeyToDS(t *testing.T) { func TestKeyToDS(t *testing.T) {
key := new(RR_DNSKEY) key := new(RR_DNSKEY)
key.Hdr.Name = "miek.nl" key.Hdr.Name = "miek.nl"
key.Hdr.Rrtype = TypeDNSKEY key.Hdr.Rrtype = TypeDNSKEY
key.Hdr.Class = ClassINET key.Hdr.Class = ClassINET
key.Hdr.Ttl = 3600 key.Hdr.Ttl = 3600
key.Flags = 256 key.Flags = 256
@ -249,9 +249,9 @@ func TestKeyToDS(t *testing.T) {
key.Algorithm = AlgRSASHA256 key.Algorithm = AlgRSASHA256
key.PublicKey = "AwEAAcNEU67LJI5GEgF9QLNqLO1SMq1EdoQ6E9f85ha0k0ewQGCblyW2836GiVsm6k8Kr5ECIoMJ6fZWf3CQSQ9ycWfTyOHfmI3eQ/1Covhb2y4bAmL/07PhrL7ozWBW3wBfM335Ft9xjtXHPy7ztCbV9qZ4TVDTW/Iyg0PiwgoXVesz" key.PublicKey = "AwEAAcNEU67LJI5GEgF9QLNqLO1SMq1EdoQ6E9f85ha0k0ewQGCblyW2836GiVsm6k8Kr5ECIoMJ6fZWf3CQSQ9ycWfTyOHfmI3eQ/1Covhb2y4bAmL/07PhrL7ozWBW3wBfM335Ft9xjtXHPy7ztCbV9qZ4TVDTW/Iyg0PiwgoXVesz"
ds := key.ToDS(HashSHA1) ds := key.ToDS(HashSHA1)
if strings.ToUpper(ds.Digest) != "B5121BDB5B8D86D0CC5FFAFBAAABE26C3E20BAC1" { if strings.ToUpper(ds.Digest) != "B5121BDB5B8D86D0CC5FFAFBAAABE26C3E20BAC1" {
t.Logf("Wrong DS digest for Sha1\n%v\n", ds) t.Logf("Wrong DS digest for Sha1\n%v\n", ds)
t.Fail() t.Fail()
} }
} }

42
edns.go
View File

@ -2,7 +2,7 @@ package dns
import ( import (
"strconv" "strconv"
"encoding/hex" "encoding/hex"
) )
// EDNS0 Options // EDNS0 Options
@ -61,14 +61,14 @@ func (rr *RR_OPT) String() string {
switch o.Code { switch o.Code {
case OptionCodeNSID: case OptionCodeNSID:
s += "\n; NSID: " + o.Data s += "\n; NSID: " + o.Data
h, e := hex.DecodeString(o.Data) h, e := hex.DecodeString(o.Data)
var r string var r string
if e == nil { if e == nil {
for _, c := range h { for _, c := range h {
r += "(" + string(c) + ")" r += "(" + string(c) + ")"
} }
s += " " + r s += " " + r
} }
} }
} }
return s return s
@ -76,7 +76,7 @@ func (rr *RR_OPT) String() string {
// Get the EDNS version (always 0 currently). // Get the EDNS version (always 0 currently).
func (rr *RR_OPT) Version() uint8 { func (rr *RR_OPT) Version() uint8 {
return 0 return 0
} }
// Set the version of EDNS. // Set the version of EDNS.
@ -106,17 +106,17 @@ func (rr *RR_OPT) SetUDPSize(size uint16) {
// Get the DO bit. // Get the DO bit.
func (rr *RR_OPT) Do() bool { func (rr *RR_OPT) Do() bool {
return byte(rr.Hdr.Ttl >> 8) &_DO == _DO return byte(rr.Hdr.Ttl>>8)&_DO == _DO
} }
// Set the DO bit // Set the DO bit.
func (rr *RR_OPT) SetDo() { func (rr *RR_OPT) SetDo() {
b1 := byte(rr.Hdr.Ttl >> 24) b1 := byte(rr.Hdr.Ttl >> 24)
b2 := byte(rr.Hdr.Ttl >> 16) b2 := byte(rr.Hdr.Ttl >> 16)
b3 := byte(rr.Hdr.Ttl >> 8) b3 := byte(rr.Hdr.Ttl >> 8)
b4 := byte(rr.Hdr.Ttl) b4 := byte(rr.Hdr.Ttl)
b3 |= _DO // Set it b3 |= _DO // Set it
rr.Hdr.Ttl = uint32(b1)<<24 | uint32(b2)<<16 | uint32(b3)<<8 | uint32(b4) rr.Hdr.Ttl = uint32(b1)<<24 | uint32(b2)<<16 | uint32(b3)<<8 | uint32(b4)
} }
// Return the NSID as hex string. // Return the NSID as hex string.
@ -126,7 +126,7 @@ func (rr *RR_OPT) Nsid() string {
// Set the NSID from a string which is represented as hex characters. // Set the NSID from a string which is represented as hex characters.
func (rr *RR_OPT) SetNsid(hexnsid string) { func (rr *RR_OPT) SetNsid(hexnsid string) {
rr.Option = make([]Option, 1) // TODO(mg) check length first? rr.Option = make([]Option, 1) // TODO(mg) check length first?
rr.Option[0].Code = OptionCodeNSID rr.Option[0].Code = OptionCodeNSID
rr.Option[0].Data = hexnsid rr.Option[0].Data = hexnsid
} }

54
msg.go
View File

@ -90,7 +90,7 @@ var Rr_str = map[uint16]string{
TypeAXFR: "AXFR", // Meta RR TypeAXFR: "AXFR", // Meta RR
TypeIXFR: "IXFR", // Meta RR TypeIXFR: "IXFR", // Meta RR
TypeALL: "ANY", // Meta RR TypeALL: "ANY", // Meta RR
TypeURI: "URI", TypeURI: "URI",
TypeTA: "TA", TypeTA: "TA",
TypeDLV: "DLV", TypeDLV: "DLV",
} }
@ -158,28 +158,28 @@ func packDomainName(s string, msg []byte, off int) (off1 int, ok bool) {
// Emit sequence of counted strings, chopping at dots. // Emit sequence of counted strings, chopping at dots.
begin := 0 begin := 0
bs := []byte(s) bs := []byte(s)
ls := len(bs) ls := len(bs)
for i := 0; i < ls; i++ { for i := 0; i < ls; i++ {
if bs[i] == '\\' { if bs[i] == '\\' {
for j := i; j < len(s)-1; j++ { for j := i; j < len(s)-1; j++ {
bs[j] = bs[j+1] bs[j] = bs[j+1]
} }
ls-- ls--
continue continue
} }
if bs[i] == '.' { if bs[i] == '.' {
if i-begin >= 1<<6 { // top two bits of length must be clear if i-begin >= 1<<6 { // top two bits of length must be clear
return len(msg), false return len(msg), false
} }
msg[off] = byte(i - begin) msg[off] = byte(i - begin)
off++ off++
for j := begin; j < i; j++ { for j := begin; j < i; j++ {
msg[off] = bs[j] msg[off] = bs[j]
off++ off++
} }
begin = i + 1 begin = i + 1
} }
} }
// Root label is special // Root label is special
@ -224,15 +224,15 @@ Loop:
if off+c > len(msg) { if off+c > len(msg) {
return "", len(msg), false return "", len(msg), false
} }
for j := off; j < off+c; j++ { for j := off; j < off+c; j++ {
if msg[j] == '.' { if msg[j] == '.' {
// literal dot, escape it // literal dot, escape it
s += "\\." s += "\\."
} else { } else {
s += string(msg[j]) s += string(msg[j])
} }
} }
s += "." s += "."
off += c off += c
case 0xC0: case 0xC0:
// pointer to somewhere else in msg. // pointer to somewhere else in msg.

View File

@ -95,7 +95,7 @@ func (res *Resolver) Query(q *Msg) (d *Msg, err os.Error) {
} }
// Start an AXFR, q should contain a message with the question // Start an AXFR, q should contain a message with the question
// for an AXFR ("miek.nl" ANY AXFR. All incoming axfr snippets // for an AXFR: "miek.nl" ANY AXFR. All incoming axfr snippets
// are returned on the channel m. The function closes the // are returned on the channel m. The function closes the
// channel to signal the end of the AXFR. // channel to signal the end of the AXFR.
func (res *Resolver) Axfr(q *Msg, m chan *Msg) { func (res *Resolver) Axfr(q *Msg, m chan *Msg) {

View File

@ -65,8 +65,8 @@ const (
TypeMAILB = 253 TypeMAILB = 253
TypeMAILA = 254 TypeMAILA = 254
TypeALL = 255 TypeALL = 255
// newly defined types // newly defined types
TypeURI = 256 TypeURI = 256
TypeTA = 32768 TypeTA = 32768
TypeDLV = 32769 TypeDLV = 32769
@ -464,11 +464,11 @@ func (rr *RR_NSEC) Header() *RR_Header {
func (rr *RR_NSEC) String() string { func (rr *RR_NSEC) String() string {
s := rr.Hdr.String() + rr.NextDomain s := rr.Hdr.String() + rr.NextDomain
for i := 0; i < len(rr.TypeBitMap); i++ { for i := 0; i < len(rr.TypeBitMap); i++ {
if _, ok := Rr_str[rr.TypeBitMap[i]]; ok { if _, ok := Rr_str[rr.TypeBitMap[i]]; ok {
s += " " + Rr_str[rr.TypeBitMap[i]] s += " " + Rr_str[rr.TypeBitMap[i]]
} else { } else {
s += " " + "TYPE" + strconv.Itoa(int(rr.TypeBitMap[i])) s += " " + "TYPE" + strconv.Itoa(int(rr.TypeBitMap[i]))
} }
} }
return s return s
} }
@ -605,11 +605,11 @@ func (rr *RR_NSEC3) String() string {
" " + strings.ToUpper(rr.Salt) + " " + strings.ToUpper(rr.Salt) +
" " + rr.NextDomain " " + rr.NextDomain
for i := 0; i < len(rr.TypeBitMap); i++ { for i := 0; i < len(rr.TypeBitMap); i++ {
if _, ok := Rr_str[rr.TypeBitMap[i]]; ok { if _, ok := Rr_str[rr.TypeBitMap[i]]; ok {
s += " " + Rr_str[rr.TypeBitMap[i]] s += " " + Rr_str[rr.TypeBitMap[i]]
} else { } else {
s += " " + "TYPE" + strconv.Itoa(int(rr.TypeBitMap[i])) s += " " + "TYPE" + strconv.Itoa(int(rr.TypeBitMap[i]))
} }
} }
return s return s
} }
@ -636,7 +636,7 @@ func (rr *RR_NSEC3PARAM) String() string {
return s return s
} }
// See RFC 4408 // See RFC 4408.
type RR_SPF struct { type RR_SPF struct {
Hdr RR_Header Hdr RR_Header
Txt string Txt string
@ -674,25 +674,25 @@ func (rr *RR_TKEY) String() string {
// Unknown RR representation // Unknown RR representation
type RR_RFC3597 struct { type RR_RFC3597 struct {
Hdr RR_Header Hdr RR_Header
Rdata string "hex" Rdata string "hex"
} }
func (rr *RR_RFC3597) Header() *RR_Header { func (rr *RR_RFC3597) Header() *RR_Header {
return &rr.Hdr return &rr.Hdr
} }
func (rr *RR_RFC3597) String() string { func (rr *RR_RFC3597) String() string {
s := rr.Hdr.String() s := rr.Hdr.String()
s += "\\# " + strconv.Itoa(len(rr.Rdata)/2) + " " + rr.Rdata s += "\\# " + strconv.Itoa(len(rr.Rdata)/2) + " " + rr.Rdata
return s return s
} }
type RR_URI struct { type RR_URI struct {
Hdr RR_Header Hdr RR_Header
Priority uint16 Priority uint16
Weight uint16 Weight uint16
Target string Target string
} }
func (rr *RR_URI) Header() *RR_Header { func (rr *RR_URI) Header() *RR_Header {
@ -700,9 +700,9 @@ func (rr *RR_URI) Header() *RR_Header {
} }
func (rr *RR_URI) String() string { func (rr *RR_URI) String() string {
return rr.Hdr.String() + strconv.Itoa(int(rr.Priority)) + return rr.Hdr.String() + strconv.Itoa(int(rr.Priority)) +
" " + strconv.Itoa(int(rr.Weight)) + " " + strconv.Itoa(int(rr.Weight)) +
" " + rr.Target " " + rr.Target
} }
// Translate the RRSIG's incep. and expir. time to the correct date. // Translate the RRSIG's incep. and expir. time to the correct date.
@ -754,7 +754,7 @@ var rr_mk = map[int]func() RR{
TypeNSEC3PARAM: func() RR { return new(RR_NSEC3PARAM) }, TypeNSEC3PARAM: func() RR { return new(RR_NSEC3PARAM) },
TypeTKEY: func() RR { return new(RR_TKEY) }, TypeTKEY: func() RR { return new(RR_TKEY) },
TypeTSIG: func() RR { return new(RR_TSIG) }, TypeTSIG: func() RR { return new(RR_TSIG) },
TypeURI: func() RR { return new(RR_URI) }, TypeURI: func() RR { return new(RR_URI) },
TypeTA: func() RR { return new(RR_TA) }, TypeTA: func() RR { return new(RR_TA) },
TypeDLV: func() RR { return new(RR_DLV) }, TypeDLV: func() RR { return new(RR_DLV) },
} }