From cbd3905f01dcc1e884d778be9437012b93fe317a Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Sat, 1 Aug 2020 19:32:51 +0200 Subject: Refactoring md5 to generalize message digest --- inc/ft_ssl.h | 39 +++++++++- inc/ft_ssl_md5.h | 25 ------- libft | 2 +- src/main.c | 20 ++++- src/md5/main.c | 208 ++++++++++++++------------------------------------- src/message_digest.c | 47 ++++++++++++ src/utils.c | 43 +++++++++++ 7 files changed, 203 insertions(+), 181 deletions(-) delete mode 100644 inc/ft_ssl_md5.h create mode 100644 src/message_digest.c create mode 100644 src/utils.c diff --git a/inc/ft_ssl.h b/inc/ft_ssl.h index f3e3595..c88e7c3 100644 --- a/inc/ft_ssl.h +++ b/inc/ft_ssl.h @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 20:27:19 by cacharle #+# #+# */ -/* Updated: 2020/07/27 21:38:12 by charles ### ########.fr */ +/* Updated: 2020/08/01 19:24:12 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include @@ -14,9 +14,29 @@ #ifndef FT_SSL_H # define FT_SSL_H +# include + # include "libft.h" -# include "ft_ssl_md5.h" +typedef void *(*t_compression_func)(void *state, uint8_t *chunk); + +typedef struct +{ + t_compression_func compression_func; + void *compression_state; + size_t compression_state_size; + size_t chunk_size; + uint8_t *message; + uint64_t size; +} t_message_digest_param; + +void *md5_compression_func(void *v_state, uint8_t *chunk); +char *message_digest(t_message_digest_param *param); + +#define MD5_A_INIT 0x67452301 +#define MD5_B_INIT 0xefcdab89 +#define MD5_C_INIT 0x98badcfe +#define MD5_D_INIT 0x10325476 // # include "ft_ssl_md5.h" // # include "ft_ssl_sha256.h" @@ -50,4 +70,19 @@ typedef char *(*t_func_hash)(char *message); // int parse_args(char *name, int argc, char **argv, t_func_hash func_hash); + +/* +** utils.c +*/ + +uint32_t rotate_left(uint32_t x, int s); +uint32_t rotate_right(uint32_t x, int s); +char *bytes_to_str(uint8_t *bytes, size_t size); + +/* +** md5 +*/ + +char *message_digest_md5(uint8_t *msg, size_t size); + #endif diff --git a/inc/ft_ssl_md5.h b/inc/ft_ssl_md5.h deleted file mode 100644 index 22d0845..0000000 --- a/inc/ft_ssl_md5.h +++ /dev/null @@ -1,25 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ft_ssl_md5.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cacharle +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2020/02/22 07:14:45 by cacharle #+# #+# */ -/* Updated: 2020/07/27 16:36:41 by charles ### ########.fr */ -/* */ -/* ************************************************************************** */ -#include - -#ifndef FT_SSL_MD5_H -# define FT_SSL_MD5_H - -# include -# include -# include - -# include "libft.h" - -char *message_digest_md5(uint8_t *msg, size_t size); - -#endif diff --git a/libft b/libft index ca68aa1..ee32953 160000 --- a/libft +++ b/libft @@ -1 +1 @@ -Subproject commit ca68aa1e6fca81213d19431439ad0b31863fe10c +Subproject commit ee32953ea79616e72f5428cdf40c834714a891c9 diff --git a/src/main.c b/src/main.c index b765a62..b8c1b1f 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 20:29:33 by cacharle #+# #+# */ -/* Updated: 2020/07/27 16:27:16 by charles ### ########.fr */ +/* Updated: 2020/08/01 19:11:50 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,6 +34,7 @@ int main(int argc, char **argv) { + /* if (argc == 1) */ /* { */ /* ft_putstr("usage: "); */ @@ -43,6 +44,21 @@ int main(int argc, char **argv) /* } */ /* return (dispatch_command(argv[1], argc - 2, argv + 2)); */ (void)argc; + t_message_digest_param param; + param.compression_func = md5_compression_func; + param.compression_state = malloc(4 * sizeof(uint32_t)); + param.compression_state_size = 4 * sizeof(uint32_t); + param.chunk_size = 64; + param.message = argv[1]; + param.size = ft_strlen(argv[1]); + + ((uint32_t*)param.compression_state)[0] = MD5_A_INIT; + ((uint32_t*)param.compression_state)[1] = MD5_B_INIT; + ((uint32_t*)param.compression_state)[2] = MD5_C_INIT; + ((uint32_t*)param.compression_state)[3] = MD5_D_INIT; + + printf("%s\n", message_digest(¶m)); - printf("%s\n", message_digest_md5((uint8_t*)argv[1], ft_strlen(argv[1]))); + /* printf("%s\n", message_digest_md5((uint8_t*)argv[1], ft_strlen(argv[1]))); */ + return 0; } diff --git a/src/md5/main.c b/src/md5/main.c index d389b60..de631bd 100644 --- a/src/md5/main.c +++ b/src/md5/main.c @@ -6,20 +6,34 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/22 07:20:07 by cacharle #+# #+# */ -/* Updated: 2020/08/01 13:50:41 by charles ### ########.fr */ +/* Updated: 2020/08/01 19:27:06 by charles ### ########.fr */ /* */ /* ************************************************************************** */ -#include "ft_ssl_md5.h" +#include "ft_ssl.h" -const int g_shifts[64] = { +/* +** | bits | bytes | +** |------|-------| +** | 8 | 1 | +** | 16 | 2 | +** | 32 | 4 | +** | 64 | 8 | +** | 128 | 16 | +** | 256 | 32 | +** | 512 | 64 | +** +** | 448 | 56 | +*/ + +static const int g_shifts_table[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] = { +static const uint32_t g_sin_table[64] = { 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, // 0.. 3 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, // 4.. 7 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, // 8..11 @@ -38,163 +52,55 @@ const uint32_t g_K[64] = { 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)); -} - -/* -** | bits | bytes | -** |------|-------| -** | 8 | 1 | -** | 16 | 2 | -** | 32 | 4 | -** | 64 | 8 | -** | 128 | 16 | -** | 256 | 32 | -** | 512 | 64 | -** -** | 448 | 56 | -*/ -char *message_digest_md5(uint8_t *msg, uint64_t size) +void *md5_compression_func(void *v_state, uint8_t *chunk) { - // 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) - - - // at least 1 byte for 1 bit + 8 bytes for 64bit size - uint64_t pad_size = (64 - (size + 8) % 64) + 8; - - /* printf("%lu\n", size % 64); */ - /* printf("%lu\n", 64 - size % 64); */ - printf("%lu + %lu = %lu byte\n", size, pad_size, size + pad_size); - - uint8_t *tmp; - tmp = msg; - msg = malloc(size + pad_size); // add ft_memdup - - ft_memcpy(msg, tmp, size); - ft_memset(msg + size, 0x0, pad_size); // fill end with 0 - - msg[size] |= 1 << 7; // add 1 bit at padding start - - *((uint64_t*)(msg + size + pad_size - sizeof(uint64_t))) = (uint64_t)size * 8; // add - size += pad_size; - - for (uint64_t i = 0; i < size; i++) - { - if (i % 8 == 0) - printf("\n"); - printf("%02x ", msg[i]); - } - printf("\n\n"); - /* printf("\n%lu: %s\n", size, msg); */ - /* printf("|%lu|\n", *((uint64_t*)(msg + size - 8))); */ - - // 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 g; int i; + uint32_t a, b, c, d, f; + uint32_t *state; - size_t chunk_i; - - uint32_t a, b, c, d; + state = v_state; + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; - uint32_t a0 = A_INIT; - uint32_t b0 = B_INIT; - uint32_t c0 = C_INIT; - uint32_t d0 = D_INIT; - - chunk_i = 0; - while (chunk_i < size) + i = -1; + while (++i < 64) { - a = a0; - b = b0; - c = c0; - d = d0; - i = -1; - while (++i < 64) + if (i < 16) { - - if (i < 16) - { - f = (b & c) | ((~b) & d); - g = i; - } - else if (i < 32) - { - f = (b & d) | (c & (~d)); - g = (5 * i + 1) % 16; - } - else if (i < 48) - { - f = b ^ c ^ d; - g = (3 * i + 5) % 16; - } - else - { - f = c ^ (b | ~d); - g = (7 * i) % 16; - } - - f += a + g_K[i] + ((uint32_t*)(msg + chunk_i))[g]; - a = d; - d = c; - c = b; - b += leftrotate(f, g_shifts[i]); + f = (b & c) | ((~b) & d); + g = i; + } + else if (i < 32) + { + f = (b & d) | (c & (~d)); + g = (5 * i + 1) % 16; + } + else if (i < 48) + { + f = b ^ c ^ d; + g = (3 * i + 5) % 16; + } + else + { + f = c ^ (b | ~d); + g = (7 * i) % 16; } - a0 += a; - b0 += b; - c0 += c; - d0 += d; - chunk_i += 64; + f += a + g_sin_table[i] + ((uint32_t*)chunk)[g]; + a = d; + d = c; + c = b; + b += rotate_left(f, g_shifts_table[i]); } - - uint8_t buf[16]; - buf[0] = (a0 & 0xff000000) >> 24; - buf[1] = (a0 & 0x00ff0000) >> 16; - buf[2] = (a0 & 0x0000ff00) >> 8; - buf[3] = a0 & 0x000000ff; - - buf[4] = (b0 & 0xff000000) >> 24; - buf[5] = (b0 & 0x00ff0000) >> 16; - buf[6] = (b0 & 0x0000ff00) >> 8; - buf[7] = b0 & 0x000000ff; - - buf[8] = (c0 & 0xff000000) >> 24; - buf[9] = (c0 & 0x00ff0000) >> 16; - buf[10] = (c0 & 0x0000ff00) >> 8; - buf[11] = c0 & 0x000000ff; - - buf[12] = (d0 & 0xff000000) >> 24; - buf[13] = (d0 & 0x00ff0000) >> 16; - buf[14] = (d0 & 0x0000ff00) >> 8; - buf[15] = d0 & 0x000000ff; - - - char *ret = malloc(33 * sizeof(char)); - ret[32] = '\0'; - - sprintf(ret, "%08x%08x%08x%08x", ((uint32_t*)buf)[0], ((uint32_t*)buf)[1], - ((uint32_t*)buf)[2], ((uint32_t*)buf)[3]); - - return (ret); + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + return (state); } diff --git a/src/message_digest.c b/src/message_digest.c new file mode 100644 index 0000000..b08022f --- /dev/null +++ b/src/message_digest.c @@ -0,0 +1,47 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* message_digest.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/08/01 15:03:39 by charles #+# #+# */ +/* Updated: 2020/08/01 19:25:07 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_ssl.h" + +char *message_digest(t_message_digest_param *param) +{ + size_t i; + uint64_t padding_size; + uint8_t *message; + + padding_size = (64 - (param->size + 8) % 64) + 8; + + message = malloc(param->size + padding_size); + if (message == NULL) + return (NULL); + ft_memcpy(message, param->message, param->size); + ft_memset(message + param->size, 0x0, padding_size); + + message[param->size] |= 1 << 7; + *((uint64_t*)(message + param->size + padding_size - sizeof(uint64_t))) = + (uint64_t)param->size * 8; + param->size += padding_size; + + i = 0; + while (i < param->size) + { + param->compression_state = param->compression_func(param->compression_state, message + i); + if (param->compression_state == NULL) + { + free(message); + return (NULL); + } + i += param->chunk_size; + } + + return (bytes_to_str(param->compression_state, param->compression_state_size)); +} diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000..2abadb6 --- /dev/null +++ b/src/utils.c @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/08/01 15:00:16 by charles #+# #+# */ +/* Updated: 2020/08/01 19:24:41 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_ssl.h" + +#define HEX_CHARS "0123456789abcdef" + +uint32_t rotate_left(uint32_t x, int s) +{ + return (x << s) | (x >> (32 - s)); +} + +uint32_t rotate_right(uint32_t x, int s) +{ + return (x >> s) | (x << (32 - s)); +} + +char *bytes_to_str(uint8_t *bytes, size_t size) +{ + char *ret; + size_t i; + + if ((ret = ft_strnew(size * 2)) == NULL) + return (NULL); + + i = 0; + while (i < size) + { + ret[i * 2 + 0] = HEX_CHARS[(bytes[i] & 0xf0) >> 4]; + ret[i * 2 + 1] = HEX_CHARS[(bytes[i] & 0x0f) >> 0]; + i++; + } + return (ret); +} -- cgit