This is a clone/fork of https://github.com/miekg/dns
Go to file
DesWurstes 0972db6834
Implement SVCB (#1067)
* Implement SVCB

* Fix serialization and deserialization of double quotes

* More effort (?)

4 months old commit

* DEBUG

* _

* Presentation format serialization/deserialization

* _

Remove generated

* Progress on presentation format parse & write

* _

* Finish parsing presentation format

* Regenerate

* Pack unpack

* Move to svcb.go

Scan_rr.go and types.go should be untouched now

* 🐛

Thanks ghedo

* Definitions

* TypeHTTPSSVC

* Generated

and isDuplicate

* Goodbye lenient functions

Now private key=value pairs have to be defined as structs too. They are no longer automatically named as KeyNNNNN

* Encode/decode

* Experimental svc

* Read method

* Implement some of the methods, use trick...

to  report where the error is while reading it. This should be applied to EDNS too. Todo: Find if case can only contain e := new(SVC_ALPN) and rest moved out

Also fix two compile errors

* Add SVC_LOCAL methods, reorder, remove alpn value, bugs

* Errors

* Alpn, make it build

* Correct testsuite

* Fully implement parser

Change from keeping a state variable to reading in one iteration until the key=value pair is fully consumed

* Simplify and document

EDNS should be simplified too

* Attempt to fix fuzzer

And Alpn bug

* A bug and change type values to match @ghedo's implementation

* IP bug

Also there are two ip duplicating patterns, one with copy, one with append. Maybe change it to be consistent.

* Check for strictly increasing keys as required

* Don't panic on invalid alpn

* Redundant check, don't modify original array

* Size calculation

* Fix the fuzzer, match the style

* 65535 is reserved too, don't delay errors

* Check keyNNN, check for aliasform having values

* IPvNHint is an array

* Fix ipvNHint

* Rename everything

* Unrecognized keys according to the updated specification

* Skip zero-length structs in generators. Fix CI

* Doc cleanup

* Off by one

* Add parse tests

* Check if private key doesn't collide with known key, invalid tests

* Disallow IPv4 as IPv6. More tests.

Related #1107

* Style fixes

* More consistency, more tests

* 🐛 Deep copy as in the documentation

	a := make([]net.IP, 1)
	a[0] = net.ParseIP("1.1.1.1").To4()
	b := append(make([]net.IP, 0, 1), a...)
	b[0] = net.ParseIP("3.1.1.1").To4()
	fmt.Println(a[0][0])

* Make tests readable

* Move valid parse tests to different file

* 🐛 One of previous commits not fully committed

* Test binary single value encoding/decoding and full encode/decode

* Add worst-case grows to builders, 🐛 Wrong visible character range, redundant tests

* Testing improvements

And don't convert to IPv4 twice

* Doc update only

* Document worst case allocations

and ipv6 can be at most of length 39, not 40

* Redundant IP copy, consistent IPv6 behavior, fix deep copy

* isDuplicate for SVCB

* Optimizations

* echoconfig

* Svc => SVCB

* Fix CI

* Regenerate after REBASE (2)

Rebased twice on 15th and 20th May

* Rename svc, use escapeByte.

* Fix parsing whitespaces between quotes, rename ECHOHOConfig

* resolve

Remove svcbFieldLen
Use reverseInt
Uppercase SVCB
Rename key_value
"invalid" => bad
Alpn comments
> 65535 check
Unneeded slices

* a little more

read => parse
IP array meaning
Force pushed because forgot to change read in svcb_test.go

* HTTPSSVC -> HTTPS

* Use new values

* mandatory code

https://github.com/MikeBishop/dns-alt-svc/pull/205

* Resolve comments

Rename svcb-pairs
Remove SVCB_PRIVATE ranges
Comment on SVCB_KEY65535
ParseError return l.token
rename svcbKeyToString and svcbStringToKey
privatize SVCBKeyToString, SVCBStringToKey

* Refactor 1

Rename sorted, originalPairs
Use append instead of copy
Use svcb_RESERVED instead of 65535, with it now being private
"type SVCBKey uint16"

* Refactor 2

svcbKeyToString as method
svcbStringToKey updated after key 0
🐛 mandatory has missing key
Rename str
idx < 0

* Refactor 3

Use l.token as z
var key, value string
Comment wrap
0:
Sentences with '.'
keyValue => kv

* Refactor 4

* Refactor 5

len() int

* Refactor 6

* Refactor 7

* Test remove parsing

* Error messages

* Rewrite two estimate comments

* parse shouldn't modify original array 🐛

* Remove two unneeded comments

* Address review comments

Push 2 because can't build fuzzer python
Push 3 to try again

* Simplify argument duplication as per tmthrgd's suggestion

And add the relevant test
Force push edit: Make sorting code fit into one line

* Rewrite ECHConfig and address the review

* Remove the optional tab

* Add To4() Check

* More cleanup and fix mandatory not sorting bug
2020-10-11 09:09:36 +02:00
.github/workflows Create codeql-analysis.yml 2020-07-08 09:23:39 +02:00
dnsutil util.TrimDomainName() fails when origin doesn't end in dot (#559) 2017-11-08 18:19:10 +00:00
.codecov.yml Add codecov yaml to not fail the build (#600) 2017-12-06 10:36:23 +00:00
.gitignore gitignore update 2013-10-15 13:22:35 +00:00
.travis.yml code generation compatible with go modules (#1050) 2019-12-30 12:25:57 +01:00
acceptfunc_test.go RFC 1996 allows SOA in answer in notify (#900) 2019-01-12 10:11:11 +00:00
acceptfunc.go Doc fixes (#1060) 2019-12-19 09:28:37 +00:00
AUTHORS add AUTHOR file 2014-02-10 17:15:49 +00:00
client_test.go Adds function ExchangeWithConn (#1110) 2020-05-04 10:22:21 +02:00
client.go Set UDPSize in connections created with client.Dial() (#1165) 2020-10-11 09:06:33 +02:00
clientconfig_test.go fix: panicing on options parsing. (#642) 2018-03-01 06:22:09 -08:00
clientconfig.go Use for range loops instead of manual for loops (#937) 2019-03-18 07:06:44 +00:00
CODEOWNERS Add CODEOWNERS (#1042) 2019-12-09 11:50:19 +00:00
CONTRIBUTORS Correctly set the Source IP to the received Destination IP (#524) 2017-09-29 10:38:26 +01:00
COPYRIGHT Remove all copyright notices 2014-09-11 20:57:37 +01:00
dane.go Improve performance by addressing some low hanging fruit. (#444) 2017-02-02 07:33:49 +00:00
defaults.go CanonicalName function to return domain name in canonical form (#1073) 2020-03-18 11:21:59 +01:00
dns_bench_test.go ZoneParser: error on parsing an IPv6 address in an A record (#923) 2019-03-09 09:02:18 +00:00
dns_test.go Properly calculate compressed message lengths (#833) 2018-11-30 10:03:41 +10:30
dns.go Prohibit newlines before record data in the ZoneParser (#979) 2019-06-10 07:38:54 +01:00
dnssec_keygen.go Remove DSA* algorithms (#972) 2019-05-20 20:49:02 +01:00
dnssec_keyscan.go Remove DSA* algorithms (#972) 2019-05-20 20:49:02 +01:00
dnssec_privkey.go Use new(big.Int) instead of big.NewInt(0) (#938) 2019-03-13 07:36:34 +00:00
dnssec_test.go Eliminate lexer goroutines (#792) 2018-10-15 17:42:31 +10:30
dnssec.go CanonicalName function to return domain name in canonical form (#1073) 2020-03-18 11:21:59 +01:00
doc.go Doc updates (#1075) 2020-02-14 22:47:21 +01:00
duplicate_generate.go Implement SVCB (#1067) 2020-10-11 09:09:36 +02:00
duplicate_test.go Implement SVCB (#1067) 2020-10-11 09:09:36 +02:00
duplicate.go Doc updates (#1075) 2020-02-14 22:47:21 +01:00
dyn_test.go Remove all copyright notices 2014-09-11 20:57:37 +01:00
edns_test.go Revert "Export EDNS0 interface (#1041)" (#1046) 2019-12-06 21:23:18 +00:00
edns.go Support the zero length EDNS0 EXPIRE option (#1065) 2019-12-30 14:42:48 +01:00
example_test.go fix a stupid mistake "undefined: zone" 2015-09-30 09:42:47 -07:00
format_test.go Add checks on data length for A and AAAA records (#919) 2019-03-12 16:31:33 +00:00
format.go Add checks on data length for A and AAAA records (#919) 2019-03-12 16:31:33 +00:00
fuzz_test.go build: reduce testing output (#1031) 2019-10-20 07:12:43 +01:00
fuzz.go [fuzzer] Avoid fuzzing parser with line that contains "$INCLUDE" (#1026) 2019-10-10 07:12:53 +01:00
generate_test.go refactor: remove ParseZone and parseZone (#1099) 2020-04-28 09:24:18 +02:00
generate.go fix failing tests on 32 bit platforms (#1130) 2020-07-02 09:54:07 +02:00
go.mod code generation compatible with go modules (#1050) 2019-12-30 12:25:57 +01:00
go.sum code generation compatible with go modules (#1050) 2019-12-30 12:25:57 +01:00
issue_test.go Tests updates (#556) 2017-11-08 10:01:19 +00:00
labels_test.go CanonicalName function to return domain name in canonical form (#1073) 2020-03-18 11:21:59 +01:00
labels.go Doc updates (#1075) 2020-02-14 22:47:21 +01:00
leak_test.go Revert doh (#800) 2018-11-01 20:16:39 +00:00
length_test.go Reduce compression memory use with map[string]uint16 (#852) 2018-12-02 08:50:51 +10:30
LICENSE Put added license bit at the bottom (#1056) 2019-12-18 06:58:51 +00:00
listen_go111.go Use correct build constraints for listen_*.go files (#750) 2018-09-26 09:12:54 +01:00
listen_go_not111.go Use correct build constraints for listen_*.go files (#750) 2018-09-26 09:12:54 +01:00
Makefile.fuzz Add fuzzing framework (#580) 2017-11-23 09:34:31 +00:00
Makefile.release Release: plain push is also needed 2018-01-10 08:17:22 +00:00
msg_generate.go Implement SVCB (#1067) 2020-10-11 09:09:36 +02:00
msg_helpers_test.go make sure removing trailing zero octets in APL AFDPART (#1150) 2020-08-17 19:51:22 +01:00
msg_helpers.go Implement SVCB (#1067) 2020-10-11 09:09:36 +02:00
msg_test.go Add test for forward compression pointer (#1123) 2020-05-27 08:05:25 +00:00
msg_truncate_test.go Set the TC bit more aggressively in Truncate (#989) 2019-06-24 16:59:43 +01:00
msg_truncate.go l is never used (#1071) 2020-02-03 21:10:40 +01:00
msg.go Be consistent about domain name label character escaping (#1122) 2020-07-06 10:07:56 +02:00
nsecx_test.go Add a HashName benchmark 2018-11-29 10:28:29 +10:30
nsecx.go Doc updates (#1075) 2020-02-14 22:47:21 +01:00
parse_test.go Implement SVCB (#1067) 2020-10-11 09:09:36 +02:00
privaterr_test.go refactor: remove ParseZone and parseZone (#1099) 2020-04-28 09:24:18 +02:00
privaterr.go Doc updates (#1075) 2020-02-14 22:47:21 +01:00
README.md readme: remove too generic users (#1164) 2020-10-05 09:13:52 +02:00
remote_test.go Add remote test 2015-08-22 10:50:07 +01:00
reverse.go Move all reversed map creation into reverse.go (#889) 2019-01-04 08:10:15 +00:00
rr_test.go Eliminate lexer goroutines (#792) 2018-10-15 17:42:31 +10:30
sanitize_test.go Tests updates (#556) 2017-11-08 10:01:19 +00:00
sanitize.go Avoid calling RR.Header more than once per RR (#891) 2019-01-04 08:12:32 +00:00
scan_rr.go validate LOC's lat/long field values not to be out of range (#1149) 2020-08-17 07:07:46 +00:00
scan_test.go refactor: remove ParseZone and parseZone (#1099) 2020-04-28 09:24:18 +02:00
scan.go fix and enhance stringToCm to parse LOC RR optional fields (#1148) 2020-08-17 07:08:03 +00:00
serve_mux_test.go Rework and optimise ServeMux (#754) 2018-09-27 07:48:02 +01:00
serve_mux.go answer queries with no matching handler with RcodeRefused (#1151) 2020-08-20 08:41:45 +02:00
server_test.go Ensure TSIG state is verified in TestServerRoundtripTsig (#1085) 2020-03-11 14:18:07 +00:00
server.go answer queries with no matching handler with RcodeRefused (#1151) 2020-08-20 08:41:45 +02:00
sig0_test.go Lowercase all error msg from the tests 2015-11-26 14:12:38 +00:00
sig0.go Use new(big.Int) instead of big.NewInt(0) (#938) 2019-03-13 07:36:34 +00:00
singleinflight.go Prevent timeout in TestConcurrentExchanges (#862) 2018-12-04 07:29:08 +00:00
smimea.go Simplify and unify various returns (#893) 2019-01-04 10:19:42 +00:00
svcb_test.go Implement SVCB (#1067) 2020-10-11 09:09:36 +02:00
svcb.go Implement SVCB (#1067) 2020-10-11 09:09:36 +02:00
tlsa.go Simplify and unify various returns (#893) 2019-01-04 10:19:42 +00:00
tsig_test.go Add support for HMAC-SHA224 and HMAC-SHA384 TSIG algorithms (#1139) 2020-07-22 13:59:04 +09:30
tsig.go Add support for HMAC-SHA224 and HMAC-SHA384 TSIG algorithms (#1139) 2020-07-22 13:59:04 +09:30
types_generate.go Implement SVCB (#1067) 2020-10-11 09:09:36 +02:00
types_test.go Be consistent about domain name label character escaping (#1122) 2020-07-06 10:07:56 +02:00
types.go Implement SVCB (#1067) 2020-10-11 09:09:36 +02:00
udp_test.go Rollback PR #738 because it breaks compatibility with Windows (#765) 2018-09-29 10:25:59 +01:00
udp_windows.go Simplify and unify various returns (#893) 2019-01-04 10:19:42 +00:00
udp.go Rollback PR #738 because it breaks compatibility with Windows (#765) 2018-09-29 10:25:59 +01:00
update_test.go ClassANY: don't convert CLASS255 to ANY (#618) 2018-01-07 17:57:04 +00:00
update.go Avoid calling RR.Header more than once per RR (#891) 2019-01-04 08:12:32 +00:00
version_test.go Doc updates (#1075) 2020-02-14 22:47:21 +01:00
version.go Release 1.1.31 2020-08-01 06:57:59 +02:00
xfr_test.go simplify loop (#1023) 2019-10-05 14:24:46 +01:00
xfr.go doc: fix xfr example. (#1062) 2019-12-19 13:11:22 +00:00
zduplicate.go Implement SVCB (#1067) 2020-10-11 09:09:36 +02:00
zmsg.go Implement SVCB (#1067) 2020-10-11 09:09:36 +02:00
ztypes.go Implement SVCB (#1067) 2020-10-11 09:09:36 +02:00

Build Status Code Coverage Go Report Card

Alternative (more granular) approach to a DNS library

Less is more.

Complete and usable DNS library. All Resource Records are supported, including the DNSSEC types. It follows a lean and mean philosophy. If there is stuff you should know as a DNS programmer there isn't a convenience function for it. Server side and client side programming is supported, i.e. you can build servers and resolvers with it.

We try to keep the "master" branch as sane as possible and at the bleeding edge of standards, avoiding breaking changes wherever reasonable. We support the last two versions of Go.

Goals

  • KISS;
  • Fast;
  • Small API. If it's easy to code in Go, don't make a function for it.

Users

A not-so-up-to-date-list-that-may-be-actually-current:

Send pull request if you want to be listed here.

Features

  • UDP/TCP queries, IPv4 and IPv6
  • RFC 1035 zone file parsing ($INCLUDE, $ORIGIN, $TTL and $GENERATE (for all record types) are supported
  • Fast
  • Server side programming (mimicking the net/http package)
  • Client side programming
  • DNSSEC: signing, validating and key generation for DSA, RSA, ECDSA and Ed25519
  • EDNS0, NSID, Cookies
  • AXFR/IXFR
  • TSIG, SIG(0)
  • DNS over TLS (DoT): encrypted connection between client and server over TCP
  • DNS name compression

Have fun!

Miek Gieben - 2010-2012 - miek@miek.nl DNS Authors 2012-

Building

This library uses Go modules and uses semantic versioning. Building is done with the go tool, so the following should work:

go get github.com/miekg/dns
go build github.com/miekg/dns

Examples

A short "how to use the API" is at the beginning of doc.go (this also will show when you call godoc github.com/miekg/dns).

Example programs can be found in the github.com/miekg/exdns repository.

Supported RFCs

all of them

  • 103{4,5} - DNS standard
  • 1348 - NSAP record (removed the record)
  • 1982 - Serial Arithmetic
  • 1876 - LOC record
  • 1995 - IXFR
  • 1996 - DNS notify
  • 2136 - DNS Update (dynamic updates)
  • 2181 - RRset definition - there is no RRset type though, just []RR
  • 2537 - RSAMD5 DNS keys
  • 2065 - DNSSEC (updated in later RFCs)
  • 2671 - EDNS record
  • 2782 - SRV record
  • 2845 - TSIG record
  • 2915 - NAPTR record
  • 2929 - DNS IANA Considerations
  • 3110 - RSASHA1 DNS keys
  • 3123 - APL record
  • 3225 - DO bit (DNSSEC OK)
  • 340{1,2,3} - NAPTR record
  • 3445 - Limiting the scope of (DNS)KEY
  • 3597 - Unknown RRs
  • 403{3,4,5} - DNSSEC + validation functions
  • 4255 - SSHFP record
  • 4343 - Case insensitivity
  • 4408 - SPF record
  • 4509 - SHA256 Hash in DS
  • 4592 - Wildcards in the DNS
  • 4635 - HMAC SHA TSIG
  • 4701 - DHCID
  • 4892 - id.server
  • 5001 - NSID
  • 5155 - NSEC3 record
  • 5205 - HIP record
  • 5702 - SHA2 in the DNS
  • 5936 - AXFR
  • 5966 - TCP implementation recommendations
  • 6605 - ECDSA
  • 6725 - IANA Registry Update
  • 6742 - ILNP DNS
  • 6840 - Clarifications and Implementation Notes for DNS Security
  • 6844 - CAA record
  • 6891 - EDNS0 update
  • 6895 - DNS IANA considerations
  • 6944 - DNSSEC DNSKEY Algorithm Status
  • 6975 - Algorithm Understanding in DNSSEC
  • 7043 - EUI48/EUI64 records
  • 7314 - DNS (EDNS) EXPIRE Option
  • 7477 - CSYNC RR
  • 7828 - edns-tcp-keepalive EDNS0 Option
  • 7553 - URI record
  • 7858 - DNS over TLS: Initiation and Performance Considerations
  • 7871 - EDNS0 Client Subnet
  • 7873 - Domain Name System (DNS) Cookies
  • 8080 - EdDSA for DNSSEC
  • 8499 - DNS Terminology

Loosely Based Upon