forked from Mirror/SafeB9SInstaller
44 lines
1.5 KiB
C
44 lines
1.5 KiB
C
#include "safewrite.h"
|
|
#include "nand.h"
|
|
#include "sha.h"
|
|
|
|
// safe file writer function, warnings:
|
|
// (1) file must be opened in RW mode for this to work
|
|
// (2) contents of buffer may change on corruption
|
|
// (3) uses SHA register
|
|
u32 SafeWriteFile(FIL* file, void* buff, FSIZE_t ofs, UINT btw) {
|
|
u8 sha_in[0x20];
|
|
UINT bw;
|
|
|
|
sha_quick(sha_in, buff, btw, SHA256_MODE);
|
|
if ((f_lseek(file, ofs) != FR_OK) || (f_write(file, buff, btw, &bw) != FR_OK) || (btw != bw) ||
|
|
(f_lseek(file, ofs) != FR_OK) || (f_read(file, buff, btw, &bw) != FR_OK) || (btw != bw))
|
|
return 1;
|
|
|
|
return (sha_cmp(sha_in, buff, btw, SHA256_MODE) == 0) ? 0 : 1;
|
|
}
|
|
|
|
// safe file quick writer function
|
|
// same as SafeWriteFile(), but also handles filec reate, too, same warnings apply
|
|
u32 SafeQWriteFile(const TCHAR* path, void* buff, UINT btw) {
|
|
FIL fp;
|
|
u32 ret = 0;
|
|
if (f_open(&fp, path, FA_READ|FA_WRITE|FA_CREATE_ALWAYS) != FR_OK)
|
|
return 1;
|
|
ret = SafeWriteFile(&fp, buff, 0, btw);
|
|
f_close(&fp);
|
|
return ret;
|
|
}
|
|
|
|
// safe NAND writer function, warnings:
|
|
// (1) contents of buffer may change on corruption
|
|
// (2) uses SHA register
|
|
u32 SafeWriteNand(void* buff, u32 ofs, u32 btw, u32 keyslot) {
|
|
u8 sha_in[0x20];
|
|
|
|
sha_quick(sha_in, buff, btw, SHA256_MODE);
|
|
if ((WriteNandBytes(buff, ofs, btw, keyslot) != 0) || (ReadNandBytes(buff, ofs, btw, keyslot) != 0))
|
|
return 1;
|
|
|
|
return (sha_cmp(sha_in, buff, btw, SHA256_MODE) == 0) ? 0 : 1;
|
|
} |