From 837a8644bd335c63dde57d39b7058fdf6d2a9847 Mon Sep 17 00:00:00 2001 From: DacoTaco Date: Thu, 19 Dec 2024 11:31:02 +0100 Subject: [PATCH] sha: split up finalize from calculate #185 this allows users to have full sha control via init/input/finalize or just call and go using calculate --- gc/ogc/sha.h | 7 +++---- libogc/sha.c | 27 +++++++++++++++++++-------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/gc/ogc/sha.h b/gc/ogc/sha.h index 07153797..c02553c3 100644 --- a/gc/ogc/sha.h +++ b/gc/ogc/sha.h @@ -49,12 +49,11 @@ typedef struct s32 SHA_Init(void); s32 SHA_Close(void); -s32 SHA_InitializeContext(sha_context* context); +s32 SHA_Calculate(const void* data, const u32 data_size, void* message_digest); -//calculate hash or add data manually - input data should *always* be 64bit aligned! -s32 SHA_Calculate(sha_context* context, const void* data, const u32 data_size, void* message_digest); +s32 SHA_InitializeContext(sha_context* context); s32 SHA_Input(sha_context* context, const void* data, const u32 data_size); - +s32 SHA_Finalize(sha_context* context, const void* data, const u32 data_size, void* message_digest); #ifdef __cplusplus } diff --git a/libogc/sha.c b/libogc/sha.c index 9e211b73..f4f77667 100644 --- a/libogc/sha.c +++ b/libogc/sha.c @@ -143,26 +143,37 @@ s32 SHA_InitializeContext(sha_context* context) iosFree(__sha_hid, params); return ret; } -s32 SHA_Calculate(sha_context* context, const void* data, const u32 data_size, void* message_digest) + +s32 SHA_Input(sha_context* context, const void* data, const u32 data_size) { - if(context == NULL || message_digest == NULL || data_size == 0 || data == NULL) + if(context == NULL || data == NULL || data_size == 0) return -1; - if(((u32)context & 0x1F) != 0 || ((u32)message_digest & 0x1F) != 0) + if(((u32)context) & 0x1F) return -4; - return SHA_ExecuteCommand(FinalizeHash, context, data, data_size, message_digest); + return SHA_ExecuteCommand(AddData, context, data, data_size, NULL); } -s32 SHA_Input(sha_context* context, const void* data, const u32 data_size) +s32 SHA_Finalize(sha_context* context, const void* data, const u32 data_size, void* message_digest) { - if(context == NULL || data == NULL || data_size == 0) + if(context == NULL || message_digest == NULL || data_size == 0 || data == NULL) return -1; - if(((u32)context) & 0x1F) + if(((u32)context & 0x1F) != 0 || ((u32)message_digest & 0x1F) != 0) return -4; - return SHA_ExecuteCommand(AddData, context, data, data_size, NULL); + return SHA_ExecuteCommand(FinalizeHash, context, data, data_size, message_digest); +} + +s32 SHA_Calculate(const void* data, const u32 data_size, void* message_digest) +{ + sha_context context ATTRIBUTE_ALIGN(32); + s32 ret = SHA_InitializeContext(&context); + if(ret < 0) + return ret; + + return SHA_Finalize(&context, data, data_size, message_digest); } #endif \ No newline at end of file