Tsig
* add some testcases for tsig * add unpack/pack stuff -- doesn't work correctly yet
This commit is contained in:
parent
11a1c753a8
commit
ac687f284a
|
@ -0,0 +1,49 @@
|
||||||
|
package resolver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"dns"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestResolverTsig(t *testing.T) {
|
||||||
|
res := new(Resolver)
|
||||||
|
ch := res.NewQuerier()
|
||||||
|
|
||||||
|
res.Servers = []string{"127.0.0.1"}
|
||||||
|
res.Timeout = 2
|
||||||
|
res.Attempts = 1
|
||||||
|
|
||||||
|
m := new(dns.Msg)
|
||||||
|
m.MsgHdr.RecursionDesired = true //only set this bit
|
||||||
|
m.Question = make([]dns.Question, 1)
|
||||||
|
|
||||||
|
// ask something
|
||||||
|
m.Question[0] = dns.Question{"powerdns.nl", dns.TypeDNSKEY, dns.ClassINET}
|
||||||
|
m.Extra = make([]dns.RR, 1)
|
||||||
|
m.SetId()
|
||||||
|
|
||||||
|
tsig := new(dns.RR_TSIG)
|
||||||
|
tsig.Hdr.Name = "miek.nl" // for tsig this is the key's name
|
||||||
|
tsig.Hdr.Rrtype = dns.TypeTSIG
|
||||||
|
tsig.Hdr.Class = dns.ClassANY
|
||||||
|
tsig.Hdr.Ttl = 0
|
||||||
|
tsig.GenerateMAC(m, "geheim")
|
||||||
|
// Add it to the msg
|
||||||
|
m.Extra[0] = tsig
|
||||||
|
|
||||||
|
|
||||||
|
ch <- DnsMsg{m, nil}
|
||||||
|
in := <-ch
|
||||||
|
if in.Dns != nil {
|
||||||
|
if in.Dns.Rcode != dns.RcodeSuccess {
|
||||||
|
t.Log("Failed to get an valid answer")
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
fmt.Printf("%v\n", in.Dns)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("Failed to get a good anwer")
|
||||||
|
}
|
||||||
|
ch <- DnsMsg{nil, nil}
|
||||||
|
<-ch // wait for ch to close channel
|
||||||
|
}
|
13
tsig.go
13
tsig.go
|
@ -30,9 +30,10 @@ type tsig_generation_fmt struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate the HMAC for msg. The TSIG RR is modified
|
// Generate the HMAC for msg. The TSIG RR is modified
|
||||||
// to include the MAC and MACSize
|
// to include the MAC and MACSize. Note the the msg Id must
|
||||||
|
// be set, otherwise the MAC is not correct
|
||||||
func (rr *RR_TSIG) GenerateMAC(msg *Msg, secret string) bool {
|
func (rr *RR_TSIG) GenerateMAC(msg *Msg, secret string) bool {
|
||||||
buf := make([]byte, 2048) // TODO(mg) bufsize!
|
buf := make([]byte, 4096) // TODO(mg) bufsize!
|
||||||
tsigbuf := new(tsig_generation_fmt)
|
tsigbuf := new(tsig_generation_fmt)
|
||||||
|
|
||||||
// Fill the struct and generate the wiredata
|
// Fill the struct and generate the wiredata
|
||||||
|
@ -46,11 +47,19 @@ func (rr *RR_TSIG) GenerateMAC(msg *Msg, secret string) bool {
|
||||||
tsigbuf.OtherLen = rr.OtherLen
|
tsigbuf.OtherLen = rr.OtherLen
|
||||||
tsigbuf.OtherData = rr.OtherData
|
tsigbuf.OtherData = rr.OtherData
|
||||||
packStruct(tsigbuf, buf, 0)
|
packStruct(tsigbuf, buf, 0)
|
||||||
|
|
||||||
|
msgbuf, ok := msg.Pack()
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
buf = append(buf, msgbuf...)
|
||||||
|
|
||||||
//func NewMD5(key []byte) hash.Hash
|
//func NewMD5(key []byte) hash.Hash
|
||||||
hmac := hmac.NewMD5([]byte(secret))
|
hmac := hmac.NewMD5([]byte(secret))
|
||||||
io.WriteString(hmac, string(buf))
|
io.WriteString(hmac, string(buf))
|
||||||
rr.MAC = string(hmac.Sum())
|
rr.MAC = string(hmac.Sum())
|
||||||
rr.MACSize = uint16(len(rr.MAC))
|
rr.MACSize = uint16(len(rr.MAC))
|
||||||
|
rr.OrigId = msg.MsgHdr.Id
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
18
tsig_test.go
18
tsig_test.go
|
@ -2,18 +2,32 @@ package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestTsig(t *testing.T) {
|
func TestTsig(t *testing.T) {
|
||||||
tsig := new(RR_TSIG)
|
tsig := new(RR_TSIG)
|
||||||
tsig.Hdr.Name = "miek.nl"
|
tsig.Hdr.Name = "miek.nl" // for tsig this is the key's name
|
||||||
tsig.Hdr.Rrtype = TypeTSIG
|
tsig.Hdr.Rrtype = TypeTSIG
|
||||||
tsig.Hdr.Class = ClassANY
|
tsig.Hdr.Class = ClassANY
|
||||||
tsig.Hdr.Ttl = 0
|
tsig.Hdr.Ttl = 0
|
||||||
|
|
||||||
ok := tsig.GenerateMAC()
|
out := new(Msg)
|
||||||
|
out.MsgHdr.RecursionDesired = true
|
||||||
|
out.Question = make([]Question, 1)
|
||||||
|
out.Question[0] = Question{"miek.nl", TypeSOA, ClassINET}
|
||||||
|
|
||||||
|
ok := tsig.GenerateMAC(out, "geheim")
|
||||||
if !ok {
|
if !ok {
|
||||||
t.Log("Failed")
|
t.Log("Failed")
|
||||||
t.Fail()
|
t.Fail()
|
||||||
}
|
}
|
||||||
|
fmt.Printf("%v\n", tsig)
|
||||||
|
|
||||||
|
// Having the TSIG record, it must now be added to the msg
|
||||||
|
// in the extra section
|
||||||
|
out.Extra = make([]RR, 1)
|
||||||
|
out.Extra[0] = tsig
|
||||||
|
|
||||||
|
fmt.Printf("%v\n", out)
|
||||||
}
|
}
|
||||||
|
|
4
types.go
4
types.go
|
@ -543,7 +543,9 @@ func (rr *RR_TSIG) Header() *RR_Header {
|
||||||
|
|
||||||
func (rr *RR_TSIG) String() string {
|
func (rr *RR_TSIG) String() string {
|
||||||
// It has no presentation format
|
// It has no presentation format
|
||||||
return ""
|
return rr.Hdr.String() +
|
||||||
|
" " + strconv.Itoa(int(rr.MACSize)) +
|
||||||
|
" " + rr.MAC
|
||||||
}
|
}
|
||||||
|
|
||||||
// Translate the RRSIG's incep. and expir. time to the correct date.
|
// Translate the RRSIG's incep. and expir. time to the correct date.
|
||||||
|
|
Loading…
Reference in New Issue