diff options
| author | ame <[email protected]> | 2024-04-15 08:23:28 -0500 |
|---|---|---|
| committer | ame <[email protected]> | 2024-04-15 08:23:28 -0500 |
| commit | 8d85e6501a9aa49da4a4a910207566e85bd5fd4d (patch) | |
| tree | e864d5bb71d06320ede5a5f15158938dcc4c1912 /src/hash/sha01.c | |
| parent | 3b9343ae3f25684e1dfa3bd8f123d61dcfd81be7 (diff) | |
msys2 + fix logging
Diffstat (limited to 'src/hash/sha01.c')
| -rw-r--r-- | src/hash/sha01.c | 446 |
1 files changed, 223 insertions, 223 deletions
diff --git a/src/hash/sha01.c b/src/hash/sha01.c index d382465..9ba3e6c 100644 --- a/src/hash/sha01.c +++ b/src/hash/sha01.c @@ -1,223 +1,223 @@ -#include "../crypto.h" -#include <stdlib.h> -#include <string.h> -#include <stdint.h> - -#define bs 64 - -struct sha01_hash { - uint8_t* buffer; - uint32_t h0, h1, h2, h3, h4; - size_t bufflen; - size_t total; - uint8_t version; -}; - -#define sha0_hash sha01_hash -#define sha1_hash sha01_hash - -struct sha01_hash sha01_init(uint8_t ver){ - struct sha01_hash a = {.h0 = 0x67452301, .h1 = 0xEFCDAB89, .h2 = 0x98BADCFE, .h3 = 0x10325476, .h4 = 0xC3D2E1F0, - .total = 0, .bufflen = 0, .version = ver}; - a.buffer = calloc(sizeof * a.buffer, bs); - return a; -} - -struct sha01_hash sha01_init_l(uint8_t ver, lua_State* L){ - struct sha01_hash a = {.h0 = 0x67452301, .h1 = 0xEFCDAB89, .h2 = 0x98BADCFE, .h3 = 0x10325476, .h4 = 0xC3D2E1F0, - .total = 0, .bufflen = 0, .version = ver}; - a.buffer = lua_newuserdata(L, sizeof * a.buffer * bs); - memset(a.buffer, 0, bs); - return a; -} - -void sha01_round(struct sha01_hash* hash){ - int hat = 0; - uint32_t W[80] = {0}; - - for(int i = 0; i != 16; i++){ - int t = 24; - for(int x = 0;t>=0; x++){ - W[i] += (((uint32_t)hash->buffer[hat]) << t); - hat++; - t-=8; - } - } - for(int i = 16; i != 80; i++) - W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], hash->version); - - uint32_t a = hash->h0; - uint32_t b = hash->h1; - uint32_t c = hash->h2; - uint32_t d = hash->h3; - uint32_t e = hash->h4; - - for(int i = 0; i != 80; i++){ - - uint32_t f,k; - if(0 <= i && i <= 19){ - f = (b & c) | ((~b) & d); - k = 0x5A827999; - } else if(20 <= i && i <= 39){ - f = b ^ c ^ d; - k = 0x6ED9EBA1; - } else if(40 <= i && i <= 59){ - f = (b & c) | (b & d) | (c & d); - k = 0x8F1BBCDC; - } else { - f = b ^ c ^ d; - k = 0xCA62C1D6; - } - - uint32_t temp = rotl32(a, 5) + f + e + k + W[i]; - e = d; - d = c; - c = rotl32(b, 30); - b = a; - a = temp; - } - - hash->h0 += a; - hash->h1 += b; - hash->h2 += c; - hash->h3 += d; - hash->h4 += e; -} - -void sha01_update(uint8_t* input, size_t len, struct sha01_hash* hash){ - hash->total += len; - size_t total_add = len + hash->bufflen; - size_t read = 0; - if(total_add < bs){ - memcpy(hash->buffer + hash->bufflen, input, len); - hash->bufflen += len; - return; - } - - for(; total_add >= bs;){ - memcpy(hash->buffer + hash->bufflen, input + read, bs - hash->bufflen); - total_add -= bs; - hash->bufflen = 0; - read += bs; - sha01_round(hash); - } - - memset(hash->buffer, 0, bs); - - if(0 != total_add){ - memcpy(hash->buffer, input + read, total_add); - hash->bufflen = total_add; - } -} - -void sha01_final(struct sha01_hash* hash, char* out_stream){ - uint8_t old[bs]; - struct sha01_hash old_hash; - memcpy(&old_hash, hash, sizeof * hash); - memcpy(old, hash->buffer, bs); - - hash->buffer[hash->bufflen] = 0x80; - - if(hash->bufflen > 55) { - //too large, needs another buffer - memset(hash->buffer + hash->bufflen + 1, 0, 64 - hash->bufflen); - sha01_round(hash); - memset(hash->buffer, 0, 64); - } - - size_t lhhh = 8*hash->total; - for(int i = 0; i != 8; i++) - hash->buffer[63 - i] = (uint8_t) (lhhh >> (i * 8) & 0xFF); - sha01_round(hash); - - sprintf(out_stream,"%02x%02x%02x%02x%02x",hash->h0,hash->h1,hash->h2,hash->h3,hash->h4); - - memcpy(hash, &old_hash, sizeof * hash); - memcpy(hash->buffer, old, bs); -} - -struct sha01_hash sha0_init(){ - return sha01_init(0); -} - -struct sha01_hash sha1_init(){ - return sha01_init(1); -} - -void sha0_update(uint8_t* input, size_t len, struct sha01_hash* hash){ - sha01_update(input, len, hash); -} - -void sha1_update(uint8_t* input, size_t len, struct sha01_hash* hash){ - sha01_update(input, len, hash); -} - -void sha0_final(struct sha01_hash* hash, char* out_stream){ - sha01_final(hash, out_stream); -} - -void sha1_final(struct sha01_hash* hash, char* out_stream){ - sha01_final(hash, out_stream); -} - -void sha0(uint8_t* a, size_t len, char* out_stream){ - struct sha01_hash aa = sha0_init(); - sha0_update(a, len, &aa); - sha0_final(&aa, out_stream); - free(aa.buffer); -} - -void sha1(uint8_t* a, size_t len, char* out_stream){ - struct sha01_hash aa = sha1_init(); - sha1_update(a, len, &aa); - sha1_final(&aa, out_stream); - free(aa.buffer); -} - -common_hash_clone(sha1); -lua_common_hash_init_ni(sha1, sha1, sha01_init_l(1, L)); -lua_common_hash_update(sha1, sha1); - -common_hash_clone(sha0); -lua_common_hash_init_ni(sha0, sha0, sha01_init_l(0, L)); -lua_common_hash_update(sha0, sha0); - -int l_sha1_final(lua_State* L){ - struct sha01_hash* a = (struct sha01_hash*)lua_touserdata(L, 1); - - char digest[160]; - sha1_final(a, digest); - - lua_pushstring(L, digest); - return 1; -} - -int l_sha0_final(lua_State* L){ - return l_sha1_final(L); -} - -int l_sha1(lua_State* L){ - if(lua_gettop(L) == 0) return l_sha1_init(L); - size_t len = 0; - char* a = (char*)luaL_checklstring(L, 1, &len); - - char digest[160]; - - sha1((uint8_t*)a, len, digest); - lua_pushstring(L, digest); - - return 1; -}; - -int l_sha0(lua_State* L){ - if(lua_gettop(L) == 0) return l_sha0_init(L); - size_t len = 0; - char* a = (char*)luaL_checklstring(L, 1, &len); - - char digest[160]; - - sha0((uint8_t*)a, len, digest); - lua_pushstring(L, digest); - - return 1; -}; +#include "../crypto.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#define bs 64
+
+struct sha01_hash {
+ uint8_t* buffer;
+ uint32_t h0, h1, h2, h3, h4;
+ size_t bufflen;
+ size_t total;
+ uint8_t version;
+};
+
+#define sha0_hash sha01_hash
+#define sha1_hash sha01_hash
+
+struct sha01_hash sha01_init(uint8_t ver){
+ struct sha01_hash a = {.h0 = 0x67452301, .h1 = 0xEFCDAB89, .h2 = 0x98BADCFE, .h3 = 0x10325476, .h4 = 0xC3D2E1F0,
+ .total = 0, .bufflen = 0, .version = ver};
+ a.buffer = calloc(sizeof * a.buffer, bs);
+ return a;
+}
+
+struct sha01_hash sha01_init_l(uint8_t ver, lua_State* L){
+ struct sha01_hash a = {.h0 = 0x67452301, .h1 = 0xEFCDAB89, .h2 = 0x98BADCFE, .h3 = 0x10325476, .h4 = 0xC3D2E1F0,
+ .total = 0, .bufflen = 0, .version = ver};
+ a.buffer = lua_newuserdata(L, sizeof * a.buffer * bs);
+ memset(a.buffer, 0, bs);
+ return a;
+}
+
+void sha01_round(struct sha01_hash* hash){
+ int hat = 0;
+ uint32_t W[80] = {0};
+
+ for(int i = 0; i != 16; i++){
+ int t = 24;
+ for(int x = 0;t>=0; x++){
+ W[i] += (((uint32_t)hash->buffer[hat]) << t);
+ hat++;
+ t-=8;
+ }
+ }
+ for(int i = 16; i != 80; i++)
+ W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], hash->version);
+
+ uint32_t a = hash->h0;
+ uint32_t b = hash->h1;
+ uint32_t c = hash->h2;
+ uint32_t d = hash->h3;
+ uint32_t e = hash->h4;
+
+ for(int i = 0; i != 80; i++){
+
+ uint32_t f,k;
+ if(0 <= i && i <= 19){
+ f = (b & c) | ((~b) & d);
+ k = 0x5A827999;
+ } else if(20 <= i && i <= 39){
+ f = b ^ c ^ d;
+ k = 0x6ED9EBA1;
+ } else if(40 <= i && i <= 59){
+ f = (b & c) | (b & d) | (c & d);
+ k = 0x8F1BBCDC;
+ } else {
+ f = b ^ c ^ d;
+ k = 0xCA62C1D6;
+ }
+
+ uint32_t temp = rotl32(a, 5) + f + e + k + W[i];
+ e = d;
+ d = c;
+ c = rotl32(b, 30);
+ b = a;
+ a = temp;
+ }
+
+ hash->h0 += a;
+ hash->h1 += b;
+ hash->h2 += c;
+ hash->h3 += d;
+ hash->h4 += e;
+}
+
+void sha01_update(uint8_t* input, size_t len, struct sha01_hash* hash){
+ hash->total += len;
+ size_t total_add = len + hash->bufflen;
+ size_t read = 0;
+ if(total_add < bs){
+ memcpy(hash->buffer + hash->bufflen, input, len);
+ hash->bufflen += len;
+ return;
+ }
+
+ for(; total_add >= bs;){
+ memcpy(hash->buffer + hash->bufflen, input + read, bs - hash->bufflen);
+ total_add -= bs;
+ hash->bufflen = 0;
+ read += bs;
+ sha01_round(hash);
+ }
+
+ memset(hash->buffer, 0, bs);
+
+ if(0 != total_add){
+ memcpy(hash->buffer, input + read, total_add);
+ hash->bufflen = total_add;
+ }
+}
+
+void sha01_final(struct sha01_hash* hash, char* out_stream){
+ uint8_t old[bs];
+ struct sha01_hash old_hash;
+ memcpy(&old_hash, hash, sizeof * hash);
+ memcpy(old, hash->buffer, bs);
+
+ hash->buffer[hash->bufflen] = 0x80;
+
+ if(hash->bufflen > 55) {
+ //too large, needs another buffer
+ memset(hash->buffer + hash->bufflen + 1, 0, 64 - hash->bufflen);
+ sha01_round(hash);
+ memset(hash->buffer, 0, 64);
+ }
+
+ size_t lhhh = 8*hash->total;
+ for(int i = 0; i != 8; i++)
+ hash->buffer[63 - i] = (uint8_t) (lhhh >> (i * 8) & 0xFF);
+ sha01_round(hash);
+
+ sprintf(out_stream,"%02x%02x%02x%02x%02x",hash->h0,hash->h1,hash->h2,hash->h3,hash->h4);
+
+ memcpy(hash, &old_hash, sizeof * hash);
+ memcpy(hash->buffer, old, bs);
+}
+
+struct sha01_hash sha0_init(){
+ return sha01_init(0);
+}
+
+struct sha01_hash sha1_init(){
+ return sha01_init(1);
+}
+
+void sha0_update(uint8_t* input, size_t len, struct sha01_hash* hash){
+ sha01_update(input, len, hash);
+}
+
+void sha1_update(uint8_t* input, size_t len, struct sha01_hash* hash){
+ sha01_update(input, len, hash);
+}
+
+void sha0_final(struct sha01_hash* hash, char* out_stream){
+ sha01_final(hash, out_stream);
+}
+
+void sha1_final(struct sha01_hash* hash, char* out_stream){
+ sha01_final(hash, out_stream);
+}
+
+void sha0(uint8_t* a, size_t len, char* out_stream){
+ struct sha01_hash aa = sha0_init();
+ sha0_update(a, len, &aa);
+ sha0_final(&aa, out_stream);
+ free(aa.buffer);
+}
+
+void sha1(uint8_t* a, size_t len, char* out_stream){
+ struct sha01_hash aa = sha1_init();
+ sha1_update(a, len, &aa);
+ sha1_final(&aa, out_stream);
+ free(aa.buffer);
+}
+
+common_hash_clone(sha1);
+lua_common_hash_init_ni(sha1, sha1, sha01_init_l(1, L));
+lua_common_hash_update(sha1, sha1);
+
+common_hash_clone(sha0);
+lua_common_hash_init_ni(sha0, sha0, sha01_init_l(0, L));
+lua_common_hash_update(sha0, sha0);
+
+int l_sha1_final(lua_State* L){
+ struct sha01_hash* a = (struct sha01_hash*)lua_touserdata(L, 1);
+
+ char digest[160];
+ sha1_final(a, digest);
+
+ lua_pushstring(L, digest);
+ return 1;
+}
+
+int l_sha0_final(lua_State* L){
+ return l_sha1_final(L);
+}
+
+int l_sha1(lua_State* L){
+ if(lua_gettop(L) == 0) return l_sha1_init(L);
+ size_t len = 0;
+ char* a = (char*)luaL_checklstring(L, 1, &len);
+
+ char digest[160];
+
+ sha1((uint8_t*)a, len, digest);
+ lua_pushstring(L, digest);
+
+ return 1;
+};
+
+int l_sha0(lua_State* L){
+ if(lua_gettop(L) == 0) return l_sha0_init(L);
+ size_t len = 0;
+ char* a = (char*)luaL_checklstring(L, 1, &len);
+
+ char digest[160];
+
+ sha0((uint8_t*)a, len, digest);
+ lua_pushstring(L, digest);
+
+ return 1;
+};
|
