#include "sha.h" void sha_init(u32 mode) { while(*REG_SHACNT & 1); *REG_SHACNT = mode | SHA_CNT_OUTPUT_ENDIAN | SHA_NORMAL_ROUND; } void sha_update(const void* src, u32 size) { const u32* src32 = (const u32*)src; 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++; } size -= 0x40; } while(*REG_SHACNT & 1); memcpy((void*)REG_SHAINFIFO, src32, size); } void sha_get(void* res) { *REG_SHACNT = (*REG_SHACNT & ~SHA_NORMAL_ROUND) | SHA_FINAL_ROUND; while(*REG_SHACNT & SHA_FINAL_ROUND); while(*REG_SHACNT & 1); memcpy(res, (void*)REG_SHAHASH, (256 / 8)); } void sha_quick(void* res, const void* src, u32 size, u32 mode) { sha_init(mode); sha_update(src, size); sha_get(res); }