Software /
code /
verse
Comparison
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 |
comparison
equal
deleted
inserted
replaced
56:014bdb4154e9 | 57:8e8bac82e119 |
---|---|
1 ------------------------------------------------- | |
2 --- *** SHA-1 algorithm for Lua *** --- | |
3 ------------------------------------------------- | |
4 --- Author: Martin Huesser --- | |
5 --- Date: 2008-06-16 --- | |
6 --- License: You may use this code in your --- | |
7 --- projects as long as this header --- | |
8 --- stays intact. --- | |
9 ------------------------------------------------- | |
10 | |
11 local strlen = string.len | |
12 local strchar = string.char | |
13 local strbyte = string.byte | |
14 local strsub = string.sub | |
15 local floor = math.floor | |
16 local bit = require "bit" | |
17 local bnot = bit.bnot | |
18 local band = bit.band | |
19 local bor = bit.bor | |
20 local bxor = bit.bxor | |
21 local shl = bit.lshift | |
22 local shr = bit.rshift | |
23 local h0, h1, h2, h3, h4 | |
24 | |
25 ------------------------------------------------- | |
26 | |
27 local function LeftRotate(val, nr) | |
28 return shl(val, nr) + shr(val, 32 - nr) | |
29 end | |
30 | |
31 ------------------------------------------------- | |
32 | |
33 local function ToHex(num) | |
34 local i, d | |
35 local str = "" | |
36 for i = 1, 8 do | |
37 d = band(num, 15) | |
38 if (d < 10) then | |
39 str = strchar(d + 48) .. str | |
40 else | |
41 str = strchar(d + 87) .. str | |
42 end | |
43 num = floor(num / 16) | |
44 end | |
45 return str | |
46 end | |
47 | |
48 ------------------------------------------------- | |
49 | |
50 local function PreProcess(str) | |
51 local bitlen, i | |
52 local str2 = "" | |
53 bitlen = strlen(str) * 8 | |
54 str = str .. strchar(128) | |
55 i = 56 - band(strlen(str), 63) | |
56 if (i < 0) then | |
57 i = i + 64 | |
58 end | |
59 for i = 1, i do | |
60 str = str .. strchar(0) | |
61 end | |
62 for i = 1, 8 do | |
63 str2 = strchar(band(bitlen, 255)) .. str2 | |
64 bitlen = floor(bitlen / 256) | |
65 end | |
66 return str .. str2 | |
67 end | |
68 | |
69 ------------------------------------------------- | |
70 | |
71 local function MainLoop(str) | |
72 local a, b, c, d, e, f, k, t | |
73 local i, j | |
74 local w = {} | |
75 while (str ~= "") do | |
76 for i = 0, 15 do | |
77 w[i] = 0 | |
78 for j = 1, 4 do | |
79 w[i] = w[i] * 256 + strbyte(str, i * 4 + j) | |
80 end | |
81 end | |
82 for i = 16, 79 do | |
83 w[i] = LeftRotate(bxor(bxor(w[i - 3], w[i - 8]), bxor(w[i - 14], w[i - 16])), 1) | |
84 end | |
85 a = h0 | |
86 b = h1 | |
87 c = h2 | |
88 d = h3 | |
89 e = h4 | |
90 for i = 0, 79 do | |
91 if (i < 20) then | |
92 f = bor(band(b, c), band(bnot(b), d)) | |
93 k = 1518500249 | |
94 elseif (i < 40) then | |
95 f = bxor(bxor(b, c), d) | |
96 k = 1859775393 | |
97 elseif (i < 60) then | |
98 f = bor(bor(band(b, c), band(b, d)), band(c, d)) | |
99 k = 2400959708 | |
100 else | |
101 f = bxor(bxor(b, c), d) | |
102 k = 3395469782 | |
103 end | |
104 t = LeftRotate(a, 5) + f + e + k + w[i] | |
105 e = d | |
106 d = c | |
107 c = LeftRotate(b, 30) | |
108 b = a | |
109 a = t | |
110 end | |
111 h0 = band(h0 + a, 4294967295) | |
112 h1 = band(h1 + b, 4294967295) | |
113 h2 = band(h2 + c, 4294967295) | |
114 h3 = band(h3 + d, 4294967295) | |
115 h4 = band(h4 + e, 4294967295) | |
116 str = strsub(str, 65) | |
117 end | |
118 end | |
119 | |
120 ------------------------------------------------- | |
121 | |
122 local function sha1(str, hex) | |
123 str = PreProcess(str) | |
124 h0 = 1732584193 | |
125 h1 = 4023233417 | |
126 h2 = 2562383102 | |
127 h3 = 0271733878 | |
128 h4 = 3285377520 | |
129 MainLoop(str) | |
130 local hex = ToHex(h0)..ToHex(h1)..ToHex(h2) | |
131 ..ToHex(h3)..ToHex(h4); | |
132 if hex then | |
133 return hex; | |
134 else | |
135 return hex:gsub("..", function (byte) | |
136 return string.char(tonumber(byte, 16)); | |
137 end); | |
138 end | |
139 end | |
140 | |
141 _G.sha1 = {sha1 = sha1}; | |
142 return _G.sha1; | |
143 | |
144 ------------------------------------------------- | |
145 ------------------------------------------------- | |
146 ------------------------------------------------- |