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