Add a compression flag to msg struct
This commit is contained in:
parent
0008471adf
commit
eafe995a56
10
dnssec.go
10
dnssec.go
|
@ -91,7 +91,7 @@ func (k *RR_DNSKEY) KeyTag() uint16 {
|
||||||
keywire.Algorithm = k.Algorithm
|
keywire.Algorithm = k.Algorithm
|
||||||
keywire.PublicKey = k.PublicKey
|
keywire.PublicKey = k.PublicKey
|
||||||
wire := make([]byte, DefaultMsgSize)
|
wire := make([]byte, DefaultMsgSize)
|
||||||
n, ok := packStruct(keywire, wire, 0, nil)
|
n, ok := packStruct(keywire, wire, 0, nil, false)
|
||||||
if !ok {
|
if !ok {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@ -126,7 +126,7 @@ func (k *RR_DNSKEY) ToDS(h int) *RR_DS {
|
||||||
keywire.Algorithm = k.Algorithm
|
keywire.Algorithm = k.Algorithm
|
||||||
keywire.PublicKey = k.PublicKey
|
keywire.PublicKey = k.PublicKey
|
||||||
wire := make([]byte, DefaultMsgSize)
|
wire := make([]byte, DefaultMsgSize)
|
||||||
n, ok := packStruct(keywire, wire, 0, nil)
|
n, ok := packStruct(keywire, wire, 0, nil, false)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -205,7 +205,7 @@ func (s *RR_RRSIG) Sign(k PrivateKey, rrset RRset) error {
|
||||||
|
|
||||||
// Create the desired binary blob
|
// Create the desired binary blob
|
||||||
signdata := make([]byte, DefaultMsgSize)
|
signdata := make([]byte, DefaultMsgSize)
|
||||||
n, ok := packStruct(sigwire, signdata, 0, nil)
|
n, ok := packStruct(sigwire, signdata, 0, nil, false)
|
||||||
if !ok {
|
if !ok {
|
||||||
return ErrPack
|
return ErrPack
|
||||||
}
|
}
|
||||||
|
@ -300,7 +300,7 @@ func (s *RR_RRSIG) Verify(k *RR_DNSKEY, rrset RRset) error {
|
||||||
sigwire.SignerName = strings.ToLower(s.SignerName)
|
sigwire.SignerName = strings.ToLower(s.SignerName)
|
||||||
// Create the desired binary blob
|
// Create the desired binary blob
|
||||||
signeddata := make([]byte, DefaultMsgSize)
|
signeddata := make([]byte, DefaultMsgSize)
|
||||||
n, ok := packStruct(sigwire, signeddata, 0, nil)
|
n, ok := packStruct(sigwire, signeddata, 0, nil, false)
|
||||||
if !ok {
|
if !ok {
|
||||||
return ErrPack
|
return ErrPack
|
||||||
}
|
}
|
||||||
|
@ -492,7 +492,7 @@ func rawSignatureData(rrset RRset, s *RR_RRSIG) (buf []byte) {
|
||||||
ttl := h.Ttl
|
ttl := h.Ttl
|
||||||
h.Ttl = s.OrigTtl
|
h.Ttl = s.OrigTtl
|
||||||
wire := make([]byte, DefaultMsgSize)
|
wire := make([]byte, DefaultMsgSize)
|
||||||
off, ok1 := packRR(r, wire, 0, nil)
|
off, ok1 := packRR(r, wire, 0, nil, false)
|
||||||
wire = wire[:off]
|
wire = wire[:off]
|
||||||
h.Ttl = ttl // restore the order in the universe TODO(mg) work on copy
|
h.Ttl = ttl // restore the order in the universe TODO(mg) work on copy
|
||||||
h.Name = name
|
h.Name = name
|
||||||
|
|
31
msg.go
31
msg.go
|
@ -74,6 +74,7 @@ type MsgHdr struct {
|
||||||
// The layout of a DNS message.
|
// The layout of a DNS message.
|
||||||
type Msg struct {
|
type Msg struct {
|
||||||
MsgHdr
|
MsgHdr
|
||||||
|
Compress bool // If true, the message will be compressed when converted to wire format.
|
||||||
Question []Question
|
Question []Question
|
||||||
Answer []RR
|
Answer []RR
|
||||||
Ns []RR
|
Ns []RR
|
||||||
|
@ -338,7 +339,7 @@ Loop:
|
||||||
|
|
||||||
// Pack a reflect.StructValue into msg. Struct members can only be uint8, uint16, uint32, string,
|
// Pack a reflect.StructValue into msg. Struct members can only be uint8, uint16, uint32, string,
|
||||||
// slices and other (often anonymous) structs.
|
// slices and other (often anonymous) structs.
|
||||||
func packStructValue(val reflect.Value, msg []byte, off int, compression map[string]int) (off1 int, ok bool) {
|
func packStructValue(val reflect.Value, msg []byte, off int, compression map[string]int, compress bool) (off1 int, ok bool) {
|
||||||
for i := 0; i < val.NumField(); i++ {
|
for i := 0; i < val.NumField(); i++ {
|
||||||
// f := val.Type().Field(i)
|
// f := val.Type().Field(i)
|
||||||
lenmsg := len(msg)
|
lenmsg := len(msg)
|
||||||
|
@ -417,7 +418,7 @@ func packStructValue(val reflect.Value, msg []byte, off int, compression map[str
|
||||||
// TODO(mg)
|
// TODO(mg)
|
||||||
}
|
}
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
off, ok = packStructValue(fv, msg, off, compression)
|
off, ok = packStructValue(fv, msg, off, compression, compress)
|
||||||
case reflect.Uint8:
|
case reflect.Uint8:
|
||||||
if off+1 > lenmsg {
|
if off+1 > lenmsg {
|
||||||
//fmt.Fprintf(os.Stderr, "dns: overflow packing uint8")
|
//fmt.Fprintf(os.Stderr, "dns: overflow packing uint8")
|
||||||
|
@ -487,9 +488,9 @@ func packStructValue(val reflect.Value, msg []byte, off int, compression map[str
|
||||||
fallthrough // No compression
|
fallthrough // No compression
|
||||||
case "cdomain-name":
|
case "cdomain-name":
|
||||||
if val.Type().Field(i).Tag == "cdomain-name" {
|
if val.Type().Field(i).Tag == "cdomain-name" {
|
||||||
off, ok = PackDomainName(s, msg, off, compression, true)
|
off, ok = PackDomainName(s, msg, off, compression, true && compress)
|
||||||
} else {
|
} else {
|
||||||
off, ok = PackDomainName(s, msg, off, compression, false)
|
off, ok = PackDomainName(s, msg, off, compression, false && compress)
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
//fmt.Fprintf(os.Stderr, "dns: overflow packing domain-name")
|
//fmt.Fprintf(os.Stderr, "dns: overflow packing domain-name")
|
||||||
|
@ -541,8 +542,8 @@ func structValue(any interface{}) reflect.Value {
|
||||||
return reflect.ValueOf(any).Elem()
|
return reflect.ValueOf(any).Elem()
|
||||||
}
|
}
|
||||||
|
|
||||||
func packStruct(any interface{}, msg []byte, off int, compression map[string]int) (off1 int, ok bool) {
|
func packStruct(any interface{}, msg []byte, off int, compression map[string]int, compress bool) (off1 int, ok bool) {
|
||||||
off, ok = packStructValue(structValue(any), msg, off, compression)
|
off, ok = packStructValue(structValue(any), msg, off, compression, compress)
|
||||||
return off, ok
|
return off, ok
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -872,12 +873,12 @@ func packBase32(s []byte) ([]byte, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resource record packer.
|
// Resource record packer.
|
||||||
func packRR(rr RR, msg []byte, off int, compression map[string]int) (off1 int, ok bool) {
|
func packRR(rr RR, msg []byte, off int, compression map[string]int, compress bool) (off1 int, ok bool) {
|
||||||
if rr == nil {
|
if rr == nil {
|
||||||
return len(msg), false
|
return len(msg), false
|
||||||
}
|
}
|
||||||
|
|
||||||
off1, ok = packStruct(rr, msg, off, compression)
|
off1, ok = packStruct(rr, msg, off, compression, compress)
|
||||||
if !ok {
|
if !ok {
|
||||||
return len(msg), false
|
return len(msg), false
|
||||||
}
|
}
|
||||||
|
@ -1018,21 +1019,21 @@ func (dns *Msg) Pack() (msg []byte, ok bool) {
|
||||||
|
|
||||||
// Pack it in: header and then the pieces.
|
// Pack it in: header and then the pieces.
|
||||||
off := 0
|
off := 0
|
||||||
off, ok = packStruct(&dh, msg, off, compression)
|
off, ok = packStruct(&dh, msg, off, compression, dns.Compress)
|
||||||
for i := 0; i < len(question); i++ {
|
for i := 0; i < len(question); i++ {
|
||||||
off, ok = packStruct(&question[i], msg, off, compression)
|
off, ok = packStruct(&question[i], msg, off, compression, dns.Compress)
|
||||||
// println("Question", off)
|
// println("Question", off)
|
||||||
}
|
}
|
||||||
for i := 0; i < len(answer); i++ {
|
for i := 0; i < len(answer); i++ {
|
||||||
off, ok = packRR(answer[i], msg, off, compression)
|
off, ok = packRR(answer[i], msg, off, compression, dns.Compress)
|
||||||
// println("Answer", off)
|
// println("Answer", off)
|
||||||
}
|
}
|
||||||
for i := 0; i < len(ns); i++ {
|
for i := 0; i < len(ns); i++ {
|
||||||
off, ok = packRR(ns[i], msg, off, compression)
|
off, ok = packRR(ns[i], msg, off, compression, dns.Compress)
|
||||||
// println("Authority", off)
|
// println("Authority", off)
|
||||||
}
|
}
|
||||||
for i := 0; i < len(extra); i++ {
|
for i := 0; i < len(extra); i++ {
|
||||||
off, ok = packRR(extra[i], msg, off, compression)
|
off, ok = packRR(extra[i], msg, off, compression, dns.Compress)
|
||||||
// println("Additional", off)
|
// println("Additional", off)
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -1160,8 +1161,8 @@ func (dns *Msg) Len() int {
|
||||||
// CompressedLen returns the length of the message when in
|
// CompressedLen returns the length of the message when in
|
||||||
// compressed wire format.
|
// compressed wire format.
|
||||||
func (dns *Msg) CompressedLen() int {
|
func (dns *Msg) CompressedLen() int {
|
||||||
// Uhh. TODO
|
// Uhh. TODO
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// Id return a 16 bits random number to be used as a
|
// Id return a 16 bits random number to be used as a
|
||||||
|
|
2
nsec3.go
2
nsec3.go
|
@ -17,7 +17,7 @@ func HashName(label string, ha, iter int, salt string) string {
|
||||||
saltwire := new(saltWireFmt)
|
saltwire := new(saltWireFmt)
|
||||||
saltwire.Salt = salt
|
saltwire.Salt = salt
|
||||||
wire := make([]byte, DefaultMsgSize)
|
wire := make([]byte, DefaultMsgSize)
|
||||||
n, ok := packStruct(saltwire, wire, 0, nil)
|
n, ok := packStruct(saltwire, wire, 0, nil, false)
|
||||||
if !ok {
|
if !ok {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
6
tsig.go
6
tsig.go
|
@ -161,7 +161,7 @@ func tsigBuffer(msgbuf []byte, rr *RR_TSIG, requestMAC string, timersOnly bool)
|
||||||
m.MACSize = uint16(len(requestMAC) / 2)
|
m.MACSize = uint16(len(requestMAC) / 2)
|
||||||
m.MAC = requestMAC
|
m.MAC = requestMAC
|
||||||
macbuf = make([]byte, len(requestMAC)) // reqmac should be twice as long
|
macbuf = make([]byte, len(requestMAC)) // reqmac should be twice as long
|
||||||
n, _ := packStruct(m, macbuf, 0, nil)
|
n, _ := packStruct(m, macbuf, 0, nil, false)
|
||||||
macbuf = macbuf[:n]
|
macbuf = macbuf[:n]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,7 +170,7 @@ func tsigBuffer(msgbuf []byte, rr *RR_TSIG, requestMAC string, timersOnly bool)
|
||||||
tsig := new(timerWireFmt)
|
tsig := new(timerWireFmt)
|
||||||
tsig.TimeSigned = rr.TimeSigned
|
tsig.TimeSigned = rr.TimeSigned
|
||||||
tsig.Fudge = rr.Fudge
|
tsig.Fudge = rr.Fudge
|
||||||
n, _ := packStruct(tsig, tsigvar, 0, nil)
|
n, _ := packStruct(tsig, tsigvar, 0, nil, false)
|
||||||
tsigvar = tsigvar[:n]
|
tsigvar = tsigvar[:n]
|
||||||
} else {
|
} else {
|
||||||
tsig := new(tsigWireFmt)
|
tsig := new(tsigWireFmt)
|
||||||
|
@ -183,7 +183,7 @@ func tsigBuffer(msgbuf []byte, rr *RR_TSIG, requestMAC string, timersOnly bool)
|
||||||
tsig.Error = rr.Error
|
tsig.Error = rr.Error
|
||||||
tsig.OtherLen = rr.OtherLen
|
tsig.OtherLen = rr.OtherLen
|
||||||
tsig.OtherData = rr.OtherData
|
tsig.OtherData = rr.OtherData
|
||||||
n, _ := packStruct(tsig, tsigvar, 0, nil)
|
n, _ := packStruct(tsig, tsigvar, 0, nil, false)
|
||||||
tsigvar = tsigvar[:n]
|
tsigvar = tsigvar[:n]
|
||||||
}
|
}
|
||||||
if rr.MAC != "" {
|
if rr.MAC != "" {
|
||||||
|
|
Loading…
Reference in New Issue