Skip to content

Commit 3126b78

Browse files
committed
Merge branch 'master' of github.com:miekg/dns
2 parents 96ab0dc + 49a9cee commit 3126b78

File tree

8 files changed

+116
-40
lines changed

8 files changed

+116
-40
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ A not-so-up-to-date-list-that-may-be-actually-current:
9797
- https://ifconfig.es
9898
- https://github.com/zmap/zdns
9999
- https://framagit.org/bortzmeyer/check-soa
100+
- https://github.com/jkerdreux-imt/owns
100101

101102
Send pull request if you want to be listed here.
102103

@@ -207,6 +208,7 @@ _all of them_
207208
- 9460 - SVCB and HTTPS Records
208209
- 9567 - DNS Error Reporting
209210
- 9606 - DNS Resolver Information
211+
- 9660 - DNS Zone Version (ZONEVERSION) Option
210212
- Draft - Compact Denial of Existence in DNSSEC
211213

212214
## Loosely Based Upon

edns.go

Lines changed: 81 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const (
2525
EDNS0PADDING = 0xc // EDNS0 padding (See RFC 7830)
2626
EDNS0EDE = 0xf // EDNS0 extended DNS errors (See RFC 8914)
2727
EDNS0REPORTING = 0x12 // EDNS0 reporting (See RFC 9567)
28+
EDNS0ZONEVERSION = 0x13 // EDNS0 Zone Version (See RFC 9660)
2829
EDNS0LOCALSTART = 0xFDE9 // Beginning of range reserved for local/experimental use (See RFC 6891)
2930
EDNS0LOCALEND = 0xFFFE // End of range reserved for local/experimental use (See RFC 6891)
3031
_DO = 1 << 15 // DNSSEC OK
@@ -63,6 +64,8 @@ func makeDataOpt(code uint16) EDNS0 {
6364
return new(EDNS0_ESU)
6465
case EDNS0REPORTING:
6566
return new(EDNS0_REPORTING)
67+
case EDNS0ZONEVERSION:
68+
return new(EDNS0_ZONEVERSION)
6669
default:
6770
e := new(EDNS0_LOCAL)
6871
e.Code = code
@@ -78,17 +81,16 @@ type OPT struct {
7881

7982
func (rr *OPT) String() string {
8083
s := "\n;; OPT PSEUDOSECTION:\n; EDNS: version " + strconv.Itoa(int(rr.Version())) + "; "
84+
s += "flags:"
8185
if rr.Do() {
82-
if rr.Co() {
83-
s += "flags: do, co; "
84-
} else {
85-
s += "flags: do; "
86-
}
87-
} else {
88-
s += "flags:; "
86+
s += " do"
8987
}
90-
if rr.Hdr.Ttl&0x7FFF != 0 {
91-
s += fmt.Sprintf("MBZ: 0x%04x, ", rr.Hdr.Ttl&0x7FFF)
88+
if rr.Co() {
89+
s += " co"
90+
}
91+
s += "; "
92+
if z := rr.Z(); z != 0 {
93+
s += fmt.Sprintf("MBZ: 0x%04x, ", z)
9294
}
9395
s += "udp: " + strconv.Itoa(int(rr.UDPSize()))
9496

@@ -132,6 +134,8 @@ func (rr *OPT) String() string {
132134
s += "\n; ESU: " + o.String()
133135
case *EDNS0_REPORTING:
134136
s += "\n; REPORT-CHANNEL: " + o.String()
137+
case *EDNS0_ZONEVERSION:
138+
s += "\n; ZONEVERSION: " + o.String()
135139
}
136140
}
137141
return s
@@ -313,41 +317,54 @@ type EDNS0_SUBNET struct {
313317
func (e *EDNS0_SUBNET) Option() uint16 { return EDNS0SUBNET }
314318

315319
func (e *EDNS0_SUBNET) pack() ([]byte, error) {
316-
b := make([]byte, 4)
317-
binary.BigEndian.PutUint16(b[0:], e.Family)
318-
b[2] = e.SourceNetmask
319-
b[3] = e.SourceScope
320320
switch e.Family {
321321
case 0:
322322
// "dig" sets AddressFamily to 0 if SourceNetmask is also 0
323323
// We might don't need to complain either
324324
if e.SourceNetmask != 0 {
325325
return nil, errors.New("bad address family")
326326
}
327+
b := make([]byte, 4)
328+
b[3] = e.SourceScope
329+
return b, nil
327330
case 1:
328331
if e.SourceNetmask > net.IPv4len*8 {
329332
return nil, errors.New("bad netmask")
330333
}
331-
if len(e.Address.To4()) != net.IPv4len {
334+
ip4 := e.Address.To4()
335+
if len(ip4) != net.IPv4len {
332336
return nil, errors.New("bad address")
333337
}
334-
ip := e.Address.To4().Mask(net.CIDRMask(int(e.SourceNetmask), net.IPv4len*8))
335338
needLength := (e.SourceNetmask + 8 - 1) / 8 // division rounding up
336-
b = append(b, ip[:needLength]...)
339+
b := make([]byte, 4+needLength)
340+
binary.BigEndian.PutUint16(b[0:], e.Family)
341+
b[2] = e.SourceNetmask
342+
b[3] = e.SourceScope
343+
if needLength > 0 {
344+
ip := ip4.Mask(net.CIDRMask(int(e.SourceNetmask), net.IPv4len*8))
345+
copy(b[4:], ip[:needLength])
346+
}
347+
return b, nil
337348
case 2:
338349
if e.SourceNetmask > net.IPv6len*8 {
339350
return nil, errors.New("bad netmask")
340351
}
341352
if len(e.Address) != net.IPv6len {
342353
return nil, errors.New("bad address")
343354
}
344-
ip := e.Address.Mask(net.CIDRMask(int(e.SourceNetmask), net.IPv6len*8))
345355
needLength := (e.SourceNetmask + 8 - 1) / 8 // division rounding up
346-
b = append(b, ip[:needLength]...)
356+
b := make([]byte, 4+needLength)
357+
binary.BigEndian.PutUint16(b[0:], e.Family)
358+
b[2] = e.SourceNetmask
359+
b[3] = e.SourceScope
360+
if needLength > 0 {
361+
ip := e.Address.Mask(net.CIDRMask(int(e.SourceNetmask), net.IPv6len*8))
362+
copy(b[4:], ip[:needLength])
363+
}
364+
return b, nil
347365
default:
348366
return nil, errors.New("bad address family")
349367
}
350-
return b, nil
351368
}
352369

353370
func (e *EDNS0_SUBNET) unpack(b []byte) error {
@@ -906,3 +923,48 @@ func (e *EDNS0_REPORTING) unpack(b []byte) error {
906923
e.AgentDomain = domain
907924
return nil
908925
}
926+
927+
// EDNS0_ZONEVERSION implements the EDNS0 Zone Version option (RFC 9660).
928+
type EDNS0_ZONEVERSION struct {
929+
// always EDNS0ZONEVERSION (19)
930+
Code uint16
931+
// An unsigned 1-octet Label Count indicating
932+
// the number of labels for the name of the zone that VERSION value refers to.
933+
LabelCount uint8
934+
// An unsigned 1-octet type number distinguishing the format and meaning of version.
935+
// 0 SOA-SERIAL, 1-245 Unassigned, 246-255 Reserved for private use, see RFC 9660.
936+
Type uint8
937+
// An opaque octet string conveying the zone version data (VERSION).
938+
Version string
939+
}
940+
941+
func (e *EDNS0_ZONEVERSION) Option() uint16 { return EDNS0ZONEVERSION }
942+
func (e *EDNS0_ZONEVERSION) String() string { return e.Version }
943+
func (e *EDNS0_ZONEVERSION) copy() EDNS0 {
944+
return &EDNS0_ZONEVERSION{e.Code, e.LabelCount, e.Type, e.Version}
945+
}
946+
func (e *EDNS0_ZONEVERSION) pack() ([]byte, error) {
947+
b := []byte{
948+
// first octet label count
949+
e.LabelCount,
950+
// second octet is type
951+
e.Type,
952+
}
953+
if len(e.Version) > 0 {
954+
b = append(b, []byte(e.Version)...)
955+
}
956+
return b, nil
957+
}
958+
func (e *EDNS0_ZONEVERSION) unpack(b []byte) error {
959+
if len(b) < 2 {
960+
return ErrBuf
961+
}
962+
e.LabelCount = b[0]
963+
e.Type = b[1]
964+
if len(b) > 2 {
965+
e.Version = string(b[2:])
966+
} else {
967+
e.Version = ""
968+
}
969+
return nil
970+
}

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
module github.com/miekg/dns
22

3-
go 1.23.0
3+
go 1.24.0
44

55
toolchain go1.24.2
66

77
require (
8-
golang.org/x/net v0.42.0
9-
golang.org/x/sync v0.16.0
10-
golang.org/x/sys v0.34.0
11-
golang.org/x/tools v0.35.0
8+
golang.org/x/net v0.47.0
9+
golang.org/x/sync v0.18.0
10+
golang.org/x/sys v0.38.0
11+
golang.org/x/tools v0.39.0
1212
)
1313

14-
require golang.org/x/mod v0.26.0 // indirect
14+
require golang.org/x/mod v0.30.0 // indirect

go.sum

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
22
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
3-
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
4-
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
5-
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
6-
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
7-
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
8-
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
9-
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
10-
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
11-
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
12-
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
3+
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
4+
golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI=
5+
golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk=
6+
golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=
7+
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
8+
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
9+
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
10+
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
11+
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
12+
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
13+
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
14+
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
15+
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
16+
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
17+
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
18+
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
19+
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
20+
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
21+
golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ=
22+
golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=

parse_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,8 +1250,8 @@ func TestNewPrivateKey(t *testing.T) {
12501250
algorithms := []algorithm{
12511251
{ECDSAP256SHA256, 256},
12521252
{ECDSAP384SHA384, 384},
1253-
{RSASHA1, 512},
1254-
{RSASHA256, 512},
1253+
{RSASHA1, 1024},
1254+
{RSASHA256, 1024},
12551255
{ED25519, 256},
12561256
}
12571257

server.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,9 @@ type DecorateWriter func(Writer) Writer
194194
// rejected (or ignored) by the MsgAcceptFunc, or passed to this function.
195195
type MsgInvalidFunc func(m []byte, err error)
196196

197-
func DefaultMsgInvalidFunc(m []byte, err error) {}
197+
var DefaultMsgInvalidFunc MsgInvalidFunc = defaultMsgInvalidFunc
198+
199+
func defaultMsgInvalidFunc(m []byte, err error) {}
198200

199201
// A Server defines parameters for running an DNS server.
200202
type Server struct {

sig0_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func TestSIG0(t *testing.T) {
2525
keysize = 256
2626
case ECDSAP384SHA384:
2727
keysize = 384
28-
case RSASHA512:
28+
case RSASHA1, RSASHA256, RSASHA512:
2929
keysize = 1024
3030
}
3131
pk, err := keyrr.Generate(keysize)

version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package dns
33
import "fmt"
44

55
// Version is current version of this library.
6-
var Version = v{1, 1, 68}
6+
var Version = v{1, 1, 69}
77

88
// v holds the version of this library.
99
type v struct {

0 commit comments

Comments
 (0)