diff --git a/arm9/source/crypto/sha.c b/arm9/source/crypto/sha.c index 0d9f737..7173d61 100644 --- a/arm9/source/crypto/sha.c +++ b/arm9/source/crypto/sha.c @@ -1,5 +1,10 @@ #include "sha.h" +typedef struct +{ + u32 data[16]; +} _sha_block; + void sha_init(u32 mode) { while(*REG_SHACNT & 1); @@ -12,16 +17,12 @@ void sha_update(const void* src, u32 size) while(size >= 0x40) { while(*REG_SHACNT & 1); - for(u32 i = 0; i < 4; i++) { - *REG_SHAINFIFO = *src32++; - *REG_SHAINFIFO = *src32++; - *REG_SHAINFIFO = *src32++; - *REG_SHAINFIFO = *src32++; - } + *((_sha_block*)REG_SHAINFIFO) = *((const _sha_block*)src32); + src32 += 16; size -= 0x40; } while(*REG_SHACNT & 1); - memcpy((void*)REG_SHAINFIFO, src32, size); + if(size) memcpy((void*)REG_SHAINFIFO, src32, size); } void sha_get(void* res) { diff --git a/arm9/source/crypto/sha.h b/arm9/source/crypto/sha.h index 10782da..a1b88ec 100644 --- a/arm9/source/crypto/sha.h +++ b/arm9/source/crypto/sha.h @@ -4,8 +4,8 @@ #define REG_SHACNT ((volatile uint32_t*)0x1000A000) #define REG_SHABLKCNT ((volatile uint32_t*)0x1000A004) -#define REG_SHAHASH ((volatile uint32_t*)0x1000A040) -#define REG_SHAINFIFO ((volatile uint32_t*)0x1000A080) +#define REG_SHAHASH (( uint32_t*)0x1000A040) +#define REG_SHAINFIFO ( 0x1000A080) #define SHA_CNT_STATE 0x00000003 #define SHA_CNT_OUTPUT_ENDIAN 0x00000008