Diff

util/sha1.lua @ 57:8e8bac82e119

util.sha1, squishy: Add sha1 lib needed for proxy65 (and soon XEP-0114)
author Matthew Wild <mwild1@gmail.com>
date Thu, 06 May 2010 10:35:50 +0100
child 105:0f2446a9f65f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util/sha1.lua	Thu May 06 10:35:50 2010 +0100
@@ -0,0 +1,146 @@
+-------------------------------------------------
+---      *** SHA-1 algorithm for Lua ***      ---
+-------------------------------------------------
+--- Author:  Martin Huesser                   ---
+--- Date:    2008-06-16                       ---
+--- License: You may use this code in your    ---
+---          projects as long as this header  ---
+---          stays intact.                    ---
+-------------------------------------------------
+
+local strlen  = string.len
+local strchar = string.char
+local strbyte = string.byte
+local strsub  = string.sub
+local floor   = math.floor
+local bit     = require "bit"
+local bnot    = bit.bnot
+local band    = bit.band
+local bor     = bit.bor
+local bxor    = bit.bxor
+local shl     = bit.lshift
+local shr     = bit.rshift
+local h0, h1, h2, h3, h4
+
+-------------------------------------------------
+
+local function LeftRotate(val, nr)
+	return shl(val, nr) + shr(val, 32 - nr)
+end
+
+-------------------------------------------------
+
+local function ToHex(num)
+	local i, d
+	local str = ""
+	for i = 1, 8 do
+		d = band(num, 15)
+		if (d < 10) then
+			str = strchar(d + 48) .. str
+		else
+			str = strchar(d + 87) .. str
+		end
+		num = floor(num / 16)
+	end
+	return str
+end
+
+-------------------------------------------------
+
+local function PreProcess(str)
+	local bitlen, i
+	local str2 = ""
+	bitlen = strlen(str) * 8
+	str = str .. strchar(128)
+	i = 56 - band(strlen(str), 63)
+	if (i < 0) then
+		i = i + 64
+	end
+	for i = 1, i do
+		str = str .. strchar(0)
+	end
+	for i = 1, 8 do
+		str2 = strchar(band(bitlen, 255)) .. str2
+		bitlen = floor(bitlen / 256)
+	end
+	return str .. str2
+end
+
+-------------------------------------------------
+
+local function MainLoop(str)
+	local a, b, c, d, e, f, k, t
+	local i, j
+	local w = {}
+	while (str ~= "") do
+		for i = 0, 15 do
+			w[i] = 0
+			for j = 1, 4 do
+				w[i] = w[i] * 256 + strbyte(str, i * 4 + j)
+			end
+		end
+		for i = 16, 79 do
+			w[i] = LeftRotate(bxor(bxor(w[i - 3], w[i - 8]), bxor(w[i - 14], w[i - 16])), 1)
+		end
+		a = h0
+		b = h1
+		c = h2
+		d = h3
+		e = h4
+		for i = 0, 79 do
+			if (i < 20) then
+				f = bor(band(b, c), band(bnot(b), d))
+				k = 1518500249
+			elseif (i < 40) then
+				f = bxor(bxor(b, c), d)
+				k = 1859775393
+			elseif (i < 60) then
+				f = bor(bor(band(b, c), band(b, d)), band(c, d))
+				k = 2400959708
+			else
+				f = bxor(bxor(b, c), d)
+				k = 3395469782
+			end
+			t = LeftRotate(a, 5) + f + e + k + w[i]	
+			e = d
+			d = c
+			c = LeftRotate(b, 30)
+			b = a
+			a = t
+		end
+		h0 = band(h0 + a, 4294967295)
+		h1 = band(h1 + b, 4294967295)
+		h2 = band(h2 + c, 4294967295)
+		h3 = band(h3 + d, 4294967295)
+		h4 = band(h4 + e, 4294967295)
+		str = strsub(str, 65)
+	end
+end
+
+-------------------------------------------------
+
+local function sha1(str, hex)
+	str = PreProcess(str)
+	h0  = 1732584193
+	h1  = 4023233417
+	h2  = 2562383102
+	h3  = 0271733878
+	h4  = 3285377520
+	MainLoop(str)
+	local hex = ToHex(h0)..ToHex(h1)..ToHex(h2)
+	            ..ToHex(h3)..ToHex(h4);
+	if hex then
+		return  hex;
+	else
+		return hex:gsub("..", function (byte)
+			return string.char(tonumber(byte, 16));
+		end);
+	end
+end
+
+_G.sha1 = {sha1 = sha1};
+return _G.sha1;
+
+-------------------------------------------------
+-------------------------------------------------
+-------------------------------------------------