From 74289579ac66890ef0d7df2a5ec5f15f8308b8cd Mon Sep 17 00:00:00 2001 From: ame Date: Mon, 11 Mar 2024 14:02:12 -0500 Subject: hashing fixes --- src/hash/buzhash.h | 4 ++++ src/hash/djb2.h | 2 ++ src/hash/farmhash.h | 4 ++++ src/hash/fasthash.h | 4 ++++ src/hash/jenkins.h | 2 ++ src/hash/loselose.h | 2 ++ src/hash/md5.c | 10 ++++------ src/hash/md5.h | 2 +- src/hash/metrohash.c | 4 ---- src/hash/metrohash.h | 8 ++++++++ src/hash/murmur.h | 4 ++++ src/hash/pjw.h | 2 ++ src/hash/sdbm.h | 2 ++ src/hash/sha01.c | 16 +++++++--------- src/hash/sha01.h | 2 +- src/hash/sha2-256.c | 34 +++++++++++----------------------- src/hash/sha2-256.h | 16 ++++++++++++++++ src/hash/spookyhash.c | 18 +++++++----------- src/hash/spookyhash.h | 9 +++++++++ 19 files changed, 90 insertions(+), 55 deletions(-) (limited to 'src/hash') diff --git a/src/hash/buzhash.h b/src/hash/buzhash.h index 74020ea..abc7fea 100644 --- a/src/hash/buzhash.h +++ b/src/hash/buzhash.h @@ -1,4 +1,8 @@ #include "../lua.h" +#include + +uint8_t i_buzhash8(uint8_t*, size_t); +uint16_t i_buzhash16(uint8_t*, size_t); int l_setbuzhash(lua_State*); int l_buzhash8(lua_State*); diff --git a/src/hash/djb2.h b/src/hash/djb2.h index 9c8036a..ab0d20f 100644 --- a/src/hash/djb2.h +++ b/src/hash/djb2.h @@ -1,3 +1,5 @@ #include "../lua.h" +#include +uint32_t djb2(uint8_t*, size_t); int l_djb2(lua_State*); diff --git a/src/hash/farmhash.h b/src/hash/farmhash.h index 8d99a46..97c0813 100644 --- a/src/hash/farmhash.h +++ b/src/hash/farmhash.h @@ -1,4 +1,8 @@ #include "../lua.h" +#include + +uint32_t farmhash32(uint8_t* in, size_t len); +uint64_t farmhash64(uint8_t* in, size_t len); int l_farmhash32(lua_State*); int l_farmhash64(lua_State*); diff --git a/src/hash/fasthash.h b/src/hash/fasthash.h index feff2fe..0a950e7 100644 --- a/src/hash/fasthash.h +++ b/src/hash/fasthash.h @@ -1,4 +1,8 @@ #include "../lua.h" +#include + +uint64_t fasthash64(uint8_t* in, size_t len, uint64_t seed); +uint32_t fasthash32(uint8_t *buf, size_t len, uint32_t seed); int l_fasthash32(lua_State*); int l_fasthash64(lua_State*); diff --git a/src/hash/jenkins.h b/src/hash/jenkins.h index d5959d2..d295896 100644 --- a/src/hash/jenkins.h +++ b/src/hash/jenkins.h @@ -1,3 +1,5 @@ #include "../lua.h" +#include +uint32_t jenkins_oaat(uint8_t* in, size_t len); int l_oaat(lua_State*); diff --git a/src/hash/loselose.h b/src/hash/loselose.h index dc7d200..434b8cb 100644 --- a/src/hash/loselose.h +++ b/src/hash/loselose.h @@ -1,3 +1,5 @@ #include "../lua.h" +#include +uint64_t loselose(uint8_t* in, size_t len); int l_loselose(lua_State*); diff --git a/src/hash/md5.c b/src/hash/md5.c index 7671066..a909819 100644 --- a/src/hash/md5.c +++ b/src/hash/md5.c @@ -20,14 +20,12 @@ static const uint32_t s[] = {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}; -void i_md5(char* input, char out_stream[64]){ +void i_md5(char* input, size_t len, char out_stream[64]){ uint32_t a0 = 0x67452301; uint32_t b0 = 0xefcdab89; uint32_t c0 = 0x98badcfe; uint32_t d0 = 0x10325476; - int len = 0; - for(int i = 0; input[i] != '\0'; i++) len++; int tlen = ((((len + 8) /64) + 1) * 64) - 8; uint8_t* b = NULL; @@ -96,11 +94,11 @@ void i_md5(char* input, char out_stream[64]){ int l_md5(lua_State* L){ - - char* a = (char*)luaL_checklstring(L, 1, NULL); + size_t len = 0; + char* a = (char*)luaL_checklstring(L, 1, &len); char digest[64]; - i_md5(a, digest); + i_md5(a, len, digest); lua_pushstring(L, digest); return 1; diff --git a/src/hash/md5.h b/src/hash/md5.h index 70161bd..aeae0c0 100644 --- a/src/hash/md5.h +++ b/src/hash/md5.h @@ -7,6 +7,6 @@ * @param {char[64]} output stream * @return {void} */ -void i_md5(char*,char*); +void i_md5(char*,size_t,char*); int l_md5(lua_State*); diff --git a/src/hash/metrohash.c b/src/hash/metrohash.c index 4e59f81..7da502a 100644 --- a/src/hash/metrohash.c +++ b/src/hash/metrohash.c @@ -8,10 +8,6 @@ #define u16(a) (*(uint16_t*)a) #define u8(a) (*(uint8_t*)a) -enum metrohash_version { - v1, v2 -}; - uint64_t metrohash64(uint8_t* in, size_t len, uint32_t seed, enum metrohash_version v){ uint64_t k0, k1, k2, k3, inner_r, inner_r2; if(v == v1){ diff --git a/src/hash/metrohash.h b/src/hash/metrohash.h index 30dabb2..8c9ebea 100644 --- a/src/hash/metrohash.h +++ b/src/hash/metrohash.h @@ -1,4 +1,12 @@ #include "../lua.h" +#include + +enum metrohash_version { + v1, v2 +}; + +uint64_t metrohash64(uint8_t* in, size_t len, uint32_t seed, enum metrohash_version v); +void metrohash128(uint8_t* in, size_t len, uint32_t seed, uint64_t *a, uint64_t *b, enum metrohash_version ver); int l_metrohash64_v1(lua_State*); int l_metrohash64_v2(lua_State*); diff --git a/src/hash/murmur.h b/src/hash/murmur.h index d7d7fc1..73a18a2 100644 --- a/src/hash/murmur.h +++ b/src/hash/murmur.h @@ -1,4 +1,8 @@ #include "../lua.h" +#include + +uint32_t murmur1_32(uint8_t* in, size_t len, uint32_t seed); +uint32_t murmur2_32(uint8_t* in, size_t len, uint32_t seed); int l_murmur1_32(lua_State*); int l_murmur2_32(lua_State*); diff --git a/src/hash/pjw.h b/src/hash/pjw.h index 7a3c1de..f1ab910 100644 --- a/src/hash/pjw.h +++ b/src/hash/pjw.h @@ -1,3 +1,5 @@ #include "../lua.h" +#include +uint32_t pjw(uint8_t* in, size_t len); int l_pjw(lua_State*); diff --git a/src/hash/sdbm.h b/src/hash/sdbm.h index 1420e48..797cc22 100644 --- a/src/hash/sdbm.h +++ b/src/hash/sdbm.h @@ -1,3 +1,5 @@ #include "../lua.h" +#include +uint64_t sdbm(uint8_t* in, size_t len); int l_sdbm(lua_State*); diff --git a/src/hash/sha01.c b/src/hash/sha01.c index 07f8829..b8b70f9 100644 --- a/src/hash/sha01.c +++ b/src/hash/sha01.c @@ -3,7 +3,7 @@ #include #include -void i_sha01(uint8_t version, char* out_stream, const char* input){ +void i_sha01(uint8_t version, char* out_stream, int len, const char* input){ if(!out_stream||version > 2) return; uint32_t h0 = 0x67452301; uint32_t h1 = 0xEFCDAB89; @@ -11,8 +11,6 @@ void i_sha01(uint8_t version, char* out_stream, const char* input){ uint32_t h3 = 0x10325476; uint32_t h4 = 0xC3D2E1F0; - int len = 0; - for(int i = 0; input[i]!='\0'; i++) len++; int tlen = ((((len + 8) /64) + 1) * 64) - 8; uint8_t* by = NULL; @@ -87,12 +85,12 @@ void i_sha01(uint8_t version, char* out_stream, const char* input){ int l_sha1(lua_State* L){ - int len = 0; - char* a = (char*)luaL_checklstring(L, 1, NULL); + size_t len = 0; + char* a = (char*)luaL_checklstring(L, 1, &len); char digest[160]; - i_sha01(1, digest, a); + i_sha01(1, digest, len, a); lua_pushstring(L, digest); return 1; @@ -100,12 +98,12 @@ int l_sha1(lua_State* L){ int l_sha0(lua_State* L){ - int len = 0; - char* a = (char*)luaL_checklstring(L, 1, NULL); + size_t len = 0; + char* a = (char*)luaL_checklstring(L, 1, &len); char digest[160]; - i_sha01(0, digest, a); + i_sha01(0, digest, len, a); lua_pushstring(L, digest); return 1; diff --git a/src/hash/sha01.h b/src/hash/sha01.h index 7c37115..c574d68 100644 --- a/src/hash/sha01.h +++ b/src/hash/sha01.h @@ -9,7 +9,7 @@ * @param {const char*} input bytes * @return {void} */ -void i_sha01(uint8_t, char*, const char*); +void i_sha01(uint8_t, char*, int, const char*); int l_sha1(lua_State*); int l_sha0(lua_State*); diff --git a/src/hash/sha2-256.c b/src/hash/sha2-256.c index d0c03f9..32af13a 100644 --- a/src/hash/sha2-256.c +++ b/src/hash/sha2-256.c @@ -23,17 +23,7 @@ void endian_swap64(uint64_t *x){ } } -struct iv { - uint64_t h0, h1, h2, h3, h4, h5, h6, h7; -}; - -static const struct iv sha512_iv = {.h0 = 0x6a09e667f3bcc908, .h1 = 0xbb67ae8584caa73b, .h2 = 0x3c6ef372fe94f82b, .h3 = 0xa54ff53a5f1d36f1, - .h4 = 0x510e527fade682d1, .h5 = 0x9b05688c2b3e6c1f, .h6 = 0x1f83d9abfb41bd6b, .h7 = 0x5be0cd19137e2179}; - -static const struct iv sha384_iv = {.h0 = 0xcbbb9d5dc1059ed8, .h1 = 0x629a292a367cd507, .h2 = 0x9159015a3070dd17, .h3 = 0x152fecd8f70e5939, - .h4 = 0x67332667ffc00b31, .h5 = 0x8eb44a8768581511, .h6 = 0xdb0c2e0d64f98fa7, .h7 = 0x47b5481dbefa4fa4}; - -void sha512_gen(uint64_t* out_stream, uint8_t* input, struct iv sha_iv){ +void sha512_gen(uint64_t* out_stream, uint8_t* input, size_t len, struct iv sha_iv){ uint64_t h0 = sha_iv.h0, h1 = sha_iv.h1, h2 = sha_iv.h2, h3 = sha_iv.h3, h4 = sha_iv.h4, h5 = sha_iv.h5, h6 = sha_iv.h6, h7 = sha_iv.h7; const uint64_t k[80] = {0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538, @@ -53,8 +43,6 @@ void sha512_gen(uint64_t* out_stream, uint8_t* input, struct iv sha_iv){ 0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817}; - size_t len = 0; - for(int i = 0; input[i]!='\0'; i++) len++; size_t blen = len*8; int ulen = 0; @@ -152,27 +140,27 @@ struct iv sha_iv_gen(int i){ uint64_t nh[8] = {0}; uint8_t in[12]; sprintf((char*)in, "SHA-512/%i",i); - sha512_gen(nh, in, oh); + sha512_gen(nh, in, strlen((char*)in), oh); return (struct iv){.h0 = nh[0], .h1 = nh[1], .h2 = nh[2], .h3 = nh[3], .h4 = nh[4], .h5 = nh[5], .h6 = nh[6], .h7 = nh[7]}; } -void sha2_512_t(uint8_t* out, uint8_t* in, int t){ +void sha2_512_t(uint8_t* out, uint8_t* in, size_t len, int t){ if(t%8!=0) return; uint64_t out_stream[8] = {0}; - sha512_gen(out_stream, in, sha_iv_gen(t)); + sha512_gen(out_stream, in, len, sha_iv_gen(t)); for(int i = 0; i != 8; i++) sprintf((char*)out, "%s%016llx", out, out_stream[i]); out[t/4] = '\0'; } -void sha2_512(uint8_t* out, uint8_t* in){ +void sha2_512(uint8_t* out, uint8_t* in, size_t len){ uint64_t out_stream[8] = {0}; - sha512_gen(out_stream, in, sha512_iv); + sha512_gen(out_stream, in, len, sha512_iv); for(int i = 0; i != 8; i++) sprintf((char*)out, "%s%016llx", out, out_stream[i]); } -void sha2_384(uint8_t* out, uint8_t* in){ +void sha2_384(uint8_t* out, uint8_t* in, size_t len){ uint64_t out_stream[8] = {0}; - sha512_gen(out_stream, in, sha384_iv); + sha512_gen(out_stream, in, len, sha384_iv); for(int i = 0; i != 6; i++) sprintf((char*)out, "%s%016llx", out, out_stream[i]); } @@ -182,7 +170,7 @@ int l_sha512(lua_State* L){ char digest[512] = {0}; - sha2_512((uint8_t*)digest, a); + sha2_512((uint8_t*)digest, a, len); lua_pushstring(L, digest); return 1; } @@ -193,7 +181,7 @@ int l_sha384(lua_State* L){ char digest[384] = {0}; - sha2_384((uint8_t*)digest, a); + sha2_384((uint8_t*)digest, a, len); lua_pushstring(L, digest); return 1; } @@ -205,7 +193,7 @@ int l_sha512_t(lua_State* L){ char digest[512] = {0}; - sha2_512_t((uint8_t*)digest, a, t); + sha2_512_t((uint8_t*)digest, a, t, len); lua_pushstring(L, digest); return 1; } diff --git a/src/hash/sha2-256.h b/src/hash/sha2-256.h index d794dec..a261819 100644 --- a/src/hash/sha2-256.h +++ b/src/hash/sha2-256.h @@ -1,4 +1,20 @@ #include "../lua.h" +#include + +struct iv { + uint64_t h0, h1, h2, h3, h4, h5, h6, h7; +}; + +static const struct iv sha512_iv = {.h0 = 0x6a09e667f3bcc908, .h1 = 0xbb67ae8584caa73b, .h2 = 0x3c6ef372fe94f82b, .h3 = 0xa54ff53a5f1d36f1, + .h4 = 0x510e527fade682d1, .h5 = 0x9b05688c2b3e6c1f, .h6 = 0x1f83d9abfb41bd6b, .h7 = 0x5be0cd19137e2179}; + +static const struct iv sha384_iv = {.h0 = 0xcbbb9d5dc1059ed8, .h1 = 0x629a292a367cd507, .h2 = 0x9159015a3070dd17, .h3 = 0x152fecd8f70e5939, + .h4 = 0x67332667ffc00b31, .h5 = 0x8eb44a8768581511, .h6 = 0xdb0c2e0d64f98fa7, .h7 = 0x47b5481dbefa4fa4}; + +struct iv sha_iv_gen(int i); +void sha2_512_t(uint8_t* out, uint8_t* in, size_t len, int t); +void sha2_512(uint8_t* out, uint8_t* in, size_t len); +void sha2_384(uint8_t* out, uint8_t* in, size_t len); int l_sha512(lua_State*); int l_sha384(lua_State*); diff --git a/src/hash/spookyhash.c b/src/hash/spookyhash.c index 5281452..abc3ea0 100644 --- a/src/hash/spookyhash.c +++ b/src/hash/spookyhash.c @@ -8,10 +8,6 @@ static const uint64_t sc_const = 0xdeadbeefdeadbeefLL; static const size_t sc_blockSize = sc_numVars*8; static const size_t sc_bufSize = 2*sc_blockSize; -enum spooky_version { - v1, v2 -}; - uint64_t i_rot64(uint64_t x, int k){ return (x << k) | (x >> (64 - k)); } @@ -81,7 +77,7 @@ void spooky_short(uint8_t* in, size_t len, uint64_t* hash1, uint64_t* hash2, enu } } - d = (((uint64_t)len) << 56) + (d * (v == v2)); + d = (((uint64_t)len) << 56) + (d * (v == spv2)); switch(remainder){ case 15: d += ((uint64_t)u.p8[14]) << 48; @@ -243,7 +239,7 @@ int l_spookyhash128_v1(lua_State* L){ char digest[128] = {0}; //uint64_t b = 0; //uint64_t c = 0; - spookyhash128(a, 4, &b, &c, v1); + spookyhash128(a, 4, &b, &c, spv1); sprintf(digest, "%016lx%016lx", b, c); lua_pushstring(L, digest); @@ -263,7 +259,7 @@ int l_spookyhash128_v2(lua_State* L){ char digest[128] = {0}; //uint64_t b = 0; //uint64_t c = 0; - spookyhash128(a, 4, &b, &c, v2); + spookyhash128(a, 4, &b, &c, spv2); sprintf(digest, "%016lx%016lx", b, c); lua_pushstring(L, digest); @@ -279,7 +275,7 @@ int l_spookyhash64_v1(lua_State* L){ char digest[64] = {0}; - sprintf(digest, "%08lx", spookyhash64(a, len, seed, v1)); + sprintf(digest, "%08lx", spookyhash64(a, len, seed, spv1)); lua_pushstring(L, digest); return 1; } @@ -293,7 +289,7 @@ int l_spookyhash64_v2(lua_State* L){ char digest[64] = {0}; - sprintf(digest, "%08lx", spookyhash64(a, len, seed, v2)); + sprintf(digest, "%08lx", spookyhash64(a, len, seed, spv2)); lua_pushstring(L, digest); return 1; } @@ -307,7 +303,7 @@ int l_spookyhash32_v1(lua_State* L){ char digest[32] = {0}; - sprintf(digest, "%04x", spookyhash32(a, len, seed, v1)); + sprintf(digest, "%04x", spookyhash32(a, len, seed, spv1)); lua_pushstring(L, digest); return 1; } @@ -321,7 +317,7 @@ int l_spookyhash32_v2(lua_State* L){ char digest[32] = {0}; - sprintf(digest, "%04x", spookyhash32(a, len, seed, v2)); + sprintf(digest, "%04x", spookyhash32(a, len, seed, spv2)); lua_pushstring(L, digest); return 1; } diff --git a/src/hash/spookyhash.h b/src/hash/spookyhash.h index 5bcecf6..5ca6c8a 100644 --- a/src/hash/spookyhash.h +++ b/src/hash/spookyhash.h @@ -1,4 +1,13 @@ #include "../lua.h" +#include + +enum spooky_version { + spv1, spv2 +}; + +void spookyhash128(uint8_t* in, size_t len, uint64_t* hash1, uint64_t* hash2, enum spooky_version v); +uint64_t spookyhash64(uint8_t *message, size_t length, uint64_t seed, enum spooky_version v); +uint32_t spookyhash32(uint8_t *message, size_t length, uint32_t seed, enum spooky_version v); int l_spookyhash128_v1(lua_State*); int l_spookyhash128_v2(lua_State*); -- cgit v1.2.3