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

View File

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

View File

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

42
edns.go
View File

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

54
msg.go
View File

@ -90,7 +90,7 @@ var Rr_str = map[uint16]string{
TypeAXFR: "AXFR", // Meta RR
TypeIXFR: "IXFR", // Meta RR
TypeALL: "ANY", // Meta RR
TypeURI: "URI",
TypeURI: "URI",
TypeTA: "TA",
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.
begin := 0
bs := []byte(s)
ls := len(bs)
bs := []byte(s)
ls := len(bs)
for i := 0; i < ls; i++ {
if bs[i] == '\\' {
for j := i; j < len(s)-1; j++ {
bs[j] = bs[j+1]
}
ls--
continue
for j := i; j < len(s)-1; j++ {
bs[j] = bs[j+1]
}
ls--
continue
}
if bs[i] == '.' {
if i-begin >= 1<<6 { // top two bits of length must be clear
return len(msg), false
}
msg[off] = byte(i - begin)
off++
for j := begin; j < i; j++ {
msg[off] = bs[j]
off++
}
begin = i + 1
if i-begin >= 1<<6 { // top two bits of length must be clear
return len(msg), false
}
msg[off] = byte(i - begin)
off++
for j := begin; j < i; j++ {
msg[off] = bs[j]
off++
}
begin = i + 1
}
}
// Root label is special
@ -224,15 +224,15 @@ Loop:
if off+c > len(msg) {
return "", len(msg), false
}
for j := off; j < off+c; j++ {
if msg[j] == '.' {
// literal dot, escape it
s += "\\."
} else {
s += string(msg[j])
}
}
s += "."
for j := off; j < off+c; j++ {
if msg[j] == '.' {
// literal dot, escape it
s += "\\."
} else {
s += string(msg[j])
}
}
s += "."
off += c
case 0xC0:
// 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
// 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
// channel to signal the end of the AXFR.
func (res *Resolver) Axfr(q *Msg, m chan *Msg) {

View File

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