X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;ds=sidebyside;f=util-src%2Fhashes.c;h=33041e83bdb8929f3673d860a408a3e89b22c064;hb=04bc83bc4d2668a95b4538def5b51cf8611ae111;hp=2a6625b3a6ddb9bae9a173fff6181bb35e882c1e;hpb=687ea0525b7683b5e4411b6b7f3d426e034ee6d1;p=prosody.git diff --git a/util-src/hashes.c b/util-src/hashes.c index 2a6625b3..33041e83 100644 --- a/util-src/hashes.c +++ b/util-src/hashes.c @@ -14,6 +14,13 @@ */ #include +#include + +#ifdef _MSC_VER +typedef unsigned __int32 uint32_t; +#else +#include +#endif #include "lua.h" #include "lauxlib.h" @@ -72,13 +79,13 @@ static void hmac(struct hash_desc *desc, const char *key, size_t key_len, }; int i; - char hashedKey[64]; /* Maximum used digest length */ + unsigned char hashedKey[64]; /* Maximum used digest length */ union xory k_ipad, k_opad; if (key_len > 64) { desc->Init(desc->ctx); desc->Update(desc->ctx, key, key_len); - desc->Final(desc->ctx, hashedKey); + desc->Final(hashedKey, desc->ctx); key = (const char*)hashedKey; key_len = desc->digestLength; } @@ -132,6 +139,52 @@ MAKE_HMAC_FUNCTION(Lhmac_sha256, SHA256, SHA256_DIGEST_LENGTH, SHA256_CTX) MAKE_HMAC_FUNCTION(Lhmac_sha512, SHA512, SHA512_DIGEST_LENGTH, SHA512_CTX) MAKE_HMAC_FUNCTION(Lhmac_md5, MD5, MD5_DIGEST_LENGTH, MD5_CTX) +static int LscramHi(lua_State *L) { + union xory { + unsigned char bytes[SHA_DIGEST_LENGTH]; + uint32_t quadbytes[SHA_DIGEST_LENGTH/4]; + }; + int i; + SHA_CTX ctx, ctxo; + unsigned char Ust[SHA_DIGEST_LENGTH]; + union xory Und; + union xory res; + size_t str_len, salt_len; + struct hash_desc desc; + const char *str = luaL_checklstring(L, 1, &str_len); + const char *salt = luaL_checklstring(L, 2, &salt_len); + char *salt2; + const int iter = luaL_checkinteger(L, 3); + + desc.Init = (int (*)(void*))SHA1_Init; + desc.Update = (int (*)(void*, const void *, size_t))SHA1_Update; + desc.Final = (int (*)(unsigned char*, void*))SHA1_Final; + desc.digestLength = SHA_DIGEST_LENGTH; + desc.ctx = &ctx; + desc.ctxo = &ctxo; + + salt2 = malloc(salt_len + 4); + if (salt2 == NULL) + luaL_error(L, "Out of memory in scramHi"); + memcpy(salt2, salt, salt_len); + memcpy(salt2 + salt_len, "\0\0\0\1", 4); + hmac(&desc, str, str_len, salt2, salt_len + 4, Ust); + free(salt2); + + memcpy(res.bytes, Ust, sizeof(res)); + for (i = 1; i < iter; i++) { + int j; + hmac(&desc, str, str_len, (char*)Ust, sizeof(Ust), Und.bytes); + for (j = 0; j < SHA_DIGEST_LENGTH/4; j++) + res.quadbytes[j] ^= Und.quadbytes[j]; + memcpy(Ust, Und.bytes, sizeof(Ust)); + } + + lua_pushlstring(L, (char*)res.bytes, SHA_DIGEST_LENGTH); + + return 1; +} + static const luaL_Reg Reg[] = { { "sha1", Lsha1 }, @@ -144,6 +197,7 @@ static const luaL_Reg Reg[] = { "hmac_sha256", Lhmac_sha256 }, { "hmac_sha512", Lhmac_sha512 }, { "hmac_md5", Lhmac_md5 }, + { "scram_Hi_sha1", LscramHi }, { NULL, NULL } };