130 MAKE_HMAC_FUNCTION(Lhmac_sha1, SHA1, SHA_DIGEST_LENGTH, SHA_CTX) |
132 MAKE_HMAC_FUNCTION(Lhmac_sha1, SHA1, SHA_DIGEST_LENGTH, SHA_CTX) |
131 MAKE_HMAC_FUNCTION(Lhmac_sha256, SHA256, SHA256_DIGEST_LENGTH, SHA256_CTX) |
133 MAKE_HMAC_FUNCTION(Lhmac_sha256, SHA256, SHA256_DIGEST_LENGTH, SHA256_CTX) |
132 MAKE_HMAC_FUNCTION(Lhmac_sha512, SHA512, SHA512_DIGEST_LENGTH, SHA512_CTX) |
134 MAKE_HMAC_FUNCTION(Lhmac_sha512, SHA512, SHA512_DIGEST_LENGTH, SHA512_CTX) |
133 MAKE_HMAC_FUNCTION(Lhmac_md5, MD5, MD5_DIGEST_LENGTH, MD5_CTX) |
135 MAKE_HMAC_FUNCTION(Lhmac_md5, MD5, MD5_DIGEST_LENGTH, MD5_CTX) |
134 |
136 |
|
137 static int LscramHi(lua_State *L) { |
|
138 union xory { |
|
139 unsigned char bytes[SHA_DIGEST_LENGTH]; |
|
140 uint32_t quadbytes[SHA_DIGEST_LENGTH/4]; |
|
141 }; |
|
142 int i; |
|
143 SHA_CTX ctx, ctxo; |
|
144 unsigned char Ust[SHA_DIGEST_LENGTH]; |
|
145 union xory Und; |
|
146 union xory res; |
|
147 size_t str_len, salt_len; |
|
148 struct hash_desc desc; |
|
149 const char *str = luaL_checklstring(L, 1, &str_len); |
|
150 const char *salt = luaL_checklstring(L, 2, &salt_len); |
|
151 char *salt2; |
|
152 const int iter = luaL_checkinteger(L, 3); |
|
153 |
|
154 desc.Init = (int (*)(void*))SHA1_Init; |
|
155 desc.Update = (int (*)(void*, const void *, size_t))SHA1_Update; |
|
156 desc.Final = (int (*)(unsigned char*, void*))SHA1_Final; |
|
157 desc.digestLength = SHA_DIGEST_LENGTH; |
|
158 desc.ctx = &ctx; |
|
159 desc.ctxo = &ctxo; |
|
160 |
|
161 salt2 = malloc(salt_len + 4); |
|
162 if (salt2 == NULL) |
|
163 luaL_error(L, "Out of memory in scramHi"); |
|
164 memcpy(salt2, salt, salt_len); |
|
165 memcpy(salt2 + salt_len, "\0\0\0\1", 4); |
|
166 hmac(&desc, str, str_len, salt2, salt_len + 4, Ust); |
|
167 free(salt2); |
|
168 |
|
169 memcpy(res.bytes, Ust, sizeof(res)); |
|
170 for (i = 1; i < iter; i++) { |
|
171 int j; |
|
172 hmac(&desc, str, str_len, (char*)Ust, sizeof(Ust), Und.bytes); |
|
173 for (j = 0; j < SHA_DIGEST_LENGTH/4; j++) |
|
174 res.quadbytes[j] ^= Und.quadbytes[j]; |
|
175 memcpy(Ust, Und.bytes, sizeof(Ust)); |
|
176 } |
|
177 |
|
178 lua_pushlstring(L, (char*)res.bytes, SHA_DIGEST_LENGTH); |
|
179 |
|
180 return 1; |
|
181 } |
|
182 |
135 static const luaL_Reg Reg[] = |
183 static const luaL_Reg Reg[] = |
136 { |
184 { |
137 { "sha1", Lsha1 }, |
185 { "sha1", Lsha1 }, |
138 { "sha224", Lsha224 }, |
186 { "sha224", Lsha224 }, |
139 { "sha256", Lsha256 }, |
187 { "sha256", Lsha256 }, |
142 { "md5", Lmd5 }, |
190 { "md5", Lmd5 }, |
143 { "hmac_sha1", Lhmac_sha1 }, |
191 { "hmac_sha1", Lhmac_sha1 }, |
144 { "hmac_sha256", Lhmac_sha256 }, |
192 { "hmac_sha256", Lhmac_sha256 }, |
145 { "hmac_sha512", Lhmac_sha512 }, |
193 { "hmac_sha512", Lhmac_sha512 }, |
146 { "hmac_md5", Lhmac_md5 }, |
194 { "hmac_md5", Lhmac_md5 }, |
|
195 { "scram_Hi_sha1", LscramHi }, |
147 { NULL, NULL } |
196 { NULL, NULL } |
148 }; |
197 }; |
149 |
198 |
150 LUALIB_API int luaopen_util_hashes(lua_State *L) |
199 LUALIB_API int luaopen_util_hashes(lua_State *L) |
151 { |
200 { |