diff options
Diffstat (limited to 'src/md5')
| -rw-r--r-- | src/md5/main.c | 144 | ||||
| -rw-r--r-- | src/md5/main_md5.c | 18 |
2 files changed, 144 insertions, 18 deletions
diff --git a/src/md5/main.c b/src/md5/main.c new file mode 100644 index 0000000..81ca6ff --- /dev/null +++ b/src/md5/main.c @@ -0,0 +1,144 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/22 07:20:07 by cacharle #+# #+# */ +/* Updated: 2020/07/27 17:04:37 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_ssl_md5.h" + +const int g_shifts[64] = { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, // 0..15 + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, // 16..31 + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, // 32..47 + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, // 48..63 +}; + +const uint32_t g_K[64] = { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, // 0.. 3 + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, // 4.. 7 + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, // 8..11 + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, // 12..15 + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, // 16..19 + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, // 20..23 + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, // 24..27 + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, // 28..31 + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, // 32..35 + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, // 36..39 + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, // 40..43 + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, // 44..47 + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, // 48..51 + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, // 52..55 + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, // 56..59 + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391, // 60..63 +}; + +#define A_INIT 0x67452301 +#define B_INIT 0xefcdab89 +#define C_INIT 0x98badcfe +#define D_INIT 0x10325476 + +uint32_t leftrotate(uint32_t x, int s) +{ + return (x << s) | (x >> (32 - s)); +} + +char *message_digest_md5(uint8_t *msg, size_t size) +{ + // padding on 512 bit (64 bytes) + // format: + // 1 bit + // fill with zero start -> (end - 64 bit) + // 64 bit repr of the original len modulo 2^64 (ULONG_MAX) + + + uint8_t *tmp; + + tmp = msg; + + + size_t pad_size = 32 - size % 32; + + /* printf("%lu\n", size % 32); */ + /* printf("%lu\n", 32 - size % 32); */ + /* printf("%lu\n", pad_size); */ + + msg = malloc(size + pad_size); + + ft_memcpy(msg, tmp, size); + ft_memset(msg + size, 0x0, pad_size); + + msg[size] |= 1 << 7; + + + /* printf("%lu\n", size + pad_size - sizeof(uint64_t)); */ + *((uint64_t*)(msg + size + pad_size - sizeof(uint64_t))) = (uint64_t)size; + size += pad_size; + /* printf("%lu: %s\n", size, msg); */ + /* printf("|%02x%02x%02x%02x|\n", msg[24], msg[25], msg[26], msg[27]); */ + + uint32_t a, b, c, d; + + // state initialized to predefined constants + + // block of 512 bit + // 128 bit state (a, b, c, d) + // 4 rounds on each block (128 * 4 = 512) + + uint32_t f; + int g; + int i; + + + size_t chunk_i; + + chunk_i = 0; + while (chunk_i < size) + { + + i = -1; + while (++i < 64) + { + if (i < 16) + { + f = (b & c) | ~(b & d); + g = i; + } + else if (i < 32) + { + f = (b & c) | (c & ~d); + g = (5 * i + 1) % 16; + } + else if (i < 48) + { + f = b ^ c ^ d; + g = (3 * i + 1) % 16; + } + else + { + f = c ^ (b | ~d); + g = (7 * i + 1) % 16; + } + + f += a + g_K[i] + ((uint32_t*)(msg + chunk_i))[g]; + a = d; + d = c; + c = b; + b += leftrotate(f, g_shifts[i]); + } + + chunk_i += 32; + } + + char *ret = malloc(33 * sizeof(char)); + ret[32] = '\0'; + + sprintf(ret, "%08x%08x%08x%08x", a, b, c, d); + + return (ret); +} diff --git a/src/md5/main_md5.c b/src/md5/main_md5.c deleted file mode 100644 index 02dcaa0..0000000 --- a/src/md5/main_md5.c +++ /dev/null @@ -1,18 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* main_md5.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2020/02/22 07:20:07 by cacharle #+# #+# */ -/* Updated: 2020/02/22 08:57:32 by cacharle ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "ft_ssl_md5.h" - -int fl_main_md5(int argc, char **argv) -{ - return (0); -} |
