From 1e3938729f46d68e0caa4c1ba154dc349fd4d6c6 Mon Sep 17 00:00:00 2001 From: DacoTaco Date: Thu, 19 Dec 2024 11:21:53 +0100 Subject: [PATCH] sha: remove need for 64 byte alignment on input --- libogc/sha.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/libogc/sha.c b/libogc/sha.c index 5a15a7d6..9e211b73 100644 --- a/libogc/sha.c +++ b/libogc/sha.c @@ -27,6 +27,7 @@ distribution. -------------------------------------------------------------*/ #if defined(HW_RVL) +#include #include #include "gctypes.h" #include "gcutil.h" @@ -52,7 +53,18 @@ static s32 SHA_ExecuteCommand(const ShaCommand command, sha_context* context, co if(params == NULL) return -4; - for (u32 i = 0; i < data_size; i += SHA_MSGBLOCK_SIZE) { + void* buffer = memalign(64, SHA_MSGBLOCK_SIZE); + if(buffer == NULL) + return -5; + + params[0].data = buffer; + params[1].data = (void*) context; + params[1].len = sizeof(sha_context); + params[2].data = out_data; + params[2].len = 0x14; + + for (u32 i = 0; i < data_size; i += SHA_MSGBLOCK_SIZE) + { u32 size = SHA_MSGBLOCK_SIZE; ShaCommand block_cmd = command; @@ -63,18 +75,17 @@ static s32 SHA_ExecuteCommand(const ShaCommand command, sha_context* context, co else if(command == FinalizeHash) block_cmd = AddData; - params[0].data = (void*)((u32)in_data + i); - params[0].len = size; - params[1].data = (void*) context; - params[1].len = sizeof(sha_context); - params[2].data = (void*)((u32)out_data); - params[2].len = 0x14; + //copy data to 64-byte aligned buffer and set the data size + memset(buffer, 0, SHA_MSGBLOCK_SIZE); + memcpy(buffer, (void*)((u32)in_data + i), size); + params[0].len = size; ret = IOS_Ioctlv(__sha_fd, block_cmd, 1, 2, params); if (ret < 0) break; } + free(buffer); iosFree(__sha_hid, params); return ret; } @@ -140,9 +151,6 @@ s32 SHA_Calculate(sha_context* context, const void* data, const u32 data_size, v if(((u32)context & 0x1F) != 0 || ((u32)message_digest & 0x1F) != 0) return -4; - if( data != NULL && ((u32)data & 0x3F) != 0) - return -4; - return SHA_ExecuteCommand(FinalizeHash, context, data, data_size, message_digest); } @@ -151,7 +159,7 @@ s32 SHA_Input(sha_context* context, const void* data, const u32 data_size) if(context == NULL || data == NULL || data_size == 0) return -1; - if((((u32)context) & 0x1F) || (((u32)data) & 0x3F)) + if(((u32)context) & 0x1F) return -4; return SHA_ExecuteCommand(AddData, context, data, data_size, NULL);