From 0f05a2f4347c2881fc13f57efccede63b05be555 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Wed, 22 Dec 2010 12:26:50 +0100 Subject: [PATCH] Make a stab for EDNS --- Makefile | 3 --- edns.go | 7 +++---- edns_test.go | 19 +++++++++++++++++++ pack_test.go | 16 ++++++++++++++-- packtest.go | 47 ----------------------------------------------- types.go | 25 ++++++++----------------- 6 files changed, 44 insertions(+), 73 deletions(-) create mode 100644 edns_test.go delete mode 100644 packtest.go diff --git a/Makefile b/Makefile index 0b822cd7..db7ae207 100644 --- a/Makefile +++ b/Makefile @@ -23,8 +23,5 @@ restest: restest.go $(GOFILES) manglertest: manglertest.go $(GOFILES) 6g -I _obj manglertest.go && 6l -L _obj -o manglertest manglertest.6 -packtest: packtest.go $(GOFILES) - 6g -I _obj packtest.go && 6l -L _obj -o packtest packtest.6 - dnssectest: dnssectest.go $(GOFILES) 6g -I _obj dnssectest.go && 6l -L _obj -o dnssectest dnssectest.6 diff --git a/edns.go b/edns.go index 0190eabd..8db4add6 100644 --- a/edns.go +++ b/edns.go @@ -1,8 +1,7 @@ package dns // This is the base layer for ENDS, in practise -// You'll only need to set updsize, do bit - +// You'll only need to set updsize, do bit, and?? const ( OptionCodeLLQ = 1 @@ -13,7 +12,7 @@ const ( ) // Need PackOption I guess?? TODO -type Edns0Option struct { +type Option struct { Code uint16 // Length uint16 Data string "hex" // len(data) is must be encode in packet @@ -32,7 +31,7 @@ type EDNS0_Header struct { type RR_EDNS0 struct { Hdr RR_Header // this must become a EDNS0_Header - Option []Edns0Option + Option []Option } func (rr *RR_EDNS0) Header() *RR_Header { diff --git a/edns_test.go b/edns_test.go new file mode 100644 index 00000000..bf5317d8 --- /dev/null +++ b/edns_test.go @@ -0,0 +1,19 @@ +package dns + +// Test EDNS RR records + +import ( + "testing" +) + +func TestEDNS_RR(t *testing.T) { + edns := new(RR_EDNS0) + edns.Hdr.Name = "miek.nl." // must . be for edns + edns.Hdr.Rrtype = TypeOPT + edns.Hdr.Class = ClassINET + edns.Hdr.Ttl = 3600 + edns.Option = make([]Option, 1) + edns.Option[0].Code = OptionCodeNSID + edns.Option[0].Data = "lalalala" + //fmt.Printf("%s\n", edns) +} diff --git a/pack_test.go b/pack_test.go index 9189e8d9..19592aff 100644 --- a/pack_test.go +++ b/pack_test.go @@ -70,16 +70,28 @@ func TestPackUnpack(t *testing.T) { sig.SignerName = "miek.nl." sig.Sig = "AwEAAaHIwpx3w4VHKi6i1LHnTaWeHCL154Jug0Rtc9ji5qwPXpBo6A5sRv7cSsPQKPIwxLpyCrbJ4mr2L0EPOdvP6z6YfljK2ZmTbogU9aSU2fiq/4wjxbdkLyoDVgtO+JsxNN4bjr4WcWhsmk1Hg93FV9ZpkWb0Tbad8DFqNDzr//kZ" + + edns := new(RR_EDNS0) + edns.Hdr.Name = "miek.nl." // must . be for edns + edns.Hdr.Rrtype = TypeOPT + edns.Hdr.Class = ClassINET + edns.Hdr.Ttl = 3600 + edns.Option = make([]Option, 1) + edns.Option[0].Code = OptionCodeNSID + edns.Option[0].Data = "lalalala" + out.Answer[0] = sig + out.Extra = make([]RR, 1) + out.Extra[0] = edns msg, ok = out.Pack() // fmt.Printf("%v\n", msg) if ! ok { - t.Log("Failed to pack msg with RRSIG") + t.Log("Failed to pack msg with RRSIG and EDNS") t.Fail() } if ! in.Unpack(msg) { - t.Log("Failed to unpack msg with RRSIG") + t.Log("Failed to unpack msg with RRSIG and EDNS") t.Fail() } fmt.Printf("%v\n", in) diff --git a/packtest.go b/packtest.go deleted file mode 100644 index 4208842a..00000000 --- a/packtest.go +++ /dev/null @@ -1,47 +0,0 @@ -package main - -import ( - "dns" - "fmt" - "net" -) - -func main() { - out := new(dns.Msg) - - r := new(dns.RR_AAAA) - r.AAAA = net.ParseIP("2001:7b8:206:1:200:39ff:fe59:b187").To16() -// r.AAAA = net.ParseIP("2003::53").To16() - r.Hdr.Name = "a.miek.nl" - r.Hdr.Rrtype = dns.TypeAAAA - r.Hdr.Class = dns.ClassINET - r.Hdr.Ttl = 3600 - out.Answer = make([]dns.RR, 1) - out.Answer[0] = r - - msg, _ := out.Pack() - - in := new(dns.Msg) - in.Unpack(msg) - fmt.Printf("%v\n", in) - - sig := new(dns.RR_RRSIG) - sig.Hdr.Name = "miek.nl." - sig.Hdr.Rrtype = dns.TypeRRSIG - sig.Hdr.Class = dns.ClassINET - sig.Hdr.Ttl = 3600 - sig.TypeCovered = dns.TypeDNSKEY - sig.Algorithm = dns.AlgRSASHA1 - sig.OrigTtl = 4000 - sig.Expiration = 1000 - sig.Inception = 800 - sig.KeyTag = 34641 - sig.SignerName = "miek.nl." - sig.Sig = "AwEAAaHIwpx3w4VHKi6i1LHnTaWeHCL154Jug0Rtc9ji5qwPXpBo6A5sRv7cSsPQKPIwxLpyCrbJ4mr2L0EPOdvP6z6YfljK2ZmTbogU9aSU2fiq/4wjxbdkLyoDVgtO+JsxNN4bjr4WcWhsmk1Hg93FV9ZpkWb0Tbad8DFq NDzr//kZ" - - out.Answer[0] = sig - - msg, _ = out.Pack() - in.Unpack(msg) - fmt.Printf("%v\n", in) -} diff --git a/types.go b/types.go index 907c157d..efc464c5 100644 --- a/types.go +++ b/types.go @@ -11,7 +11,6 @@ import ( "net" "strconv" "time" - "reflect" ) // Packet formats @@ -133,23 +132,15 @@ func (h *RR_Header) Header() *RR_Header { } func (h *RR_Header) String() string { - // - r := reflect.NewValue(h).(*reflect.PtrValue).Elem().(*reflect.StructValue) - f := r.Type().(*reflect.StructType).Field(0).Tag var s string - switch f { - default: - if len(h.Name) == 0 { - s = ".\t" - } else { - s = h.Name + "\t" - } - s = s + strconv.Itoa(int(h.Ttl)) + "\t" - s = s + class_str[h.Class] + "\t" - s = s + rr_str[h.Rrtype] + "\t" - case "edns": - // edns here - } + if len(h.Name) == 0 { + s = ".\t" + } else { + s = h.Name + "\t" + } + s = s + strconv.Itoa(int(h.Ttl)) + "\t" + s = s + class_str[h.Class] + "\t" + s = s + rr_str[h.Rrtype] + "\t" return s }