spec/net_stun_spec.lua
author Kim Alvefur <zash@zash.se>
Sun, 24 Mar 2024 20:39:42 +0100
changeset 13466 720aed1f5cf2
parent 12367 0576d7d625a0
permissions -rw-r--r--
util.startup: Check root after detecting platform and reading config (thanks SigmaTel71) Ensures that startup.detect_platform() runs so know whether to use the POSIX method of checking the current user or something else. Also after reading the config so we know whether the root override setting is set.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12365
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);