From c82d9fdcbdf82869b286e52bcae5dc5b487f6066 Mon Sep 17 00:00:00 2001
From: Daniel Salzman <daniel.salzman@nic.cz>
Date: Fri, 18 Jun 2021 15:47:50 +0200
Subject: [PATCH] tests/libzscanner: extend tests for SVCB and HTTPS

---
 tests/libzscanner/data/57_SVCB.in   | 116 +++++++++---
 tests/libzscanner/data/57_SVCB.out  | 270 ++++++++++++++++++++++++++--
 tests/libzscanner/data/58_HTTPS.in  |  16 +-
 tests/libzscanner/data/58_HTTPS.out |  42 ++++-
 4 files changed, 409 insertions(+), 35 deletions(-)

diff --git a/tests/libzscanner/data/57_SVCB.in b/tests/libzscanner/data/57_SVCB.in
index 5e21defcd8..c4ce534e0d 100644
--- a/tests/libzscanner/data/57_SVCB.in
+++ b/tests/libzscanner/data/57_SVCB.in
@@ -2,25 +2,101 @@ $ORIGIN	.
 $TTL	1
 
 ; OK
-@	SVCB	1	.
-@	TYPE64	2	@
-@	SVCB	3	x.	key1026=foo
-@	TYPE64	4	.	key1026="foo bar" key1027=baz
-@	SVCB	5	.	mandatory=key1,port alpn="h1,h2\,h3" port=1029
-@	TYPE64	6	.	(
-                                mandatory="ipv4hint"
-                                alpn="h\010h"
-                                ipv4hint=1.2.3.4,1.2.3.5
-                                ipv6hint=1::2
-                                )
-@	SVCB	7	.	alpn=h1,h2\044h3 echconfig="YWhvag=="
+@	SVCB	0	.
+@	SVCB	0	@	; Comment
+@	SVCB	65535	.	mandatory=alpn alpn=h2
+@	SVCB	1	.	mandatory="alpn" alpn=h2
+@	SVCB	1	.	alpn=h2
+@	SVCB	1	.	alpn="abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNabcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNabcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNabcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNabcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMN1234\053"    ; Text string of maximal length (255 chars)
+@	SVCB	1	.	alpn="part1,part2,part3\\,part4\\\\"
+@	SVCB	1	.	alpn=part1\,\p\a\r\t2\044part3\092,part4\092\\
+@	SVCB	1	.	no-default-alpn
+@	SVCB	1	.	port=0
+@	SVCB	1	.	port="65535"
+@	SVCB	1	.	ipv4hint=0.0.0.0
+@	SVCB	1	.	ipv4hint="255.255.255.255"
+@	SVCB	1	.	ech=AA==
+@	SVCB	1	.	ech="Zm9vYg=="
+@	SVCB	1	.	ipv6hint=::1
+@	SVCB	1	.	ipv6hint="::1"
+@	SVCB	1	.	key7
+@	SVCB	1	.	key65535
+@	SVCB	1	.	key65535=a
+@	SVCB	1	.	key65535="a"
+@	SVCB	1	.	key65535="a" key1000=b port=4 key7 mandatory=key7,port
+@	TYPE64	\# 3 000000
+@	TYPE64	0	.
+@	svcb	0	.
+
+; RFC OK examples
+example.com.	HTTPS	0 foo.example.com.
+example.com.	SVCB	1 .
+example.com.	SVCB	16 foo.example.com. port=53
+example.com.	SVCB	1 foo.example.com. key667=hello
+example.com.	SVCB	1 foo.example.com. key667="hello\210qoo"
+example.com.	SVCB	1 foo.example.com. (
+                        ipv6hint="2001:db8::1,2001:db8::53:1"
+                        )
+example.com.	SVCB	1 example.com. ipv6hint="::ffff:198.51.100.100"
+example.com.	SVCB	16 foo.example.org. (
+                        alpn=h2,h3-19 mandatory=ipv4hint,alpn
+                        ipv4hint=192.0.2.1
+                        )
+example.com.	SVCB	16 foo.example.org. alpn="f\\\\oo\\,bar,h2"
+example.com.	SVCB	16 foo.example.org. alpn=f\\\092oo\092,bar,h2
 
 ; KO
-@	SVCB	70000	.
-@	SVCB	8	abcdef012345678901234567890123456789012345678901234567890123456789.
-@	SVCB	9	.	key70000=foo
-@	SVCB	10	.	nonextype=bar
-@	SVCB	11	.	mandatory=alpn,nonextype
-@	SVCB	12	.	port=70000
-@	SVCB	13	.	ipv4hint=1.2.3.400
-@	SVCB	14	.	ipv6hint=1::2,foo
+@	SVCB
+@	SVCB						; Empty rdata
+@	SVCB	\# 0					; Hex empty rdata
+@	SVCB	65536	.				; Priority overflow
+@	SVCB	0					; Missing item
+@	SVCB	1	.	bogus			; Unknown parameter
+@	SVCB	1	.	PORT=0			; Capital letter in parameter name
+@	SVCB	1	.	mandatory
+@	SVCB	1	.	mandatory=
+@	SVCB	1	.	mandatory=a,
+@	SVCB	1	.	mandatory=a,,b
+@	SVCB	1	.	mandatory=mandatory
+@	SVCB	1	.	mandatory=bogus
+@	SVCB	1	.	alpn
+@	SVCB	1	.	alpn=
+@	SVCB	1	.	alpn=a,
+@	SVCB	1	.	alpn=a,,b
+@	SVCB	1	.	alpn="abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNabcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNabcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNabcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNabcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMN1234\0536"    ; Text string overflow (256 chars)
+@	SVCB	1	.	no-default-alpn=
+@	SVCB	1	.	no-default-alpn=h1
+@	SVCB	1	.	no-default-alpn="h1"
+@	SVCB	1	.	port
+@	SVCB	1	.	port=
+@	SVCB	1	.	port=65536
+@	SVCB	1	.	port=1,2
+@	SVCB	1	.	ipv4hint
+@	SVCB	1	.	ipv4hint=
+@	SVCB	1	.	ipv4hint=1.2.3
+@	SVCB	1	.	ipv4hint=1.2.3.4,
+@	SVCB	1	.	ipv4hint=1.2.3.4,,2.3.4.5
+@	SVCB	1	.	ech
+@	SVCB	1	.	ech=
+@	SVCB	1	.	ech=AA==,AA==
+@	SVCB	1	.	ech=W
+@	SVCB	1	.	ipv6hint
+@	SVCB	1	.	ipv6hint=
+@	SVCB	1	.	ipv6hint=::1,,::2
+@	SVCB	1	.	ipv6hint=::W
+
+; RFC KO examples
+example.com.	SVCB	1 foo.example.com. (
+                        key123=abc key123=def
+                        )
+example.com.	SVCB	1 foo.example.com. mandatory
+example.com.	SVCB	1 foo.example.com. alpn
+example.com.	SVCB	1 foo.example.com. port
+example.com.	SVCB	1 foo.example.com. ipv4hint
+example.com.	SVCB	1 foo.example.com. ipv6hint
+example.com.	SVCB	1 foo.example.com. no-default-alpn=abc
+example.com.	SVCB	1 foo.example.com. mandatory=key123
+example.com.	SVCB	1 foo.example.com. mandatory=mandatory
+example.com.	SVCB	1 foo.example.com. (
+                        mandatory=key123,key123 key123=abc
+                        )
diff --git a/tests/libzscanner/data/57_SVCB.out b/tests/libzscanner/data/57_SVCB.out
index ffae942500..a799eb7cb6 100644
--- a/tests/libzscanner/data/57_SVCB.out
+++ b/tests/libzscanner/data/57_SVCB.out
@@ -2,57 +2,305 @@ OWNER=00
 CLASS=0001
 RRTTL=00000001
 RTYPE=0040
-RDATA=000100
+RDATA=000000
 ------
 OWNER=00
 CLASS=0001
 RRTTL=00000001
 RTYPE=0040
-RDATA=000200
+RDATA=000000
 ------
 OWNER=00
 CLASS=0001
 RRTTL=00000001
 RTYPE=0040
-RDATA=000301780004020003666F6F
+RDATA=FFFF0000000002000100010003026832
 ------
 OWNER=00
 CLASS=0001
 RRTTL=00000001
 RTYPE=0040
-RDATA=00040004020007666F6F206261720403000362617A
+RDATA=00010000000002000100010003026832
 ------
 OWNER=00
 CLASS=0001
 RRTTL=00000001
 RTYPE=0040
-RDATA=0005000000000400010003000100090268310568322C6833000300020405
+RDATA=00010000010003026832
 ------
 OWNER=00
 CLASS=0001
 RRTTL=00000001
 RTYPE=0040
-RDATA=0006000000000200040001000403680A680004000801020304010203050006001000010000000000000000000000000002
+RDATA=00010000010100FF6162636465666768696A6B6C6D6E6F707172737475767778797A313233343536373839304142434445464748494A4B4C4D4E6162636465666768696A6B6C6D6E6F707172737475767778797A313233343536373839304142434445464748494A4B4C4D4E6162636465666768696A6B6C6D6E6F707172737475767778797A313233343536373839304142434445464748494A4B4C4D4E6162636465666768696A6B6C6D6E6F707172737475767778797A313233343536373839304142434445464748494A4B4C4D4E6162636465666768696A6B6C6D6E6F707172737475767778797A313233343536373839304142434445464748494A4B4C4D4E3132333435
 ------
 OWNER=00
 CLASS=0001
 RRTTL=00000001
 RTYPE=0040
-RDATA=000700000100090268310568322C68330005000461686F6A
+RDATA=000100000100190570617274310570617274320C70617274332C70617274345C
 ------
-WARNG=ZS_NUMBER16_OVERFLOW
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=000100000100190570617274310570617274320C70617274332C70617274345C
 ------
-WARNG=ZS_LABEL_OVERFLOW
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=00010000020000
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=000100000300020000
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=00010000030002FFFF
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=0001000004000400000000
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=00010000040004FFFFFFFF
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=0001000005000100
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=00010000050004666F6F62
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=0001000006001000000000000000000000000000000001
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=0001000006001000000000000000000000000000000001
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=00010000070000
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=000100FFFF0000
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=000100FFFF000161
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=000100FFFF000161
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=00010000000004000300070003000200040007000003E8000162FFFF000161
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=000000
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=000000
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=000000
+------
+OWNER=076578616D706C6503636F6D00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0041
+RDATA=000003666F6F076578616D706C6503636F6D00
+------
+OWNER=076578616D706C6503636F6D00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=000100
+------
+OWNER=076578616D706C6503636F6D00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=001003666F6F076578616D706C6503636F6D00000300020035
+------
+OWNER=076578616D706C6503636F6D00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=000103666F6F076578616D706C6503636F6D00029B000568656C6C6F
+------
+OWNER=076578616D706C6503636F6D00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=000103666F6F076578616D706C6503636F6D00029B000968656C6C6FD2716F6F
+------
+OWNER=076578616D706C6503636F6D00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=000103666F6F076578616D706C6503636F6D000006002020010DB800000000000000000000000120010DB8000000000000000000530001
+------
+OWNER=076578616D706C6503636F6D00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=0001076578616D706C6503636F6D000006001000000000000000000000FFFFC6336464
+------
+OWNER=076578616D706C6503636F6D00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=001003666F6F076578616D706C65036F7267000000000400010004000100090268320568332D313900040004C0000201
+------
+OWNER=076578616D706C6503636F6D00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=001003666F6F076578616D706C65036F7267000001000C08665C6F6F2C626172026832
+------
+OWNER=076578616D706C6503636F6D00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0040
+RDATA=001003666F6F076578616D706C65036F7267000001000C08665C6F6F2C626172026832
+------
+WARNG=ZS_BAD_NUMBER
+------
+WARNG=ZS_BAD_NUMBER
+------
+WARNG=ZS_BAD_HEX_CHAR
 ------
 WARNG=ZS_NUMBER16_OVERFLOW
 ------
-WARNG=ZS_BAD_SVC_PARAM
+WARNG=ZS_BAD_RDATA
 ------
-WARNG=ZS_BAD_SVC_PARAM
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_MANDATORY
+------
+WARNG=ZS_BAD_SVCB_MANDATORY
+------
+WARNG=ZS_BAD_SVCB_MANDATORY
+------
+WARNG=ZS_BAD_SVCB_MANDATORY
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_EMPTY_LIST_ITEM
+------
+WARNG=ZS_EMPTY_LIST_ITEM
+------
+WARNG=ZS_ITEM_OVERFLOW
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_NUMBER
 ------
 WARNG=ZS_NUMBER16_OVERFLOW
 ------
+WARNG=ZS_BAD_NUMBER
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_ADDRESS_CHAR
+------
 WARNG=ZS_BAD_IPV4
 ------
 WARNG=ZS_BAD_ADDRESS_CHAR
 ------
+WARNG=ZS_BAD_ADDRESS_CHAR
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_ADDRESS_CHAR
+------
+WARNG=ZS_BAD_ADDRESS_CHAR
+------
+WARNG=ZS_BAD_ADDRESS_CHAR
+------
+WARNG=ZS_DUPLICATE_SVCB_KEY
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_BAD_SVCB_PARAM
+------
+WARNG=ZS_MISSING_SVCB_MANDATORY
+------
+WARNG=ZS_BAD_SVCB_MANDATORY
+------
+WARNG=ZS_DUPLICATE_SVCB_MANDATORY
+------
diff --git a/tests/libzscanner/data/58_HTTPS.in b/tests/libzscanner/data/58_HTTPS.in
index c1b6ddb531..674f86547a 100644
--- a/tests/libzscanner/data/58_HTTPS.in
+++ b/tests/libzscanner/data/58_HTTPS.in
@@ -1,9 +1,19 @@
 $ORIGIN	.
 $TTL	1
 
+; HTTPS is the same as SVCB, so there are the differences and basics only.
+
 ; OK
-@	HTTPS	1	.
+@	HTTPS	0	.
+@	HTTPS	65535	@	; Comment
+@       HTTPS	1	.       key65535="a" key1000=b port=4 key7 mandatory=key7,port
+@       TYPE65	\# 3 000000
+@       TYPE65	0	.
+@       https	0	.
 
 ; KO
-;@	SMIMEA
-
+@	HTTPS
+@	HTTPS						; Empty rdata
+@	HTTPS	\# 0					; Hex empty rdata
+@	HTTPS	65536	.				; Priority overflow
+@	HTTPS	0					; Missing item
diff --git a/tests/libzscanner/data/58_HTTPS.out b/tests/libzscanner/data/58_HTTPS.out
index 52141539dd..8ec9a35181 100644
--- a/tests/libzscanner/data/58_HTTPS.out
+++ b/tests/libzscanner/data/58_HTTPS.out
@@ -2,5 +2,45 @@ OWNER=00
 CLASS=0001
 RRTTL=00000001
 RTYPE=0041
-RDATA=000100
+RDATA=000000
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0041
+RDATA=FFFF00
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0041
+RDATA=00010000000004000300070003000200040007000003E8000162FFFF000161
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0041
+RDATA=000000
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0041
+RDATA=000000
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0041
+RDATA=000000
+------
+WARNG=ZS_BAD_NUMBER
+------
+WARNG=ZS_BAD_NUMBER
+------
+WARNG=ZS_BAD_HEX_CHAR
+------
+WARNG=ZS_NUMBER16_OVERFLOW
+------
+WARNG=ZS_BAD_RDATA
 ------
-- 
GitLab