aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2020-08-03 13:02:41 +0200
committerCharles Cabergs <me@cacharle.xyz>2020-08-03 13:02:41 +0200
commit93af56873184ab9ed9b17590da142eb4a90722d8 (patch)
tree874b683ce7b0d512cd673ab953f3f14aecb70d40
parent49005573d3f6ee9123e827f71e694434b29251af (diff)
downloadft_ssl-93af56873184ab9ed9b17590da142eb4a90722d8.tar.gz
ft_ssl-93af56873184ab9ed9b17590da142eb4a90722d8.tar.bz2
ft_ssl-93af56873184ab9ed9b17590da142eb4a90722d8.zip
Fixing sha1 by reversing bytes since it was designed for big endian
-rw-r--r--inc/ft_ssl.h11
-rw-r--r--src/main.c13
-rw-r--r--src/message_digest.c22
-rw-r--r--src/sha1.c10
-rw-r--r--src/sha256.c4
-rw-r--r--src/utils.c30
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 <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <stdio.h>
@@ -16,6 +16,11 @@
# include <stdint.h>
# include <string.h>
+# include <endian.h>
+
+# 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 <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <me@cacharle.xyz> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <me@cacharle.xyz> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <me@cacharle.xyz> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <me@cacharle.xyz> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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: <byteswap.h>
+*/
+
+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
+ );
+}