--- /dev/null
+crypto.cloudflare.com. 3600 IN SOA jobs.ns.cloudflare.com. dns.cloudflare.com. (
+ 2037099480 ; serial
+ 10000 ; refresh (2 hours 46 minutes 40 seconds)
+ 2400 ; retry (40 minutes)
+ 604800 ; expire (1 week)
+ 3600 ; minimum (1 hour)
+ )
+crypto.cloudflare.com. 300 IN HTTPS 1 . alpn=h2 ipv4hint=162.159.135.79,162.159.136.79 echconfig=AEj+CgBETwAgACDeVpr34JzYHDGNFoGWhksj5mpBxradonbqH3X9+h7jHgAEAAEAAQAAABNjbG91ZGZsYXJlLWVzbmkuY29tAAA= ipv6hint=2606:4700:7::a29f:874f,2606:4700:7::a29f:884f
+
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+
+@ SOA primary admin 1 3600 1800 7200 3600
+ NS primary
+primary A 127.0.0.1
+
+; This example has multiple instances of the same SvcParamKey
+
+f01 SVCB 1 foo.example.com. (
+ key123=abc key123=def
+ )
+; In the next examples the SvcParamKeys are missing their values.
+
+f02 SVCB 1 foo.example.com. mandatory
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f03 SVCB 1 foo.example.com. alpn
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f04 SVCB 1 foo.example.com. port
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f05 SVCB 1 foo.example.com. ipv4hint
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f06 SVCB 1 foo.example.com. ipv6hint
+
+; The "no-default-alpn" SvcParamKey value MUST be empty
+
+f07 SVCB 1 foo.example.com. no-default-alpn=abc
+
+; In this record a mandatory SvcParam is missing
+
+f08 SVCB 1 foo.example.com. mandatory=key123
+
+; The "mandatory" SvcParamKey MUST not be included in mandatory list
+
+f09 SVCB 1 foo.example.com. mandatory=mandatory
+
+; Here there are multiple instances of the same SvcParamKey in the mandatory list
+
+f10 SVCB 1 foo.example.com. (
+ mandatory=key123,key123 key123=abc
+ )
+
+; This example has multiple instances of the same SvcParamKey
+
+f11 HTTPS 1 foo.example.com. (
+ key123=abc key123=def
+ )
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f12 HTTPS 1 foo.example.com. mandatory
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f13 HTTPS 1 foo.example.com. alpn
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f14 HTTPS 1 foo.example.com. port
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f15 HTTPS 1 foo.example.com. ipv4hint
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f16 HTTPS 1 foo.example.com. ipv6hint
+
+; The "no-default-alpn" SvcParamKey value MUST be empty
+
+f17 HTTPS 1 foo.example.com. no-default-alpn=abc
+
+; In this record a mandatory SvcParam is missing
+
+f18 HTTPS 1 foo.example.com. mandatory=key123
+
+; The "mandatory" SvcParamKey MUST not be included in mandatory list
+
+f19 HTTPS 1 foo.example.com. mandatory=mandatory
+
+; Here there are multiple instances of the same SvcParamKey in the mandatory list
+
+f20 HTTPS 1 foo.example.com. (
+ mandatory=key123,key123 key123=abc
+ )
+
--- /dev/null
+BaseName: svcb
+Version: 1.0
+Description: Test SVCB and HTTPS parsing
+CreationDate: Fri May 25 12:51:22 UTC 2021
+Maintainer: Tom Carpay
+Category:
+Component:
+CmdDepends:
+Depends:
+Help:
+Pre:
+Post:
+Test: svcb.test
+AuxFiles:
+Passed:
+Failure:
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; This example has multiple instances of the same SvcParamKey
+
+f01 SVCB 1 foo.example.com. (
+ key123=abc key123=def
+ )
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f02 SVCB 1 foo.example.com. mandatory
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f03 SVCB 1 foo.example.com. alpn
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f04 SVCB 1 foo.example.com. port
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f05 SVCB 1 foo.example.com. ipv4hint
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f06 SVCB 1 foo.example.com. ipv6hint
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; The "no-default-alpn" SvcParamKey value MUST be empty
+
+f07 SVCB 1 foo.example.com. no-default-alpn=abc
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; In this record a mandatory SvcParam is missing
+
+f08 SVCB 1 foo.example.com. mandatory=key123
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; The "mandatory" SvcParamKey MUST not be included in mandatory list
+
+f09 SVCB 1 foo.example.com. mandatory=mandatory
+
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; Here there are multiple instances of the same SvcParamKey in the mandatory list
+
+f10 SVCB 1 foo.example.com. (
+ mandatory=key123,key123 key123=abc
+ )
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; This example has multiple instances of the same SvcParamKey
+
+f01 HTTPS 1 foo.example.com. (
+ key123=abc key123=def
+ )
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f02 HTTPS 1 foo.example.com. mandatory
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f03 HTTPS 1 foo.example.com. alpn
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f04 HTTPS 1 foo.example.com. port
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f05 HTTPS 1 foo.example.com. ipv4hint
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; In the next examples the SvcParamKeys are missing their values.
+
+f06 HTTPS 1 foo.example.com. ipv6hint
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; The "no-default-alpn" SvcParamKey value MUST be empty
+
+f07 HTTPS 1 foo.example.com. no-default-alpn=abc
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; In this record a mandatory SvcParam is missing
+
+f08 HTTPS 1 foo.example.com. mandatory=key123
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; The "mandatory" SvcParamKey MUST not be included in mandatory list
+
+f09 HTTPS 1 foo.example.com. mandatory=mandatory
+
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; Here there are multiple instances of the same SvcParamKey in the mandatory list
+
+f10 HTTPS 1 foo.example.com. (
+ mandatory=key123,key123 key123=abc
+ )
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; Here there are multiple instances of the same SvcParamKey in the mandatory list
+
+f21 HTTPS 1 foo.example.com. ech="123"
+f21 HTTPS 1 foo.example.com. echconfig="123"
--- /dev/null
+$ORIGIN failure-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+; Port mus be a positive number < 65536
+
+f22 HTTPS 1 foo.example.com. port=65536
--- /dev/null
+$ORIGIN success-cases.
+$TTL 3600
+
+@ SOA primary admin 0 0 0 0 0
+
+
+; A particular key does not need to have a value
+
+s01 SVCB 0 . key123
+
+
+; echconfig does not need to have a value
+
+s02 SVCB 0 . echconfig
+
+
+; When "no-default-alpn" is specified in an RR, "alpn" must also be specified
+; in order for the RR to be "self-consistent"
+
+s03 HTTPS 0 . alpn="h2,h3" no-default-alpn
+
+
+; SHOULD is not MUST (so allowed)
+; Zone-file implementations SHOULD enforce self-consistency
+
+s04 HTTPS 0 . no-default-alpn
+
+
+; SHOULD is not MUST (so allowed)
+; (port and no-default-alpn are automatically mandatory keys with HTTPS)
+; Other automatically mandatory keys SHOULD NOT appear in the list either.
+
+s05 HTTPS 0 . alpn="dot" no-default-alpn port=853 mandatory=port
+
+; Any valid base64 is okay for ech
+s06 HTTPS 0 . ech="aGVsbG93b3JsZCE="
+
+; echconfig is an alias for ech
+s07 HTTPS 0 . echconfig="aGVsbG93b3JsZCE="
+
--- /dev/null
+$ORIGIN .
+success-cases 3600 IN SOA primary.success-cases. admin.success-cases. (
+ 0 0 0 0 0 )
+$ORIGIN success-cases.
+s01 3600 IN SVCB 0 . key123
+s02 3600 IN SVCB 0 . ech
+s03 3600 IN HTTPS 0 . alpn="h2,h3" no-default-alpn
+s04 3600 IN HTTPS 0 . no-default-alpn
+s05 3600 IN HTTPS 0 . mandatory=port alpn="dot" no-default-alpn port=853
+s06 3600 IN HTTPS 0 . ech=aGVsbG93b3JsZCE=
+s07 3600 IN HTTPS 0 . ech=aGVsbG93b3JsZCE=
+; zone success-cases is ok
--- /dev/null
+# #-- svcb.test --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+
+# check and write the test vectors in their respective formats
+PRE=../..
+if ! $PRE/readzone svcb.test-vectors-pf.zone > svcb.test-vectors-pf.zone.out
+then
+ echo "Could not parse presentation format zone"
+ exit 1
+
+elif ! $PRE/readzone svcb.test-vectors-pf.zone.out > svcb.test-vectors-pf.zone.out.out
+then
+ echo "Could not parse output from presentation format zone"
+ exit 1
+
+elif ! $PRE/readzone svcb.test-vectors-wf.zone > svcb.test-vectors-wf.zone.out
+then
+ echo "Could not parse RFC3597 formatted zone"
+ exit 1
+
+elif ! $PRE/readzone svcb.test-vectors-wf.zone.out > svcb.test-vectors-wf.zone.out.out
+then
+ echo "Could not parse output from RFC3597 formatted zone"
+ exit 1
+else
+ echo "All test zones parsed successfully"
+fi
+
+
+# check the formatting of the written files
+if ! diff svcb.test-vectors-pf.zone.out svcb.test-vectors-pf.zone.out.out
+then
+ echo "Parsing inconsistency 1"
+ exit 1
+
+elif ! diff svcb.test-vectors-pf.zone.out svcb.test-vectors-wf.zone.out
+then
+ echo "Parsing inconsistency 2"
+ exit 1
+
+elif ! diff svcb.test-vectors-pf.zone.out svcb.test-vectors-wf.zone.out.out
+then
+ echo "Parsing inconsistency 3"
+ exit 1
+else
+ echo "Parsing of SVCB and HTTPS was consistent"
+fi
+
+
+# check all the failure cases
+if svcb.failure-cases-01
+then
+ echo "Failure case 1: Multiple instances of the same SvcParamKey"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-02
+then
+ echo "Failure case 2: a SvcParamKey is missing a value"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-03
+then
+ echo "Failure case 3: a SvcParamKey is missing a value"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-04
+then
+ echo "Failure case 4: a SvcParamKey is missing a value"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-05
+then
+ echo "Failure case 5: a SvcParamKey is missing a value"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-06
+then
+ echo "Failure case 6: a SvcParamKey is missing a value"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-07
+then
+ echo "Failure case 7: The \no-default-alpn\" SvcParamKey value MUST be empty
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-08
+then
+ echo "Failure case 8: a mandatory SvcParam is missing"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-09
+then
+ echo "Failure case 9: The \"mandatory\" SvcParamKey MUST not be included in mandatory list"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-10
+then
+ echo "Failure case 10: multiple instances of the same SvcParamKey in the mandatory list"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-11
+then
+ echo "Failure case 11: Multiple instances of the same SvcParamKey"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-12
+then
+ echo "Failure case 12: a SvcParamKey is missing a value"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-13
+then
+ echo "Failure case 13: a SvcParamKey is missing a value"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-14
+then
+ echo "Failure case 14: a SvcParamKey is missing a value"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-15
+then
+ echo "Failure case 15: a SvcParamKey is missing a value"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-16
+then
+ echo "Failure case 16: a SvcParamKey is missing a value"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-17
+then
+ echo "Failure case 17: The \no-default-alpn\" SvcParamKey value MUST be empty
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-18
+then
+ echo "Failure case 18: a mandatory SvcParam is missing"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-19
+then
+ echo "Failure case 19: The \"mandatory\" SvcParamKey MUST not be included in mandatory list"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-20
+then
+ echo "Failure case 20: multiple instances of the same SvcParamKey in the mandatory list"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-21
+then
+ echo "Failure case 21: ech value is not base64 encoded"
+ echo "Incorrectly succeeded"
+ exit 1
+
+elif $PRE/readzone svcb.failure-cases-22
+then
+ echo "Failure case 22: port value needs to be a positive integer < 65536"
+ echo "Incorrectly succeeded"
+ exit 1
+else
+ echo "All failure cases test successfully"
+fi
+
+
+# check all the succes and write them
+if ! $PRE/nsd-checkzone -p success-cases svcb.success-cases.zone > svcb.success-cases.zone.out
+then
+ echo "Some particular success cases did not succeed to parse"
+ exit 1
+
+elif ! diff svcb.success-cases.zone.out svcb.success-cases.zone.cmp
+then
+ echo "Some success cases could not be printed"
+ exit 1
+else
+ echo "All particular success cases parsed and printed successfully"
+fi
+
+
+rem $PRE/nsd-control -c svcb.secondary.conf write
+rem while [ ! -f test-vectors-secondary.zone ]
+rem do
+rem sleep 1
+rem done
+rem while ! grep '^v20' test-vectors-secondary.zone
+rem do
+rem sleep 1
+rem done
+rem grep -v '^;' svcb.test-vectors-pf.zone.out > svcb.test-vectors-pf.zone.out2
+rem grep -v '^;' test-vectors-secondary.zone > test-vectors-secondary.zone.out
+rem if ! diff svcb.test-vectors-pf.zone.out2 test-vectors-secondary.zone.out
+rem then
+rem echo "Output from secondary did not match output from primary"
+rem exit 1
+rem else
+rem echo "Output from secondary did match output from primary"
+rem fi
+
+rem dig @127.0.0.1 -p $TPKG_SEC_PORT f01.failure-cases. TYPE64 > f01.failure-cases.out
+rem if grep 'status: NOERROR' f01.failure-cases.out
+rem then
+rem echo "Failure case 1: Multiple instances of the same SvcParamKey"
+rem echo "allowed for secondary"
+rem else
+rem echo "Could not load failure-cases zone in secondary"
+rem exit 1
+rem fi
+
--- /dev/null
+$ORIGIN test-vectors.
+$TTL 3600
+
+@ SOA primary admin 1 3600 1800 7200 3600
+
+ NS primary
+primary A 127.0.0.1
+; D.1. AliasForm
+
+v01 SVCB 0 foo.example.com.
+
+; D.2. ServiceForm
+; The first form is the simple "use the ownername".
+
+v02 SVCB 1 .
+
+; This vector only has a port.
+
+v03 SVCB 16 foo.example.com. port=53
+
+; This example has a key that is not registered, its value is unquoted.
+
+v04 SVCB 1 foo.example.com. key667=hello
+
+; This example has a key that is not registered, its value is quoted and
+; contains a decimal-escaped character.
+
+v05 SVCB 1 foo.example.com. key667="hello\210qoo"
+
+; Here, two IPv6 hints are quoted in the presentation format.
+
+v06 SVCB 1 foo.example.com. ipv6hint="2001:db8::1,2001:db8::53:1"
+
+; This example shows a single IPv6 hint in IPv4 mapped IPv6 presentation format.
+
+v07 SVCB 1 example.com. ipv6hint="2001:db8:ffff:ffff:ffff:ffff:198.51.100.100"
+
+; In the next vector, neither the SvcParamValues nor the mandatory keys are
+; sorted in presentation format, but are correctly sorted in the wire-format.
+
+v08 SVCB 16 foo.example.org. (alpn=h2,h3-19 mandatory=ipv4hint,alpn
+ ipv4hint=192.0.2.1)
+
+; This last (two) vectors has an alpn value with an escaped comma and an
+; escaped backslash in two presentation formats.
+
+v09 SVCB 16 foo.example.org. alpn="f\\\\oo\\,bar,h2"
+v10 SVCB 16 foo.example.org. alpn=f\\\092oo\092,bar,h2
+
+
+; D.1. AliasForm
+
+v11 HTTPS 0 foo.example.com.
+
+; D.2. ServiceForm
+; The first form is the simple "use the ownername".
+
+v12 HTTPS 1 .
+
+; This vector only has a port.
+
+v13 HTTPS 16 foo.example.com. port=53
+
+; This example has a key that is not registered, its value is unquoted.
+
+v14 HTTPS 1 foo.example.com. key667=hello
+
+; This example has a key that is not registered, its value is quoted and
+; contains a decimal-escaped character.
+
+v15 HTTPS 1 foo.example.com. key667="hello\210qoo"
+
+; Here, two IPv6 hints are quoted in the presentation format.
+
+v16 HTTPS 1 foo.example.com. ipv6hint="2001:db8::1,2001:db8::53:1"
+
+; This example shows a single IPv6 hint in IPv4 mapped IPv6 presentation format.
+
+v17 HTTPS 1 example.com. ipv6hint="2001:db8:ffff:ffff:ffff:ffff:198.51.100.100"
+
+; In the next vector, neither the SvcParamValues nor the mandatory keys are
+; sorted in presentation format, but are correctly sorted in the wire-format.
+
+v18 HTTPS 16 foo.example.org. (alpn=h2,h3-19 mandatory=ipv4hint,alpn
+ ipv4hint=192.0.2.1)
+
+; This last (two) vectors has an alpn value with an escaped comma and an
+; escaped backslash in two presentation formats.
+
+v19 HTTPS 16 foo.example.org. alpn="f\\\\oo\\,bar,h2"
+v20 HTTPS 16 foo.example.org. alpn=f\\\092oo\092,bar,h2
+
--- /dev/null
+$ORIGIN test-vectors.
+$TTL 3600
+
+@ SOA primary admin 1 3600 1800 7200 3600
+
+ NS primary
+primary A 127.0.0.1
+
+; D.1. AliasForm
+
+v01 SVCB \# 19 (
+00 00 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target
+)
+
+; D.2. ServiceForm
+; The first form is the simple "use the ownername".
+
+v02 SVCB \# 3 (
+00 01 ; priority
+00 ; target (root label)
+)
+
+; This vector only has a port.
+
+v03 SVCB \# 25 (
+00 10 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target
+00 03 ; key 3
+00 02 ; length 2
+00 35 ; value
+)
+
+; This example has a key that is not registered, its value is unquoted.
+
+v04 SVCB \# 28 (
+00 01 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target
+02 9b ; key 667
+00 05 ; length 5
+68 65 6c 6c 6f ; value
+)
+
+; This example has a key that is not registered, its value is quoted and
+; contains a decimal-escaped character.
+
+v05 SVCB \# 32 (
+00 01 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target
+02 9b ; key 667
+00 09 ; length 9
+68 65 6c 6c 6f d2 71 6f 6f ; value
+)
+
+; Here, two IPv6 hints are quoted in the presentation format.
+
+v06 SVCB \# 55 (
+00 01 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target
+00 06 ; key 6
+00 20 ; length 32
+20 01 0d b8 00 00 00 00 00 00 00 00 00 00 00 01 ; first address
+20 01 0d b8 00 00 00 00 00 00 00 00 00 53 00 01 ; second address
+)
+
+; This example shows a single IPv6 hint in IPv4 mapped IPv6 presentation format.
+
+v07 SVCB \# 35 (
+00 01 ; priority
+07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target
+00 06 ; key 6
+00 10 ; length 16
+20 01 0d b8 ff ff ff ff ff ff ff ff c6 33 64 64 ; address
+)
+
+; In the next vector, neither the SvcParamValues nor the mandatory keys are
+; sorted in presentation format, but are correctly sorted in the wire-format.
+
+v08 SVCB \# 48 (
+00 10 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 ; target
+00 00 ; key 0
+00 04 ; param length 4
+00 01 ; value: key 1
+00 04 ; value: key 4
+00 01 ; key 1
+00 09 ; param length 9
+02 ; alpn length 2
+68 32 ; alpn value
+05 ; alpn length 5
+68 33 2d 31 39 ; alpn value
+00 04 ; key 4
+00 04 ; param length 4
+c0 00 02 01 ; param value
+)
+
+; This last (two) vectors has an alpn value with an escaped comma and an
+; escaped backslash in two presentation formats.
+
+v09 SVCB \# 35 (
+00 10 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 ; target
+00 01 ; key 1
+00 0c ; param length 12
+08 ; alpn length 8
+66 5c 6f 6f 2c 62 61 72 ; alpn value
+02 ; alpn length 2
+68 32 ; alpn value
+)
+v10 SVCB \# 35 (
+00 10 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 ; target
+00 01 ; key 1
+00 0c ; param length 12
+08 ; alpn length 8
+66 5c 6f 6f 2c 62 61 72 ; alpn value
+02 ; alpn length 2
+68 32 ; alpn value
+)
+
+; D.1. AliasForm
+
+v11 HTTPS \# 19 (
+00 00 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target
+)
+
+; D.2. ServiceForm
+; The first form is the simple "use the ownername".
+
+v12 HTTPS \# 3 (
+00 01 ; priority
+00 ; target (root label)
+)
+
+; This vector only has a port.
+
+v13 HTTPS \# 25 (
+00 10 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target
+00 03 ; key 3
+00 02 ; length 2
+00 35 ; value
+)
+
+; This example has a key that is not registered, its value is unquoted.
+
+v14 HTTPS \# 28 (
+00 01 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target
+02 9b ; key 667
+00 05 ; length 5
+68 65 6c 6c 6f ; value
+)
+
+; This example has a key that is not registered, its value is quoted and
+; contains a decimal-escaped character.
+
+v15 HTTPS \# 32 (
+00 01 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target
+02 9b ; key 667
+00 09 ; length 9
+68 65 6c 6c 6f d2 71 6f 6f ; value
+)
+
+; Here, two IPv6 hints are quoted in the presentation format.
+
+v16 HTTPS \# 55 (
+00 01 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target
+00 06 ; key 6
+00 20 ; length 32
+20 01 0d b8 00 00 00 00 00 00 00 00 00 00 00 01 ; first address
+20 01 0d b8 00 00 00 00 00 00 00 00 00 53 00 01 ; second address
+)
+
+; This example shows a single IPv6 hint in IPv4 mapped IPv6 presentation format.
+
+v17 HTTPS \# 35 (
+00 01 ; priority
+07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target
+00 06 ; key 6
+00 10 ; length 16
+20 01 0d b8 ff ff ff ff ff ff ff ff c6 33 64 64 ; address
+)
+
+; In the next vector, neither the SvcParamValues nor the mandatory keys are
+; sorted in presentation format, but are correctly sorted in the wire-format.
+
+v18 HTTPS \# 48 (
+00 10 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 ; target
+00 00 ; key 0
+00 04 ; param length 4
+00 01 ; value: key 1
+00 04 ; value: key 4
+00 01 ; key 1
+00 09 ; param length 9
+02 ; alpn length 2
+68 32 ; alpn value
+05 ; alpn length 5
+68 33 2d 31 39 ; alpn value
+00 04 ; key 4
+00 04 ; param length 4
+c0 00 02 01 ; param value
+)
+
+; This last (two) vectors has an alpn value with an escaped comma and an
+; escaped backslash in two presentation formats.
+
+v19 HTTPS \# 35 (
+00 10 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 ; target
+00 01 ; key 1
+00 0c ; param length 12
+08 ; alpn length 8
+66 5c 6f 6f 2c 62 61 72 ; alpn value
+02 ; alpn length 2
+68 32 ; alpn value
+)
+v20 HTTPS \# 35 (
+00 10 ; priority
+03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 ; target
+00 01 ; key 1
+00 0c ; param length 12
+08 ; alpn length 8
+66 5c 6f 6f 2c 62 61 72 ; alpn value
+02 ; alpn length 2
+68 32 ; alpn value
+)
+