From 93af56873184ab9ed9b17590da142eb4a90722d8 Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Mon, 3 Aug 2020 13:02:41 +0200 Subject: Fixing sha1 by reversing bytes since it was designed for big endian --- inc/ft_ssl.h | 11 ++++++++++- src/main.c | 13 +++++++++---- src/message_digest.c | 22 ++++++++++++++++++++-- src/sha1.c | 10 ++-------- src/sha256.c | 4 +++- src/utils.c | 30 +++++++++++++++++++++++++++++- 6 files changed, 73 insertions(+), 17 deletions(-) diff --git a/inc/ft_ssl.h b/inc/ft_ssl.h index 2b16d53..bbda83c 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/08/02 16:37:45 by charles ### ########.fr */ +/* Updated: 2020/08/03 12:46:26 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include @@ -16,6 +16,11 @@ # include # include +# include + +# if __BYTE_ORDER == __BIG_ENDIAN +# error "This implementation doesn't support big endian" +# endif # include "libft.h" @@ -26,7 +31,9 @@ typedef struct t_compression_func compression_func; const void *compression_state_init; size_t compression_state_size; + size_t compression_state_stride; size_t chunk_size; + bool big_endian; } t_message_digest_param; void *md5_compression_func(void *v_state, uint8_t *chunk); @@ -74,6 +81,8 @@ int parse_args(int argc, char **argv, char *command, t_message_digest_param *m 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); +uint32_t reverse_bytes32(uint32_t x); +uint64_t reverse_bytes64(uint64_t x); /* ** md5 diff --git a/src/main.c b/src/main.c index 305d627..25b9947 100644 --- a/src/main.c +++ b/src/main.c @@ -6,12 +6,17 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 20:29:33 by cacharle #+# #+# */ -/* Updated: 2020/08/02 16:47:01 by charles ### ########.fr */ +/* Updated: 2020/08/03 12:39:25 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" + +/* #if __BYTE_ORDER == __BIG_ENDIAN */ +/* #warn "bonjour" */ +/* #endif */ + static const uint32_t g_md5_state[4] = { 0x67452301, 0xefcdab89, @@ -39,9 +44,9 @@ static const uint32_t g_sha256_state[8] = { }; 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}}, - {"sha256", {sha256_compression_func, g_sha256_state, sizeof(g_sha256_state), 64}}, + {"md5", {md5_compression_func, g_md5_state, sizeof(g_md5_state), sizeof(uint32_t), 64, false}}, + {"sha1", {sha1_compression_func, g_sha1_state, sizeof(g_sha1_state), sizeof(uint32_t), 64, true}}, + {"sha256", {sha256_compression_func, g_sha256_state, sizeof(g_sha256_state), sizeof(uint32_t), 64, true}}, }; t_message_digest_param *dispatch_command(char *command) diff --git a/src/message_digest.c b/src/message_digest.c index c696780..122d40d 100644 --- a/src/message_digest.c +++ b/src/message_digest.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/08/01 15:03:39 by charles #+# #+# */ -/* Updated: 2020/08/02 13:56:26 by charles ### ########.fr */ +/* Updated: 2020/08/03 12:56:52 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,8 +32,18 @@ char *message_digest(t_message_digest_param *param, uint8_t *message_origin, uin 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; + *((uint64_t*)(message + size + padding_size - sizeof(uint64_t))) = + param->big_endian ? reverse_bytes64(size * 8) : (size * 8); size += padding_size; + + for (size_t j = 0; j < size; j++) + { + if (j % 8 == 0) + printf("\n"); + printf("%02x ", message[j]); + } + printf("\n"); + i = 0; while (i < size) { @@ -47,6 +57,14 @@ char *message_digest(t_message_digest_param *param, uint8_t *message_origin, uin i += param->chunk_size; } free(message); + if (param->big_endian) + { + for (i = 0; i < param->compression_state_size / param->compression_state_stride; i++) + ((uint32_t*)local_state)[i] = + param->compression_state_stride == sizeof(uint32_t) + ? reverse_bytes32(((uint32_t*)local_state)[i]) + : reverse_bytes64(((uint64_t*)local_state)[i]); + } ret = bytes_to_str(local_state, param->compression_state_size); free(local_state); return (ret); diff --git a/src/sha1.c b/src/sha1.c index 12369e8..645c925 100644 --- a/src/sha1.c +++ b/src/sha1.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/08/02 14:20:39 by charles #+# #+# */ -/* Updated: 2020/08/02 15:42:51 by charles ### ########.fr */ +/* Updated: 2020/08/03 12:10:55 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,13 +20,7 @@ void *sha1_compression_func(void *v_state, uint8_t *chunk) 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); */ + buf[i] = reverse_bytes32(((uint32_t*)chunk)[i]); i = 16; while (i < 80) { diff --git a/src/sha256.c b/src/sha256.c index 29e2cde..85336fa 100644 --- a/src/sha256.c +++ b/src/sha256.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/08/02 16:36:43 by charles #+# #+# */ -/* Updated: 2020/08/02 16:46:32 by charles ### ########.fr */ +/* Updated: 2020/08/03 13:00:09 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,6 +32,8 @@ void *sha256_compression_func(void *v_state, uint8_t *chunk) ft_memcpy(buf, chunk, 64); + /* for (i = 0; i < 16; i++) */ + /* buf[i] = reverse_bytes32(((uint32_t*)chunk)[i]); */ for (i = 16; i < 64; i++) { s0 = rotate_right(buf[i - 15], 7) ^ rotate_right(buf[i - 15], 18) ^ rotate_right(buf[i - 15], 3); diff --git a/src/utils.c b/src/utils.c index 2abadb6..db0c203 100644 --- a/src/utils.c +++ b/src/utils.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/08/01 15:00:16 by charles #+# #+# */ -/* Updated: 2020/08/01 19:24:41 by charles ### ########.fr */ +/* Updated: 2020/08/03 12:57:25 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,3 +41,31 @@ char *bytes_to_str(uint8_t *bytes, size_t size) } return (ret); } + +uint32_t reverse_bytes32(uint32_t x) +{ + return ( + (x & 0x000000ffu) << 24 | + (x & 0x0000ff00u) << 8 | + (x & 0x00ff0000u) >> 8 | + (x & 0xff000000u) >> 24 + ); +} + +/* +** from: +*/ + +uint64_t reverse_bytes64(uint64_t x) +{ + return ( + (x & 0x00000000000000ffull) << 56 | + (x & 0x000000000000ff00ull) << 40 | + (x & 0x0000000000ff0000ull) << 24 | + (x & 0x00000000ff000000ull) << 8 | + (x & 0x000000ff00000000ull) >> 8 | + (x & 0x0000ff0000000000ull) >> 24 | + (x & 0x00ff000000000000ull) >> 40 | + (x & 0xff00000000000000ull) >> 56 + ); +} -- cgit