2522 lines
142 KiB
OCaml
2522 lines
142 KiB
OCaml
|
|
(* (c) 2017 Hannes Mehnert, all rights reserved *)
|
||
|
|
open Dns
|
||
|
|
open Packet
|
||
|
|
|
||
|
|
let n_of_s = Domain_name.of_string_exn
|
||
|
|
|
||
|
|
let p_cs = Alcotest.testable (Ohex.pp_hexdump ()) String.equal
|
||
|
|
|
||
|
|
let p_err =
|
||
|
|
let module M = struct
|
||
|
|
type t = err
|
||
|
|
let pp = pp_err
|
||
|
|
let equal a b = match a, b with
|
||
|
|
| `Not_implemented _, `Not_implemented _
|
||
|
|
| `Malformed _, `Malformed _
|
||
|
|
| `Partial, `Partial
|
||
|
|
| `Bad_edns_version _, `Bad_edns_version _ -> true
|
||
|
|
| `Leftover (off, _), `Leftover (off', _) -> off = off'
|
||
|
|
| _ -> false
|
||
|
|
end in
|
||
|
|
(module M: Alcotest.TESTABLE with type t = M.t)
|
||
|
|
|
||
|
|
module Packet = struct
|
||
|
|
let t_ok =
|
||
|
|
let module M = Packet in
|
||
|
|
(module Packet: Alcotest.TESTABLE with type t = M.t)
|
||
|
|
|
||
|
|
let bad_query () =
|
||
|
|
let cs = Ohex.decode "0000 0000 0001 0000 0000 0000 0000 0100 02" in
|
||
|
|
Alcotest.(check (result t_ok p_err) "query with bad class"
|
||
|
|
(Error (`Not_implemented (0, "BadClass 2")))
|
||
|
|
(decode cs)) ;
|
||
|
|
let cs = Ohex.decode "0000 0100 0001 0000 0000 0000 0000 0100 03" in
|
||
|
|
Alcotest.(check (result t_ok p_err) "query with unsupported class"
|
||
|
|
(Error (`Not_implemented (0, "UnsupportedClass 0")))
|
||
|
|
(decode cs)) ;
|
||
|
|
let cs = Ohex.decode "0000 0100 0001 0000 0000 0000 0000 0000 01" in
|
||
|
|
let header = (0, Flags.singleton `Recursion_desired) in
|
||
|
|
let res =
|
||
|
|
let i = match Rr_map.I.of_int 0 with
|
||
|
|
| Error _ -> Alcotest.fail "expected ok"
|
||
|
|
| Ok i -> i
|
||
|
|
in
|
||
|
|
let question = Question.create Domain_name.root (Unknown i)
|
||
|
|
and data = `Query
|
||
|
|
in
|
||
|
|
Packet.create header question data
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "question with unsupported typ"
|
||
|
|
(Ok res) (decode cs)) ;
|
||
|
|
let cs = Ohex.decode "0000 0100 0001 0000 0000 0000 0000 2100 01" in
|
||
|
|
let r =
|
||
|
|
let question = Question.create Domain_name.root Srv in
|
||
|
|
Packet.create header question `Query
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "question with SRV ()"
|
||
|
|
(Ok r) (decode cs)) ;
|
||
|
|
let cs = Ohex.decode "0000 0100 0001 0000 0000 0000 0102 0000 0200 01" in
|
||
|
|
let r =
|
||
|
|
let name = Domain_name.of_string_exn "\002." in
|
||
|
|
let question = Question.create name Ns in
|
||
|
|
Packet.create header question `Query
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "question with name that is not a hostname"
|
||
|
|
(Ok r) (decode cs))
|
||
|
|
|
||
|
|
let regression0 () =
|
||
|
|
let data = Ohex.decode
|
||
|
|
{___|d4 e4 85 83 00 01 00 00 00 01 00 00 01 36 02 31
|
||
|
|
36 03 31 35 30 03 31 33 38 07 69 6e 2d 61 64 64
|
||
|
|
72 04 61 72 70 61 00 00 0c 00 01 03 31 35 30 03
|
||
|
|
31 33 38 07 49 4e 2d 41 44 44 52 04 41 52 50 41
|
||
|
|
00 00 06 00 01 00 00 2a 30 00 3f 05 43 4f 4e 31
|
||
|
|
52 04 4e 49 50 52 03 4d 49 4c 00 13 44 41 4e 49
|
||
|
|
45 4c 2e 57 2e 4b 4e 4f 50 50 53 2e 43 49 56 04
|
||
|
|
4d 41 49 4c c0 56 78 39 c3 d1 00 00 2a 30 00 00
|
||
|
|
03 84 00 12 75 00 00 00 2a 30|___}
|
||
|
|
in
|
||
|
|
let flags = Flags.(add `Authoritative (add `Recursion_desired (singleton `Recursion_available)))
|
||
|
|
and content =
|
||
|
|
let soa = {
|
||
|
|
Soa.nameserver = n_of_s "CON1R.NIPR.MIL" ;
|
||
|
|
hostmaster =
|
||
|
|
Domain_name.of_strings_exn ["DANIEL.W.KNOPPS.CIV" ; "MAIL" ; "MIL" ] ;
|
||
|
|
serial = 0x7839c3d1l ; refresh = 0x2a30l ; retry = 0x384l ;
|
||
|
|
expiry = 0x127500l ; minimum = 0x2a30l
|
||
|
|
} in
|
||
|
|
Domain_name.Map.empty,
|
||
|
|
Name_rr_map.singleton (n_of_s "150.138.in-addr.arpa") Soa soa
|
||
|
|
in
|
||
|
|
let res =
|
||
|
|
create (0xD4E4, flags)
|
||
|
|
(Question.create (n_of_s "6.16.150.138.in-addr.arpa") Ptr)
|
||
|
|
(`Rcode_error (Rcode.NXDomain, Opcode.Query, Some content))
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 0 decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let regression1 () =
|
||
|
|
let data = Ohex.decode
|
||
|
|
{___|83 d9 01 00 00 01 00 00 00 00 00 00 04 6b 65 79
|
||
|
|
73 06 72 69 73 65 75 70 03 6e 65 74 00 00 1c 00
|
||
|
|
01|___}
|
||
|
|
in
|
||
|
|
let flags = Flags.singleton `Recursion_desired in
|
||
|
|
let res =
|
||
|
|
create (0x83D9, flags)
|
||
|
|
(Question.create (n_of_s "keys.riseup.net") Aaaa) `Query
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 1 decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let regression2 () =
|
||
|
|
let data = Ohex.decode
|
||
|
|
{___|ae 00 84 03 00 01 00 00 00 01 00 00 04 6e 65 77
|
||
|
|
73 03 62 62 63 03 6e 65 74 02 75 6b 00 00 02 00
|
||
|
|
01 03 62 62 63 03 6e 65 74 02 75 6b 00 00 06 00
|
||
|
|
01 00 00 0e 10 00 34 03 32 31 32 02 35 38 03 32
|
||
|
|
33 30 03 32 30 30 00 04 62 6f 66 68 03 62 62 63
|
||
|
|
02 63 6f 02 75 6b 00 59 5c bd ce 00 01 51 80 00
|
||
|
|
01 51 80 00 01 51 80 00 00 01 2c|___}
|
||
|
|
in
|
||
|
|
let flags = Flags.singleton `Authoritative
|
||
|
|
and content =
|
||
|
|
let soa = {
|
||
|
|
Soa.nameserver = n_of_s "212.58.230.200" ;
|
||
|
|
hostmaster = n_of_s "bofh.bbc.co.uk" ;
|
||
|
|
serial = 0x595cbdcel ; refresh = 0x00015180l ; retry = 0x00015180l ;
|
||
|
|
expiry = 0x00015180l ; minimum = 0x0000012cl
|
||
|
|
} in
|
||
|
|
(Domain_name.Map.empty,
|
||
|
|
Name_rr_map.singleton (n_of_s "bbc.net.uk") Soa soa)
|
||
|
|
in
|
||
|
|
let res = create (0xAE00, flags)
|
||
|
|
(Question.create (n_of_s "news.bbc.net.uk") Ns)
|
||
|
|
(`Rcode_error (Rcode.NXDomain, Opcode.Query, Some content))
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 2 decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let regression3 () =
|
||
|
|
let data = Ohex.decode
|
||
|
|
{___|e213 8180 0001
|
||
|
|
0001 0000 0001 0366 6f6f 0363 6f6d 0000
|
||
|
|
0f00 01c0 0c00 0f00 0100 0002 2c00 0b03
|
||
|
|
e801 3001 3001 3001 3000 0000 2901 c2 00
|
||
|
|
0000 0000 00|___}
|
||
|
|
in
|
||
|
|
let flags = Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and question =
|
||
|
|
Question.create (Domain_name.of_string_exn "foo.com") Mx
|
||
|
|
and answer =
|
||
|
|
let mx = {
|
||
|
|
Mx.preference = 1000 ;
|
||
|
|
mail_exchange = Obj.magic (Domain_name.of_string_exn "0.0.0.0")
|
||
|
|
} in
|
||
|
|
Name_rr_map.singleton (Domain_name.of_string_exn "foo.com")
|
||
|
|
Mx (556l, Rr_map.Mx_set.singleton mx)
|
||
|
|
and edns = Edns.create ~payload_size:450 ()
|
||
|
|
in
|
||
|
|
let res = create ~edns (0xe213, flags) question
|
||
|
|
(`Answer (answer, Domain_name.Map.empty))
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 3 decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
(* still not sure whether to allow this or not... -- since the resolver code
|
||
|
|
now knows about SRV records (and drops _foo._tcp), this shouldn't appear *)
|
||
|
|
let regression4 () =
|
||
|
|
let data = Ohex.decode
|
||
|
|
{___|9f ca 84 03 00 01 00 00 00 01 00 01 04 5f 74 63
|
||
|
|
70 04 6b 65 79 73 06 72 69 73 65 75 70 03 6e 65
|
||
|
|
74 00 00 02 00 01 c0 16 00 06 00 01 00 00 01 2c
|
||
|
|
00 2b 07 70 72 69 6d 61 72 79 c0 16 0a 63 6f 6c
|
||
|
|
6c 65 63 74 69 76 65 c0 16 78 48 8b 04 00 00 1c
|
||
|
|
20 00 00 0e 10 00 12 75 00 00 00 01 2c 00 00 29
|
||
|
|
10 00 00 00 00 00 00 00|___}
|
||
|
|
in
|
||
|
|
let question =
|
||
|
|
Question.create (Domain_name.of_string_exn "_tcp.keys.riseup.net") Ns
|
||
|
|
and authority =
|
||
|
|
let soa = { Soa.nameserver = Domain_name.of_string_exn "primary.riseup.net" ;
|
||
|
|
hostmaster = Domain_name.of_string_exn "collective.riseup.net" ;
|
||
|
|
serial = 0x78488b04l ; refresh = 0x1c20l ; retry = 0x0e10l ;
|
||
|
|
expiry = 0x127500l ; minimum = 0x012cl }
|
||
|
|
in
|
||
|
|
Name_rr_map.singleton (Domain_name.of_string_exn "riseup.net") Soa soa
|
||
|
|
and edns = Edns.create ~payload_size:4096 ()
|
||
|
|
in
|
||
|
|
let res =
|
||
|
|
create ~edns (0x9FCA, Flags.singleton `Authoritative) question
|
||
|
|
(`Rcode_error (Rcode.NXDomain, Opcode.Query, Some (Name_rr_map.empty, authority)))
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 4 decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let regression5 () =
|
||
|
|
(* this is what bbc returns me (extra bytes) since it doesn't like EDNS *)
|
||
|
|
let data = Ohex.decode
|
||
|
|
{___|5b 12 84 01 00 01 00 00 00 00 00 00 03 6e 73 34
|
||
|
|
03 62 62 63 03 6e 65 74 02 75 6b 00 00 02 00 01
|
||
|
|
00 00 29 05 cc 00 00 00 00 00 00|___}
|
||
|
|
in
|
||
|
|
let flags = Flags.singleton `Authoritative
|
||
|
|
and question =
|
||
|
|
Question.create (Domain_name.of_string_exn "ns4.bbc.net.uk") Ns
|
||
|
|
in
|
||
|
|
let res = create (0x5B12, flags) question
|
||
|
|
(`Rcode_error (Rcode.FormErr, Opcode.Query, None))
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 5 decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let regression6 () =
|
||
|
|
let data = Ohex.decode
|
||
|
|
{|00 03 00 00 00 b5 00 00 00 00 00 00 03 66 6f 6f
|
||
|
|
02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03
|
||
|
|
66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01
|
||
|
|
00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e
|
||
|
|
00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d
|
||
|
|
61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06
|
||
|
|
64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02
|
||
|
|
6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66
|
||
|
|
6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00
|
||
|
|
01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00
|
||
|
|
00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61
|
||
|
|
69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64
|
||
|
|
6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d
|
||
|
|
79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f
|
||
|
|
6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01
|
||
|
|
03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00
|
||
|
|
01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69
|
||
|
|
6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f
|
||
|
|
6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79
|
||
|
|
06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f
|
||
|
|
02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03
|
||
|
|
66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01
|
||
|
|
00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e
|
||
|
|
00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d
|
||
|
|
61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06
|
||
|
|
64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02
|
||
|
|
6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66
|
||
|
|
6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00
|
||
|
|
01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00
|
||
|
|
00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61
|
||
|
|
69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64
|
||
|
|
6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d
|
||
|
|
79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f
|
||
|
|
6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01
|
||
|
|
03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00
|
||
|
|
01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69
|
||
|
|
6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f
|
||
|
|
6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79
|
||
|
|
06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f
|
||
|
|
02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03
|
||
|
|
66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01
|
||
|
|
00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e
|
||
|
|
00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d
|
||
|
|
61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06
|
||
|
|
64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02
|
||
|
|
6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66
|
||
|
|
6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00
|
||
|
|
01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00
|
||
|
|
00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61
|
||
|
|
69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64
|
||
|
|
6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d
|
||
|
|
79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f
|
||
|
|
6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01
|
||
|
|
03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00
|
||
|
|
01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69
|
||
|
|
6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f
|
||
|
|
6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79
|
||
|
|
06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f
|
||
|
|
02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03
|
||
|
|
66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01
|
||
|
|
00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e
|
||
|
|
00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d
|
||
|
|
61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06
|
||
|
|
64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02
|
||
|
|
6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66
|
||
|
|
6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00
|
||
|
|
01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00
|
||
|
|
00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61
|
||
|
|
69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64
|
||
|
|
6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d
|
||
|
|
79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f
|
||
|
|
6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01
|
||
|
|
03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00
|
||
|
|
01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69
|
||
|
|
6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f
|
||
|
|
6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79
|
||
|
|
06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f
|
||
|
|
02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03
|
||
|
|
66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01
|
||
|
|
00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e
|
||
|
|
00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d
|
||
|
|
61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06
|
||
|
|
64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02
|
||
|
|
6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66
|
||
|
|
6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00
|
||
|
|
01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00
|
||
|
|
00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61
|
||
|
|
69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64
|
||
|
|
6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d
|
||
|
|
79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f
|
||
|
|
6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01
|
||
|
|
03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00
|
||
|
|
01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69
|
||
|
|
6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f
|
||
|
|
6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79
|
||
|
|
06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f
|
||
|
|
02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03
|
||
|
|
66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01
|
||
|
|
00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e
|
||
|
|
00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d
|
||
|
|
61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06
|
||
|
|
64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02
|
||
|
|
6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66
|
||
|
|
6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00
|
||
|
|
01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00
|
||
|
|
00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61
|
||
|
|
69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64
|
||
|
|
6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d
|
||
|
|
79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f
|
||
|
|
6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01
|
||
|
|
03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00
|
||
|
|
01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69
|
||
|
|
6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f
|
||
|
|
6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79
|
||
|
|
06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f
|
||
|
|
02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03
|
||
|
|
66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01
|
||
|
|
00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e
|
||
|
|
00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d
|
||
|
|
61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06
|
||
|
|
64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02
|
||
|
|
6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66
|
||
|
|
6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00
|
||
|
|
01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00
|
||
|
|
00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61
|
||
|
|
69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64
|
||
|
|
6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d
|
||
|
|
79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f
|
||
|
|
6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01
|
||
|
|
03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00
|
||
|
|
01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69
|
||
|
|
6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f
|
||
|
|
6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79
|
||
|
|
06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f
|
||
|
|
02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03
|
||
|
|
66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01
|
||
|
|
00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e
|
||
|
|
00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d
|
||
|
|
61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06
|
||
|
|
64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02
|
||
|
|
6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66
|
||
|
|
6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00
|
||
|
|
01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00
|
||
|
|
00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61
|
||
|
|
69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64
|
||
|
|
6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d
|
||
|
|
79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f
|
||
|
|
6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01
|
||
|
|
03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00
|
||
|
|
01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69
|
||
|
|
6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f
|
||
|
|
6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79
|
||
|
|
06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f
|
||
|
|
02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03
|
||
|
|
66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01
|
||
|
|
00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e
|
||
|
|
00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d
|
||
|
|
61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06
|
||
|
|
64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02
|
||
|
|
6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66
|
||
|
|
6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00
|
||
|
|
01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00
|
||
|
|
00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61
|
||
|
|
69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64
|
||
|
|
6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d
|
||
|
|
79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f
|
||
|
|
6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01
|
||
|
|
03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00
|
||
|
|
01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69
|
||
|
|
6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f
|
||
|
|
6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79
|
||
|
|
06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f
|
||
|
|
02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03
|
||
|
|
66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01
|
||
|
|
00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e
|
||
|
|
00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d
|
||
|
|
61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06
|
||
|
|
64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02
|
||
|
|
6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66
|
||
|
|
6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00
|
||
|
|
01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00
|
||
|
|
00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61
|
||
|
|
69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64
|
||
|
|
6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d
|
||
|
|
79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f
|
||
|
|
6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01
|
||
|
|
03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00
|
||
|
|
01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69
|
||
|
|
6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f
|
||
|
|
6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79
|
||
|
|
06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f
|
||
|
|
02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03
|
||
|
|
66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01
|
||
|
|
00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e
|
||
|
|
00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d
|
||
|
|
61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06
|
||
|
|
64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02
|
||
|
|
6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66
|
||
|
|
6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00
|
||
|
|
01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00
|
||
|
|
00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61
|
||
|
|
69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64
|
||
|
|
6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d
|
||
|
|
79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f
|
||
|
|
6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01
|
||
|
|
03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00
|
||
|
|
01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69
|
||
|
|
6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f
|
||
|
|
6d 61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79
|
||
|
|
06 64 6f 6d 61 69 6e 00 00 01 00 01 03 66 6f 6f
|
||
|
|
02 6d 79 06 64 6f 6d 61 69 6e 00 00 01 00 01 03
|
||
|
|
66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e 00 00 01
|
||
|
|
00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d 61 69 6e
|
||
|
|
00 00 01 00 01 03 66 6f 6f 02 6d 79 06 64 6f 6d
|
||
|
|
61 69 6e 00 00 01 00 01 03 66 6f 6f 02 6d 79 06
|
||
|
|
64 6f 6d 61 69 6e 00 00 01 00 01 |}
|
||
|
|
in
|
||
|
|
match decode data with
|
||
|
|
| Error _ -> ()
|
||
|
|
| Ok _ -> Alcotest.fail "got ok, expected to fail with multiple questions"
|
||
|
|
|
||
|
|
let regression7 () =
|
||
|
|
(* encoding a remove_single in an update frame lead to wrong rdlength (off by 2) *)
|
||
|
|
let header = 0xAE00, Flags.empty
|
||
|
|
and update =
|
||
|
|
let up =
|
||
|
|
Domain_name.Map.singleton
|
||
|
|
(n_of_s "www.example.com")
|
||
|
|
[ Update.Remove_single Rr_map.(B (A, (0l, Ipaddr.V4.Set.singleton Ipaddr.V4.localhost))) ]
|
||
|
|
in
|
||
|
|
(Domain_name.Map.empty, up)
|
||
|
|
and zone = Question.create (n_of_s "example.com") Soa
|
||
|
|
in
|
||
|
|
let res = create header zone (`Update update) in
|
||
|
|
let encoded = fst (encode `Udp res) in
|
||
|
|
(* encode followed by decode should lead to same data *)
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 7 decode encode works"
|
||
|
|
(Ok res) (decode encoded))
|
||
|
|
|
||
|
|
let regression8 () =
|
||
|
|
(* encoding a exists_data in an update frame lead to wrong rdlength (off by 2) *)
|
||
|
|
let header = 0xAE00, Flags.empty
|
||
|
|
and prereq =
|
||
|
|
let pre =
|
||
|
|
Domain_name.Map.singleton (n_of_s "www.example.com")
|
||
|
|
[ Update.Exists_data Rr_map.(B (A, (0l, Ipaddr.V4.Set.singleton Ipaddr.V4.localhost)))]
|
||
|
|
in
|
||
|
|
(pre, Domain_name.Map.empty)
|
||
|
|
and zone = Question.create (n_of_s "example.com") Soa
|
||
|
|
in
|
||
|
|
let res = create header zone (`Update prereq) in
|
||
|
|
(* encode followed by decode should lead to same data *)
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 8 decode encode works"
|
||
|
|
(Ok res) (decode (fst (encode `Udp res))))
|
||
|
|
|
||
|
|
let regression9 () =
|
||
|
|
(* from ednscomp.isc.org *)
|
||
|
|
let data = Ohex.decode {|
|
||
|
|
a8 6c 00 00 00 01 00 00 00 00 00 01 04 6e 71 73
|
||
|
|
62 02 69 6f 00 00 01 00 01 00 00 29 10 00 00 00
|
||
|
|
00 00 00 1c 00 03 00 00 00 08 00 04 00 01 00 00
|
||
|
|
00 0a 00 08 c8 9a 2a f8 aa 77 31 af 00 09 00 00
|
||
|
|
|}
|
||
|
|
in
|
||
|
|
let header = 0xa86c, Flags.empty
|
||
|
|
and question = Question.create (n_of_s "nqsb.io") A
|
||
|
|
and edns =
|
||
|
|
let extensions = [
|
||
|
|
Edns.Nsid "" ;
|
||
|
|
Edns.Extension (8, Ohex.decode "00 01 00 00") ;
|
||
|
|
Edns.Cookie (Ohex.decode "c8 9a 2a f8 aa 77 31 af") ;
|
||
|
|
Edns.Extension (9, "")
|
||
|
|
] in
|
||
|
|
Edns.create ~payload_size:4096 ~extensions ()
|
||
|
|
in
|
||
|
|
let res = create ~edns header question `Query in
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 9 decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let regression10 () =
|
||
|
|
(* ERR [application] decode error (from 141.1.1.1:53)
|
||
|
|
not implemented at 305: unsupported RR typ ISDN for *)
|
||
|
|
let data = Ohex.decode {|
|
||
|
|
10 92 81 80 00 01 00 0d 00 00 00 0d 03 63 63 63
|
||
|
|
02 64 65 00 00 ff 00 01 c0 0c 00 06 00 01 00 00
|
||
|
|
1b 9e 00 2a 02 6e 73 03 68 61 6d c0 0c 0a 68 6f
|
||
|
|
73 74 6d 61 73 74 65 72 c0 0c 78 57 fa 94 00 00
|
||
|
|
a8 c0 00 00 1c 20 00 24 ea 00 00 01 51 80 c0 0c
|
||
|
|
00 02 00 01 00 00 1b 9e 00 09 02 6e 73 03 62 65
|
||
|
|
72 c0 0c c0 0c 00 02 00 01 00 00 1b 9e 00 02 c0
|
||
|
|
24 c0 0c 00 02 00 01 00 00 1b 9e 00 09 02 6e 73
|
||
|
|
03 76 69 65 c0 0c c0 0c 00 02 00 01 00 00 1b 9e
|
||
|
|
00 11 05 73 2d 64 6e 73 05 69 72 7a 34 32 03 6e
|
||
|
|
65 74 00 c0 0c 00 0f 00 01 00 00 1b 9e 00 0b 00
|
||
|
|
05 06 6e 6f 6d 61 69 6c c0 0c c0 0c 00 0f 00 01
|
||
|
|
00 00 1b 9e 00 09 00 0a 04 6d 61 69 6c c0 0c c0
|
||
|
|
0c 00 0f 00 01 00 00 1b 9e 00 0c 00 17 07 6e 6f
|
||
|
|
6d 61 69 6c 32 c0 0c c0 0c 00 0f 00 01 00 00 1b
|
||
|
|
9e 00 0c 00 2a 07 6e 6f 6d 61 69 6c 33 c0 0c c0
|
||
|
|
0c 00 01 00 01 00 00 1b 9e 00 04 c3 36 a4 27 c0
|
||
|
|
0c 00 1c 00 01 00 00 1b 9e 00 10 20 01 06 7c 20
|
||
|
|
a0 00 02 00 00 01 64 00 00 00 39 c0 0c 00 14 00
|
||
|
|
01 00 00 1b 9e 00 0c 0b 34 39 34 30 34 30 31 38
|
||
|
|
30 31 30 c0 0c 00 10 00 01 00 00 1b 9e 00 26 25
|
||
|
|
43 68 61 6f 73 20 43 6f 6d 70 75 74 65 72 20 43
|
||
|
|
6c 75 62 2c 20 48 61 6d 62 75 72 67 2c 20 47 65
|
||
|
|
72 6d 61 6e 79 c0 5a 00 01 00 01 00 00 0d d8 00
|
||
|
|
04 c3 36 a4 24 c0 24 00 01 00 01 00 00 0d d8 00
|
||
|
|
04 d4 0c 37 4d c0 7d 00 01 00 01 00 00 0d d8 00
|
||
|
|
04 92 ff 39 e4 c0 b1 00 01 00 01 00 00 1b 9e 00
|
||
|
|
04 d4 0c 37 41 c0 c8 00 01 00 01 00 00 1b 9e 00
|
||
|
|
04 d4 0c 37 42 c0 dd 00 01 00 01 00 00 1b 9e 00
|
||
|
|
04 d4 0c 37 41 c0 5a 00 1c 00 01 00 00 06 d0 00
|
||
|
|
10 20 01 06 7c 20 a0 00 02 00 00 01 64 00 00 00
|
||
|
|
36 c0 24 00 1c 00 01 00 00 06 d0 00 10 2a 00 14
|
||
|
|
b0 42 00 30 00 00 23 00 55 00 00 00 77 c0 7d 00
|
||
|
|
1c 00 01 00 00 06 d0 00 10 2a 02 01 b8 00 10 00
|
||
|
|
31 00 00 00 00 00 00 02 28 c0 b1 00 1c 00 01 00
|
||
|
|
00 1b 9e 00 10 2a 00 14 b0 42 00 30 00 00 23 00
|
||
|
|
55 00 00 00 65 c0 c8 00 1c 00 01 00 00 1b 9e 00
|
||
|
|
10 2a 00 14 b0 42 00 30 00 00 23 00 55 00 00 00
|
||
|
|
66 c0 f5 00 1c 00 01 00 00 1b 9e 00 10 2a 00 14
|
||
|
|
b0 42 00 30 00 00 23 00 55 00 00 00 65 00 00 29
|
||
|
|
20 00 00 00 00 00 00 00
|
||
|
|
|}
|
||
|
|
in
|
||
|
|
let header = 0x1092, Flags.(add `Recursion_available (singleton `Recursion_desired))
|
||
|
|
and question = n_of_s "ccc.de", `Any
|
||
|
|
and an, additional =
|
||
|
|
let isdn = match Rr_map.I.of_int 20 with Ok x -> x | Error _ -> Alcotest.fail "expected unexpected" in
|
||
|
|
let ip s = Ipaddr.V4.Set.singleton (Ipaddr.V4.of_string_exn s)
|
||
|
|
and ip6 s = Ipaddr.V6.Set.singleton (Ipaddr.V6.of_string_exn s)
|
||
|
|
in
|
||
|
|
Domain_name.Map.singleton (n_of_s "ccc.de")
|
||
|
|
(Rr_map.add Soa {
|
||
|
|
Soa.nameserver = n_of_s "ns.ham.ccc.de" ; hostmaster = n_of_s "hostmaster.ccc.de" ;
|
||
|
|
serial = 2019031700l ; refresh = 43200l ; retry = 7200l ; expiry = 2419200l ;
|
||
|
|
minimum = 86400l }
|
||
|
|
(Rr_map.add Ns (7070l, Domain_name.Host_set.of_list
|
||
|
|
(List.map Domain_name.host_exn [
|
||
|
|
n_of_s "ns.vie.ccc.de" ; n_of_s "ns.ham.ccc.de" ;
|
||
|
|
n_of_s "ns.ber.ccc.de" ; n_of_s "s-dns.irz42.net"
|
||
|
|
]))
|
||
|
|
(Rr_map.add Mx (7070l, Rr_map.Mx_set.of_list [
|
||
|
|
{ preference = 5 ; mail_exchange = Domain_name.host_exn (n_of_s "nomail.ccc.de") } ;
|
||
|
|
{ preference = 10 ; mail_exchange = Domain_name.host_exn (n_of_s "mail.ccc.de") } ;
|
||
|
|
{ preference = 23 ; mail_exchange = Domain_name.host_exn (n_of_s "nomail2.ccc.de") } ;
|
||
|
|
{ preference = 42 ; mail_exchange = Domain_name.host_exn (n_of_s "nomail3.ccc.de") }
|
||
|
|
])
|
||
|
|
(Rr_map.add A (7070l, ip "195.54.164.39")
|
||
|
|
(Rr_map.add Aaaa (7070l, ip6 "2001:67c:20a0:2:0:164:0:39")
|
||
|
|
(Rr_map.add Txt (7070l, Rr_map.Txt_set.singleton "Chaos Computer Club, Hamburg, Germany")
|
||
|
|
(Rr_map.singleton (Unknown isdn) (7070l, Rr_map.Txt_set.singleton (Ohex.decode "0B3439343034303138303130"))))))))),
|
||
|
|
Domain_name.Map.add (n_of_s "mail.ccc.de")
|
||
|
|
(Rr_map.add Aaaa (7070l, ip6 "2a00:14b0:4200:3000:23:55:0:66")
|
||
|
|
(Rr_map.singleton A (7070l, ip "212.12.55.66")))
|
||
|
|
(Domain_name.Map.add (n_of_s "nomail.ccc.de")
|
||
|
|
(Rr_map.add A (7070l, ip "212.12.55.65")
|
||
|
|
(Rr_map.singleton Aaaa (7070l, ip6 "2a00:14b0:4200:3000:23:55:0:65")))
|
||
|
|
(Domain_name.Map.add (n_of_s "nomail2.ccc.de")
|
||
|
|
(Rr_map.singleton A (7070l, ip "212.12.55.65"))
|
||
|
|
(Domain_name.Map.add (n_of_s "nomail3.ccc.de") (Rr_map.singleton Aaaa (7070l, ip6 "2a00:14b0:4200:3000:23:55:0:65"))
|
||
|
|
(Domain_name.Map.add (n_of_s "ns.ber.ccc.de")
|
||
|
|
(Rr_map.add A (3544l, ip "195.54.164.36")
|
||
|
|
(Rr_map.singleton Aaaa (1744l, ip6 "2001:67c:20a0:2:0:164:0:36")))
|
||
|
|
(Domain_name.Map.add (n_of_s "ns.ham.ccc.de")
|
||
|
|
(Rr_map.add A (3544l, ip "212.12.55.77")
|
||
|
|
(Rr_map.singleton Aaaa (1744l, ip6 "2a00:14b0:4200:3000:23:55:0:77")))
|
||
|
|
(Domain_name.Map.singleton (n_of_s "ns.vie.ccc.de")
|
||
|
|
(Rr_map.add A (3544l, ip "146.255.57.228")
|
||
|
|
(Rr_map.singleton Aaaa (1744l, ip6 "2a02:1b8:10:31::228")))))))))
|
||
|
|
and edns =
|
||
|
|
Edns.create ~payload_size:8192 ()
|
||
|
|
in
|
||
|
|
let res = create ~additional ~edns header question (`Answer (an, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 9 decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let regression11 () =
|
||
|
|
(* here we have an overlong text record (>255 bytes) which should be encoded into a single RR! *)
|
||
|
|
let data = Ohex.decode {|
|
||
|
|
d0 55 81 80 00 01 00 01 00 00 00 01 0c 61 72 63
|
||
|
|
2d 32 30 31 36 30 38 31 36 0a 5f 64 6f 6d 61 69
|
||
|
|
6e 6b 65 79 06 67 6f 6f 67 6c 65 03 63 6f 6d 00
|
||
|
|
00 10 00 01 c0 0c 00 10 00 01 00 00 00 33 01 93
|
||
|
|
aa 6b 3d 72 73 61 3b 20 70 3d 4d 49 49 42 49 6a
|
||
|
|
41 4e 42 67 6b 71 68 6b 69 47 39 77 30 42 41 51
|
||
|
|
45 46 41 41 4f 43 41 51 38 41 4d 49 49 42 43 67
|
||
|
|
4b 43 41 51 45 41 31 4c 7a 74 70 78 73 37 79 55
|
||
|
|
78 51 45 73 62 44 46 68 6a 4d 63 39 6b 5a 56 5a
|
||
|
|
75 35 50 2f 43 4f 59 45 55 49 58 34 42 33 39 49
|
||
|
|
4c 34 53 58 41 62 76 34 76 69 49 6c 54 39 45 36
|
||
|
|
46 36 69 5a 6d 54 68 31 67 6f 37 2b 39 57 51 4c
|
||
|
|
79 77 77 67 77 6a 58 4d 4a 78 2f 44 7a 30 52 67
|
||
|
|
4d 6f 50 65 79 70 35 4e 52 79 34 6c 33 32 30 44
|
||
|
|
50 59 69 62 4e 71 56 4d 57 61 35 e7 69 51 32 57
|
||
|
|
69 49 6d 51 43 30 65 6e 31 4f 39 75 68 4c 4c 76
|
||
|
|
7a 61 53 5a 4a 30 33 66 76 47 6d 43 6f 39 6a 4d
|
||
|
|
6f 30 47 77 4b 7a 4c 4e 65 31 34 78 4d 67 6e 2f
|
||
|
|
70 78 32 4c 35 4e 2f 33 49 4b 6c 4b 58 34 62 71
|
||
|
|
55 41 4a 54 55 74 38 4c 39 39 33 5a 6c 57 7a 76
|
||
|
|
67 4d 6e 53 46 53 74 38 42 2b 65 75 53 4b 53 72
|
||
|
|
74 41 69 6f 70 64 79 34 72 31 79 4f 34 65 4e 35
|
||
|
|
67 6f 42 41 53 72 47 57 30 65 4c 51 63 31 6c 59
|
||
|
|
6f 75 4e 76 43 72 63 54 51 70 6f 73 34 2f 47 45
|
||
|
|
41 71 69 47 7a 70 71 75 65 4a 4c 6d 42 66 4f 4f
|
||
|
|
34 63 6c 4e 76 56 76 70 50 6b 76 51 73 32 42 48
|
||
|
|
77 39 49 39 4c 6d 49 6a 61 4d 78 54 4e 47 78 6b
|
||
|
|
47 42 52 61 50 33 75 74 44 69 4b 58 58 71 75 31
|
||
|
|
4b 2b 4c 52 7a 6c 30 48 43 4e 53 64 51 49 44 41
|
||
|
|
51 41 42 00 00 29 20 00 00 00 00 00 00 00
|
||
|
|
|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "arc-20160816._domainkey.google.com" in
|
||
|
|
let flags = Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and question = Question.create host Txt
|
||
|
|
and content =
|
||
|
|
Domain_name.Map.singleton host
|
||
|
|
(Rr_map.singleton Txt (51l, Rr_map.Txt_set.singleton "k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Lztpxs7yUxQEsbDFhjMc9kZVZu5P/COYEUIX4B39IL4SXAbv4viIlT9E6F6iZmTh1go7+9WQLywwgwjXMJx/Dz0RgMoPeyp5NRy4l320DPYibNqVMWa5iQ2WiImQC0en1O9uhLLvzaSZJ03fvGmCo9jMo0GwKzLNe14xMgn/px2L5N/3IKlKX4bqUAJTUt8L993ZlWzvgMnSFSt8B+euSKSrtAiopdy4r1yO4eN5goBASrGW0eLQc1lYouNvCrcTQpos4/GEAqiGzpqueJLmBfOO4clNvVvpPkvQs2BHw9I9LmIjaMxTNGxkGBRaP3utDiKXXqu1K+LRzl0HCNSdQIDAQAB"))
|
||
|
|
and edns =
|
||
|
|
Edns.create ~payload_size:8192 ()
|
||
|
|
in
|
||
|
|
let header = 0xD055, flags in
|
||
|
|
let res = create ~edns header question (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 11 decodes"
|
||
|
|
(Ok res) (decode data)) ;
|
||
|
|
(* manually moved the length field a bit further *)
|
||
|
|
let data' = Ohex.decode {|
|
||
|
|
d0 55 81 80 00 01 00 01 00 00 00 01 0c 61 72 63
|
||
|
|
2d 32 30 31 36 30 38 31 36 0a 5f 64 6f 6d 61 69
|
||
|
|
6e 6b 65 79 06 67 6f 6f 67 6c 65 03 63 6f 6d 00
|
||
|
|
00 10 00 01 c0 0c 00 10 00 01 00 00 00 33 01 93
|
||
|
|
ff 6b 3d 72 73 61 3b 20 70 3d 4d 49 49 42 49 6a
|
||
|
|
41 4e 42 67 6b 71 68 6b 69 47 39 77 30 42 41 51
|
||
|
|
45 46 41 41 4f 43 41 51 38 41 4d 49 49 42 43 67
|
||
|
|
4b 43 41 51 45 41 31 4c 7a 74 70 78 73 37 79 55
|
||
|
|
78 51 45 73 62 44 46 68 6a 4d 63 39 6b 5a 56 5a
|
||
|
|
75 35 50 2f 43 4f 59 45 55 49 58 34 42 33 39 49
|
||
|
|
4c 34 53 58 41 62 76 34 76 69 49 6c 54 39 45 36
|
||
|
|
46 36 69 5a 6d 54 68 31 67 6f 37 2b 39 57 51 4c
|
||
|
|
79 77 77 67 77 6a 58 4d 4a 78 2f 44 7a 30 52 67
|
||
|
|
4d 6f 50 65 79 70 35 4e 52 79 34 6c 33 32 30 44
|
||
|
|
50 59 69 62 4e 71 56 4d 57 61 35 69 51 32 57
|
||
|
|
69 49 6d 51 43 30 65 6e 31 4f 39 75 68 4c 4c 76
|
||
|
|
7a 61 53 5a 4a 30 33 66 76 47 6d 43 6f 39 6a 4d
|
||
|
|
6f 30 47 77 4b 7a 4c 4e 65 31 34 78 4d 67 6e 2f
|
||
|
|
70 78 32 4c 35 4e 2f 33 49 4b 6c 4b 58 34 62 71
|
||
|
|
55 41 4a 54 55 74 38 4c 39 39 33 5a 6c 57 7a 76
|
||
|
|
67 92 4d 6e 53 46 53 74 38 42 2b 65 75 53 4b 53 72
|
||
|
|
74 41 69 6f 70 64 79 34 72 31 79 4f 34 65 4e 35
|
||
|
|
67 6f 42 41 53 72 47 57 30 65 4c 51 63 31 6c 59
|
||
|
|
6f 75 4e 76 43 72 63 54 51 70 6f 73 34 2f 47 45
|
||
|
|
41 71 69 47 7a 70 71 75 65 4a 4c 6d 42 66 4f 4f
|
||
|
|
34 63 6c 4e 76 56 76 70 50 6b 76 51 73 32 42 48
|
||
|
|
77 39 49 39 4c 6d 49 6a 61 4d 78 54 4e 47 78 6b
|
||
|
|
47 42 52 61 50 33 75 74 44 69 4b 58 58 71 75 31
|
||
|
|
4b 2b 4c 52 7a 6c 30 48 43 4e 53 64 51 49 44 41
|
||
|
|
51 41 42 00 00 29 20 00 00 00 00 00 00 00
|
||
|
|
|} in
|
||
|
|
Alcotest.(check p_cs "regression 11 encode works"
|
||
|
|
data' (fst (encode `Tcp res)));
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 11 encoded decodes well"
|
||
|
|
(Ok res) (decode data'))
|
||
|
|
|
||
|
|
let regression12 () =
|
||
|
|
let data = {|
|
||
|
|
7b a2 80 09 00 01 00 00 00 00 00 01 00 00
|
||
|
|
06 00 01 03 31 34 37 02 37 35 02 33 34 03 32 31
|
||
|
|
30 03 31 39 34 03 31 35 30 03 31 36 38 03 31 35
|
||
|
|
36 09 5f 74 72 61 6e 73 66 65 72 00 00 fa 00 ff
|
||
|
|
00 00 00 00 00 43 0b 68 6d 61 63 2d 73 68 61 32
|
||
|
|
35 36 00 00 00 5f f3 22 3b 01 2c 00 20 b1 40 50
|
||
|
|
19 fd 27 49 c3 90 77 d3 a2 87 38 ed a0 eb 2f e8
|
||
|
|
eb c4 12 03 f1 25 ad fa 5b 4a 17 83 5e 7b a2 00
|
||
|
|
12 00 06 00 00 5f f3 23 71
|
||
|
|
|} in
|
||
|
|
let header = 0x7BA2, Flags.empty in
|
||
|
|
let question = Question.create Domain_name.root Soa in
|
||
|
|
let r = `Rcode_error (Rcode.NotAuth, Opcode.Query, None) in
|
||
|
|
let tsig =
|
||
|
|
let of_ts s = match Ptime.of_rfc3339 s with
|
||
|
|
Ok (ts, _, _) -> ts
|
||
|
|
| Error _ -> Alcotest.fail "bad ts"
|
||
|
|
in
|
||
|
|
let mac = Ohex.decode {|
|
||
|
|
b1 40 50 19 fd 27 49 c3 90 77 d3 a2 87 38 ed a0
|
||
|
|
eb 2f e8 eb c4 12 03 f1 25 ad fa 5b 4a 17 83 5e
|
||
|
|
|}
|
||
|
|
and signed = of_ts "2021-01-04T14:12:11-00:00"
|
||
|
|
and other = of_ts "2021-01-04T14:17:21-00:00"
|
||
|
|
and fudge = Ptime.Span.of_int_s 300
|
||
|
|
in
|
||
|
|
let tsig =
|
||
|
|
match
|
||
|
|
Tsig.tsig ~algorithm:Tsig.SHA256
|
||
|
|
~signed ~fudge ~mac ~original_id:0x7BA2
|
||
|
|
~error:Rcode.BadTime ~other ()
|
||
|
|
with
|
||
|
|
| Some ts -> ts
|
||
|
|
| None -> Alcotest.fail "bad tsig"
|
||
|
|
in
|
||
|
|
n_of_s "147.75.34.210.194.150.168.156._transfer",
|
||
|
|
tsig, 17
|
||
|
|
in
|
||
|
|
let res = create ~tsig header question r in
|
||
|
|
Alcotest.(check (result t_ok p_err) "regression 12 decodes"
|
||
|
|
(Ok res) (decode (Ohex.decode data)))
|
||
|
|
|
||
|
|
let a_success () =
|
||
|
|
let data = Ohex.decode {|ac 8f 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 01 00 01 c0 0c
|
||
|
|
00 01 00 01 00 00 0d c9 00 04 c1 1e 28 8a|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "robur.coop" in
|
||
|
|
let header = 0xac8f, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and q = Question.create host A
|
||
|
|
in
|
||
|
|
let content = Domain_name.Map.singleton host
|
||
|
|
(Rr_map.singleton A (3600l, Ipaddr.V4.(Set.singleton (of_string_exn "193.30.40.138"))))
|
||
|
|
in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "A decodes" (Ok res) (decode data))
|
||
|
|
|
||
|
|
let a_leftover () =
|
||
|
|
let data = Ohex.decode {|ac 8f 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 01 00 01 c0 0c
|
||
|
|
00 01 00 01 00 00 0d c9 00 04 c1 1e 28 8a 9b|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "robur.coop" in
|
||
|
|
let header = 0xac8f, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and q = Question.create host A
|
||
|
|
in
|
||
|
|
let content = Domain_name.Map.singleton host
|
||
|
|
(Rr_map.singleton A (3600l, Ipaddr.V4.(Set.singleton (of_string_exn "193.30.40.138"))))
|
||
|
|
in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "A decodes" (Ok res) (decode data))
|
||
|
|
|
||
|
|
let a_fail_partial () =
|
||
|
|
let data = Ohex.decode {|ac 8f 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 01 00 01 c0 0c
|
||
|
|
00 01 00 01 00 00 0d c9 00 04 c1 1e 28|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "short A decodes" (Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let a_fail_leftover_inner () =
|
||
|
|
let data = Ohex.decode {|ac 8f 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 01 00 01 c0 0c
|
||
|
|
00 01 00 01 00 00 0d c9 00 05 c1 1e 28 8a 9b|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "A decode failure (rdata leftover)"
|
||
|
|
(Error (`Leftover (44, "rdata"))) (decode data))
|
||
|
|
|
||
|
|
let a_fail_partial_inner () =
|
||
|
|
let data = Ohex.decode {|ac 8f 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 01 00 01 c0 0c
|
||
|
|
00 01 00 01 00 00 0d c9 00 03 c1 1e 28 8a|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "A decode failure (rdata partial)" (Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let ns_success () =
|
||
|
|
let data = Ohex.decode {|
|
||
|
|
31 58 81 80 00 01 00 03 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 02 00 01 c0 0c
|
||
|
|
00 02 00 01 00 00 0e 10 00 11 03 6e 73 32 07 6d
|
||
|
|
65 68 6e 65 72 74 03 6f 72 67 00 c0 0c 00 02 00
|
||
|
|
01 00 00 0e 10 00 06 03 6e 73 33 c0 2c c0 0c 00
|
||
|
|
02 00 01 00 00 0e 10 00 06 03 6e 73 36 c0 2c|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "robur.coop" in
|
||
|
|
let header = 0x3158, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and q = Question.create host Ns
|
||
|
|
in
|
||
|
|
let h s = Domain_name.host_exn (n_of_s s) in
|
||
|
|
let content = Domain_name.Map.singleton host
|
||
|
|
(Rr_map.singleton Ns (3600l,
|
||
|
|
Domain_name.Host_set.(add (h "ns6.mehnert.org")
|
||
|
|
(add (h "ns2.mehnert.org") (singleton (h "ns3.mehnert.org"))))))
|
||
|
|
in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "NS decodes" (Ok res) (decode data))
|
||
|
|
|
||
|
|
let ns_fail_partial () =
|
||
|
|
let data = Ohex.decode {|
|
||
|
|
31 58 81 80 00 01 00 03 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 02 00 01 c0 0c
|
||
|
|
00 02 00 01 00 00 0e 10 00 11 03 6e 73 32 07 6d
|
||
|
|
65 68 6e 65 72 74 03 6f 72 67 00 c0 0c 00 02 00
|
||
|
|
01 00 00 0e 10 00 06 03 6e 73 33 c0 2c c0 0c 00
|
||
|
|
02 00 01 00 00 0e 10 00 06 03 6e 73 36 c0|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Ns decode failure (partial)"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let ns_fail_leftover_inner () =
|
||
|
|
let data = Ohex.decode {|
|
||
|
|
31 58 81 80 00 01 00 03 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 02 00 01 c0 0c
|
||
|
|
00 02 00 01 00 00 0e 10 00 12 03 6e 73 32 07 6d
|
||
|
|
65 68 6e 65 72 74 03 6f 72 67 00 c0 0c 00 02 00
|
||
|
|
01 00 00 0e 10 00 06 03 6e 73 33 c0 2c c0 0c 00
|
||
|
|
02 00 01 00 00 0e 10 00 06 03 6e 73 36 c0 2c|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Ns decode failure (rdata leftover)"
|
||
|
|
(Error (`Leftover (57, "rdata"))) (decode data));
|
||
|
|
let data = Ohex.decode {|
|
||
|
|
31 58 81 80 00 01 00 03 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 02 00 01 c0 0c
|
||
|
|
00 02 00 01 00 00 0e 10 00 11 03 6e 73 32 07 6d
|
||
|
|
65 68 6e 65 72 74 03 6f 72 67 00 c0 0c 00 02 00
|
||
|
|
01 00 00 0e 10 00 07 03 6e 73 33 c0 2c c0 0c 00
|
||
|
|
02 00 01 00 00 0e 10 00 06 03 6e 73 36 c0 2c|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Ns decode failure (rdata leftover)"
|
||
|
|
(Error (`Leftover (75, "rdata"))) (decode data));
|
||
|
|
let data = Ohex.decode {|
|
||
|
|
31 58 81 80 00 01 00 03 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 02 00 01 c0 0c
|
||
|
|
00 02 00 01 00 00 0e 10 00 11 03 6e 73 32 07 6d
|
||
|
|
65 68 6e 65 72 74 03 6f 72 67 00 c0 0c 00 02 00
|
||
|
|
01 00 00 0e 10 00 06 03 6e 73 33 c0 2c c0 0c 00
|
||
|
|
02 00 01 00 00 0e 10 00 07 03 6e 73 36 c0 2c 00|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Ns decode failure (rdata leftover)"
|
||
|
|
(Error (`Leftover (93, "rdata"))) (decode data))
|
||
|
|
|
||
|
|
let ns_fail_partial_inner () =
|
||
|
|
let data = Ohex.decode {|
|
||
|
|
31 58 81 80 00 01 00 03 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 02 00 01 c0 0c
|
||
|
|
00 02 00 01 00 00 0e 10 00 10 03 6e 73 32 07 6d
|
||
|
|
65 68 6e 65 72 74 03 6f 72 67 00 c0 0c 00 02 00
|
||
|
|
01 00 00 0e 10 00 06 03 6e 73 33 c0 2c c0 0c 00
|
||
|
|
02 00 01 00 00 0e 10 00 06 03 6e 73 36 c0 2c|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Ns decode failure (rdata partial)"
|
||
|
|
(Error `Partial) (decode data));
|
||
|
|
let data = Ohex.decode {|
|
||
|
|
31 58 81 80 00 01 00 03 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 02 00 01 c0 0c
|
||
|
|
00 02 00 01 00 00 0e 11 00 10 03 6e 73 32 07 6d
|
||
|
|
65 68 6e 65 72 74 03 6f 72 67 00 c0 0c 00 02 00
|
||
|
|
01 00 00 0e 10 00 05 03 6e 73 33 c0 2c c0 0c 00
|
||
|
|
02 00 01 00 00 0e 10 00 06 03 6e 73 36 c0 2c|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Ns decode failure (rdata partial)"
|
||
|
|
(Error `Partial) (decode data));
|
||
|
|
let data = Ohex.decode {|
|
||
|
|
31 58 81 80 00 01 00 03 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 02 00 01 c0 0c
|
||
|
|
00 02 00 01 00 00 0e 11 00 10 03 6e 73 32 07 6d
|
||
|
|
65 68 6e 65 72 74 03 6f 72 67 00 c0 0c 00 02 00
|
||
|
|
01 00 00 0e 10 00 06 03 6e 73 33 c0 2c c0 0c 00
|
||
|
|
02 00 01 00 00 0e 10 00 05 03 6e 73 36 c0 2c|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Ns decode failure (rdata partial)"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let cname_success () =
|
||
|
|
let data = Ohex.decode {|58 ca 81 80 00 01 00 01 00 00 00 00 03 77
|
||
|
|
77 77 0a 74 61 67 65 73 73 63 68 61 75 02 64 65
|
||
|
|
00 00 05 00 01 c0 0c 00 05 00 01 00 00 00 aa 00
|
||
|
|
1f 03 77 77 77 0a 74 61 67 65 73 73 63 68 61 75
|
||
|
|
02 64 65 07 65 64 67 65 6b 65 79 03 6e 65 74 00|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "www.tagesschau.de" in
|
||
|
|
let header = 0x58ca, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and q = Question.create host Cname
|
||
|
|
in
|
||
|
|
let content = Domain_name.Map.singleton host
|
||
|
|
(Rr_map.singleton Cname (170l, n_of_s "www.tagesschau.de.edgekey.net"))
|
||
|
|
in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Cname decodes" (Ok res) (decode data))
|
||
|
|
|
||
|
|
let cname_fail_partial () =
|
||
|
|
let data = Ohex.decode {|58 ca 81 80 00 01 00 01 00 00 00 00 03 77
|
||
|
|
77 77 0a 74 61 67 65 73 73 63 68 61 75 02 64 65
|
||
|
|
00 00 05 00 01 c0 0c 00 05 00 01 00 00 00 aa 00
|
||
|
|
1f 03 77 77 77 0a 74 61 67 65 73 73 63 68 61 75
|
||
|
|
02 64 65 07 65 64 67 65 6b 65 79 03 6e 65 74|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Cname decode failure partial"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let cname_fail_leftover_inner () =
|
||
|
|
let data = Ohex.decode {|58 ca 81 80 00 01 00 01 00 00 00 00 03 77
|
||
|
|
77 77 0a 74 61 67 65 73 73 63 68 61 75 02 64 65
|
||
|
|
00 00 05 00 01 c0 0c 00 05 00 01 00 00 00 aa 00
|
||
|
|
1f 03 77 77 77 0a 74 61 67 65 73 73 63 68 61 75
|
||
|
|
02 64 65 07 65 64 67 65 6b 65 79 02 6e 65 00 00|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Cname decode failure (rdata leftover)"
|
||
|
|
(Error (`Leftover (77, ""))) (decode data))
|
||
|
|
|
||
|
|
let cname_fail_partial_inner () =
|
||
|
|
let data = Ohex.decode {|58 ca 81 80 00 01 00 01 00 00 00 00 03 77
|
||
|
|
77 77 0a 74 61 67 65 73 73 63 68 61 75 02 64 65
|
||
|
|
00 00 05 00 01 c0 0c 00 05 00 01 00 00 00 aa 00
|
||
|
|
1e 03 77 77 77 0a 74 61 67 65 73 73 63 68 61 75
|
||
|
|
02 64 65 07 65 64 67 65 6b 65 79 03 6e 65 74 00|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Cname decode failure (rdata partial)"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let soa_success () =
|
||
|
|
let data = Ohex.decode
|
||
|
|
{___|d4 e4 85 83 00 01 00 00 00 01 00 00 01 36 02 31
|
||
|
|
36 03 31 35 30 03 31 33 38 07 69 6e 2d 61 64 64
|
||
|
|
72 04 61 72 70 61 00 00 0c 00 01 03 31 35 30 03
|
||
|
|
31 33 38 07 49 4e 2d 41 44 44 52 04 41 52 50 41
|
||
|
|
00 00 06 00 01 00 00 2a 30 00 3f 05 43 4f 4e 31
|
||
|
|
52 04 4e 49 50 52 03 4d 49 4c 00 13 44 41 4e 49
|
||
|
|
45 4c 2e 57 2e 4b 4e 4f 50 50 53 2e 43 49 56 04
|
||
|
|
4d 41 49 4c c0 56 78 39 c3 d1 00 00 2a 30 00 00
|
||
|
|
03 84 00 12 75 00 00 00 2a 30|___}
|
||
|
|
in
|
||
|
|
let flags = Flags.(add `Authoritative (add `Recursion_desired (singleton `Recursion_available)))
|
||
|
|
and content =
|
||
|
|
let soa = {
|
||
|
|
Soa.nameserver = n_of_s "CON1R.NIPR.MIL" ;
|
||
|
|
hostmaster =
|
||
|
|
Domain_name.of_strings_exn ["DANIEL.W.KNOPPS.CIV" ; "MAIL" ; "MIL" ] ;
|
||
|
|
serial = 0x7839c3d1l ; refresh = 0x2a30l ; retry = 0x384l ;
|
||
|
|
expiry = 0x127500l ; minimum = 0x2a30l
|
||
|
|
} in
|
||
|
|
Domain_name.Map.empty,
|
||
|
|
Name_rr_map.singleton (n_of_s "150.138.in-addr.arpa") Soa soa
|
||
|
|
in
|
||
|
|
let res =
|
||
|
|
create (0xD4E4, flags)
|
||
|
|
(Question.create (n_of_s "6.16.150.138.in-addr.arpa") Ptr)
|
||
|
|
(`Rcode_error (Rcode.NXDomain, Opcode.Query, Some content))
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "soa decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let soa_fail_partial () =
|
||
|
|
(* missing one byte for the SOA (minimum) *)
|
||
|
|
let data = Ohex.decode
|
||
|
|
{___|d4 e4 85 83 00 01 00 00 00 01 00 00 01 36 02 31
|
||
|
|
36 03 31 35 30 03 31 33 38 07 69 6e 2d 61 64 64
|
||
|
|
72 04 61 72 70 61 00 00 0c 00 01 03 31 35 30 03
|
||
|
|
31 33 38 07 49 4e 2d 41 44 44 52 04 41 52 50 41
|
||
|
|
00 00 06 00 01 00 00 2a 30 00 3e 05 43 4f 4e 31
|
||
|
|
52 04 4e 49 50 52 03 4d 49 4c 00 13 44 41 4e 49
|
||
|
|
45 4c 2e 57 2e 4b 4e 4f 50 50 53 2e 43 49 56 04
|
||
|
|
4d 41 49 4c c0 56 78 39 c3 d1 00 00 2a 30 00 00
|
||
|
|
03 84 00 12 75 00 00 00 2a|___}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "soa fails partial"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let soa_fail_leftover_inner () =
|
||
|
|
let data = Ohex.decode
|
||
|
|
{___|d4 e4 85 83 00 01 00 00 00 01 00 00 01 36 02 31
|
||
|
|
36 03 31 35 30 03 31 33 38 07 69 6e 2d 61 64 64
|
||
|
|
72 04 61 72 70 61 00 00 0c 00 01 03 31 35 30 03
|
||
|
|
31 33 38 07 49 4e 2d 41 44 44 52 04 41 52 50 41
|
||
|
|
00 00 06 00 01 00 00 2a 30 00 40 05 43 4f 4e 31
|
||
|
|
52 04 4e 49 50 52 03 4d 49 4c 00 13 44 41 4e 49
|
||
|
|
45 4c 2e 57 2e 4b 4e 4f 50 50 53 2e 43 49 56 04
|
||
|
|
4d 41 49 4c c0 56 78 39 c3 d1 00 00 2a 30 00 00
|
||
|
|
03 84 00 12 75 00 00 00 2a 30 00|___}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "soa fails (rdata leftover)"
|
||
|
|
(Error (`Leftover (138, ""))) (decode data))
|
||
|
|
|
||
|
|
let soa_fail_partial_inner () =
|
||
|
|
(* missing one byte for the SOA (minimum) *)
|
||
|
|
let data = Ohex.decode
|
||
|
|
{___|d4 e4 85 83 00 01 00 00 00 01 00 00 01 36 02 31
|
||
|
|
36 03 31 35 30 03 31 33 38 07 69 6e 2d 61 64 64
|
||
|
|
72 04 61 72 70 61 00 00 0c 00 01 03 31 35 30 03
|
||
|
|
31 33 38 07 49 4e 2d 41 44 44 52 04 41 52 50 41
|
||
|
|
00 00 06 00 01 00 00 2a 30 00 3e 05 43 4f 4e 31
|
||
|
|
52 04 4e 49 50 52 03 4d 49 4c 00 13 44 41 4e 49
|
||
|
|
45 4c 2e 57 2e 4b 4e 4f 50 50 53 2e 43 49 56 04
|
||
|
|
4d 41 49 4c c0 56 78 39 c3 d1 00 00 2a 30 00 00
|
||
|
|
03 84 00 12 75 00 00 00 2a 30|___}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "soa fails (rdata partial)"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let ptr_success () =
|
||
|
|
let data = Ohex.decode {|1f 71 81 80 00 01 00 01 00 00 00 00 01 31
|
||
|
|
01 31 01 31 01 31 07 69 6e 2d 61 64 64 72 04 61
|
||
|
|
72 70 61 00 00 0c 00 01 c0 0c 00 0c 00 01 00 00
|
||
|
|
02 cf 00 11 03 6f 6e 65 03 6f 6e 65 03 6f 6e 65
|
||
|
|
03 6f 6e 65 00|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "1.1.1.1.in-addr.arpa" in
|
||
|
|
let header = 0x1f71, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
Name_rr_map.singleton host Ptr (719l, n_of_s "one.one.one.one" |> Domain_name.host_exn)
|
||
|
|
in
|
||
|
|
let q = Question.create host Ptr in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "ptr decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let ptr_fail_partial () =
|
||
|
|
let data = Ohex.decode {|1f 71 81 80 00 01 00 01 00 00 00 00 01 31
|
||
|
|
01 31 01 31 01 31 07 69 6e 2d 61 64 64 72 04 61
|
||
|
|
72 70 61 00 00 0c 00 01 c0 0c 00 0c 00 01 00 00
|
||
|
|
02 cf 00 11 03 6f 6e 65 03 6f 6e 65 03 6f 6e 65
|
||
|
|
03 6f 6e 65|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "ptr fails partial"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let ptr_fail_leftover_inner () =
|
||
|
|
let data = Ohex.decode {|1f 71 81 80 00 01 00 01 00 00 00 00 01 31
|
||
|
|
01 31 01 31 01 31 07 69 6e 2d 61 64 64 72 04 61
|
||
|
|
72 70 61 00 00 0c 00 01 c0 0c 00 0c 00 01 00 00
|
||
|
|
02 cf 00 12 03 6f 6e 65 03 6f 6e 65 03 6f 6e 65
|
||
|
|
03 6f 6e 65 00 01|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "ptr fails (rdata leftover)"
|
||
|
|
(Error (`Leftover (67, ""))) (decode data))
|
||
|
|
|
||
|
|
let ptr_fail_partial_inner () =
|
||
|
|
let data = Ohex.decode {|1f 71 81 80 00 01 00 01 00 00 00 00 01 31
|
||
|
|
01 31 01 31 01 31 07 69 6e 2d 61 64 64 72 04 61
|
||
|
|
72 70 61 00 00 0c 00 01 c0 0c 00 0c 00 01 00 00
|
||
|
|
02 cf 00 11 03 6f 6e 65 03 6f 6e 65 03 6f 6e 65
|
||
|
|
03 6f 6e 65|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "ptr fails (rdata partial)"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
|
||
|
|
let mx_success () =
|
||
|
|
let data = Ohex.decode {|85 5a 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 0f 00 01 c0 0c
|
||
|
|
00 0f 00 01 00 00 0e 10 00 0f 00 0a 02 6d 78 05
|
||
|
|
72 6f 62 75 72 02 69 6f 00|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "robur.coop" in
|
||
|
|
let header = 0x855a, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
Name_rr_map.singleton host Mx
|
||
|
|
(3600l, Rr_map.Mx_set.singleton { preference = 10 ; mail_exchange = n_of_s "mx.robur.io" |> Domain_name.host_exn })
|
||
|
|
in
|
||
|
|
let q = Question.create host Mx in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "mx decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let mx_fail_partial () =
|
||
|
|
let data = Ohex.decode {|85 5a 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 0f 00 01 c0 0c
|
||
|
|
00 0f 00 01 00 00 0e 10 00 0f 00 0a 02 6d 78 05
|
||
|
|
72 6f 62 75 72 02 69 6f|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "mx fails partial"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let mx_fail_leftover_inner () =
|
||
|
|
let data = Ohex.decode {|85 5a 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 0f 00 01 c0 0c
|
||
|
|
00 0f 00 01 00 00 0e 10 00 10 00 0a 02 6d 78 05
|
||
|
|
72 6f 62 75 72 02 69 6f 00 00|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "mx fails (rdata leftover)"
|
||
|
|
(Error (`Leftover (55, ""))) (decode data))
|
||
|
|
|
||
|
|
let mx_fail_partial_inner () =
|
||
|
|
let data = Ohex.decode {|85 5a 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 0f 00 01 c0 0c
|
||
|
|
00 0f 00 01 00 00 0e 10 00 0e 00 0a 02 6d 78 05
|
||
|
|
72 6f 62 75 72 02 69 6f 00|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "mx fails (rdata partial)"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let txt_success () =
|
||
|
|
let data = Ohex.decode {|a9 f3 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 10 00 01 c0 0c
|
||
|
|
00 10 00 01 00 00 0e 10 00 0f 0e 76 3d 73 70 66
|
||
|
|
31 20 6d 78 20 2d 61 6c 6c|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "robur.coop" in
|
||
|
|
let header = 0xa9f3, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
Name_rr_map.singleton host Txt
|
||
|
|
(3600l, Rr_map.Txt_set.singleton "v=spf1 mx -all")
|
||
|
|
in
|
||
|
|
let q = Question.create host Txt in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "txt decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let txt_fail_partial () =
|
||
|
|
let data = Ohex.decode {|a9 f3 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 10 00 01 c0 0c
|
||
|
|
00 10 00 01 00 00 0e 10 00 0f 0e 76 3d 73 70 66
|
||
|
|
31 20 6d 78 20 2d 61 6c |}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "txt fails partial"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let txt_fail_partial_inner () =
|
||
|
|
let data = Ohex.decode {|a9 f3 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 10 00 01 c0 0c
|
||
|
|
00 10 00 01 00 00 0e 10 00 10 0e 76 3d 73 70 66
|
||
|
|
31 20 6d 78 20 2d 61 6c 6c 01|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "txt fails (rdata partial)"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let aaaa_success () =
|
||
|
|
let data = Ohex.decode {|c1 a8 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 1c 00 01 c0 0c
|
||
|
|
00 1c 00 01 00 00 0e 10 00 10 2a 0f 7c c7 7c c7
|
||
|
|
7c 40 00 00 00 00 00 00 01 38|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "robur.coop" in
|
||
|
|
let header = 0xc1a8, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
Name_rr_map.singleton host Aaaa
|
||
|
|
(3600l, Ipaddr.V6.Set.singleton (Ipaddr.V6.of_string_exn "2a0f:7cc7:7cc7:7c40::138"))
|
||
|
|
in
|
||
|
|
let q = Question.create host Aaaa in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "aaaa decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let aaaa_fail_partial () =
|
||
|
|
let data = Ohex.decode {|c1 a8 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 1c 00 01 c0 0c
|
||
|
|
00 1c 00 01 00 00 0e 10 00 10 2a 0f 7c c7 7c c7
|
||
|
|
7c 40 00 00 00 00 00 00 01|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "aaaa fails partial"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let aaaa_fail_leftover_inner () =
|
||
|
|
let data = Ohex.decode {|c1 a8 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 1c 00 01 c0 0c
|
||
|
|
00 1c 00 01 00 00 0e 10 00 11 2a 0f 7c c7 7c c7
|
||
|
|
7c 40 00 00 00 00 00 00 01 38 00|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "aaaa fails (rdata leftover)"
|
||
|
|
(Error (`Leftover (56, ""))) (decode data))
|
||
|
|
|
||
|
|
let aaaa_fail_partial_inner () =
|
||
|
|
let data = Ohex.decode {|c1 a8 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 00 1c 00 01 c0 0c
|
||
|
|
00 1c 00 01 00 00 0e 10 00 08 2a 0f 7c c7 7c c7
|
||
|
|
7c 40 00 00 00 00 00 00 01 38|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "aaaa fails (rdata partial)"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let srv_success () =
|
||
|
|
let data = Ohex.decode {|03 ad 81 80 00 01 00 03 00 00 00 00 0c 5f
|
||
|
|
78 6d 70 70 2d 73 65 72 76 65 72 04 5f 74 63 70
|
||
|
|
06 6a 61 62 62 65 72 03 63 63 63 02 64 65 00 00
|
||
|
|
21 00 01 c0 0c 00 21 00 01 00 00 1a 55 00 1d 00
|
||
|
|
0a 00 00 14 95 07 6a 61 62 62 65 72 64 06 6a 61
|
||
|
|
62 62 65 72 03 63 63 63 02 64 65 00 c0 0c 00 21
|
||
|
|
00 01 00 00 1a 55 00 22 00 1e 00 00 14 95 0c 6a
|
||
|
|
61 62 62 65 72 64 2d 69 70 76 36 06 6a 61 62 62
|
||
|
|
65 72 03 63 63 63 02 64 65 00 c0 0c 00 21 00 01
|
||
|
|
00 00 1a 55 00 22 00 1f 00 00 14 95 0c 6a 61 62
|
||
|
|
62 65 72 64 2d 69 70 76 34 06 6a 61 62 62 65 72
|
||
|
|
03 63 63 63 02 64 65 00|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "_xmpp-server._tcp.jabber.ccc.de" in
|
||
|
|
let header = 0x03ad, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
let srv1 = { Srv.priority = 31 ; weight = 0 ; port = 5269 ; target = n_of_s "jabberd-ipv4.jabber.ccc.de" |> Domain_name.host_exn } in
|
||
|
|
let srv2 = { srv1 with priority = 30 ; target = n_of_s "jabberd-ipv6.jabber.ccc.de" |> Domain_name.host_exn } in
|
||
|
|
let srv3 = { srv1 with priority = 10 ; target = n_of_s "jabberd.jabber.ccc.de" |> Domain_name.host_exn } in
|
||
|
|
Name_rr_map.singleton host Srv
|
||
|
|
(6741l, Rr_map.Srv_set.(add srv1 (add srv2 (singleton srv3))))
|
||
|
|
in
|
||
|
|
let q = Question.create host Srv in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "srv decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let srv_fail_partial () =
|
||
|
|
let data = Ohex.decode {|03 ad 81 80 00 01 00 03 00 00 00 00 0c 5f
|
||
|
|
78 6d 70 70 2d 73 65 72 76 65 72 04 5f 74 63 70
|
||
|
|
06 6a 61 62 62 65 72 03 63 63 63 02 64 65 00 00
|
||
|
|
21 00 01 c0 0c 00 21 00 01 00 00 1a 55 00 1d 00
|
||
|
|
0a 00 00 14 95 07 6a 61 62 62 65 72 64 06 6a 61
|
||
|
|
62 62 65 72 03 63 63 63 02 64 65 00 c0 0c 00 21
|
||
|
|
00 01 00 00 1a 55 00 22 00 1e 00 00 14 95 0c 6a
|
||
|
|
61 62 62 65 72 64 2d 69 70 76 36 06 6a 61 62 62
|
||
|
|
65 72 03 63 63 63 02 64 65 00 c0 0c 00 21 00 01
|
||
|
|
00 00 1a 55 00 22 00 1f 00 00 14 95 0c 6a 61 62
|
||
|
|
62 65 72 64 2d 69 70 76 34 06 6a 61 62 62 65 72
|
||
|
|
03 63 63 63 02 64 65|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "srv fails partial"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let srv_fail_leftover_inner () =
|
||
|
|
let data = Ohex.decode {|03 ad 81 80 00 01 00 03 00 00 00 00 0c 5f
|
||
|
|
78 6d 70 70 2d 73 65 72 76 65 72 04 5f 74 63 70
|
||
|
|
06 6a 61 62 62 65 72 03 63 63 63 02 64 65 00 00
|
||
|
|
21 00 01 c0 0c 00 21 00 01 00 00 1a 55 00 1e 00
|
||
|
|
0a 00 00 14 95 07 6a 61 62 62 65 72 64 06 6a 61
|
||
|
|
62 62 65 72 03 63 63 63 02 64 65 00 00 c0 0c 00 21
|
||
|
|
00 01 00 00 1a 55 00 22 00 1e 00 00 14 95 0c 6a
|
||
|
|
61 62 62 65 72 64 2d 69 70 76 36 06 6a 61 62 62
|
||
|
|
65 72 03 63 63 63 02 64 65 00 c0 0c 00 21 00 01
|
||
|
|
00 00 1a 55 00 22 00 1f 00 00 14 95 0c 6a 61 62
|
||
|
|
62 65 72 64 2d 69 70 76 34 06 6a 61 62 62 65 72
|
||
|
|
03 63 63 63 02 64 65 00|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "srv fails (rdata leftover)"
|
||
|
|
(Error (`Leftover (90, ""))) (decode data))
|
||
|
|
|
||
|
|
let srv_fail_partial_inner () =
|
||
|
|
let data = Ohex.decode {|03 ad 81 80 00 01 00 03 00 00 00 00 0c 5f
|
||
|
|
78 6d 70 70 2d 73 65 72 76 65 72 04 5f 74 63 70
|
||
|
|
06 6a 61 62 62 65 72 03 63 63 63 02 64 65 00 00
|
||
|
|
21 00 01 c0 0c 00 21 00 01 00 00 1a 55 00 1d 00
|
||
|
|
0a 00 00 14 95 07 6a 61 62 62 65 72 64 06 6a 61
|
||
|
|
62 62 65 72 03 63 63 63 02 64 65 00 c0 0c 00 21
|
||
|
|
00 01 00 00 1a 55 00 22 00 1e 00 00 14 95 0c 6a
|
||
|
|
61 62 62 65 72 64 2d 69 70 76 36 06 6a 61 62 62
|
||
|
|
65 72 03 63 63 63 02 64 65 00 c0 0c 00 21 00 01
|
||
|
|
00 00 1a 55 00 20 00 1f 00 00 14 95 0c 6a 61 62
|
||
|
|
62 65 72 64 2d 69 70 76 34 06 6a 61 62 62 65 72
|
||
|
|
03 63 63 63 02 64|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "srv fails (rdata partial)"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let sshfp_success () =
|
||
|
|
let data = Ohex.decode {|98 e5 81 80 00 01 00 06 00 00 00 00 0f 72
|
||
|
|
65 64 70 69 6c 6c 6c 69 6e 70 72 6f 30 31 04 72
|
||
|
|
69 6e 67 05 6e 6c 6e 6f 67 03 6e 65 74 00 00 2c
|
||
|
|
00 01 c0 0c 00 2c 00 01 00 00 02 58 00 16 03 01
|
||
|
|
3e 46 ce cd 98 60 42 e5 06 26 57 52 31 a4 a1 55
|
||
|
|
cb 0e e5 ca c0 0c 00 2c 00 01 00 00 02 58 00 22
|
||
|
|
03 02 20 cf e8 d9 06 a4 c3 8a bb be 8f 5d 04 c2
|
||
|
|
ca b8 a0 0c 8a 80 3b 51 e2 52 a1 58 5f 73 90 98
|
||
|
|
b0 2b c0 0c 00 2c 00 01 00 00 02 58 00 22 02 02
|
||
|
|
8a 07 b9 7b 96 d8 26 a7 d4 d4 03 42 4b 97 a8 cc
|
||
|
|
db 77 10 5b 52 7b e7 d7 be 83 5d 02 fd b9 cd 58
|
||
|
|
c0 0c 00 2c 00 01 00 00 02 58 00 16 01 01 5f ca
|
||
|
|
08 7a 7c 3e be bb c8 9b 22 9a 05 af d4 50 d0 8c
|
||
|
|
f9 b3 c0 0c 00 2c 00 01 00 00 02 58 00 22 01 02
|
||
|
|
cd b4 cd af 77 34 df 34 3f d5 67 e0 ca b9 2f d6
|
||
|
|
ac 5f 27 54 bf ef 79 78 26 df d4 bc f9 0f 0b af
|
||
|
|
c0 0c 00 2c 00 01 00 00 02 58 00 16 02 01 61 3f
|
||
|
|
38 9a 36 cf 33 b6 7d 9b d6 9e 38 17 85 b2 75 e1
|
||
|
|
01 cd|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "redpilllinpro01.ring.nlnog.net" in
|
||
|
|
let header = 0x98e5, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
let one = { Sshfp.algorithm = Ecdsa ; typ = SHA256 ; fingerprint = Ohex.decode "20CFE8D906A4C38ABBBE8F5D04C2CAB8A00C8A803B51E252A1585F739098B02B" } in
|
||
|
|
let two = { Sshfp.algorithm = Ecdsa ; typ = SHA1 ; fingerprint = Ohex.decode "3E46CECD986042E50626575231A4A155CB0EE5CA" } in
|
||
|
|
let three = { Sshfp.algorithm = Dsa ; typ = SHA256 ; fingerprint = Ohex.decode "8A07B97B96D826A7D4D403424B97A8CCDB77105B527BE7D7BE835D02FDB9CD58" } in
|
||
|
|
let four = { Sshfp.algorithm = Dsa ; typ = SHA1 ; fingerprint = Ohex.decode "613F389A36CF33B67D9BD69E381785B275E101CD" } in
|
||
|
|
let five = { Sshfp.algorithm = Rsa ; typ = SHA256 ; fingerprint = Ohex.decode "CDB4CDAF7734DF343FD567E0CAB92FD6AC5F2754BFEF797826DFD4BCF90F0BAF" } in
|
||
|
|
let six = { Sshfp.algorithm = Rsa ; typ = SHA1 ; fingerprint = Ohex.decode "5FCA087A7C3EBEBBC89B229A05AFD450D08CF9B3" } in
|
||
|
|
Name_rr_map.singleton host Sshfp
|
||
|
|
(600l, Rr_map.Sshfp_set.(add one (add two (add three (add four (add five (singleton six)))))))
|
||
|
|
in
|
||
|
|
let q = Question.create host Sshfp in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "sshfp decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let sshfp_fail_partial () =
|
||
|
|
let data = Ohex.decode {|98 e5 81 80 00 01 00 06 00 00 00 00 0f 72
|
||
|
|
65 64 70 69 6c 6c 6c 69 6e 70 72 6f 30 31 04 72
|
||
|
|
69 6e 67 05 6e 6c 6e 6f 67 03 6e 65 74 00 00 2c
|
||
|
|
00 01 c0 0c 00 2c 00 01 00 00 02 58 00 16 03 01
|
||
|
|
3e 46 ce cd 98 60 42 e5 06 26 57 52 31 a4 a1 55
|
||
|
|
cb 0e e5 ca c0 0c 00 2c 00 01 00 00 02 58 00 22
|
||
|
|
03 02 20 cf e8 d9 06 a4 c3 8a bb be 8f 5d 04 c2
|
||
|
|
ca b8 a0 0c 8a 80 3b 51 e2 52 a1 58 5f 73 90 98
|
||
|
|
b0 2b c0 0c 00 2c 00 01 00 00 02 58 00 22 02 02
|
||
|
|
8a 07 b9 7b 96 d8 26 a7 d4 d4 03 42 4b 97 a8 cc
|
||
|
|
db 77 10 5b 52 7b e7 d7 be 83 5d 02 fd b9 cd 58
|
||
|
|
c0 0c 00 2c 00 01 00 00 02 58 00 16 01 01 5f ca
|
||
|
|
08 7a 7c 3e be bb c8 9b 22 9a 05 af d4 50 d0 8c
|
||
|
|
f9 b3 c0 0c 00 2c 00 01 00 00 02 58 00 22 01 02
|
||
|
|
cd b4 cd af 77 34 df 34 3f d5 67 e0 ca b9 2f d6
|
||
|
|
ac 5f 27 54 bf ef 79 78 26 df d4 bc f9 0f 0b af
|
||
|
|
c0 0c 00 2c 00 01 00 00 02 58 00 16 02 01 61 3f
|
||
|
|
38 9a 36 cf 33 b6 7d 9b d6 9e 38 17 85 b2 75 e1
|
||
|
|
01|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "sshfp fails partial"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let sshfp_fail_partial_inner () =
|
||
|
|
let data = Ohex.decode {|98 e5 81 80 00 01 00 06 00 00 00 00 0f 72
|
||
|
|
65 64 70 69 6c 6c 6c 69 6e 70 72 6f 30 31 04 72
|
||
|
|
69 6e 67 05 6e 6c 6e 6f 67 03 6e 65 74 00 00 2c
|
||
|
|
00 01 c0 0c 00 2c 00 01 00 00 02 58 00 16 03 01
|
||
|
|
3e 46 ce cd 98 60 42 e5 06 26 57 52 31 a4 a1 55
|
||
|
|
cb 0e e5 ca c0 0c 00 2c 00 01 00 00 02 58 00 22
|
||
|
|
03 02 20 cf e8 d9 06 a4 c3 8a bb be 8f 5d 04 c2
|
||
|
|
ca b8 a0 0c 8a 80 3b 51 e2 52 a1 58 5f 73 90 98
|
||
|
|
b0 2b c0 0c 00 2c 00 01 00 00 02 58 00 22 02 02
|
||
|
|
8a 07 b9 7b 96 d8 26 a7 d4 d4 03 42 4b 97 a8 cc
|
||
|
|
db 77 10 5b 52 7b e7 d7 be 83 5d 02 fd b9 cd 58
|
||
|
|
c0 0c 00 2c 00 01 00 00 02 58 00 16 01 01 5f ca
|
||
|
|
08 7a 7c 3e be bb c8 9b 22 9a 05 af d4 50 d0 8c
|
||
|
|
f9 b3 c0 0c 00 2c 00 01 00 00 02 58 00 22 01 02
|
||
|
|
cd b4 cd af 77 34 df 34 3f d5 67 e0 ca b9 2f d6
|
||
|
|
ac 5f 27 54 bf ef 79 78 26 df d4 bc f9 0f 0b af
|
||
|
|
c0 0c 00 2c 00 01 00 00 02 58 00 00|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "sshfp fails (rdata partial)"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let tlsa_success () =
|
||
|
|
let data = Ohex.decode {|e1 bf 81 80 00 01 00 04 00 00 00 00 0c 5f
|
||
|
|
6c 65 74 73 65 6e 63 72 79 70 74 04 5f 74 63 70
|
||
|
|
05 72 6f 62 75 72 04 63 6f 6f 70 00 00 34 00 01
|
||
|
|
c0 0c 00 34 00 01 00 00 0e 10 05 1d 00 00 00 30
|
||
|
|
82 05 16 30 82 02 fe a0 03 02 01 02 02 11 00 91
|
||
|
|
2b 08 4a cf 0c 18 a7 53 f6 d6 2e 25 a7 5f 5a 30
|
||
|
|
0d 06 09 2a 86 48 86 f7 0d 01 01 0b 05 00 30 4f
|
||
|
|
31 0b 30 09 06 03 55 04 06 13 02 55 53 31 29 30
|
||
|
|
27 06 03 55 04 0a 13 20 49 6e 74 65 72 6e 65 74
|
||
|
|
20 53 65 63 75 72 69 74 79 20 52 65 73 65 61 72
|
||
|
|
63 68 20 47 72 6f 75 70 31 15 30 13 06 03 55 04
|
||
|
|
03 13 0c 49 53 52 47 20 52 6f 6f 74 20 58 31 30
|
||
|
|
1e 17 0d 32 30 30 39 30 34 30 30 30 30 30 30 5a
|
||
|
|
17 0d 32 35 30 39 31 35 31 36 30 30 30 30 5a 30
|
||
|
|
32 31 0b 30 09 06 03 55 04 06 13 02 55 53 31 16
|
||
|
|
30 14 06 03 55 04 0a 13 0d 4c 65 74 27 73 20 45
|
||
|
|
6e 63 72 79 70 74 31 0b 30 09 06 03 55 04 03 13
|
||
|
|
02 52 33 30 82 01 22 30 0d 06 09 2a 86 48 86 f7
|
||
|
|
0d 01 01 01 05 00 03 82 01 0f 00 30 82 01 0a 02
|
||
|
|
82 01 01 00 bb 02 15 28 cc f6 a0 94 d3 0f 12 ec
|
||
|
|
8d 55 92 c3 f8 82 f1 99 a6 7a 42 88 a7 5d 26 aa
|
||
|
|
b5 2b b9 c5 4c b1 af 8e 6b f9 75 c8 a3 d7 0f 47
|
||
|
|
94 14 55 35 57 8c 9e a8 a2 39 19 f5 82 3c 42 a9
|
||
|
|
4e 6e f5 3b c3 2e db 8d c0 b0 5c f3 59 38 e7 ed
|
||
|
|
cf 69 f0 5a 0b 1b be c0 94 24 25 87 fa 37 71 b3
|
||
|
|
13 e7 1c ac e1 9b ef db e4 3b 45 52 45 96 a9 c1
|
||
|
|
53 ce 34 c8 52 ee b5 ae ed 8f de 60 70 e2 a5 54
|
||
|
|
ab b6 6d 0e 97 a5 40 34 6b 2b d3 bc 66 eb 66 34
|
||
|
|
7c fa 6b 8b 8f 57 29 99 f8 30 17 5d ba 72 6f fb
|
||
|
|
81 c5 ad d2 86 58 3d 17 c7 e7 09 bb f1 2b f7 86
|
||
|
|
dc c1 da 71 5d d4 46 e3 cc ad 25 c1 88 bc 60 67
|
||
|
|
75 66 b3 f1 18 f7 a2 5c e6 53 ff 3a 88 b6 47 a5
|
||
|
|
ff 13 18 ea 98 09 77 3f 9d 53 f9 cf 01 e5 f5 a6
|
||
|
|
70 17 14 af 63 a4 ff 99 b3 93 9d dc 53 a7 06 fe
|
||
|
|
48 85 1d a1 69 ae 25 75 bb 13 cc 52 03 f5 ed 51
|
||
|
|
a1 8b db 15 02 03 01 00 01 a3 82 01 08 30 82 01
|
||
|
|
04 30 0e 06 03 55 1d 0f 01 01 ff 04 04 03 02 01
|
||
|
|
86 30 1d 06 03 55 1d 25 04 16 30 14 06 08 2b 06
|
||
|
|
01 05 05 07 03 02 06 08 2b 06 01 05 05 07 03 01
|
||
|
|
30 12 06 03 55 1d 13 01 01 ff 04 08 30 06 01 01
|
||
|
|
ff 02 01 00 30 1d 06 03 55 1d 0e 04 16 04 14 14
|
||
|
|
2e b3 17 b7 58 56 cb ae 50 09 40 e6 1f af 9d 8b
|
||
|
|
14 c2 c6 30 1f 06 03 55 1d 23 04 18 30 16 80 14
|
||
|
|
79 b4 59 e6 7b b6 e5 e4 01 73 80 08 88 c8 1a 58
|
||
|
|
f6 e9 9b 6e 30 32 06 08 2b 06 01 05 05 07 01 01
|
||
|
|
04 26 30 24 30 22 06 08 2b 06 01 05 05 07 30 02
|
||
|
|
86 16 68 74 74 70 3a 2f 2f 78 31 2e 69 2e 6c 65
|
||
|
|
6e 63 72 2e 6f 72 67 2f 30 27 06 03 55 1d 1f 04
|
||
|
|
20 30 1e 30 1c a0 1a a0 18 86 16 68 74 74 70 3a
|
||
|
|
2f 2f 78 31 2e 63 2e 6c 65 6e 63 72 2e 6f 72 67
|
||
|
|
2f 30 22 06 03 55 1d 20 04 1b 30 19 30 08 06 06
|
||
|
|
67 81 0c 01 02 01 30 0d 06 0b 2b 06 01 04 01 82
|
||
|
|
df 13 01 01 01 30 0d 06 09 2a 86 48 86 f7 0d 01
|
||
|
|
01 0b 05 00 03 82 02 01 00 85 ca 4e 47 3e a3 f7
|
||
|
|
85 44 85 bc d5 67 78 b2 98 63 ad 75 4d 1e 96 3d
|
||
|
|
33 65 72 54 2d 81 a0 ea c3 ed f8 20 bf 5f cc b7
|
||
|
|
70 00 b7 6e 3b f6 5e 94 de e4 20 9f a6 ef 8b b2
|
||
|
|
03 e7 a2 b5 16 3c 91 ce b4 ed 39 02 e7 7c 25 8a
|
||
|
|
47 e6 65 6e 3f 46 f4 d9 f0 ce 94 2b ee 54 ce 12
|
||
|
|
bc 8c 27 4b b8 c1 98 2f a2 af cd 71 91 4a 08 b7
|
||
|
|
c8 b8 23 7b 04 2d 08 f9 08 57 3e 83 d9 04 33 0a
|
||
|
|
47 21 78 09 82 27 c3 2a c8 9b b9 ce 5c f2 64 c8
|
||
|
|
c0 be 79 c0 4f 8e 6d 44 0c 5e 92 bb 2e f7 8b 10
|
||
|
|
e1 e8 1d 44 29 db 59 20 ed 63 b9 21 f8 12 26 94
|
||
|
|
93 57 a0 1d 65 04 c1 0a 22 ae 10 0d 43 97 a1 18
|
||
|
|
1f 7e e0 e0 86 37 b5 5a b1 bd 30 bf 87 6e 2b 2a
|
||
|
|
ff 21 4e 1b 05 c3 f5 18 97 f0 5e ac c3 a5 b8 6a
|
||
|
|
f0 2e bc 3b 33 b9 ee 4b de cc fc e4 af 84 0b 86
|
||
|
|
3f c0 55 43 36 f6 68 e1 36 17 6a 8e 99 d1 ff a5
|
||
|
|
40 a7 34 b7 c0 d0 63 39 35 39 75 6e f2 ba 76 c8
|
||
|
|
93 02 e9 a9 4b 6c 17 ce 0c 02 d9 bd 81 fb 9f b7
|
||
|
|
68 d4 06 65 b3 82 3d 77 53 f8 8e 79 03 ad 0a 31
|
||
|
|
07 75 2a 43 d8 55 97 72 c4 29 0e f7 c4 5d 4e c8
|
||
|
|
ae 46 84 30 d7 f2 85 5f 18 a1 79 bb e7 5e 70 8b
|
||
|
|
07 e1 86 93 c3 b9 8f dc 61 71 25 2a af df ed 25
|
||
|
|
50 52 68 8b 92 dc e5 d6 b5 e3 da 7d d0 87 6c 84
|
||
|
|
21 31 ae 82 f5 fb b9 ab c8 89 17 3d e1 4c e5 38
|
||
|
|
0e f6 bd 2b bd 96 81 14 eb d5 db 3d 20 a7 7e 59
|
||
|
|
d3 e2 f8 58 f9 5b b8 48 cd fe 5c 4f 16 29 fe 1e
|
||
|
|
55 23 af c8 11 b0 8d ea 7c 93 90 17 2f fd ac a2
|
||
|
|
09 47 46 3f f0 e9 b0 b7 ff 28 4d 68 32 d6 67 5e
|
||
|
|
1e 69 a3 93 b8 f5 9d 8b 2f 0b d2 52 43 a6 6f 32
|
||
|
|
57 65 4d 32 81 df 38 53 85 5d 7e 5d 66 29 ea b8
|
||
|
|
dd e4 95 b5 cd b5 56 12 42 cd c4 4e c6 25 38 44
|
||
|
|
50 6d ec ce 00 55 18 fe e9 49 64 d4 4e ca 97 9c
|
||
|
|
b4 5b c0 73 a8 ab b8 47 c2 c0 0c 00 34 00 01 00
|
||
|
|
00 0e 10 05 67 00 00 00 30 82 05 60 30 82 04 48
|
||
|
|
a0 03 02 01 02 02 10 40 01 77 21 37 d4 e9 42 b8
|
||
|
|
ee 76 aa 3c 64 0a b7 30 0d 06 09 2a 86 48 86 f7
|
||
|
|
0d 01 01 0b 05 00 30 3f 31 24 30 22 06 03 55 04
|
||
|
|
0a 13 1b 44 69 67 69 74 61 6c 20 53 69 67 6e 61
|
||
|
|
74 75 72 65 20 54 72 75 73 74 20 43 6f 2e 31 17
|
||
|
|
30 15 06 03 55 04 03 13 0e 44 53 54 20 52 6f 6f
|
||
|
|
74 20 43 41 20 58 33 30 1e 17 0d 32 31 30 31 32
|
||
|
|
30 31 39 31 34 30 33 5a 17 0d 32 34 30 39 33 30
|
||
|
|
31 38 31 34 30 33 5a 30 4f 31 0b 30 09 06 03 55
|
||
|
|
04 06 13 02 55 53 31 29 30 27 06 03 55 04 0a 13
|
||
|
|
20 49 6e 74 65 72 6e 65 74 20 53 65 63 75 72 69
|
||
|
|
74 79 20 52 65 73 65 61 72 63 68 20 47 72 6f 75
|
||
|
|
70 31 15 30 13 06 03 55 04 03 13 0c 49 53 52 47
|
||
|
|
20 52 6f 6f 74 20 58 31 30 82 02 22 30 0d 06 09
|
||
|
|
2a 86 48 86 f7 0d 01 01 01 05 00 03 82 02 0f 00
|
||
|
|
30 82 02 0a 02 82 02 01 00 ad e8 24 73 f4 14 37
|
||
|
|
f3 9b 9e 2b 57 28 1c 87 be dc b7 df 38 90 8c 6e
|
||
|
|
3c e6 57 a0 78 f7 75 c2 a2 fe f5 6a 6e f6 00 4f
|
||
|
|
28 db de 68 86 6c 44 93 b6 b1 63 fd 14 12 6b bf
|
||
|
|
1f d2 ea 31 9b 21 7e d1 33 3c ba 48 f5 dd 79 df
|
||
|
|
b3 b8 ff 12 f1 21 9a 4b c1 8a 86 71 69 4a 66 66
|
||
|
|
6c 8f 7e 3c 70 bf ad 29 22 06 f3 e4 c0 e6 80 ae
|
||
|
|
e2 4b 8f b7 99 7e 94 03 9f d3 47 97 7c 99 48 23
|
||
|
|
53 e8 38 ae 4f 0a 6f 83 2e d1 49 57 8c 80 74 b6
|
||
|
|
da 2f d0 38 8d 7b 03 70 21 1b 75 f2 30 3c fa 8f
|
||
|
|
ae dd da 63 ab eb 16 4f c2 8e 11 4b 7e cf 0b e8
|
||
|
|
ff b5 77 2e f4 b2 7b 4a e0 4c 12 25 0c 70 8d 03
|
||
|
|
29 a0 e1 53 24 ec 13 d9 ee 19 bf 10 b3 4a 8c 3f
|
||
|
|
89 a3 61 51 de ac 87 07 94 f4 63 71 ec 2e e2 6f
|
||
|
|
5b 98 81 e1 89 5c 34 79 6c 76 ef 3b 90 62 79 e6
|
||
|
|
db a4 9a 2f 26 c5 d0 10 e1 0e de d9 10 8e 16 fb
|
||
|
|
b7 f7 a8 f7 c7 e5 02 07 98 8f 36 08 95 e7 e2 37
|
||
|
|
96 0d 36 75 9e fb 0e 72 b1 1d 9b bc 03 f9 49 05
|
||
|
|
d8 81 dd 05 b4 2a d6 41 e9 ac 01 76 95 0a 0f d8
|
||
|
|
df d5 bd 12 1f 35 2f 28 17 6c d2 98 c1 a8 09 64
|
||
|
|
77 6e 47 37 ba ce ac 59 5e 68 9d 7f 72 d6 89 c5
|
||
|
|
06 41 29 3e 59 3e dd 26 f5 24 c9 11 a7 5a a3 4c
|
||
|
|
40 1f 46 a1 99 b5 a7 3a 51 6e 86 3b 9e 7d 72 a7
|
||
|
|
12 05 78 59 ed 3e 51 78 15 0b 03 8f 8d d0 2f 05
|
||
|
|
b2 3e 7b 4a 1c 4b 73 05 12 fc c6 ea e0 50 13 7c
|
||
|
|
43 93 74 b3 ca 74 e7 8e 1f 01 08 d0 30 d4 5b 71
|
||
|
|
36 b4 07 ba c1 30 30 5c 48 b7 82 3b 98 a6 7d 60
|
||
|
|
8a a2 a3 29 82 cc ba bd 83 04 1b a2 83 03 41 a1
|
||
|
|
d6 05 f1 1b c2 b6 f0 a8 7c 86 3b 46 a8 48 2a 88
|
||
|
|
dc 76 9a 76 bf 1f 6a a5 3d 19 8f eb 38 f3 64 de
|
||
|
|
c8 2b 0d 0a 28 ff f7 db e2 15 42 d4 22 d0 27 5d
|
||
|
|
e1 79 fe 18 e7 70 88 ad 4e e6 d9 8b 3a c6 dd 27
|
||
|
|
51 6e ff bc 64 f5 33 43 4f 02 03 01 00 01 a3 82
|
||
|
|
01 46 30 82 01 42 30 0f 06 03 55 1d 13 01 01 ff
|
||
|
|
04 05 30 03 01 01 ff 30 0e 06 03 55 1d 0f 01 01
|
||
|
|
ff 04 04 03 02 01 06 30 4b 06 08 2b 06 01 05 05
|
||
|
|
07 01 01 04 3f 30 3d 30 3b 06 08 2b 06 01 05 05
|
||
|
|
07 30 02 86 2f 68 74 74 70 3a 2f 2f 61 70 70 73
|
||
|
|
2e 69 64 65 6e 74 72 75 73 74 2e 63 6f 6d 2f 72
|
||
|
|
6f 6f 74 73 2f 64 73 74 72 6f 6f 74 63 61 78 33
|
||
|
|
2e 70 37 63 30 1f 06 03 55 1d 23 04 18 30 16 80
|
||
|
|
14 c4 a7 b1 a4 7b 2c 71 fa db e1 4b 90 75 ff c4
|
||
|
|
15 60 85 89 10 30 54 06 03 55 1d 20 04 4d 30 4b
|
||
|
|
30 08 06 06 67 81 0c 01 02 01 30 3f 06 0b 2b 06
|
||
|
|
01 04 01 82 df 13 01 01 01 30 30 30 2e 06 08 2b
|
||
|
|
06 01 05 05 07 02 01 16 22 68 74 74 70 3a 2f 2f
|
||
|
|
63 70 73 2e 72 6f 6f 74 2d 78 31 2e 6c 65 74 73
|
||
|
|
65 6e 63 72 79 70 74 2e 6f 72 67 30 3c 06 03 55
|
||
|
|
1d 1f 04 35 30 33 30 31 a0 2f a0 2d 86 2b 68 74
|
||
|
|
74 70 3a 2f 2f 63 72 6c 2e 69 64 65 6e 74 72 75
|
||
|
|
73 74 2e 63 6f 6d 2f 44 53 54 52 4f 4f 54 43 41
|
||
|
|
58 33 43 52 4c 2e 63 72 6c 30 1d 06 03 55 1d 0e
|
||
|
|
04 16 04 14 79 b4 59 e6 7b b6 e5 e4 01 73 80 08
|
||
|
|
88 c8 1a 58 f6 e9 9b 6e 30 0d 06 09 2a 86 48 86
|
||
|
|
f7 0d 01 01 0b 05 00 03 82 01 01 00 0a 73 00 6c
|
||
|
|
96 6e ff 0e 52 d0 ae dd 8c e7 5a 06 ad 2f a8 e3
|
||
|
|
8f bf c9 0a 03 15 50 c2 e5 6c 42 bb 6f 9b f4 b4
|
||
|
|
4f c2 44 88 08 75 cc eb 07 9b 14 62 6e 78 de ec
|
||
|
|
27 ba 39 5c f5 a2 a1 6e 56 94 70 10 53 b1 bb e4
|
||
|
|
af d0 a2 c3 2b 01 d4 96 f4 c5 20 35 33 f9 d8 61
|
||
|
|
36 e0 71 8d b4 b8 b5 aa 82 45 95 c0 f2 a9 23 28
|
||
|
|
e7 d6 a1 cb 67 08 da a0 43 2c aa 1b 93 1f c9 de
|
||
|
|
f5 ab 69 5d 13 f5 5b 86 58 22 ca 4d 55 e4 70 67
|
||
|
|
6d c2 57 c5 46 39 41 cf 8a 58 83 58 6d 99 fe 57
|
||
|
|
e8 36 0e f0 0e 23 aa fd 88 97 d0 e3 5c 0e 94 49
|
||
|
|
b5 b5 17 35 d2 2e bf 4e 85 ef 18 e0 85 92 eb 06
|
||
|
|
3b 6c 29 23 09 60 dc 45 02 4c 12 18 3b e9 fb 0e
|
||
|
|
de dc 44 f8 58 98 ae ea bd 45 45 a1 88 5d 66 ca
|
||
|
|
fe 10 e9 6f 82 c8 11 42 0d fb e9 ec e3 86 00 de
|
||
|
|
9d 10 e3 38 fa a4 7d b1 d8 e8 49 82 84 06 9b 2b
|
||
|
|
e8 6b 4f 01 0c 38 77 2e f9 dd e7 39 c0 0c 00 34
|
||
|
|
00 01 00 00 0e 10 06 2f 03 00 00 30 82 06 28 30
|
||
|
|
82 05 10 a0 03 02 01 02 02 12 04 09 7c 41 de ea
|
||
|
|
77 a0 69 44 37 dc 69 e0 a3 83 4f 5b 30 0d 06 09
|
||
|
|
2a 86 48 86 f7 0d 01 01 0b 05 00 30 32 31 0b 30
|
||
|
|
09 06 03 55 04 06 13 02 55 53 31 16 30 14 06 03
|
||
|
|
55 04 0a 13 0d 4c 65 74 27 73 20 45 6e 63 72 79
|
||
|
|
70 74 31 0b 30 09 06 03 55 04 03 13 02 52 33 30
|
||
|
|
1e 17 0d 32 31 31 31 30 37 32 33 35 33 32 32 5a
|
||
|
|
17 0d 32 32 30 32 30 35 32 33 35 33 32 31 5a 30
|
||
|
|
15 31 13 30 11 06 03 55 04 03 13 0a 72 6f 62 75
|
||
|
|
72 2e 63 6f 6f 70 30 82 02 22 30 0d 06 09 2a 86
|
||
|
|
48 86 f7 0d 01 01 01 05 00 03 82 02 0f 00 30 82
|
||
|
|
02 0a 02 82 02 01 00 96 91 31 29 a2 12 3b 13 13
|
||
|
|
a2 b7 cc 36 fc 16 a2 e7 a1 0b ad 87 dc 84 7e 26
|
||
|
|
b5 44 f7 0d 30 60 33 b4 12 d9 de 0f 4a df d0 08
|
||
|
|
5a 5d b5 9c 2b 40 38 d9 f3 46 54 e7 ba fd d1 3f
|
||
|
|
c7 f3 76 4d 88 5c e6 31 99 29 24 86 ed 95 99 f4
|
||
|
|
d4 49 2a 5a dc 4b db 62 43 c7 2e e7 1a b8 19 b3
|
||
|
|
1d bd e7 0b ca 51 38 82 f7 20 d3 5d c4 e4 41 34
|
||
|
|
38 25 91 7c d9 de 39 5e 20 1d 24 ed a7 43 76 da
|
||
|
|
6a 68 7b 3a 11 43 a0 ab ad 66 4f 8a 69 c6 de 3d
|
||
|
|
a0 a1 6d 65 0d 80 27 6b 7f db 82 76 38 93 20 44
|
||
|
|
01 87 3a 2a a9 0f f4 80 7a 90 a6 d9 3b fe 74 57
|
||
|
|
e9 f6 41 48 0e ad 4d 69 4c 4f 80 e7 15 9b c8 95
|
||
|
|
8c 27 c3 8d 57 33 f5 0d d0 ee e8 9b 00 f4 0e 66
|
||
|
|
d5 d4 97 96 c1 e2 96 13 f6 66 90 57 9e 9a 81 36
|
||
|
|
f6 4a 74 74 bf 00 bf 6a 81 ce 48 0b 83 de 90 27
|
||
|
|
55 80 56 74 92 44 1a da 2e 52 9d 68 07 0d 7a c3
|
||
|
|
97 9e 3e 6d 03 65 68 18 b0 41 27 7e cf b6 96 0a
|
||
|
|
4f 7f 43 79 3f 2d 40 69 0f 71 21 f8 f1 ad 65 2d
|
||
|
|
19 76 cd 64 6f f1 56 f6 ed 08 c3 b2 1c bf 07 22
|
||
|
|
65 44 70 24 f9 74 fb 57 8a 33 a8 c5 0b a5 85 9c
|
||
|
|
98 7a 86 71 81 0a c4 f1 f7 a7 95 f6 36 06 81 77
|
||
|
|
a1 0c 67 98 7a c8 a4 11 60 c7 19 ea 23 23 b7 35
|
||
|
|
fd d9 51 27 f7 94 21 be 80 4a e0 eb 9d 1c 6e 20
|
||
|
|
5f 5b 99 f1 3d 4f 89 af ce fe c7 af 75 c7 c2 88
|
||
|
|
c6 e3 60 1e 11 e9 cd 02 db db d6 77 ed 2d 58 a0
|
||
|
|
06 5c bf 8d 29 04 03 24 fd ef 4e 31 73 b9 b6 03
|
||
|
|
0e ce ba 8b 54 c1 60 78 0e 70 1a 53 45 de 06 ba
|
||
|
|
59 fe cd 81 c4 65 e9 18 a1 c5 85 5c ac a1 b1 1a
|
||
|
|
5b 29 d3 11 de aa 75 b7 d8 ef 4a 92 64 36 d8 e5
|
||
|
|
19 86 59 50 18 ec c6 9d df 69 b7 fa cc e5 e7 18
|
||
|
|
e4 27 7f e0 00 c9 e5 4d 2f f0 75 49 2a b6 60 a8
|
||
|
|
77 1d 8f a3 a4 f9 73 29 2c e9 85 46 2f d4 45 72
|
||
|
|
f6 e5 14 66 46 e3 91 02 03 01 00 01 a3 82 02 53
|
||
|
|
30 82 02 4f 30 0e 06 03 55 1d 0f 01 01 ff 04 04
|
||
|
|
03 02 05 a0 30 1d 06 03 55 1d 25 04 16 30 14 06
|
||
|
|
08 2b 06 01 05 05 07 03 01 06 08 2b 06 01 05 05
|
||
|
|
07 03 02 30 0c 06 03 55 1d 13 01 01 ff 04 02 30
|
||
|
|
00 30 1d 06 03 55 1d 0e 04 16 04 14 55 e7 90 35
|
||
|
|
fe 74 5b 6b e5 ca a8 dd 5f 53 82 86 b2 3c 09 c8
|
||
|
|
30 1f 06 03 55 1d 23 04 18 30 16 80 14 14 2e b3
|
||
|
|
17 b7 58 56 cb ae 50 09 40 e6 1f af 9d 8b 14 c2
|
||
|
|
c6 30 55 06 08 2b 06 01 05 05 07 01 01 04 49 30
|
||
|
|
47 30 21 06 08 2b 06 01 05 05 07 30 01 86 15 68
|
||
|
|
74 74 70 3a 2f 2f 72 33 2e 6f 2e 6c 65 6e 63 72
|
||
|
|
2e 6f 72 67 30 22 06 08 2b 06 01 05 05 07 30 02
|
||
|
|
86 16 68 74 74 70 3a 2f 2f 72 33 2e 69 2e 6c 65
|
||
|
|
6e 63 72 2e 6f 72 67 2f 30 23 06 03 55 1d 11 04
|
||
|
|
1c 30 1a 82 0c 2a 2e 72 6f 62 75 72 2e 63 6f 6f
|
||
|
|
70 82 0a 72 6f 62 75 72 2e 63 6f 6f 70 30 4c 06
|
||
|
|
03 55 1d 20 04 45 30 43 30 08 06 06 67 81 0c 01
|
||
|
|
02 01 30 37 06 0b 2b 06 01 04 01 82 df 13 01 01
|
||
|
|
01 30 28 30 26 06 08 2b 06 01 05 05 07 02 01 16
|
||
|
|
1a 68 74 74 70 3a 2f 2f 63 70 73 2e 6c 65 74 73
|
||
|
|
65 6e 63 72 79 70 74 2e 6f 72 67 30 82 01 04 06
|
||
|
|
0a 2b 06 01 04 01 d6 79 02 04 02 04 81 f5 04 81
|
||
|
|
f2 00 f0 00 76 00 41 c8 ca b1 df 22 46 4a 10 c6
|
||
|
|
a1 3a 09 42 87 5e 4e 31 8b 1b 03 eb eb 4b c7 68
|
||
|
|
f0 90 62 96 06 f6 00 00 01 7c fd 09 12 ca 00 00
|
||
|
|
04 03 00 47 30 45 02 21 00 e8 f7 7f 83 2d 24 c2
|
||
|
|
29 0f f7 bb 07 67 7a e8 8b 0a c2 c3 8b 96 ac c7
|
||
|
|
ad cd bf 73 84 78 29 1e 64 02 20 10 5f d7 9c 34
|
||
|
|
ed bc f8 28 ee 51 7a 5d 5d 2c c6 00 07 a6 1c a2
|
||
|
|
90 5b 63 66 23 43 18 cb cd 3d 73 00 76 00 29 79
|
||
|
|
be f0 9e 39 39 21 f0 56 73 9f 63 a5 77 e5 be 57
|
||
|
|
7d 9c 60 0a f8 f9 4d 5d 26 5c 25 5d c7 84 00 00
|
||
|
|
01 7c fd 09 12 9e 00 00 04 03 00 47 30 45 02 20
|
||
|
|
3a 16 29 28 f0 cd b6 36 7d 14 80 a1 5b 58 95 26
|
||
|
|
f5 97 9c ce 94 cc 44 7b f6 57 8b 6b de 49 a8 36
|
||
|
|
02 21 00 c7 30 ff 24 79 9c 05 36 62 ca 7a 6b ad
|
||
|
|
d6 d4 de 80 80 cb 4a ef 44 d5 6b da bb 95 87 2c
|
||
|
|
8e e7 bd 30 0d 06 09 2a 86 48 86 f7 0d 01 01 0b
|
||
|
|
05 00 03 82 01 01 00 78 ee 1c bf 34 f4 4e 3f ca
|
||
|
|
14 3f ba db 36 d5 1e b0 d7 fa 75 f5 c7 4e de fb
|
||
|
|
37 73 80 7f 9c 55 5a 15 4a 70 21 a1 42 e7 9c 24
|
||
|
|
34 0d c6 6b 0d 2d ec fc 3c e2 9e e7 cc 05 fb 57
|
||
|
|
0d b1 f8 9e 6f fb fc 95 20 18 5e 02 72 7b 8f df
|
||
|
|
01 e3 fe 8e a2 13 35 a5 ae ff 3d 86 fd 98 9d 33
|
||
|
|
7f 75 2d 16 89 61 a0 34 be 5e a9 28 83 a5 38 25
|
||
|
|
08 46 db e6 5c 84 62 8b 09 f4 9a 2e ad b3 24 c4
|
||
|
|
01 18 df d6 6d d7 cb 96 72 64 09 b6 2b 87 76 cf
|
||
|
|
36 43 93 1c a3 c2 fc a8 99 94 0a 0e c4 ae 2e 04
|
||
|
|
66 0a d2 0d 4e b3 eb 27 f0 db 14 35 25 89 d0 2b
|
||
|
|
a1 b4 8a 9d b2 6f 21 01 da 93 d3 b2 52 c9 2c ca
|
||
|
|
97 d8 20 7d a1 2f 87 95 90 cb 3c c5 56 a9 d5 9a
|
||
|
|
9f 46 fe fe e2 3c bf 2c 7c 53 02 72 fc a2 25 87
|
||
|
|
81 68 d5 eb 31 f4 12 19 e9 21 0c 9c 90 91 4d 85
|
||
|
|
db 50 c2 44 df a0 10 6a 53 cc 8f 80 cb ff 78 11
|
||
|
|
7d a2 54 5d 8d df 79 c0 0c 00 34 00 01 00 00 0e
|
||
|
|
10 04 97 03 ff 00 30 82 04 90 30 82 02 78 02 01
|
||
|
|
00 30 15 31 13 30 11 06 03 55 04 03 0c 0a 72 6f
|
||
|
|
62 75 72 2e 63 6f 6f 70 30 82 02 22 30 0d 06 09
|
||
|
|
2a 86 48 86 f7 0d 01 01 01 05 00 03 82 02 0f 00
|
||
|
|
30 82 02 0a 02 82 02 01 00 96 91 31 29 a2 12 3b
|
||
|
|
13 13 a2 b7 cc 36 fc 16 a2 e7 a1 0b ad 87 dc 84
|
||
|
|
7e 26 b5 44 f7 0d 30 60 33 b4 12 d9 de 0f 4a df
|
||
|
|
d0 08 5a 5d b5 9c 2b 40 38 d9 f3 46 54 e7 ba fd
|
||
|
|
d1 3f c7 f3 76 4d 88 5c e6 31 99 29 24 86 ed 95
|
||
|
|
99 f4 d4 49 2a 5a dc 4b db 62 43 c7 2e e7 1a b8
|
||
|
|
19 b3 1d bd e7 0b ca 51 38 82 f7 20 d3 5d c4 e4
|
||
|
|
41 34 38 25 91 7c d9 de 39 5e 20 1d 24 ed a7 43
|
||
|
|
76 da 6a 68 7b 3a 11 43 a0 ab ad 66 4f 8a 69 c6
|
||
|
|
de 3d a0 a1 6d 65 0d 80 27 6b 7f db 82 76 38 93
|
||
|
|
20 44 01 87 3a 2a a9 0f f4 80 7a 90 a6 d9 3b fe
|
||
|
|
74 57 e9 f6 41 48 0e ad 4d 69 4c 4f 80 e7 15 9b
|
||
|
|
c8 95 8c 27 c3 8d 57 33 f5 0d d0 ee e8 9b 00 f4
|
||
|
|
0e 66 d5 d4 97 96 c1 e2 96 13 f6 66 90 57 9e 9a
|
||
|
|
81 36 f6 4a 74 74 bf 00 bf 6a 81 ce 48 0b 83 de
|
||
|
|
90 27 55 80 56 74 92 44 1a da 2e 52 9d 68 07 0d
|
||
|
|
7a c3 97 9e 3e 6d 03 65 68 18 b0 41 27 7e cf b6
|
||
|
|
96 0a 4f 7f 43 79 3f 2d 40 69 0f 71 21 f8 f1 ad
|
||
|
|
65 2d 19 76 cd 64 6f f1 56 f6 ed 08 c3 b2 1c bf
|
||
|
|
07 22 65 44 70 24 f9 74 fb 57 8a 33 a8 c5 0b a5
|
||
|
|
85 9c 98 7a 86 71 81 0a c4 f1 f7 a7 95 f6 36 06
|
||
|
|
81 77 a1 0c 67 98 7a c8 a4 11 60 c7 19 ea 23 23
|
||
|
|
b7 35 fd d9 51 27 f7 94 21 be 80 4a e0 eb 9d 1c
|
||
|
|
6e 20 5f 5b 99 f1 3d 4f 89 af ce fe c7 af 75 c7
|
||
|
|
c2 88 c6 e3 60 1e 11 e9 cd 02 db db d6 77 ed 2d
|
||
|
|
58 a0 06 5c bf 8d 29 04 03 24 fd ef 4e 31 73 b9
|
||
|
|
b6 03 0e ce ba 8b 54 c1 60 78 0e 70 1a 53 45 de
|
||
|
|
06 ba 59 fe cd 81 c4 65 e9 18 a1 c5 85 5c ac a1
|
||
|
|
b1 1a 5b 29 d3 11 de aa 75 b7 d8 ef 4a 92 64 36
|
||
|
|
d8 e5 19 86 59 50 18 ec c6 9d df 69 b7 fa cc e5
|
||
|
|
e7 18 e4 27 7f e0 00 c9 e5 4d 2f f0 75 49 2a b6
|
||
|
|
60 a8 77 1d 8f a3 a4 f9 73 29 2c e9 85 46 2f d4
|
||
|
|
45 72 f6 e5 14 66 46 e3 91 02 03 01 00 01 a0 36
|
||
|
|
30 34 06 09 2a 86 48 86 f7 0d 01 09 0e 31 27 30
|
||
|
|
25 30 23 06 03 55 1d 11 04 1c 30 1a 82 0a 72 6f
|
||
|
|
62 75 72 2e 63 6f 6f 70 82 0c 2a 2e 72 6f 62 75
|
||
|
|
72 2e 63 6f 6f 70 30 0d 06 09 2a 86 48 86 f7 0d
|
||
|
|
01 01 0b 05 00 03 82 02 01 00 61 48 df c1 bf 34
|
||
|
|
8f ee ef e6 f2 e6 df 2d 28 e3 38 8e 6d b2 fb 9a
|
||
|
|
34 30 36 20 19 81 2d 4a e0 35 68 78 4f f2 07 7b
|
||
|
|
84 a1 08 d7 4a 0d a5 6c e3 12 af 25 d7 de 7b f3
|
||
|
|
8f b0 15 d1 95 7d 0b bf e3 a3 84 37 2d 48 bd 3c
|
||
|
|
77 f0 65 a5 e6 8f 5d 7b d2 05 2b 1e a8 e0 71 39
|
||
|
|
e0 4d f4 d5 df 42 f5 5d b2 c4 5e 4f 9f 66 86 24
|
||
|
|
9a 99 aa 7d f9 bc 08 48 4a 49 50 11 a0 11 a6 c5
|
||
|
|
00 1c c9 73 30 e9 04 b3 4e 84 65 38 56 58 bd 53
|
||
|
|
05 be c9 19 d0 f1 74 04 87 a9 62 89 63 fa 5f a5
|
||
|
|
84 98 5b 75 f1 b7 18 14 a7 78 4c a2 d1 2e a8 0f
|
||
|
|
a8 00 7d 03 ca bd 15 06 a9 e0 02 f7 35 33 14 ec
|
||
|
|
73 03 d4 36 07 09 69 26 41 61 12 6e 86 88 88 24
|
||
|
|
2e 81 41 35 29 b1 f5 19 ae aa 72 d1 0d 83 09 05
|
||
|
|
cd 0b 75 f2 33 d9 cc e8 d7 e4 ac 74 30 ec 6f 16
|
||
|
|
3a bb c6 2a f6 be 65 8d 61 2e ee f4 98 d7 2e 7c
|
||
|
|
c1 1e d5 0a c7 60 87 58 c8 01 93 41 40 54 2f b2
|
||
|
|
d8 51 11 bf 23 38 0f e9 63 63 0c 0f f7 1a d4 2b
|
||
|
|
ad 01 c2 28 86 76 d2 18 bb 10 e1 55 ca 21 15 7f
|
||
|
|
fe 6b 6f 63 c7 a1 e3 46 bb e8 24 2e 84 cb 9f 03
|
||
|
|
f3 e7 34 a5 63 56 95 3d 79 06 5e 00 c6 5d c6 89
|
||
|
|
6a a5 de a9 f0 2d 76 5b 7b 42 2f 08 25 94 6f 18
|
||
|
|
d8 0d 3d 6f b9 18 fc 19 1d 8b 56 50 ce 78 af e8
|
||
|
|
4d e0 4a e7 65 f4 15 09 11 b3 40 51 9d a9 b9 50
|
||
|
|
f3 0b e8 7d 30 ff ed 43 6a 28 1b e7 93 29 90 1f
|
||
|
|
9f 33 3c 95 ce 9a 8e 9f b0 1b b8 58 4a 5e 87 b4
|
||
|
|
d2 c8 6d 2d 35 42 14 87 23 a3 e1 ec 44 d9 10 cf
|
||
|
|
0a 76 4b f8 ee 97 23 3c f6 c8 9f 6a ee dd 72 e6
|
||
|
|
b9 c0 f8 1a 64 fa 68 1e 28 8e 8b 44 e7 04 7c d8
|
||
|
|
8e 1f c9 97 7e 62 57 39 38 cb 4b f0 88 ec c2 d0
|
||
|
|
bd 9d 34 25 ba fb 35 e5 36 8d b9 4b 10 70 15 52
|
||
|
|
a5 7d d9 96 bc 67 09 54 0d 15 c5 2a b0 0d 0b f7
|
||
|
|
67 c6 4a 30 2f 37 36 78 1d 34|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "_letsencrypt._tcp.robur.coop" in
|
||
|
|
let header = 0xe1bf, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
let tlsa1 = { Tlsa.cert_usage = Domain_issued_certificate ; selector = Private ; matching_type = No_hash ; data = Ohex.decode "308204903082027802010030153113301106035504030C0A726F6275722E636F6F7030820222300D06092A864886F70D01010105000382020F003082020A028202010096913129A2123B1313A2B7CC36FC16A2E7A10BAD87DC847E26B544F70D306033B412D9DE0F4ADFD0085A5DB59C2B4038D9F34654E7BAFDD13FC7F3764D885CE63199292486ED9599F4D4492A5ADC4BDB6243C72EE71AB819B31DBDE70BCA513882F720D35DC4E441343825917CD9DE395E201D24EDA74376DA6A687B3A1143A0ABAD664F8A69C6DE3DA0A16D650D80276B7FDB82763893204401873A2AA90FF4807A90A6D93BFE7457E9F641480EAD4D694C4F80E7159BC8958C27C38D5733F50DD0EEE89B00F40E66D5D49796C1E29613F66690579E9A8136F64A7474BF00BF6A81CE480B83DE90275580567492441ADA2E529D68070D7AC3979E3E6D03656818B041277ECFB6960A4F7F43793F2D40690F7121F8F1AD652D1976CD646FF156F6ED08C3B21CBF072265447024F974FB578A33A8C50BA5859C987A8671810AC4F1F7A795F636068177A10C67987AC8A41160C719EA2323B735FDD95127F79421BE804AE0EB9D1C6E205F5B99F13D4F89AFCEFEC7AF75C7C288C6E3601E11E9CD02DBDBD677ED2D58A0065CBF8D29040324FDEF4E3173B9B6030ECEBA8B54C160780E701A5345DE06BA59FECD81C465E918A1C5855CACA1B11A5B29D311DEAA75B7D8EF4A926436D8E51986595018ECC69DDF69B7FACCE5E718E4277FE000C9E54D2FF075492AB660A8771D8FA3A4F973292CE985462FD44572F6E5146646E3910203010001A036303406092A864886F70D01090E3127302530230603551D11041C301A820A726F6275722E636F6F70820C2A2E726F6275722E636F6F70300D06092A864886F70D01010B050003820201006148DFC1BF348FEEEFE6F2E6DF2D28E3388E6DB2FB9A3430362019812D4AE03568784FF2077B84A108D74A0DA56CE312AF25D7DE7BF38FB015D1957D0BBFE3A384372D48BD3C77F065A5E68F5D7BD2052B1EA8E07139E04DF4D5DF42F55DB2C45E4F9F6686249A99AA7DF9BC08484A495011A011A6C5001CC97330E904B34E8465385658BD5305BEC919D0F1740487A9628963FA5FA584985B75F1B71814A7784CA2D12EA80FA8007D03CABD1506A9E002F7353314EC7303D436070969264161126E868888242E81413529B1F519AEAA72D10D830905CD0B75F233D9CCE8D7E4AC7430EC6F163ABBC62AF6BE658D612EEEF498D72E7CC11ED50AC7608758C801934140542FB2D85111BF23380FE963630C0FF71AD42BAD01C2288676D218BB10E155CA21157FFE6B6F63C7A1E346BBE8242E84CB9F03F3E734A56356953D79065E00C65DC6896AA5DEA9F02D765B7B422F0825946F18D80D3D6FB918FC191D8B5650CE78AFE84DE04AE765F4150911B340519DA9B950F30BE87D30FFED436A281BE79329901F9F333C95CE9A8E9FB01BB8584A5E87B4D2C86D2D3542148723A3E1EC44D910CF0A764BF8EE97233CF6C89F6AEEDD72E6B9C0F81A64FA681E288E8B44E7047CD88E1FC9977E62573938CB4BF088ECC2D0BD9D3425BAFB35E5368DB94B10701552A57DD996BC6709540D15C52AB00D0BF767C64A302F3736781D34" } in
|
||
|
|
let tlsa2 = { Tlsa.cert_usage = Domain_issued_certificate ; selector = Full_certificate ; matching_type = No_hash ; data = Ohex.decode "3082062830820510A003020102021204097C41DEEA77A0694437DC69E0A3834F5B300D06092A864886F70D01010B05003032310B300906035504061302555331163014060355040A130D4C6574277320456E6372797074310B3009060355040313025233301E170D3231313130373233353332325A170D3232303230353233353332315A3015311330110603550403130A726F6275722E636F6F7030820222300D06092A864886F70D01010105000382020F003082020A028202010096913129A2123B1313A2B7CC36FC16A2E7A10BAD87DC847E26B544F70D306033B412D9DE0F4ADFD0085A5DB59C2B4038D9F34654E7BAFDD13FC7F3764D885CE63199292486ED9599F4D4492A5ADC4BDB6243C72EE71AB819B31DBDE70BCA513882F720D35DC4E441343825917CD9DE395E201D24EDA74376DA6A687B3A1143A0ABAD664F8A69C6DE3DA0A16D650D80276B7FDB82763893204401873A2AA90FF4807A90A6D93BFE7457E9F641480EAD4D694C4F80E7159BC8958C27C38D5733F50DD0EEE89B00F40E66D5D49796C1E29613F66690579E9A8136F64A7474BF00BF6A81CE480B83DE90275580567492441ADA2E529D68070D7AC3979E3E6D03656818B041277ECFB6960A4F7F43793F2D40690F7121F8F1AD652D1976CD646FF156F6ED08C3B21CBF072265447024F974FB578A33A8C50BA5859C987A8671810AC4F1F7A795F636068177A10C67987AC8A41160C719EA2323B735FDD95127F79421BE804AE0EB9D1C6E205F5B99F13D4F89AFCEFEC7AF75C7C288C6E3601E11E9CD02DBDBD677ED2D58A0065CBF8D29040324FDEF4E3173B9B6030ECEBA8B54C160780E701A5345DE06BA59FECD81C465E918A1C5855CACA1B11A5B29D311DEAA75B7D8EF4A926436D8E51986595018ECC69DDF69B7FACCE5E718E4277FE000C9E54D2FF075492AB660A8771D8FA3A4F973292CE985462FD44572F6E5146646E3910203010001A38202533082024F300E0603551D0F0101FF0404030205A0301D0603551D250416301406082B0601050507030106082B06010505070302300C0603551D130101FF04023000301D0603551D0E0416041455E79035FE745B6BE5CAA8DD5F538286B23C09C8301F0603551D23041830168014142EB317B75856CBAE500940E61FAF9D8B14C2C6305506082B0601050507010104493047302106082B060105050730018615687474703A2F2F72332E6F2E6C656E63722E6F7267302206082B060105050730028616687474703A2F2F72332E692E6C656E63722E6F72672F30230603551D11041C301A820C2A2E726F6275722E636F6F70820A726F6275722E636F6F70304C0603551D20044530433008060667810C0102013037060B2B0601040182DF130101013028302606082B06010505070201161A687474703A2F2F6370732E6C657473656E63727970742E6F726730820104060A2B06010401D6790204020481F50481F200F000760041C8CAB1DF22464A10C6A13A0942875E4E318B1B03EBEB4BC768F090629606F60000017CFD0912CA0000040300473045022100E8F77F832D24C2290FF7BB07677AE88B0AC2C38B96ACC7ADCDBF738478291E640220105FD79C34EDBCF828EE517A5D5D2CC60007A61CA2905B6366234318CBCD3D730076002979BEF09E393921F056739F63A577E5BE577D9C600AF8F94D5D265C255DC7840000017CFD09129E000004030047304502203A162928F0CDB6367D1480A15B589526F5979CCE94CC447BF6578B6BDE49A836022100C730FF24799C053662CA7A6BADD6D4DE8080CB4AEF44D56BDABB95872C8EE7BD300D06092A864886F70D01010B0500038201010078EE1CBF34F44E3FCA143FBADB36D51EB0D7FA75F5C74EDEFB3773807F9C555A154A7021A142E79C24340DC66B0D2DECFC3CE29EE7CC05FB570DB1F89E6FFBFC9520185E02727B8FDF01E3FE8EA21335A5AEFF3D86FD989D337F752D168961A034BE5EA92883A538250846DBE65C84628B09F49A2EADB324C40118DFD66DD7CB96726409B62B8776CF3643931CA3C2FCA899940A0EC4AE2E04660AD20D4EB3EB27F0DB14352589D02BA1B48A9DB26F2101DA93D3B252C92CCA97D8207DA12F879590CB3CC556A9D59A9F46FEFEE23CBF2C7C530272FCA225878168D5EB31F41219E9210C9C90914D85DB50C244DFA0106A53CC8F80CBFF78117DA2545D8DDF79" } in
|
||
|
|
let tlsa3 = { Tlsa.cert_usage =CA_constraint ; selector = Full_certificate; matching_type = No_hash ; data = Ohex.decode "3082056030820448A00302010202104001772137D4E942B8EE76AA3C640AB7300D06092A864886F70D01010B0500303F31243022060355040A131B4469676974616C205369676E617475726520547275737420436F2E311730150603550403130E44535420526F6F74204341205833301E170D3231303132303139313430335A170D3234303933303138313430335A304F310B300906035504061302555331293027060355040A1320496E7465726E65742053656375726974792052657365617263682047726F7570311530130603550403130C4953524720526F6F7420583130820222300D06092A864886F70D01010105000382020F003082020A0282020100ADE82473F41437F39B9E2B57281C87BEDCB7DF38908C6E3CE657A078F775C2A2FEF56A6EF6004F28DBDE68866C4493B6B163FD14126BBF1FD2EA319B217ED1333CBA48F5DD79DFB3B8FF12F1219A4BC18A8671694A66666C8F7E3C70BFAD292206F3E4C0E680AEE24B8FB7997E94039FD347977C99482353E838AE4F0A6F832ED149578C8074B6DA2FD0388D7B0370211B75F2303CFA8FAEDDDA63ABEB164FC28E114B7ECF0BE8FFB5772EF4B27B4AE04C12250C708D0329A0E15324EC13D9EE19BF10B34A8C3F89A36151DEAC870794F46371EC2EE26F5B9881E1895C34796C76EF3B906279E6DBA49A2F26C5D010E10EDED9108E16FBB7F7A8F7C7E50207988F360895E7E237960D36759EFB0E72B11D9BBC03F94905D881DD05B42AD641E9AC0176950A0FD8DFD5BD121F352F28176CD298C1A80964776E4737BACEAC595E689D7F72D689C50641293E593EDD26F524C911A75AA34C401F46A199B5A73A516E863B9E7D72A712057859ED3E5178150B038F8DD02F05B23E7B4A1C4B730512FCC6EAE050137C439374B3CA74E78E1F0108D030D45B7136B407BAC130305C48B7823B98A67D608AA2A32982CCBABD83041BA2830341A1D605F11BC2B6F0A87C863B46A8482A88DC769A76BF1F6AA53D198FEB38F364DEC82B0D0A28FFF7DBE21542D422D0275DE179FE18E77088AD4EE6D98B3AC6DD27516EFFBC64F533434F0203010001A382014630820142300F0603551D130101FF040530030101FF300E0603551D0F0101FF040403020106304B06082B06010505070101043F303D303B06082B06010505073002862F687474703A2F2F617070732E6964656E74727573742E636F6D2F726F6F74732F647374726F6F74636178332E703763301F0603551D23041830168014C4A7B1A47B2C71FADBE14B9075FFC4156085891030540603551D20044D304B3008060667810C010201303F060B2B0601040182DF130101013030302E06082B060105050702011622687474703A2F2F6370732E726F6F742D78312E6C657473656E63727970742E6F7267303C0603551D1F043530333031A02FA02D862B687474703A2F2F63726C2E6964656E74727573742E636F6D2F445354524F4F544341583343524C2E63726C301D0603551D0E0416041479B459E67BB6E5E40173800888C81A58F6E99B6E300D06092A864886F70D01010B050003820101000A73006C966EFF0E52D0AEDD8CE75A06AD2FA8E38FBFC90A031550C2E56C42BB6F9BF4B44FC244880875CCEB079B14626E78DEEC27BA395CF5A2A16E5694701053B1BBE4AFD0A2C32B01D496F4C5203533F9D86136E0718DB4B8B5AA824595C0F2A92328E7D6A1CB6708DAA0432CAA1B931FC9DEF5AB695D13F55B865822CA4D55E470676DC257C5463941CF8A5883586D99FE57E8360EF00E23AAFD8897D0E35C0E9449B5B51735D22EBF4E85EF18E08592EB063B6C29230960DC45024C12183BE9FB0EDEDC44F85898AEEABD4545A1885D66CAFE10E96F82C811420DFBE9ECE38600DE9D10E338FAA47DB1D8E8498284069B2BE86B4F010C38772EF9DDE739" } in
|
||
|
|
let tlsa4 = { Tlsa.cert_usage = CA_constraint ; selector = Full_certificate ; matching_type = No_hash ; data = Ohex.decode "30820516308202FEA003020102021100912B084ACF0C18A753F6D62E25A75F5A300D06092A864886F70D01010B0500304F310B300906035504061302555331293027060355040A1320496E7465726E65742053656375726974792052657365617263682047726F7570311530130603550403130C4953524720526F6F74205831301E170D3230303930343030303030305A170D3235303931353136303030305A3032310B300906035504061302555331163014060355040A130D4C6574277320456E6372797074310B300906035504031302523330820122300D06092A864886F70D01010105000382010F003082010A0282010100BB021528CCF6A094D30F12EC8D5592C3F882F199A67A4288A75D26AAB52BB9C54CB1AF8E6BF975C8A3D70F4794145535578C9EA8A23919F5823C42A94E6EF53BC32EDB8DC0B05CF35938E7EDCF69F05A0B1BBEC094242587FA3771B313E71CACE19BEFDBE43B45524596A9C153CE34C852EEB5AEED8FDE6070E2A554ABB66D0E97A540346B2BD3BC66EB66347CFA6B8B8F572999F830175DBA726FFB81C5ADD286583D17C7E709BBF12BF786DCC1DA715DD446E3CCAD25C188BC60677566B3F118F7A25CE653FF3A88B647A5FF1318EA9809773F9D53F9CF01E5F5A6701714AF63A4FF99B3939DDC53A706FE48851DA169AE2575BB13CC5203F5ED51A18BDB150203010001A382010830820104300E0603551D0F0101FF040403020186301D0603551D250416301406082B0601050507030206082B0601050507030130120603551D130101FF040830060101FF020100301D0603551D0E04160414142EB317B75856CBAE500940E61FAF9D8B14C2C6301F0603551D2304183016801479B459E67BB6E5E40173800888C81A58F6E99B6E303206082B0601050507010104263024302206082B060105050730028616687474703A2F2F78312E692E6C656E63722E6F72672F30270603551D1F0420301E301CA01AA0188616687474703A2F2F78312E632E6C656E63722E6F72672F30220603551D20041B30193008060667810C010201300D060B2B0601040182DF13010101300D06092A864886F70D01010B0500038202010085CA4E473EA3F7854485BCD56778B29863AD754D1E963D336572542D81A0EAC3EDF820BF5FCCB77000B76E3BF65E94DEE4209FA6EF8BB203E7A2B5163C91CEB4ED3902E77C258A47E6656E3F46F4D9F0CE942BEE54CE12BC8C274BB8C1982FA2AFCD71914A08B7C8B8237B042D08F908573E83D904330A472178098227C32AC89BB9CE5CF264C8C0BE79C04F8E6D440C5E92BB2EF78B10E1E81D4429DB5920ED63B921F81226949357A01D6504C10A22AE100D4397A1181F7EE0E08637B55AB1BD30BF876E2B2AFF214E1B05C3F51897F05EACC3A5B86AF02EBC3B33B9EE4BDECCFCE4AF840B863FC0554336F668E136176A8E99D1FFA540A734B7C0D063393539756EF2BA76C89302E9A94B6C17CE0C02D9BD81FB9FB768D40665B3823D7753F88E7903AD0A3107752A43D8559772C4290EF7C45D4EC8AE468430D7F2855F18A179BBE75E708B07E18693C3B98FDC6171252AAFDFED255052688B92DCE5D6B5E3DA7DD0876C842131AE82F5FBB9ABC889173DE14CE5380EF6BD2BBD968114EBD5DB3D20A77E59D3E2F858F95BB848CDFE5C4F1629FE1E5523AFC811B08DEA7C9390172FFDACA20947463FF0E9B0B7FF284D6832D6675E1E69A393B8F59D8B2F0BD25243A66F3257654D3281DF3853855D7E5D6629EAB8DDE495B5CDB5561242CDC44EC6253844506DECCE005518FEE94964D44ECA979CB45BC073A8ABB847C2" } in
|
||
|
|
Name_rr_map.singleton host Tlsa
|
||
|
|
(3600l, Rr_map.Tlsa_set.(add tlsa1 (add tlsa2 (add tlsa3 (singleton tlsa4)))))
|
||
|
|
in
|
||
|
|
let q = Question.create host Tlsa in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "tlsa decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let caa_success () =
|
||
|
|
let data = Ohex.decode {|2b 9b 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 01 01 00 01 c0 0c
|
||
|
|
01 01 00 01 00 00 0e 10 00 16 80 05 69 73 73 75
|
||
|
|
65 6c 65 74 73 65 6e 63 72 79 70 74 2e 6f 72 67|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "robur.coop" in
|
||
|
|
let header = 0x2b9b, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
let one = { Caa.critical = true ; tag = "issue" ; value = [ "letsencrypt.org" ] } in
|
||
|
|
Name_rr_map.singleton host Caa
|
||
|
|
(3600l, Rr_map.Caa_set.singleton one)
|
||
|
|
in
|
||
|
|
let q = Question.create host Caa in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "caa decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let caa_fail_partial () =
|
||
|
|
let data = Ohex.decode {|2b 9b 81 80 00 01 00 01 00 00 00 00 05 72
|
||
|
|
6f 62 75 72 04 63 6f 6f 70 00 01 01 00 01 c0 0c
|
||
|
|
01 01 00 01 00 00 0e 10 00 16 80 05 69 73 73 75
|
||
|
|
65 6c 65 74 73 65 6e 63 72 79 70 74 2e 6f 72|}
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "caa fails partial"
|
||
|
|
(Error `Partial) (decode data))
|
||
|
|
|
||
|
|
|
||
|
|
let dnskey_success () =
|
||
|
|
let data = Ohex.decode {| 58 1d 81 80 00 01 00 03 00 00 00 00 04 63
|
||
|
|
6f 6f 70 00 00 30 00 01 c0 0c 00 30 00 01 00 00
|
||
|
|
0d bd 00 88 01 00 03 08 03 01 00 01 b0 16 c5 b1
|
||
|
|
c0 a1 ea c9 9d 1c ae 3d 38 32 21 e4 c3 77 5c 0b
|
||
|
|
fa e2 c0 cd ed c5 6d 37 0e af a0 53 5c 28 6b d3
|
||
|
|
d5 82 54 7f db 42 5f 03 d3 11 e7 76 70 27 4b 22
|
||
|
|
03 69 30 25 a4 8f d6 ea 9d 2c db ac 7d ce c2 a8
|
||
|
|
fc 86 85 29 1f ab f9 ce c0 b3 ee 30 d5 22 61 44
|
||
|
|
01 24 ff 6d 87 4f 9e d4 75 88 94 b0 f7 52 59 f5
|
||
|
|
dd 79 3e dd 64 ea e7 0c be 16 37 f8 75 48 0d 47
|
||
|
|
8c 8f 0f d0 9f c0 18 b1 55 6e 41 55 c0 0c 00 30
|
||
|
|
00 01 00 00 0d bd 01 08 01 01 03 08 03 01 00 01
|
||
|
|
ca cf de 90 a8 08 b4 0f 11 ee c1 ca 55 13 43 65
|
||
|
|
97 a6 db d8 03 6a fa 1a 61 09 f4 aa 2a 0f 18 77
|
||
|
|
fd 59 35 4a dc b8 e2 bd c6 b4 80 86 83 f2 5c cb
|
||
|
|
5b fc 5f ce 4b 60 0c 6d c4 1c fe 0e 64 cb 30 78
|
||
|
|
5b f0 cb 53 bf 5f 3b a3 bc e1 37 6b 9d eb b8 3d
|
||
|
|
29 66 47 9c 6e 8d 1b a6 76 a9 20 97 6a c9 f8 bf
|
||
|
|
24 e2 50 69 24 03 a1 5f c2 e4 45 29 72 3a 20 24
|
||
|
|
6e 76 df f3 97 88 5b 74 32 f2 de df e6 ef a3 3e
|
||
|
|
1e ab d2 e2 74 dc 6d ac b8 7a b9 d2 7d 63 5d f7
|
||
|
|
2c 83 be 26 6f 67 50 2e 47 e2 94 98 e6 0c bf cf
|
||
|
|
ee 1a 98 1c 0f 0c 1a 2e 1f 79 45 a8 f5 7b bb a4
|
||
|
|
ab 6a da fc e4 f4 c6 48 36 81 a0 7d 7a 1b 11 80
|
||
|
|
ab f1 0d 22 54 0f 13 cd c8 41 e3 3a c1 18 2d c2
|
||
|
|
28 9b b0 38 1b 5a 1a ed 5d 16 93 57 b7 88 02 f1
|
||
|
|
da 7f 4d 44 56 fa 7a 3b 7b 3e f9 dd 1f ec df c3
|
||
|
|
df f4 5d 0d b5 03 e3 f5 84 db 42 fe 32 e3 ae 85
|
||
|
|
c0 0c 00 30 00 01 00 00 0d bd 00 88 01 00 03 08
|
||
|
|
03 01 00 01 dd 67 34 bc 81 f1 b2 92 5c a6 af a2
|
||
|
|
99 93 d9 48 94 8b cc 0f c4 81 7c 8d f2 85 23 68
|
||
|
|
27 fd 2f 9f 37 fb 92 b8 34 0b cc d3 c8 36 e7 14
|
||
|
|
d7 17 7f 6d 78 0c f9 90 43 59 f8 7f 3d 90 f0 a6
|
||
|
|
aa 30 1b 5b 84 61 1b 3c bf d4 ee ba 21 d2 45 a6
|
||
|
|
d6 a5 77 fe f7 e2 cd 87 a8 7b da 6e c5 7c e3 86
|
||
|
|
87 a4 ae 6c f4 1b ac 0e 8e 0a ca fb 77 3d 76 b4
|
||
|
|
de 2d 10 09 cd 92 95 24 0d 7d 2f 0a dd 02 4b ce
|
||
|
|
9f 23 f8 0d|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "coop" in
|
||
|
|
let header = 0x581d, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and keys =
|
||
|
|
let key1 =
|
||
|
|
let b64 = "AwEAAcrP3pCoCLQPEe7BylUTQ2WXptvYA2r6GmEJ9KoqDxh3/Vk1Sty44r3GtICGg/Jcy1v8X85LYAxtxBz+DmTLMHhb8MtTv187o7zhN2ud67g9KWZHnG6NG6Z2qSCXasn4vyTiUGkkA6FfwuRFKXI6ICRudt/zl4hbdDLy3t/m76M+HqvS4nTcbay4ernSfWNd9yyDviZvZ1AuR+KUmOYMv8/uGpgcDwwaLh95Raj1e7ukq2ra/OT0xkg2gaB9ehsRgKvxDSJUDxPNyEHjOsEYLcIom7A4G1oa7V0Wk1e3iALx2n9NRFb6ejt7PvndH+zfw9/0XQ21A+P1hNtC/jLjroU=" in
|
||
|
|
Dnskey.({
|
||
|
|
flags = F.add `Zone (F.singleton `Secure_entry_point) ;
|
||
|
|
algorithm = RSA_SHA256 ;
|
||
|
|
key = Base64.decode_exn b64})
|
||
|
|
and key2 =
|
||
|
|
let b64 = "AwEAAbAWxbHAoerJnRyuPTgyIeTDd1wL+uLAze3FbTcOr6BTXChr09WCVH/bQl8D0xHndnAnSyIDaTAlpI/W6p0s26x9zsKo/IaFKR+r+c7As+4w1SJhRAEk/22HT57UdYiUsPdSWfXdeT7dZOrnDL4WN/h1SA1HjI8P0J/AGLFVbkFV" in
|
||
|
|
Dnskey.({
|
||
|
|
flags = F.singleton `Zone ;
|
||
|
|
algorithm = RSA_SHA256 ;
|
||
|
|
key = Base64.decode_exn b64})
|
||
|
|
and key3 =
|
||
|
|
let b64 = "AwEAAd1nNLyB8bKSXKavopmT2UiUi8wPxIF8jfKFI2gn/S+fN/uSuDQLzNPINucU1xd/bXgM+ZBDWfh/PZDwpqowG1uEYRs8v9TuuiHSRabWpXf+9+LNh6h72m7FfOOGh6SubPQbrA6OCsr7dz12tN4tEAnNkpUkDX0vCt0CS86fI/gN" in
|
||
|
|
Dnskey.({
|
||
|
|
flags = F.singleton `Zone ;
|
||
|
|
algorithm = RSA_SHA256 ;
|
||
|
|
key = Base64.decode_exn b64})
|
||
|
|
in
|
||
|
|
Name_rr_map.singleton host Dnskey
|
||
|
|
(3517l, Rr_map.Dnskey_set.(add key3 (add key2 (singleton key1))))
|
||
|
|
in
|
||
|
|
let q = Question.create host Dnskey in
|
||
|
|
let res = create header q (`Answer (keys, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "dnskey decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let ds_success () =
|
||
|
|
let data = Ohex.decode {|04 1f 81 80 00 01 00 02 00 00 00 00 04 63
|
||
|
|
6f 6f 70 00 00 2b 00 01 c0 0c 00 2b 00 01 00 01
|
||
|
|
31 c3 00 18 26 e9 08 01 f9 37 0f ae af 0b 84 64
|
||
|
|
b7 c8 80 21 36 a0 3f c9 6d 8f f2 00 c0 0c 00 2b
|
||
|
|
00 01 00 01 31 c3 00 24 26 e9 08 02 74 64 84 9b
|
||
|
|
6c 08 38 40 30 d1 35 d1 56 55 96 91 db 98 80 4c
|
||
|
|
e1 da b9 89 14 47 ca 45 b5 94 ef 36|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "coop" in
|
||
|
|
let header = 0x041f, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
let ds1 = Ds.{ key_tag = 9961 ; algorithm = Dnskey.RSA_SHA256 ; digest_type = SHA256 ; digest = Ohex.decode "7464849B6C08384030D135D156559691DB98804CE1DAB9891447CA45B594EF36"}
|
||
|
|
and ds2 = Ds.{ key_tag = 9961 ; algorithm = Dnskey.RSA_SHA256 ; digest_type = SHA1 ; digest = Ohex.decode "F9370FAEAF0B8464B7C8802136A03FC96D8FF200" }
|
||
|
|
in
|
||
|
|
Name_rr_map.singleton host Ds
|
||
|
|
(78275l, Rr_map.Ds_set.(add ds2 (singleton ds1)))
|
||
|
|
in
|
||
|
|
let q = Question.create host Ds in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "ds decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let rrsig_success () =
|
||
|
|
let data = Ohex.decode {|6d ec 81 80 00 01 00 03 00 00 00 01 0a 63
|
||
|
|
6c 6f 75 64 66 6c 61 72 65 03 63 6f 6d 00 00 01
|
||
|
|
00 01 c0 0c 00 01 00 01 00 00 01 29 00 04 68 10
|
||
|
|
85 e5 c0 0c 00 01 00 01 00 00 01 29 00 04 68 10
|
||
|
|
84 e5 c0 0c 00 2e 00 01 00 00 01 29 00 62 00 01
|
||
|
|
0d 02 00 00 01 2c 61 ce 06 6f 61 cb 47 4f 86 c9
|
||
|
|
0a 63 6c 6f 75 64 66 6c 61 72 65 03 63 6f 6d 00
|
||
|
|
7c 4a c3 54 38 74 f0 0f f4 db ed 58 7f e4 aa aa
|
||
|
|
0b bf bd 83 2a cc c1 f0 42 55 44 7b ad 43 9e 83
|
||
|
|
ba 58 0c 38 a3 7c 1a e7 13 fe bf 8e dd 39 6b 6d
|
||
|
|
c3 c2 06 9e 82 87 8e db 5c fa 88 82 b9 ee 5a c6
|
||
|
|
00 00 29 20 00 00 00 80 00 00 00|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "cloudflare.com" in
|
||
|
|
let header = 0x6DEC, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
let of_d_t d t = Option.get (Ptime.of_date_time (d, t)) in
|
||
|
|
let a = 297l, Ipaddr.V4.Set.(add (Ipaddr.V4.of_string_exn "104.16.133.229") (singleton (Ipaddr.V4.of_string_exn "104.16.132.229")))
|
||
|
|
and rrsig =
|
||
|
|
297l,
|
||
|
|
Rr_map.Rrsig_set.singleton
|
||
|
|
Rrsig.{ type_covered = 1 ; algorithm = Dnskey.P256_SHA256 ; label_count = 2 ; original_ttl = 300l ;
|
||
|
|
signature_expiration = of_d_t (2021, 12, 30) ((19, 20, 15), 0) ;
|
||
|
|
signature_inception = of_d_t (2021, 12, 28) ((17, 20, 15), 0) ;
|
||
|
|
key_tag = 34505 ;
|
||
|
|
signer_name = n_of_s "cloudflare.com" ;
|
||
|
|
signature = Base64.decode_exn "fErDVDh08A/02+1Yf+Sqqgu/vYMqzMHwQlVEe61DnoO6WAw4o3wa5xP+v47dOWttw8IGnoKHjttc+oiCue5axg=="
|
||
|
|
}
|
||
|
|
in
|
||
|
|
Domain_name.Map.singleton host
|
||
|
|
Rr_map.(add A a (singleton Rrsig rrsig))
|
||
|
|
in
|
||
|
|
let q = Question.create host A in
|
||
|
|
let edns = Edns.create ~dnssec_ok:true ~payload_size:8192 () in
|
||
|
|
let res = create ~edns header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "rrsig decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let nsec_success () =
|
||
|
|
let data = Ohex.decode {|38 51 81 80 00 01 00 01 00 00 00 00 06 66
|
||
|
|
6f 6f 6f 6f 6f 0a 63 6c 6f 75 64 66 6c 61 72 65
|
||
|
|
03 63 6f 6d 00 00 2f 00 01 c0 0c 00 2f 00 01 00
|
||
|
|
00 01 2c 00 21 01 00 06 66 6f 6f 6f 6f 6f 0a 63
|
||
|
|
6c 6f 75 64 66 6c 61 72 65 03 63 6f 6d 00 00 06
|
||
|
|
00 00 00 00 00 03|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "fooooo.cloudflare.com" in
|
||
|
|
let header = 0x3851, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
let nsec = Nsec.{ next_domain = n_of_s "\000.fooooo.cloudflare.com" ; types = Bit_map.(add 47 (singleton 46)) } in
|
||
|
|
Name_rr_map.singleton host Nsec
|
||
|
|
(300l, nsec)
|
||
|
|
in
|
||
|
|
let q = Question.create host Nsec in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "nsec decodes"
|
||
|
|
(Ok res) (decode data));
|
||
|
|
let encoded, _ = Packet.encode `Udp res in
|
||
|
|
Alcotest.(check bool "nsec encodes" true (String.equal data encoded))
|
||
|
|
|
||
|
|
let nsec_success2 () =
|
||
|
|
let data = Ohex.decode {|38 51 81 80 00 01 00 01 00 00 00 00 06 66
|
||
|
|
6f 6f 6f 6f 6f 0a 63 6c 6f 75 64 66 6c 61 72 65
|
||
|
|
03 63 6f 6d 00 00 2f 00 01 c0 0c 00 2f 00 01 00
|
||
|
|
00 01 2c 00 22 01 00 06 66 6f 6f 6f 6f 6f 0a 63
|
||
|
|
6c 6f 75 64 66 6c 61 72 65 03 63 6f 6d 00 00 07
|
||
|
|
22 00 00 00 00 03 80|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "fooooo.cloudflare.com" in
|
||
|
|
let header = 0x3851, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
let types = Bit_map.of_list [ 2 ; 6 ; 46; 47; 48 ] in
|
||
|
|
let nsec = Nsec.{ next_domain = n_of_s "\000.fooooo.cloudflare.com" ; types } in
|
||
|
|
Name_rr_map.singleton host Nsec
|
||
|
|
(300l, nsec)
|
||
|
|
in
|
||
|
|
let q = Question.create host Nsec in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "nsec decodes"
|
||
|
|
(Ok res) (decode data));
|
||
|
|
let encoded, _ = Packet.encode `Udp res in
|
||
|
|
Alcotest.(check bool "nsec encodes" true (String.equal data encoded))
|
||
|
|
|
||
|
|
let nsec3_success () =
|
||
|
|
let data = Ohex.decode {|8f ab 81 83 00 01 00 00 00 06 00 01 03 61
|
||
|
|
61 61 05 73 73 68 66 70 03 6e 65 74 00 00 2b 00
|
||
|
|
01 c0 10 00 06 00 01 00 00 00 85 00 3b 03 6e 73
|
||
|
|
30 08 77 65 62 65 72 64 6e 73 02 64 65 00 09 77
|
||
|
|
65 62 6d 61 73 74 65 72 09 77 65 62 65 72 6e 65
|
||
|
|
74 7a c0 16 78 76 7b b8 00 00 0e 10 00 00 03 84
|
||
|
|
00 24 ea 00 00 00 00 b4 c0 10 00 2e 00 01 00 00
|
||
|
|
00 85 01 1d 00 06 0a 02 00 01 51 80 61 ef 45 ad
|
||
|
|
61 c7 aa 9d 79 4f 05 73 73 68 66 70 03 6e 65 74
|
||
|
|
00 35 dd 03 c0 75 e9 f0 8f a6 23 90 1a 4d 5c e1
|
||
|
|
52 2b ad 02 d3 d1 a5 43 52 8d f3 76 08 38 5e ec
|
||
|
|
23 b0 85 80 71 02 89 13 d4 7d 24 0e 29 39 64 51
|
||
|
|
2f f0 e0 30 c1 69 c6 0e e0 fc 7e e5 08 b1 19 7b
|
||
|
|
b2 7e ff 28 0e 7c 45 cf 88 25 87 25 34 de cb 49
|
||
|
|
c9 58 39 c7 c7 80 cc f1 af 73 2d 6b d6 07 41 02
|
||
|
|
88 34 b5 89 b5 c6 99 f8 30 e0 b2 70 ca fb 43 c8
|
||
|
|
71 8e 8e d9 b6 0e 0d 0a 48 ef 89 a6 77 57 3c 08
|
||
|
|
e4 47 ec 40 70 40 95 0f 0d 4c e0 76 5d cb 36 48
|
||
|
|
02 82 5b 93 5a 84 c3 d6 c9 25 8e 22 99 11 5d 2c
|
||
|
|
03 72 f8 32 62 a0 e2 df 50 89 4a cf ac b9 d9 44
|
||
|
|
24 bd 80 5b cb b7 94 b0 40 e7 c3 65 ae 46 b9 00
|
||
|
|
d4 14 83 c8 73 1c 3a 5e 94 29 a5 5f 13 73 f9 ba
|
||
|
|
7c 7b 4e 18 82 a7 ea 12 0a bf e1 28 7d 67 24 70
|
||
|
|
76 af e8 f5 01 61 a7 f7 ba 11 f7 45 1e 49 be 19
|
||
|
|
63 2c 19 df 8a 83 57 ac 9d df 94 b7 5d 5d 0f 49
|
||
|
|
3c 20 31 44 53 4a 53 38 39 4c 4a 31 38 46 4a 56
|
||
|
|
4a 47 45 43 30 33 35 35 35 48 33 50 50 47 31 30
|
||
|
|
42 4c c0 10 00 32 00 01 00 00 00 85 00 36 01 00
|
||
|
|
00 14 10 7b 1a 90 a9 16 19 7e 45 d0 77 2a bc b6
|
||
|
|
44 11 56 14 88 02 6c d0 ec 9b ca b3 15 02 81 1b
|
||
|
|
fb 8e 8c 8d 35 6d d9 78 00 07 62 00 80 08 00 02
|
||
|
|
90 01 01 40 c1 8f 00 2e 00 01 00 00 00 85 01 1d
|
||
|
|
00 32 0a 03 00 00 00 b4 61 e0 10 7d 61 b8 79 58
|
||
|
|
79 4f 05 73 73 68 66 70 03 6e 65 74 00 47 c4 15
|
||
|
|
e8 2f 51 a8 d2 15 39 9f 09 fb 8e 8e 3d 69 01 dc
|
||
|
|
37 6f 7b 6c ae 5e 77 a0 c8 b6 72 36 73 63 e7 bb
|
||
|
|
c6 41 64 f1 14 15 6d 9b 79 a3 fc 12 65 5b ac b6
|
||
|
|
f3 49 7a 1b 83 09 67 ac f4 f7 dc 66 dc c7 27 98
|
||
|
|
41 8b 2e 1f e9 58 15 01 49 b2 91 b1 fc 1d 19 e2
|
||
|
|
15 6c 3e ce 2b 2e ad 68 d9 f8 7d 7a 17 60 db 67
|
||
|
|
03 50 e8 83 d8 1b 59 f6 ee 9e 54 0e 98 5e f6 d8
|
||
|
|
3b e5 f6 a6 a2 b2 73 ef f8 c2 4e e8 17 27 25 95
|
||
|
|
59 3f 2a a2 0c 79 74 6d e4 12 34 83 29 f7 9e d6
|
||
|
|
ad ca 6f 6c b1 0f e2 ad e4 3e e3 81 28 74 72 75
|
||
|
|
8a aa 7c da 25 52 e4 a0 56 8b aa f8 2a 08 25 24
|
||
|
|
d5 98 28 5f b9 30 22 79 ea 47 b8 4b 26 75 b0 c2
|
||
|
|
59 4d e9 12 87 ad 15 47 40 ac 36 ca 1b 13 d8 a9
|
||
|
|
9c 90 76 06 4f 91 0b d8 0b 4b 66 9b bc 39 5c 22
|
||
|
|
38 2c 2a 8f f1 fe ff 64 38 d4 48 ac fa 59 f0 e5
|
||
|
|
aa 05 7f 0e 92 8e 0d be 17 a7 21 34 47 20 48 30
|
||
|
|
31 36 50 4b 37 43 4a 46 35 42 36 35 38 32 47 34
|
||
|
|
44 56 4e 33 4b 43 48 4b 51 4d 52 4d 42 4f c0 10
|
||
|
|
00 32 00 01 00 00 00 85 00 32 01 00 00 14 10 7b
|
||
|
|
1a 90 a9 16 19 7e 45 d0 77 2a bc b6 44 11 56 14
|
||
|
|
dd 58 5c dc 28 6f 14 8e f0 c9 23 cf 0e 43 30 ca
|
||
|
|
c1 00 1e b0 00 06 00 00 80 00 00 02 c3 1b 00 2e
|
||
|
|
00 01 00 00 00 85 01 1d 00 32 0a 03 00 00 00 b4
|
||
|
|
61 e0 25 40 61 b8 93 2b 79 4f 05 73 73 68 66 70
|
||
|
|
03 6e 65 74 00 1f 1d 69 09 b8 d4 7c c2 59 a9 4a
|
||
|
|
d7 f8 4b d8 27 2b b0 01 46 40 10 97 af be 81 6b
|
||
|
|
43 75 a6 44 3b c8 2a bc 34 99 66 1a 11 99 59 cc
|
||
|
|
22 a2 f0 f9 26 9b 12 e1 44 bc 97 82 12 92 6c 2d
|
||
|
|
d0 98 29 69 6b b3 68 8e 6d 5f 51 d3 dc 44 65 2f
|
||
|
|
cd b9 f1 34 a8 d3 08 0c b8 14 32 8c 4c 8c bb b4
|
||
|
|
4e 55 cb d7 74 c3 80 b7 78 ec 34 8f ee d6 42 3e
|
||
|
|
f7 77 54 d4 8c 7d f1 4f c8 82 b3 3a 50 21 68 cd
|
||
|
|
6a b5 37 cd 02 85 5c 7c d6 b4 50 3f 68 47 43 98
|
||
|
|
86 b5 f7 f9 85 ee 25 01 84 65 df ec 67 e9 4f 0b
|
||
|
|
a3 67 62 f4 33 74 f9 7b 35 50 bb 92 6a 7b ee ca
|
||
|
|
ce 14 04 15 0b e0 e7 3f 8e 2b 4f da 50 9c 62 b4
|
||
|
|
e1 21 fa 4f 13 0d 2b 79 cc 78 91 ee f7 3e a6 c7
|
||
|
|
0f 9b 9d 8c c9 70 78 b4 f9 91 a8 13 32 ab 10 57
|
||
|
|
cb e3 a7 a0 c4 24 1b 1d 6a bf 4b 2e 47 e6 f2 37
|
||
|
|
63 fe 0f 95 8d a8 a7 1d 6b 3c d4 b7 47 2d 2e bb
|
||
|
|
30 f5 e5 16 20 00 00 29 20 00 00 00 80 00 00 00|}
|
||
|
|
in
|
||
|
|
let host = n_of_s "aaa.sshfp.net" in
|
||
|
|
let header = 0x8fab, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and content =
|
||
|
|
let of_d_t d t = Option.get (Ptime.of_date_time (d, t)) in
|
||
|
|
let domain = n_of_s "sshfp.net" in
|
||
|
|
let nsec3_1_host = n_of_s "1DSJS89LJ18FJVJGEC03555H3PPG10BL.sshfp.net" in
|
||
|
|
let nsec3_2_host = n_of_s "H016PK7CJF5B6582G4DVN3KCHKQMRMBO.sshfp.net" in
|
||
|
|
let soa = Soa.{ nameserver = n_of_s "ns0.weberdns.de" ; hostmaster = n_of_s "webmaster.webernetz.net" ;
|
||
|
|
serial = 2021030840l ; refresh = 3600l ; retry = 900l ; expiry = 2419200l ; minimum = 180l }
|
||
|
|
and rrsig_soa =
|
||
|
|
Rrsig.{ type_covered = 6 ; algorithm = Dnskey.RSA_SHA512 ; label_count = 2 ; original_ttl = 86400l ;
|
||
|
|
signature_expiration = of_d_t (2022, 01, 25) ((00, 34, 53), 0) ;
|
||
|
|
signature_inception = of_d_t (2021, 12, 25) ((23, 34, 53), 0) ;
|
||
|
|
key_tag = 31055 ;
|
||
|
|
signer_name = domain ;
|
||
|
|
signature = Base64.decode_exn "Nd0DwHXp8I+mI5AaTVzhUiutAtPRpUNSjfN2CDhe7COwhYBxAokT1H0kDik5ZFEv8OAwwWnGDuD8fuUIsRl7sn7/KA58Rc+IJYclNN7LSclYOcfHgMzxr3Mta9YHQQKINLWJtcaZ+DDgsnDK+0PIcY6O2bYODQpI74mmd1c8CORH7EBwQJUPDUzgdl3LNkgCgluTWoTD1skljiKZEV0sA3L4MmKg4t9QiUrPrLnZRCS9gFvLt5SwQOfDZa5GuQDUFIPIcxw6XpQppV8Tc/m6fHtOGIKn6hIKv+EofWckcHav6PUBYaf3uhH3RR5JvhljLBnfioNXrJ3flLddXQ9JPA=="
|
||
|
|
}
|
||
|
|
and nsec3_1 =
|
||
|
|
let types = Bit_map.of_list [1;2;6;16;28;46;48;51;257] in
|
||
|
|
Nsec3.{ flags = None ; iterations = 20 ; salt = Ohex.decode "7B1A90A916197E45D0772ABCB6441156" ; next_owner_hashed = Ohex.decode "88026CD0EC9BCAB31502811BFB8E8C8D356DD978" ; types }
|
||
|
|
and rrsig_nsec3_1 =
|
||
|
|
Rrsig.{ type_covered = 50 ; algorithm = Dnskey.RSA_SHA512 ; label_count = 3 ; original_ttl = 180l ;
|
||
|
|
signature_expiration = of_d_t (2022, 01, 13) ((11, 43, 57), 0) ;
|
||
|
|
signature_inception = of_d_t (2021, 12, 14) ((11, 00, 40), 0) ;
|
||
|
|
key_tag = 31055 ;
|
||
|
|
signer_name = domain ;
|
||
|
|
signature = Base64.decode_exn "R8QV6C9RqNIVOZ8J+46OPWkB3Ddve2yuXnegyLZyNnNj57vGQWTxFBVtm3mj/BJlW6y280l6G4MJZ6z099xm3McnmEGLLh/pWBUBSbKRsfwdGeIVbD7OKy6taNn4fXoXYNtnA1Dog9gbWfbunlQOmF722Dvl9qaisnPv+MJO6BcnJZVZPyqiDHl0beQSNIMp957WrcpvbLEP4q3kPuOBKHRydYqqfNolUuSgVouq+CoIJSTVmChfuTAieepHuEsmdbDCWU3pEoetFUdArDbKGxPYqZyQdgZPkQvYC0tmm7w5XCI4LCqP8f7/ZDjUSKz6WfDlqgV/DpKODb4XpyE0Rw=="
|
||
|
|
}
|
||
|
|
and nsec3_2 =
|
||
|
|
let types = Bit_map.of_list [16;46] in
|
||
|
|
Nsec3.{ flags = None ; iterations = 20 ; salt = Ohex.decode "7B1A90A916197E45D0772ABCB6441156" ; next_owner_hashed = Ohex.decode "DD585CDC286F148EF0C923CF0E4330CAC1001EB0" ; types }
|
||
|
|
and rrsig_nsec3_2 =
|
||
|
|
Rrsig.{ type_covered = 50 ; algorithm = Dnskey.RSA_SHA512 ; label_count = 3 ; original_ttl = 180l ;
|
||
|
|
signature_expiration = of_d_t (2022, 01, 13) ((13, 12, 32), 0) ;
|
||
|
|
signature_inception = of_d_t (2021, 12, 14) ((12, 50, 51), 0) ;
|
||
|
|
key_tag = 31055 ;
|
||
|
|
signer_name = domain ;
|
||
|
|
signature = Base64.decode_exn "Hx1pCbjUfMJZqUrX+EvYJyuwAUZAEJevvoFrQ3WmRDvIKrw0mWYaEZlZzCKi8PkmmxLhRLyXghKSbC3QmClpa7Nojm1fUdPcRGUvzbnxNKjTCAy4FDKMTIy7tE5Vy9d0w4C3eOw0j+7WQj73d1TUjH3xT8iCszpQIWjNarU3zQKFXHzWtFA/aEdDmIa19/mF7iUBhGXf7GfpTwujZ2L0M3T5ezVQu5Jqe+7KzhQEFQvg5z+OK0/aUJxitOEh+k8TDSt5zHiR7vc+pscPm52MyXB4tPmRqBMyqxBXy+OnoMQkGx1qv0suR+byN2P+D5WNqKcdazzUt0ctLrsw9eUWIA=="
|
||
|
|
}
|
||
|
|
in
|
||
|
|
Domain_name.Map.(
|
||
|
|
add nsec3_2_host
|
||
|
|
Rr_map.(add Nsec3 (133l, nsec3_2)
|
||
|
|
(singleton Rrsig (133l, Rr_map.Rrsig_set.singleton rrsig_nsec3_2)))
|
||
|
|
(add nsec3_1_host
|
||
|
|
Rr_map.(add Nsec3 (133l, nsec3_1)
|
||
|
|
(singleton Rrsig (133l, Rr_map.Rrsig_set.singleton rrsig_nsec3_1)))
|
||
|
|
(singleton domain
|
||
|
|
Rr_map.(add Soa soa (singleton Rrsig (133l, Rr_map.Rrsig_set.singleton rrsig_soa))))))
|
||
|
|
in
|
||
|
|
let q = Question.create host Ds in
|
||
|
|
let edns = Edns.create ~dnssec_ok:true ~payload_size:8192 () in
|
||
|
|
let res = create ~edns header q (`Rcode_error (Rcode.NXDomain, Opcode.Query, Some (Name_rr_map.empty, content))) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "nsec3 decodes"
|
||
|
|
(Ok res) (decode data))
|
||
|
|
|
||
|
|
let loc_packet_preamble =
|
||
|
|
(* RFC1035 section 4.1 *)
|
||
|
|
(* header *)
|
||
|
|
"11 11 81 80 00 01 00 01 00 00 00 00" ^
|
||
|
|
(* question *)
|
||
|
|
(* example.com *)
|
||
|
|
"07 65 78 61 6d 70 6c 65" ^ (* example *)
|
||
|
|
"03" ^ (* dot *)
|
||
|
|
"63 6f 6d" ^ (* com *)
|
||
|
|
"00" ^ (* \0 - null terminated *)
|
||
|
|
(* QTYPE = 29 = LOC *)
|
||
|
|
"00 1d" ^
|
||
|
|
(* QCLASS = IN `*)
|
||
|
|
"00 01" ^
|
||
|
|
(* answer *)
|
||
|
|
"c0 0c" ^
|
||
|
|
(* binary: 11000000 00001100
|
||
|
|
first 2 11's indicate a pointer
|
||
|
|
000000 00001100 = 12
|
||
|
|
this gives the size of the header as an offer, pointing to the domain in the query
|
||
|
|
*)
|
||
|
|
"00 1d" ^ (* TYPE = LOC *)
|
||
|
|
"00 01" ^ (* CLASS = IN *)
|
||
|
|
"00 00 0e 10" ^ (* TTL = 3600s *)
|
||
|
|
"00 10" (* RDLENGTH = 16 *)
|
||
|
|
|
||
|
|
let loc_decode_helper data loc =
|
||
|
|
let host = n_of_s "example.com" in
|
||
|
|
let header = 0x1111, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and q = Question.create host Loc
|
||
|
|
in
|
||
|
|
let content =
|
||
|
|
Domain_name.Map.singleton host (Rr_map.singleton Loc (3600l, Rr_map.Loc_set.singleton loc))
|
||
|
|
in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
let _ = Format.printf "%a\n" (Ohex.pp_hexdump ()) (fst (encode `Udp res)) in
|
||
|
|
let _ =
|
||
|
|
Format.printf "%a\n" pp (match (decode data) with
|
||
|
|
| Ok t -> t
|
||
|
|
| Error _ -> raise (Failure "Failed to decode data"))
|
||
|
|
in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Loc decodes" (Ok res) (decode data))
|
||
|
|
|
||
|
|
let loc_decode () =
|
||
|
|
let data = Ohex.decode (
|
||
|
|
loc_packet_preamble ^
|
||
|
|
(* RFC1876 section 2 *)
|
||
|
|
"00" ^ (* version *)
|
||
|
|
"13" ^ (* size *)
|
||
|
|
"13" ^ (* horizontal percision *)
|
||
|
|
"13" ^ (* vertical percision *)
|
||
|
|
"8b 34 0c 50" ^ (* lat *)
|
||
|
|
"7f fa ef 84" ^ (* long *)
|
||
|
|
"00 98 9f 18" (* alt *)
|
||
|
|
) in
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((52l, 12l, 40400l), `North)
|
||
|
|
~longitude:((0l, 5l, 31900l), `West)
|
||
|
|
~altitude:2200L
|
||
|
|
~precision:(1000L, 1000L, 1000L)
|
||
|
|
in
|
||
|
|
loc_decode_helper data loc
|
||
|
|
|
||
|
|
let loc_decode_min () =
|
||
|
|
let data = Ohex.decode (
|
||
|
|
loc_packet_preamble ^
|
||
|
|
(* RDATA *)
|
||
|
|
(* RFC1876 section 2 *)
|
||
|
|
"00" ^ (* version *)
|
||
|
|
"00" ^ (* size *)
|
||
|
|
"00" ^ (* horizontal percision *)
|
||
|
|
"00" ^ (* vertical percision *)
|
||
|
|
"80 00 00 00" ^ (* lat *)
|
||
|
|
"80 00 00 00" ^ (* long *)
|
||
|
|
"00 00 00 00" (* alt *)
|
||
|
|
) in
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((0l, 0l, 0l), `North)
|
||
|
|
~longitude:((0l, 0l, 0l), `East)
|
||
|
|
~altitude:(Int64.neg 10000000L)
|
||
|
|
~precision:(0L, 0L, 0L)
|
||
|
|
in
|
||
|
|
loc_decode_helper data loc
|
||
|
|
|
||
|
|
let loc_decode_min_negated () =
|
||
|
|
let data = Ohex.decode (
|
||
|
|
loc_packet_preamble ^
|
||
|
|
(* RDATA *)
|
||
|
|
(* RFC1876 section 2 *)
|
||
|
|
"00" ^ (* version *)
|
||
|
|
"00" ^ (* size *)
|
||
|
|
"00" ^ (* horizontal percision *)
|
||
|
|
"00" ^ (* vertical percision *)
|
||
|
|
"80 00 00 00" ^ (* lat *)
|
||
|
|
"80 00 00 00" ^ (* long *)
|
||
|
|
"00 00 00 00" (* alt *)
|
||
|
|
) in
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((0l, 0l, 0l), `South)
|
||
|
|
~longitude:((0l, 0l, 0l), `West)
|
||
|
|
~altitude:(Int64.neg 10000000L)
|
||
|
|
~precision:(0L, 0L, 0L)
|
||
|
|
in
|
||
|
|
loc_decode_helper data loc
|
||
|
|
|
||
|
|
let loc_decode_max () =
|
||
|
|
let data = Ohex.decode (
|
||
|
|
loc_packet_preamble ^
|
||
|
|
(* RDATA *)
|
||
|
|
(* RFC1876 section 2 *)
|
||
|
|
"00" ^ (* version *)
|
||
|
|
"99" ^ (* size *)
|
||
|
|
"99" ^ (* horizontal percision *)
|
||
|
|
"99" ^ (* vertical percision *)
|
||
|
|
"93 4f d9 00" ^ (* lat *)
|
||
|
|
"a6 9f b2 00" ^ (* long *)
|
||
|
|
"ff ff ff ff" (* alt *)
|
||
|
|
) in
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((90l, 0l, 0l), `North)
|
||
|
|
~longitude:((180l, 0l, 0l), `East)
|
||
|
|
~altitude:4284967295L
|
||
|
|
~precision:(9000000000L, 9000000000L, 9000000000L)
|
||
|
|
in
|
||
|
|
loc_decode_helper data loc
|
||
|
|
|
||
|
|
let loc_decode_max_inverted () =
|
||
|
|
let data = Ohex.decode (
|
||
|
|
loc_packet_preamble ^
|
||
|
|
(* RDATA *)
|
||
|
|
(* RFC1876 section 2 *)
|
||
|
|
"00" ^ (* version *)
|
||
|
|
"99" ^ (* size *)
|
||
|
|
"99" ^ (* horizontal percision *)
|
||
|
|
"99" ^ (* vertical percision *)
|
||
|
|
"6c b0 27 00" ^ (* lat *)
|
||
|
|
"59 60 4e 00" ^ (* long *)
|
||
|
|
"ff ff ff ff" (* alt *)
|
||
|
|
) in
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((90l, 0l, 0l), `South)
|
||
|
|
~longitude:((180l, 0l, 0l), `West)
|
||
|
|
~altitude:4284967295L
|
||
|
|
~precision:(9000000000L, 9000000000L, 9000000000L)
|
||
|
|
in
|
||
|
|
loc_decode_helper data loc
|
||
|
|
|
||
|
|
let loc_decode_alt_signed_max_under () =
|
||
|
|
let data = Ohex.decode (
|
||
|
|
loc_packet_preamble ^
|
||
|
|
(* RDATA *)
|
||
|
|
(* RFC1876 section 2 *)
|
||
|
|
"00" ^ (* version *)
|
||
|
|
"99" ^ (* size *)
|
||
|
|
"99" ^ (* horizontal percision *)
|
||
|
|
"99" ^ (* vertical percision *)
|
||
|
|
"93 4f d9 00" ^ (* lat *)
|
||
|
|
"a6 9f b2 00" ^ (* long *)
|
||
|
|
"7f ff ff ff" (* alt *)
|
||
|
|
) in
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((90l, 0l, 0l), `North)
|
||
|
|
~longitude:((180l, 0l, 0l), `East)
|
||
|
|
~altitude:2137483647L
|
||
|
|
~precision:(9000000000L, 9000000000L, 9000000000L)
|
||
|
|
in
|
||
|
|
loc_decode_helper data loc
|
||
|
|
|
||
|
|
let loc_decode_alt_signed_max () =
|
||
|
|
let data = Ohex.decode (
|
||
|
|
loc_packet_preamble ^
|
||
|
|
(* RDATA *)
|
||
|
|
(* RFC1876 section 2 *)
|
||
|
|
"00" ^ (* version *)
|
||
|
|
"99" ^ (* size *)
|
||
|
|
"99" ^ (* horizontal percision *)
|
||
|
|
"99" ^ (* vertical percision *)
|
||
|
|
"93 4f d9 00" ^ (* lat *)
|
||
|
|
"a6 9f b2 00" ^ (* long *)
|
||
|
|
"80 00 00 00" (* alt *)
|
||
|
|
) in
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((90l, 0l, 0l), `North)
|
||
|
|
~longitude:((180l, 0l, 0l), `East)
|
||
|
|
~altitude:2137483648L
|
||
|
|
~precision:(9000000000L, 9000000000L, 9000000000L)
|
||
|
|
in
|
||
|
|
loc_decode_helper data loc
|
||
|
|
|
||
|
|
let loc_decode_alt_signed_max_over () =
|
||
|
|
let data = Ohex.decode (
|
||
|
|
loc_packet_preamble ^
|
||
|
|
(* RDATA *)
|
||
|
|
(* RFC1876 section 2 *)
|
||
|
|
"00" ^ (* version *)
|
||
|
|
"99" ^ (* size *)
|
||
|
|
"99" ^ (* horizontal percision *)
|
||
|
|
"99" ^ (* vertical percision *)
|
||
|
|
"93 4f d9 00" ^ (* lat *)
|
||
|
|
"a6 9f b2 00" ^ (* long *)
|
||
|
|
"80 00 00 01" (* alt *)
|
||
|
|
) in
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((90l, 0l, 0l), `North)
|
||
|
|
~longitude:((180l, 0l, 0l), `East)
|
||
|
|
~altitude:2137483649L
|
||
|
|
~precision:(9000000000L, 9000000000L, 9000000000L)
|
||
|
|
in
|
||
|
|
loc_decode_helper data loc
|
||
|
|
|
||
|
|
let loc_leftover () =
|
||
|
|
let data = Ohex.decode (
|
||
|
|
loc_packet_preamble ^
|
||
|
|
(* RFC1876 section 2 *)
|
||
|
|
"00" ^ (* version *)
|
||
|
|
"13" ^ (* size *)
|
||
|
|
"13" ^ (* horizontal percision *)
|
||
|
|
"13" ^ (* vertical percision *)
|
||
|
|
"8b 34 0c 50" ^ (* lat *)
|
||
|
|
"7f fa ef 84" ^ (* long *)
|
||
|
|
"00 98 9f 18 00" (* alt *)
|
||
|
|
) in
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((52l, 12l, 40400l), `North)
|
||
|
|
~longitude:((0l, 5l, 31900l), `West)
|
||
|
|
~altitude:2200L
|
||
|
|
~precision:(1000L, 1000L, 1000L)
|
||
|
|
in
|
||
|
|
loc_decode_helper data loc
|
||
|
|
|
||
|
|
let loc_leftover_inner () =
|
||
|
|
let data = Ohex.decode (
|
||
|
|
(* RFC1035 section 4.1 *)
|
||
|
|
(* header *)
|
||
|
|
"11 11 81 80 00 01 00 01 00 00 00 00" ^
|
||
|
|
(* question *)
|
||
|
|
(* example.com *)
|
||
|
|
"07 65 78 61 6d 70 6c 65" ^ (* example *)
|
||
|
|
"03" ^ (* dot *)
|
||
|
|
"63 6f 6d" ^ (* com *)
|
||
|
|
"00" ^ (* \0 - null terminated *)
|
||
|
|
(* QTYPE = 29 = LOC *)
|
||
|
|
"00 1d" ^
|
||
|
|
(* QCLASS = IN `*)
|
||
|
|
"00 01" ^
|
||
|
|
(* answer *)
|
||
|
|
"c0 0c" ^
|
||
|
|
(* binary: 11000000 00001100
|
||
|
|
first 2 11's indicate a pointer
|
||
|
|
000000 00001100 = 12
|
||
|
|
this gives the size of the header as an offer, pointing to the domain in the query
|
||
|
|
*)
|
||
|
|
"00 1d" ^ (* TYPE = LOC *)
|
||
|
|
"00 01" ^ (* CLASS = IN *)
|
||
|
|
"00 00 0e 10" ^ (* TTL = 3600s *)
|
||
|
|
"00 11" ^ (* RDLENGTH = 17 *)
|
||
|
|
(* RDATA *)
|
||
|
|
(* RFC1876 section 2 *)
|
||
|
|
"00" ^ (* version *)
|
||
|
|
"13" ^ (* size *)
|
||
|
|
"13" ^ (* horizontal percision *)
|
||
|
|
"13" ^ (* vertical percision *)
|
||
|
|
"8b 34 0c 50" ^ (* lat *)
|
||
|
|
"7f fa ef 84" ^ (* long *)
|
||
|
|
"00 98 9f 18 00" (* alt *)
|
||
|
|
) in
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((52l, 12l, 40400l), `North)
|
||
|
|
~longitude:((0l, 5l, 31900l), `West)
|
||
|
|
~altitude:2200L
|
||
|
|
~precision:(1000L, 1000L, 1000L)
|
||
|
|
in
|
||
|
|
loc_decode_helper data loc
|
||
|
|
|
||
|
|
let loc_fail_partial () =
|
||
|
|
let data = Ohex.decode (
|
||
|
|
loc_packet_preamble ^
|
||
|
|
(* RDATA *)
|
||
|
|
(* RFC1876 section 2 *)
|
||
|
|
"00" ^ (* version *)
|
||
|
|
"13" ^ (* size *)
|
||
|
|
"13" ^ (* horizontal percision *)
|
||
|
|
"13" ^ (* vertical percision *)
|
||
|
|
"8b 34 0c 50" ^ (* lat *)
|
||
|
|
"7f fa ef 84" ^ (* long *)
|
||
|
|
"00 98 9f" (* alt *)
|
||
|
|
) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "short LOC decodes" (Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let loc_fail_partial_inner () =
|
||
|
|
let data = Ohex.decode (
|
||
|
|
(* RFC1035 section 4.1 *)
|
||
|
|
(* header *)
|
||
|
|
"11 11 81 80 00 01 00 01 00 00 00 00" ^
|
||
|
|
(* question *)
|
||
|
|
(* example.com *)
|
||
|
|
"07 65 78 61 6d 70 6c 65" ^ (* example *)
|
||
|
|
"03" ^ (* dot *)
|
||
|
|
"63 6f 6d" ^ (* com *)
|
||
|
|
"00" ^ (* \0 - null terminated *)
|
||
|
|
(* QTYPE = 29 = LOC *)
|
||
|
|
"00 1d" ^
|
||
|
|
(* QCLASS = IN `*)
|
||
|
|
"00 01" ^
|
||
|
|
(* answer *)
|
||
|
|
"c0 0c" ^
|
||
|
|
(* binary: 11000000 00001100
|
||
|
|
first 2 11's indicate a pointer
|
||
|
|
000000 00001100 = 12
|
||
|
|
this gives the size of the header as an offer, pointing to the domain in the query
|
||
|
|
*)
|
||
|
|
"00 1d" ^ (* TYPE = LOC *)
|
||
|
|
"00 01" ^ (* CLASS = IN *)
|
||
|
|
"00 00 0e 10" ^ (* TTL = 3600s *)
|
||
|
|
"00 0f" ^ (* RDLENGTH = 15 *)
|
||
|
|
(* RDATA *)
|
||
|
|
(* RFC1876 section 2 *)
|
||
|
|
"00" ^ (* version *)
|
||
|
|
"13" ^ (* size *)
|
||
|
|
"13" ^ (* horizontal percision *)
|
||
|
|
"13" ^ (* vertical percision *)
|
||
|
|
"8b 34 0a c0" ^ (* lat *)
|
||
|
|
"7f fa f3 08" ^ (* long *)
|
||
|
|
"00 98 9f" (* alt *)
|
||
|
|
) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "A decode failure (rdata partial)" (Error `Partial) (decode data))
|
||
|
|
|
||
|
|
let loc_encode_helper loc =
|
||
|
|
let host = n_of_s "example.com" in
|
||
|
|
let header = 0x1111, Flags.(add `Recursion_desired (singleton `Recursion_available))
|
||
|
|
and q = Question.create host Loc
|
||
|
|
in
|
||
|
|
let content =
|
||
|
|
Domain_name.Map.singleton host (Rr_map.singleton Loc (3600l, Rr_map.Loc_set.singleton loc))
|
||
|
|
in
|
||
|
|
let res = create header q (`Answer (content, Name_rr_map.empty)) in
|
||
|
|
let _ = Format.printf "%a" (Ohex.pp_hexdump ()) (fst (encode `Udp res)) in
|
||
|
|
Alcotest.(check (result t_ok p_err) "Loc encodes" (Ok res) (decode (fst (encode `Udp res))))
|
||
|
|
|
||
|
|
let loc_encode_min () =
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((0l, 0l, 0l), `North)
|
||
|
|
~longitude:((0l, 0l, 0l), `East)
|
||
|
|
~altitude:(Int64.neg 10000000L)
|
||
|
|
~precision:(0L, 0L, 0L)
|
||
|
|
in
|
||
|
|
loc_encode_helper loc
|
||
|
|
|
||
|
|
let loc_encode_min_negated () =
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((0l, 0l, 0l), `South)
|
||
|
|
~longitude:((0l, 0l, 0l), `West)
|
||
|
|
~altitude:(Int64.neg 10000000L)
|
||
|
|
~precision:(0L, 0L, 0L)
|
||
|
|
in
|
||
|
|
loc_encode_helper loc
|
||
|
|
|
||
|
|
let loc_encode_max () =
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((90l, 0l, 0l), `North)
|
||
|
|
~longitude:((180l, 0l, 0l), `East)
|
||
|
|
~altitude:4284967295L
|
||
|
|
~precision:(9000000000L, 9000000000L, 9000000000L)
|
||
|
|
in
|
||
|
|
loc_encode_helper loc
|
||
|
|
|
||
|
|
let loc_encode_max_inverted () =
|
||
|
|
let loc = Loc.parse
|
||
|
|
~latitude:((90l, 0l, 0l), `South)
|
||
|
|
~longitude:((180l, 0l, 0l), `West)
|
||
|
|
~altitude:4284967295L
|
||
|
|
~precision:(9000000000L, 9000000000L, 9000000000L)
|
||
|
|
in
|
||
|
|
loc_encode_helper loc
|
||
|
|
|
||
|
|
let dnskey_t = Alcotest.testable Dnskey.pp (fun a b -> Dnskey.compare a b = 0)
|
||
|
|
|
||
|
|
let domain_name_t = Alcotest.testable Domain_name.pp Domain_name.equal
|
||
|
|
|
||
|
|
let name_key_t =
|
||
|
|
Alcotest.pair domain_name_t dnskey_t
|
||
|
|
|
||
|
|
let err_t =
|
||
|
|
Alcotest.testable
|
||
|
|
(fun ppf (`Msg m) -> Fmt.string ppf m)
|
||
|
|
(fun _ _ -> true)
|
||
|
|
|
||
|
|
let dnskey_name_to_of_string () =
|
||
|
|
let name = n_of_s "example.com" in
|
||
|
|
let keydata = "abcd" in
|
||
|
|
let key = Dnskey.{ flags = F.empty ; algorithm = SHA256 ; key = keydata } in
|
||
|
|
let keydata = Domain_name.to_string name ^ ":SHA256:" ^ keydata in
|
||
|
|
Alcotest.(check string "dnskey name_key_to_string is good" keydata
|
||
|
|
(Dnskey.name_key_to_string (name, key)));
|
||
|
|
Alcotest.(check (result name_key_t err_t)
|
||
|
|
"dnskey name_key_of_string is good" (Ok (name, key))
|
||
|
|
(Dnskey.name_key_of_string keydata))
|
||
|
|
|
||
|
|
let code_tests = [
|
||
|
|
"bad query", `Quick, bad_query ;
|
||
|
|
"regression0", `Quick, regression0 ;
|
||
|
|
"regression1", `Quick, regression1 ;
|
||
|
|
"regression2", `Quick, regression2 ;
|
||
|
|
(* "regression3", `Quick, regression3 ; *)
|
||
|
|
"regression4", `Quick, regression4 ;
|
||
|
|
"regression5", `Quick, regression5 ;
|
||
|
|
"regression6", `Quick, regression6 ;
|
||
|
|
"regression7", `Quick, regression7 ;
|
||
|
|
"regression8", `Quick, regression8 ;
|
||
|
|
"regression9", `Quick, regression9 ;
|
||
|
|
"regression10", `Quick, regression10 ;
|
||
|
|
"regression11", `Quick, regression11 ;
|
||
|
|
"regression12", `Quick, regression12 ;
|
||
|
|
"a success", `Quick, a_success ;
|
||
|
|
"a leftover", `Quick, a_leftover ;
|
||
|
|
"a fail partial", `Quick, a_fail_partial ;
|
||
|
|
"a fail leftover inner", `Quick, a_fail_leftover_inner ;
|
||
|
|
"a fail partial inner", `Quick, a_fail_partial_inner ;
|
||
|
|
"ns success", `Quick, ns_success ;
|
||
|
|
"ns fail partial", `Quick, ns_fail_partial ;
|
||
|
|
"ns fail leftover inner", `Quick, ns_fail_leftover_inner ;
|
||
|
|
"ns fail partial inner", `Quick, ns_fail_partial_inner ;
|
||
|
|
"cname success", `Quick, cname_success ;
|
||
|
|
"cname fail partial", `Quick, cname_fail_partial ;
|
||
|
|
"cname fail leftover inner", `Quick, cname_fail_leftover_inner ;
|
||
|
|
"cname fail partial inner", `Quick, cname_fail_partial_inner ;
|
||
|
|
"soa success", `Quick, soa_success ;
|
||
|
|
"soa fail partial", `Quick, soa_fail_partial ;
|
||
|
|
"soa fail leftover inner", `Quick, soa_fail_leftover_inner ;
|
||
|
|
"soa fail partial inner", `Quick, soa_fail_partial_inner ;
|
||
|
|
"ptr success", `Quick, ptr_success ;
|
||
|
|
"ptr fail partial", `Quick, ptr_fail_partial ;
|
||
|
|
"ptr fail leftover inner", `Quick, ptr_fail_leftover_inner ;
|
||
|
|
"ptr fail partial inner", `Quick, ptr_fail_partial_inner ;
|
||
|
|
"mx success", `Quick, mx_success ;
|
||
|
|
"mx fail partial", `Quick, mx_fail_partial ;
|
||
|
|
"mx fail leftover inner", `Quick, mx_fail_leftover_inner ;
|
||
|
|
"mx fail partial inner", `Quick, mx_fail_partial_inner ;
|
||
|
|
"txt success", `Quick, txt_success ;
|
||
|
|
"txt fail partial", `Quick, txt_fail_partial ;
|
||
|
|
"txt fail partial inner", `Quick, txt_fail_partial_inner ;
|
||
|
|
"aaaa success", `Quick, aaaa_success ;
|
||
|
|
"aaaa fail partial", `Quick, aaaa_fail_partial ;
|
||
|
|
"aaaa fail leftover inner", `Quick, aaaa_fail_leftover_inner ;
|
||
|
|
"aaaa fail partial inner", `Quick, aaaa_fail_partial_inner ;
|
||
|
|
"srv success", `Quick, srv_success ;
|
||
|
|
"srv fail partial", `Quick, srv_fail_partial ;
|
||
|
|
"srv fail leftover inner", `Quick, srv_fail_leftover_inner ;
|
||
|
|
"srv fail partial inner", `Quick, srv_fail_partial_inner ;
|
||
|
|
"sshfp success", `Quick, sshfp_success ;
|
||
|
|
"sshfp fail partial", `Quick, sshfp_fail_partial ;
|
||
|
|
"sshfp fail partial inner", `Quick, sshfp_fail_partial_inner ;
|
||
|
|
"tlsa success", `Quick, tlsa_success ;
|
||
|
|
"caa success", `Quick, caa_success ;
|
||
|
|
"caa fail partial", `Quick, caa_fail_partial ;
|
||
|
|
"dnskey success", `Quick, dnskey_success ;
|
||
|
|
"ds success", `Quick, ds_success ;
|
||
|
|
"rrsig success", `Quick, rrsig_success ;
|
||
|
|
"nsec success", `Quick, nsec_success ;
|
||
|
|
"nsec success 2", `Quick, nsec_success2 ;
|
||
|
|
"nsec3 success", `Quick, nsec3_success ;
|
||
|
|
"loc decode", `Quick, loc_decode ;
|
||
|
|
"loc decode min", `Quick, loc_decode_min ;
|
||
|
|
"loc decode min negated", `Quick, loc_decode_min_negated ;
|
||
|
|
"loc decode max", `Quick, loc_decode_max ;
|
||
|
|
"loc decode max inverted", `Quick, loc_decode_max_inverted ;
|
||
|
|
"loc decode alt signed max under", `Quick, loc_decode_alt_signed_max_under ;
|
||
|
|
"loc decode alt signed max", `Quick, loc_decode_alt_signed_max ;
|
||
|
|
"loc decode alt signed max over", `Quick, loc_decode_alt_signed_max_over ;
|
||
|
|
"loc leftover", `Quick, loc_leftover ;
|
||
|
|
"loc leftover inner", `Quick, loc_leftover_inner ;
|
||
|
|
"loc fail partial", `Quick, loc_fail_partial ;
|
||
|
|
"loc fail partial inner", `Quick, loc_fail_partial_inner ;
|
||
|
|
"loc encode min" , `Quick, loc_encode_min ;
|
||
|
|
"loc encode min negated", `Quick, loc_encode_min_negated ;
|
||
|
|
"loc encode max", `Quick, loc_encode_max ;
|
||
|
|
"loc encode max inverted", `Quick, loc_encode_max_inverted ;
|
||
|
|
"dnskey to/of_string", `Quick, dnskey_name_to_of_string ;
|
||
|
|
]
|
||
|
|
end
|
||
|
|
|
||
|
|
let tests = [
|
||
|
|
"Packet decode", Packet.code_tests ;
|
||
|
|
]
|
||
|
|
|
||
|
|
let () = Alcotest.run "DNS name and packet tests" tests
|