NSID is broken

This commit is contained in:
Miek Gieben 2011-09-20 12:52:23 +02:00
parent acfb57879c
commit 1a81ac9c85
4 changed files with 31 additions and 15 deletions

View File

@ -11,12 +11,13 @@ import (
const (
// Detected software types
NSD = "nsd"
BIND = "bind"
NSD = "NSD"
BIND = "BIND"
// Vendors
ISC = "ISC"
NLNETLABS = "NLnet Labs"
MICROSOFT = "Microsoft"
)
func startParse(addr string) {

View File

@ -108,8 +108,20 @@ Flags:
m.MsgHdr.RecursionDesired = *rd
m.Question = make([]dns.Question, 1)
if *dnssec || *nsid {
m.SetEdns0(dns.DefaultMsgSize, true)
o := new(dns.RR_OPT)
o.Hdr.Name = "."
o.Hdr.Rrtype = dns.TypeOPT
if *dnssec {
o.SetDo()
o.SetUDPSize(dns.DefaultMsgSize)
}
if *nsid {
o.SetNsid("")
}
m.Extra = append(m.Extra, o)
//m.SetEdns0(dns.DefaultMsgSize, true)
}
if *fp {
startParse(nameserver)
return

View File

@ -111,7 +111,7 @@ func (rr *RR_OPT) Do() bool {
return byte(rr.Hdr.Ttl>>8)&_DO == _DO
}
// Set the DO bit.
// SetDo sets the DO (DNSSEC OK) bit.
func (rr *RR_OPT) SetDo() {
b1 := byte(rr.Hdr.Ttl >> 24)
b2 := byte(rr.Hdr.Ttl >> 16)
@ -121,12 +121,13 @@ func (rr *RR_OPT) SetDo() {
rr.Hdr.Ttl = uint32(b1)<<24 | uint32(b2)<<16 | uint32(b3)<<8 | uint32(b4)
}
// Return the NSID as hex string.
// Nsid returns the NSID as hex character string.
func (rr *RR_OPT) Nsid() string {
return "NSID: " + rr.Option[0].Data
}
// Set the NSID from a string which is represented as hex characters.
// SetNsid sets the NSID from a hex character string.
// Use the empty string when requesting NSID.
func (rr *RR_OPT) SetNsid(hexnsid string) {
rr.Option = make([]Option, 1) // TODO(mg) check length first?
rr.Option[0].Code = OptionCodeNSID

20
msg.go
View File

@ -16,7 +16,6 @@ package dns
import (
"os"
// "fmt"
"reflect"
"net"
"rand"
@ -318,6 +317,7 @@ func packStructValue(val reflect.Value, msg []byte, off int) (off1 int, ok bool)
//fmt.Fprintf(os.Stderr, "dns: unknown packing slice tag %v\n", f.Tag)
return lenmsg, false
case "OPT": // edns
// Length of the entire option section
for j := 0; j < val.Field(i).Len(); j++ {
element := val.Field(i).Index(j)
code := uint16(element.Field(0).Uint())
@ -327,16 +327,18 @@ func packStructValue(val reflect.Value, msg []byte, off int) (off1 int, ok bool)
//fmt.Fprintf(os.Stderr, "dns: failure packing OTP")
return lenmsg, false
}
data := string(h)
// Option Code
msg[off] = byte(code >> 8)
msg[off+1] = byte(code)
// the rdlength needs to be set somehow
println("code ", code)
println("length ", len(string(h)))
println("off ", off)
msg[off], msg[off+1] = packUint16(code)
// Length
msg[off+2] = byte(len(data) >> 8)
msg[off+3] = byte(len(data))
off += 4
copy(msg[off:off+len(data)], []byte(data))
off += len(data)
msg[off+2], msg[off+3] = packUint16(uint16(len(string(h))))
off += 4
copy(msg[off:off+len(string(h))], h)
off += len(string(h))
}
case "A":
// It must be a slice of 4, even if it is 16, we encode