Changeset

3288:1a84d7d6f667

mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
author Matthew Wild <mwild1@gmail.com>
date Tue, 22 Jun 2010 20:52:43 +0100
parents 3287:e425e27c12be
children 3289:180a0b3b018d
files plugins/mod_auth_internal_hashed.lua
diffstat 1 files changed, 35 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/mod_auth_internal_hashed.lua	Tue Jun 22 19:14:55 2010 +0100
+++ b/plugins/mod_auth_internal_hashed.lua	Tue Jun 22 20:52:43 2010 +0100
@@ -26,6 +26,27 @@
 local hmac_sha1 = require "util.hmac".sha1;
 local sha1 = require "util.hashes".sha1;
 
+local to_hex;
+do
+	local function replace_byte_with_hex(byte)
+		return ("%02x"):format(byte:byte());
+	end
+	function to_hex(binary_string)
+		return binary_string:gsub(".", replace_byte_with_hex);
+	end
+end
+
+local from_hex;
+do
+	local function replace_hex_with_byte(hex)
+		return string.char(tonumber(hex, 16));
+	end
+	function from_hex(hex_string)
+		return hex_string:gsub("..", replace_hex_with_byte);
+	end
+end
+
+
 local prosody = _G.prosody;
 
 -- Default; can be set per-user
@@ -57,17 +78,17 @@
 		-- convert hexpass to stored_key and server_key
 		-- TODO: remove this in near future
 		if credentials.hashpass then
-			local salted_password = credentials.hashpass:gsub("..", function(x) return string.char(tonumber(x, 16)); end);
-			credentials.stored_key = sha1(hmac_sha1(salted_password, "Client Key")):gsub(".", function (c) return ("%02x"):format(c:byte()); end);
-			credentials.server_key = hmac_sha1(salted_password, "Server Key"):gsub(".", function (c) return ("%02x"):format(c:byte()); end);
+			local salted_password = from_hex(credentials.hashpass);
+			credentials.stored_key = sha1(hmac_sha1(salted_password, "Client Key"), true);
+			credentials.server_key = to_hex(hmac_sha1(salted_password, "Server Key"));
 			credentials.hashpass = nil
 			datamanager.store(username, host, "accounts", credentials);
 		end
 		
 		local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, credentials.salt, credentials.iteration_count);
 		
-		local stored_key_hex = stored_key:gsub(".", function (c) return ("%02x"):format(c:byte()); end);
-		local server_key_hex = server_key:gsub(".", function (c) return ("%02x"):format(c:byte()); end);
+		local stored_key_hex = to_hex(stored_key);
+		local server_key_hex = to_hex(server_key);
 		
 		if valid and stored_key_hex == credentials.stored_key and server_key_hex == credentials.server_key then
 			return true;
@@ -82,8 +103,8 @@
 			account.salt = account.salt or generate_uuid();
 			account.iteration_count = account.iteration_count or iteration_count;
 			local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, account.salt, account.iteration_count);
-			local stored_key_hex = stored_key:gsub(".", function (c) return ("%02x"):format(c:byte()); end);
-			local server_key_hex = server_key:gsub(".", function (c) return ("%02x"):format(c:byte()); end);
+			local stored_key_hex = to_hex(stored_key);
+			local server_key_hex = to_hex(server_key);
 			
 			account.stored_key = stored_key_hex
 			account.server_key = server_key_hex
@@ -110,8 +131,8 @@
 	function provider.create_user(username, password)
 		local salt = generate_uuid();
 		local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, salt, iteration_count);
-		local stored_key_hex = stored_key:gsub(".", function (c) return ("%02x"):format(c:byte()); end);
-		local server_key_hex = server_key:gsub(".", function (c) return ("%02x"):format(c:byte()); end);
+		local stored_key_hex = to_hex(stored_key);
+		local server_key_hex = to_hex(server_key);
 		return datamanager.store(username, host, "accounts", {stored_key = stored_key_hex, server_key = server_key_hex, salt = salt, iteration_count = iteration_count});
 	end
 
@@ -136,16 +157,16 @@
 				-- convert hexpass to stored_key and server_key
 				-- TODO: remove this in near future
 				if credentials.hashpass then
-					local salted_password = credentials.hashpass:gsub("..", function(x) return string.char(tonumber(x, 16)); end);
-					credentials.stored_key = sha1(hmac_sha1(salted_password, "Client Key")):gsub(".", function (c) return ("%02x"):format(c:byte()); end);
-					credentials.server_key = hmac_sha1(salted_password, "Server Key"):gsub(".", function (c) return ("%02x"):format(c:byte()); end);
+					local salted_password = from_hex(credentials.hashpass);
+					credentials.stored_key = sha1(hmac_sha1(salted_password, "Client Key"), true);
+					credentials.server_key = to_hex(hmac_sha1(salted_password, "Server Key"));
 					credentials.hashpass = nil
 					datamanager.store(username, host, "accounts", credentials);
 				end
 				
 				local stored_key, server_key, iteration_count, salt = credentials.stored_key, credentials.server_key, credentials.iteration_count, credentials.salt;
-				stored_key = stored_key and stored_key:gsub("..", function(x) return string.char(tonumber(x, 16)); end);
-				server_key = server_key and server_key:gsub("..", function(x) return string.char(tonumber(x, 16)); end);
+				stored_key = stored_key and from_hex(stored_key);
+				server_key = server_key and from_hex(server_key);
 				return stored_key, server_key, iteration_count, salt, true;
 			end
 		};