Annotate

spec/net_stun_spec.lua @ 13245:ffe4adbd2af9

util.array: Fix new() library function
author Kim Alvefur <zash@zash.se>
date Sat, 22 Jul 2023 16:31:05 +0200
parent 12363:0576d7d625a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12361
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local hex = require "util.hex";
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local function parse(pkt_desc)
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local result = {};
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 for line in pkt_desc:gmatch("([^\n]+)\n") do
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local b1, b2, b3, b4 = line:match("^%s*(%x%x) (%x%x) (%x%x) (%x%x)%s");
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 if b1 then
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 table.insert(result, b1);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 table.insert(result, b2);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 table.insert(result, b3);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 table.insert(result, b4);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 end
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 end
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 return hex.decode(table.concat(result));
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 end
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 local sample_packet = parse[[
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 00 01 00 60 Request type and message length
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 21 12 a4 42 Magic cookie
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 78 ad 34 33 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 c6 ad 72 c0 } Transaction ID
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 29 da 41 2e }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 00 06 00 12 USERNAME attribute header
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 e3 83 9e e3 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 83 88 e3 83 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 aa e3 83 83 } Username value (18 bytes) and padding (2 bytes)
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 e3 82 af e3 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 82 b9 00 00 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 00 15 00 1c NONCE attribute header
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 66 2f 2f 34 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 39 39 6b 39 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 35 34 64 36 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 4f 4c 33 34 } Nonce value
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 6f 4c 39 46 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 53 54 76 79 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 36 34 73 41 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 00 14 00 0b REALM attribute header
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 65 78 61 6d }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 70 6c 65 2e } Realm value (11 bytes) and padding (1 byte)
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 6f 72 67 00 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 00 08 00 14 MESSAGE-INTEGRITY attribute header
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 f6 70 24 65 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 6d d6 4a 3e }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 02 b8 e0 71 } HMAC-SHA1 fingerprint
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 2e 85 c9 a2 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 8c a8 96 66 }
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 ]];
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 describe("net.stun", function ()
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 local stun = require "net.stun";
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 it("works", function ()
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 local packet = stun.new_packet();
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 assert.is_string(packet:serialize());
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 end);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 it("can decode the sample packet", function ()
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 local packet = stun.new_packet():deserialize(sample_packet);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 assert(packet);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 local method, method_name = packet:get_method();
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 assert.equal(1, method);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 assert.equal("binding", method_name);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 assert.equal("example.org", packet:get_attribute("realm"));
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 end);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 it("can generate the sample packet", function ()
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 -- These values, and the sample packet, come from RFC 5769 2.4
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 local username = string.char(
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 -- U+30DE KATAKANA LETTER MA
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 0xE3, 0x83, 0x9E,
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 -- U+30C8 KATAKANA LETTER TO
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 0xE3, 0x83, 0x88,
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 -- U+30EA KATAKANA LETTER RI
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 0xE3, 0x83, 0xAA,
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 -- U+30C3 KATAKANA LETTER SMALL TU
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 0xE3, 0x83, 0x83,
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 -- U+30AF KATAKANA LETTER KU
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 0xE3, 0x82, 0xAF,
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 -- U+30B9 KATAKANA LETTER SU
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 0xE3, 0x82, 0xB9
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 );
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 -- Password: "The<U+00AD>M<U+00AA>tr<U+2168>" and "TheMatrIX" (without
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 -- quotes) respectively before and after SASLprep processing
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 local password = "TheMatrIX";
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 local realm = "example.org";
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 local p3 = stun.new_packet("binding", "request");
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 p3.transaction_id = hex.decode("78AD3433C6AD72C029DA412E");
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 p3:add_attribute("username", username);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 p3:add_attribute("nonce", "f//499k954d6OL34oL9FSTvy64sA");
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 p3:add_attribute("realm", realm);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 local key = stun.get_long_term_auth_key(realm, username, password);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 p3:add_message_integrity(key);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 assert.equal(sample_packet, p3:serialize());
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 end);
713f8ee9e1b4 net.stun: Add tests for serialization/deserialization
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 end);