aboutsummaryrefslogtreecommitdiff
path: root/src/sha1.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sha1.c')
-rw-r--r--src/sha1.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/sha1.c b/src/sha1.c
new file mode 100644
index 0000000..12369e8
--- /dev/null
+++ b/src/sha1.c
@@ -0,0 +1,80 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* sha1.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <me@cacharle.xyz> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/08/02 14:20:39 by charles #+# #+# */
+/* Updated: 2020/08/02 15:42:51 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_ssl.h"
+
+void *sha1_compression_func(void *v_state, uint8_t *chunk)
+{
+ uint32_t buf[80] = {0};
+ size_t i;
+ uint32_t a, b, c, d, e, f, k, tmp;
+ uint32_t *state;
+
+ for (i = 0; i < 16; i++)
+ {
+ buf[i] = chunk[i * 4] << 24;
+ buf[i] |= chunk[i * 4 + 1] << 16;
+ buf[i] |= chunk[i * 4 + 2] << 8;
+ buf[i] |= chunk[i * 4 + 3];
+ }
+ /* ft_memcpy(buf, chunk, 64); */
+ i = 16;
+ while (i < 80)
+ {
+ buf[i] = rotate_left(buf[i - 3] ^ buf[i - 8] ^ buf[i - 14] ^ buf[i - 16], 1);
+ i++;
+ }
+ state = v_state;
+ a = state[0];
+ b = state[1];
+ c = state[2];
+ d = state[3];
+ e = state[4];
+
+ i = 0;
+ while (i < 80)
+ {
+ if (i < 20)
+ {
+ f = (b & c) | ((~b) & d);
+ k = 0x5a827999;
+ }
+ else if (i < 40)
+ {
+ f = b ^ c ^ d;
+ k = 0x6ed9eba1;
+ }
+ else if (i < 60)
+ {
+ f = (b & c) | (b & d) | (c & d);
+ k = 0x8f1bbcdc;
+ }
+ else
+ {
+ f = b ^ c ^ d;
+ k = 0xca62c1d6;
+ }
+ tmp = rotate_left(a, 5) + f + e + k + buf[i];
+ e = d;
+ d = c;
+ c = rotate_left(b, 30);
+ b = a;
+ a = tmp;
+ i++;
+ }
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+ state[4] += e;
+ return (state);
+}