spec/net_stun_spec.lua
author Kim Alvefur <zash@zash.se>
Sun, 24 Mar 2024 21:32:00 +0100
changeset 13468 2dbc169aae6a
parent 12367 0576d7d625a0
permissions -rw-r--r--
util.startup: Abort before initialization of logging when started as root Prevents creation of log files owned by the root user which could be inaccessible once started correctly.
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);