From 820d554d5fd75cf5d2ec8e2a10403972c78d55ba Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Sun, 2 Aug 2020 12:00:43 +0200 Subject: Added argument parsing (file/stdin digest) --- src/args.c | 166 +++++++++++++++++++++++++---------------------- src/error.c | 32 +++++---- src/main.c | 83 +++++++++++------------- src/md5.c | 106 ++++++++++++++++++++++++++++++ src/md5/main.c | 106 ------------------------------ src/message_digest.c | 27 ++++---- src/sha256/main_sha256.c | 18 ----- 7 files changed, 260 insertions(+), 278 deletions(-) create mode 100644 src/md5.c delete mode 100644 src/md5/main.c delete mode 100644 src/sha256/main_sha256.c (limited to 'src') diff --git a/src/args.c b/src/args.c index 4cd783a..41e9e9f 100644 --- a/src/args.c +++ b/src/args.c @@ -6,86 +6,96 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/22 09:43:42 by cacharle #+# #+# */ -/* Updated: 2020/07/27 14:57:39 by charles ### ########.fr */ +/* Updated: 2020/08/02 11:58:47 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" -/* static void st_print_digest_id(t_flags flags, char *id) */ -/* { */ -/* if (flags & FLAG_STRING) */ -/* ft_putchar('"'); */ -/* ft_putstr(id); */ -/* if (flags & FLAG_STRING) */ -/* ft_putchar('"'); */ -/* } */ -/* */ -/* static void st_print_digest(t_digest *digest, t_flags flags, char *name, char *id) */ -/* { */ -/* int i; */ -/* */ -/* if (!(flags & FLAG_REVERSE) && !(flags & FLAG_QUIET)) */ -/* { */ -/* ft_putstr(name); */ -/* ft_putchar('('); */ -/* st_print_digest_id(flags, id); */ -/* ft_putstr(") = "); */ -/* } */ -/* i = -1; */ -/* while (++i < digest->size) */ -/* ft_putnbr_base(digest->data[i], "0123456789abcdef"); */ -/* if (flags & FLAG_QUIET) */ -/* return ; */ -/* ft_putchar(' '); */ -/* st_print_digest_id(flags, id); */ -/* } */ -/* */ -/* int parse_args(char *name, int argc, char **argv, t_func_hash func_hash) */ -/* { */ -/* t_flags flags; */ -/* t_digest digest; */ -/* char *file; */ -/* */ -/* flags = 0; */ -/* while (**argv == '-') */ -/* { */ -/* (*argv)++; */ -/* if (**argv == 's') */ -/* { */ -/* if ((*argv)[1] == '\0') */ -/* { */ -/* func_hash(*(++argv), &digest); */ -/* argc--; */ -/* } */ -/* else */ -/* func_hash(ft_strdup(*argv + 1), &digest); */ -/* st_print_digest(&digest, flags, name, ""); */ -/* } */ -/* else if (**argv == 'p') */ -/* flags |= FLAG_PIPE; */ -/* else if (**argv == 'q') */ -/* flags |= FLAG_QUIET; */ -/* else if (**argv == 'r') */ -/* flags |= FLAG_REVERSE; */ -/* else */ -/* return (1); */ -/* if (ft_strchr("pqrs", (*argv)[1]) != NULL) */ -/* { */ -/* **argv = '-'; */ -/* continue; */ -/* } */ -/* argv++; */ -/* argc--; */ -/* } */ -/* while (argc-- > 0) */ -/* { */ -/* if ((file = ft_read_file(*argv)) == NULL) */ -/* return (1); */ -/* func_hash(file, &digest); */ -/* free(file); */ -/* st_print_digest(&digest, flags, name, *argv); */ -/* argv++; */ -/* } */ -/* return (0); */ -/* } */ +static void st_print_digest_input(t_flags flags, char *input) +{ + if (flags & FLAG_STRING) + ft_putchar('"'); + ft_putstr(input); + if (flags & FLAG_STRING) + ft_putchar('"'); +} + +static void st_print_digest(t_flags flags, char *command, char *input, char *digest_str) +{ + if (!(flags & FLAG_REVERSE) && !(flags & FLAG_QUIET)) + { + ft_putstr(command); //toupper + ft_putchar('('); + st_print_digest_input(flags, input); + ft_putstr(") = "); + } + ft_putstr(digest_str); + if (flags & FLAG_QUIET) + { + ft_putchar('\n'); + return ; + } + if (flags & FLAG_REVERSE) + { + ft_putchar(' '); + st_print_digest_input(flags, input); + } + ft_putchar('\n'); +} + +int parse_args(int argc, char **argv, char *command, t_message_digest_param *md_param) +{ + t_flags flags; + t_ftmem file; + + char *digest_str; + int i; + + flags = 0; + i = 0; + while (i < argc) + { + if (argv[i][0] != '-') + break ; + if (ft_strcmp(argv[i], "-s") == 0) + { + i++; + if (i >= argc) // no string + return 1; + digest_str = message_digest(md_param, (uint8_t*)argv[i], ft_strlen(argv[i])); + if (digest_str == NULL) + return 1; + st_print_digest(flags | FLAG_STRING, command, argv[i], digest_str); + } + else if (ft_strcmp(argv[i], "-p") == 0) + { + if (ft_getfile_fd(STDIN_FILENO, &file) < 0) + return (1); + digest_str = message_digest(md_param, file.data, file.size); + if (digest_str == NULL) + return 1; + write(STDOUT_FILENO, file.data, file.size); + ft_putendl(digest_str); + } + else if (ft_strcmp(argv[i], "-q") == 0) + flags |= FLAG_QUIET; + else if (ft_strcmp(argv[i], "-r") == 0) + flags |= FLAG_REVERSE; + else + return (1); + i++; + } + while (i < argc) + { + if (ft_getfile(argv[i], &file) < 0) + return (1); + digest_str = message_digest(md_param, file.data, file.size); + if (digest_str == NULL) + return 1; + st_print_digest(flags, command, argv[i], digest_str); + free(file.data); + i++; + } + return (0); +} diff --git a/src/error.c b/src/error.c index 96ef3b1..e094a0a 100644 --- a/src/error.c +++ b/src/error.c @@ -6,22 +6,26 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/22 07:02:59 by cacharle #+# #+# */ -/* Updated: 2020/07/27 14:59:41 by charles ### ########.fr */ +/* Updated: 2020/08/02 09:23:37 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" -/* void error_command(char *command) */ -/* { */ -/* ft_putstr_fd("ft_ssl: Error: '", STDERR_FILENO); */ -/* ft_putstr_fd(command, STDERR_FILENO); */ -/* ft_putendl_fd("' is an invalid command.", STDERR_FILENO); */ -/* ft_putstr_fd("\nStandard commands:\n" */ -/* "\nMessage Digest commands:\n" */ -/* "md5\n" */ -/* "sha256\n" */ -/* "\nCipher commands:\n", */ -/* STDERR_FILENO */ -/* ); */ -/* } */ +// use in error message +/* extern t_compression_entry g_compression_table[]; */ + +void error_command(char *command) +{ + // argv[0]? + ft_putstr_fd("ft_ssl: Error: '", STDERR_FILENO); + ft_putstr_fd(command, STDERR_FILENO); + ft_putendl_fd("' is an invalid command.", STDERR_FILENO); + ft_putstr_fd("\nStandard commands:\n" + "\nMessage Digest commands:\n" + "md5\n" + "sha256\n" + "\nCipher commands:\n", + STDERR_FILENO + ); +} diff --git a/src/main.c b/src/main.c index b8c1b1f..f5898ad 100644 --- a/src/main.c +++ b/src/main.c @@ -6,59 +6,50 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 20:29:33 by cacharle #+# #+# */ -/* Updated: 2020/08/01 19:11:50 by charles ### ########.fr */ +/* Updated: 2020/08/02 11:26:50 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" -/* static t_command g_commands[] = { */ -/* {"md5", main_md5}, */ -/* {"sha256", main_sha256} */ -/* }; */ +static uint32_t g_md5_state[4] = {MD5_A_INIT, MD5_B_INIT, MD5_C_INIT, MD5_D_INIT}; -/* int dispatch_command(char *command, int argc, char **argv) */ -/* { */ -/* size_t i; */ -/* */ -/* i = 0; */ -/* while (i < sizeof(g_commands) / sizeof(t_command)) */ -/* { */ -/* if (ft_strcmp(g_commands[i].name, command) == 0) */ -/* return (g_commands[i].entry(argc, argv)); */ -/* i++; */ -/* } */ -/* error_command(command); */ -/* return (1); */ -/* } */ +/* static uint32_t g_sha1_state[5] = {0}; */ -int main(int argc, char **argv) -{ - - /* if (argc == 1) */ - /* { */ - /* ft_putstr("usage: "); */ - /* ft_putstr(argv[0]); */ - /* ft_putendl_fd(" command [command opts] [command args]", STDERR_FILENO); */ - /* return (1); */ - /* } */ - /* 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; +t_compression_entry g_compression_table[] = { + {"md5", {md5_compression_func, g_md5_state, sizeof(g_md5_state), 64}}, + /* {"sha1", {sha1_compression_func, g_sha1_state, sizeof(g_sha1_state), 64}} */ +}; - printf("%s\n", message_digest(¶m)); +t_message_digest_param *dispatch_command(char *command) +{ + size_t i; + + i = 0; + while (i < sizeof(g_compression_table) / sizeof(t_compression_entry)) + { + if (ft_strcmp(g_compression_table[i].name, command) == 0) + return (&g_compression_table[i].param); + i++; + } + error_command(command); + return (NULL); +} - /* printf("%s\n", message_digest_md5((uint8_t*)argv[1], ft_strlen(argv[1]))); */ - return 0; +int main(int argc, char **argv) +{ + if (argc == 1) + { + ft_putstr("usage: "); + ft_putstr(argv[0]); + ft_putendl_fd(" command [command opts] [command args]", STDERR_FILENO); + return (1); + } + t_message_digest_param *md_param = dispatch_command(argv[1]); + if (md_param == NULL) + return 1; + return (parse_args(argc - 2, argv + 2, argv[1], md_param)); + + /* printf("%s\n", message_digest(md_param, (uint8_t*)argv[2], ft_strlen(argv[2]))); */ + /* return 0; */ } diff --git a/src/md5.c b/src/md5.c new file mode 100644 index 0000000..561dcbd --- /dev/null +++ b/src/md5.c @@ -0,0 +1,106 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* md5.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/22 07:20:07 by cacharle #+# #+# */ +/* Updated: 2020/08/02 09:25:59 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_ssl.h" + +/* +** | 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 +}; + +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 + 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 +}; + + +void *md5_compression_func(void *v_state, uint8_t *chunk) +{ + int g; + int i; + + uint32_t a, b, c, d, f; + uint32_t *state; + + state = v_state; + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + + i = -1; + while (++i < 64) + { + + 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_sin_table[i] + ((uint32_t*)chunk)[g]; + a = d; + d = c; + c = b; + b += rotate_left(f, g_shifts_table[i]); + } + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + return (state); +} diff --git a/src/md5/main.c b/src/md5/main.c deleted file mode 100644 index de631bd..0000000 --- a/src/md5/main.c +++ /dev/null @@ -1,106 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* main.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cacharle +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2020/02/22 07:20:07 by cacharle #+# #+# */ -/* Updated: 2020/08/01 19:27:06 by charles ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "ft_ssl.h" - -/* -** | 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 -}; - -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 - 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 -}; - - -void *md5_compression_func(void *v_state, uint8_t *chunk) -{ - int g; - int i; - - uint32_t a, b, c, d, f; - uint32_t *state; - - state = v_state; - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - - i = -1; - while (++i < 64) - { - - 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_sin_table[i] + ((uint32_t*)chunk)[g]; - a = d; - d = c; - c = b; - b += rotate_left(f, g_shifts_table[i]); - } - 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 index b08022f..24c1db5 100644 --- a/src/message_digest.c +++ b/src/message_digest.c @@ -6,33 +6,28 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/08/01 15:03:39 by charles #+# #+# */ -/* Updated: 2020/08/01 19:25:07 by charles ### ########.fr */ +/* Updated: 2020/08/02 11:56:27 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" -char *message_digest(t_message_digest_param *param) +char *message_digest(t_message_digest_param *param, uint8_t *message_origin, uint64_t size) { 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) + padding_size = (param->chunk_size - (size + sizeof(uint64_t)) % param->chunk_size) + sizeof(uint64_t); + if ((message = malloc(size + padding_size)) == 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; - + ft_memcpy(message, message_origin, size); + ft_memset(message + size, 0x0, padding_size); + message[size] |= 1 << 7; + *((uint64_t*)(message + size + padding_size - sizeof(uint64_t))) = size * 8; + size += padding_size; i = 0; - while (i < param->size) + while (i < size) { param->compression_state = param->compression_func(param->compression_state, message + i); if (param->compression_state == NULL) @@ -42,6 +37,6 @@ char *message_digest(t_message_digest_param *param) } i += param->chunk_size; } - + // FIXME reset state return (bytes_to_str(param->compression_state, param->compression_state_size)); } diff --git a/src/sha256/main_sha256.c b/src/sha256/main_sha256.c deleted file mode 100644 index 817061e..0000000 --- a/src/sha256/main_sha256.c +++ /dev/null @@ -1,18 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* main_sha256.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cacharle +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2020/02/22 07:19:18 by cacharle #+# #+# */ -/* Updated: 2020/07/27 15:01:15 by charles ### ########.fr */ -/* */ -/* ************************************************************************** */ - -/* #include "ft_ssl_sha256.h" */ -/* */ -/* int main_sha256(int argc, char **argv) */ -/* { */ -/* return (0); */ -/* } */ -- cgit