mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-26 13:42:47 +00:00
Introduce ctr_decrypt_boffset() function
This commit is contained in:
parent
b70761e6aa
commit
4bd787ace9
@ -85,7 +85,7 @@ void add_ctr(void* ctr, uint32_t carry)
|
|||||||
uint32_t sum;
|
uint32_t sum;
|
||||||
int32_t i;
|
int32_t i;
|
||||||
|
|
||||||
for(i = 0; i < 4; i++) {
|
for(i=0; i < 4; i++) {
|
||||||
counter[i] = ((uint32_t)outctr[i*4+0]<<24) | ((uint32_t)outctr[i*4+1]<<16) | ((uint32_t)outctr[i*4+2]<<8) | ((uint32_t)outctr[i*4+3]<<0);
|
counter[i] = ((uint32_t)outctr[i*4+0]<<24) | ((uint32_t)outctr[i*4+1]<<16) | ((uint32_t)outctr[i*4+2]<<8) | ((uint32_t)outctr[i*4+3]<<0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,6 +110,46 @@ void add_ctr(void* ctr, uint32_t carry)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ctr_decrypt_boffset(void *inbuf, void *outbuf, size_t size, size_t off, uint32_t mode, uint8_t *ctr)
|
||||||
|
{
|
||||||
|
size_t bytes_left = size;
|
||||||
|
size_t off_fix = off % AES_BLOCK_SIZE;
|
||||||
|
uint8_t temp[AES_BLOCK_SIZE];
|
||||||
|
uint8_t ctr_local[16];
|
||||||
|
uint8_t *in = inbuf;
|
||||||
|
uint8_t *out = outbuf;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
for (i=0; i<16; i++) // setup local ctr
|
||||||
|
ctr_local[i] = ctr[i];
|
||||||
|
add_ctr(ctr_local, off / AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
if (off_fix) // handle misaligned offset (at beginning)
|
||||||
|
{
|
||||||
|
for (i=off_fix; i<AES_BLOCK_SIZE; i++)
|
||||||
|
temp[i] = *(in++);
|
||||||
|
ctr_decrypt(temp, temp, 1, mode, ctr_local);
|
||||||
|
for (i=off_fix; i<AES_BLOCK_SIZE; i++)
|
||||||
|
*(out++) = temp[i];
|
||||||
|
bytes_left -= AES_BLOCK_SIZE - off_fix;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctr_decrypt(in, out, bytes_left / AES_BLOCK_SIZE, mode, ctr_local);
|
||||||
|
in += AES_BLOCK_SIZE * (uint32_t) (bytes_left / AES_BLOCK_SIZE);
|
||||||
|
out += AES_BLOCK_SIZE * (uint32_t) (bytes_left / AES_BLOCK_SIZE);
|
||||||
|
bytes_left -= AES_BLOCK_SIZE * (uint32_t) (bytes_left / AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
if (bytes_left) // handle misaligned offset (at end)
|
||||||
|
{
|
||||||
|
for (i=0; i<bytes_left; i++)
|
||||||
|
temp[i] = *(in++);
|
||||||
|
ctr_decrypt(temp, temp, 1, mode, ctr_local);
|
||||||
|
for (i=0; i<bytes_left; i++)
|
||||||
|
*(out++) = temp[i];
|
||||||
|
bytes_left = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ctr_decrypt(void *inbuf, void *outbuf, size_t size, uint32_t mode, uint8_t *ctr)
|
void ctr_decrypt(void *inbuf, void *outbuf, size_t size, uint32_t mode, uint8_t *ctr)
|
||||||
{
|
{
|
||||||
size_t blocks_left = size;
|
size_t blocks_left = size;
|
||||||
|
@ -54,6 +54,7 @@ void set_ctr(void* iv);
|
|||||||
void add_ctr(void* ctr, uint32_t carry);
|
void add_ctr(void* ctr, uint32_t carry);
|
||||||
void aes_decrypt(void* inbuf, void* outbuf, size_t size, uint32_t mode);
|
void aes_decrypt(void* inbuf, void* outbuf, size_t size, uint32_t mode);
|
||||||
void ctr_decrypt(void* inbuf, void* outbuf, size_t size, uint32_t mode, uint8_t *ctr);
|
void ctr_decrypt(void* inbuf, void* outbuf, size_t size, uint32_t mode, uint8_t *ctr);
|
||||||
|
void ctr_decrypt_boffset(void *inbuf, void *outbuf, size_t size, size_t off, uint32_t mode, uint8_t *ctr);
|
||||||
void aes_cmac(void* inbuf, void* outbuf, size_t size);
|
void aes_cmac(void* inbuf, void* outbuf, size_t size);
|
||||||
void aes_fifos(void* inbuf, void* outbuf, size_t blocks);
|
void aes_fifos(void* inbuf, void* outbuf, size_t blocks);
|
||||||
void set_aeswrfifo(uint32_t value);
|
void set_aeswrfifo(uint32_t value);
|
||||||
|
@ -52,44 +52,6 @@ FilCryptInfo* fx_find_cryptinfo(FIL* fptr) {
|
|||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fx_crypt(FilCryptInfo* info, void* buff, FSIZE_t off, UINT bt) {
|
|
||||||
u32 mode = AES_CNT_CTRNAND_MODE;
|
|
||||||
u8 ctr[16] __attribute__((aligned(32)));
|
|
||||||
u8 buff16[16];
|
|
||||||
u8* buffer = buff;
|
|
||||||
|
|
||||||
// copy CTR and increment it
|
|
||||||
memcpy(ctr, info->ctr, 16);
|
|
||||||
add_ctr(ctr, off / 16);
|
|
||||||
|
|
||||||
// setup the key
|
|
||||||
setup_aeskeyY(0x34, info->keyy);
|
|
||||||
use_aeskey(0x34);
|
|
||||||
|
|
||||||
// handle misaligned offset (at beginning)
|
|
||||||
if (off % 16) {
|
|
||||||
memcpy(buff16 + (off % 16), buffer, 16 - (off % 16));
|
|
||||||
ctr_decrypt(buff16, buff16, 1, mode, ctr);
|
|
||||||
memcpy(buffer, buff16 + (off % 16), 16 - (off % 16));
|
|
||||||
buffer += 16 - (off % 16);
|
|
||||||
bt -= 16 - (off % 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
// de/encrypt the data
|
|
||||||
ctr_decrypt(buffer, buffer, bt / 16, mode, ctr);
|
|
||||||
buffer += 16 * (UINT) (bt / 16);
|
|
||||||
bt -= 16 * (UINT) (bt / 16);
|
|
||||||
|
|
||||||
// handle misaligned offset (at end)
|
|
||||||
if (bt) {
|
|
||||||
memcpy(buff16, buffer, bt);
|
|
||||||
ctr_decrypt(buff16, buff16, 1, mode, ctr);
|
|
||||||
memcpy(buffer, buff16, bt);
|
|
||||||
buffer += bt;
|
|
||||||
bt = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FRESULT fx_open (FIL* fp, const TCHAR* path, BYTE mode) {
|
FRESULT fx_open (FIL* fp, const TCHAR* path, BYTE mode) {
|
||||||
int num = alias_num(path);
|
int num = alias_num(path);
|
||||||
FilCryptInfo* info = fx_find_cryptinfo(fp);
|
FilCryptInfo* info = fx_find_cryptinfo(fp);
|
||||||
@ -122,8 +84,11 @@ FRESULT fx_read (FIL* fp, void* buff, UINT btr, UINT* br) {
|
|||||||
FilCryptInfo* info = fx_find_cryptinfo(fp);
|
FilCryptInfo* info = fx_find_cryptinfo(fp);
|
||||||
FSIZE_t off = f_tell(fp);
|
FSIZE_t off = f_tell(fp);
|
||||||
FRESULT res = f_read(fp, buff, btr, br);
|
FRESULT res = f_read(fp, buff, btr, br);
|
||||||
if (info && info->fptr)
|
if (info && info->fptr) {
|
||||||
fx_crypt(info, buff, off, btr);
|
setup_aeskeyY(0x34, info->keyy);
|
||||||
|
use_aeskey(0x34);
|
||||||
|
ctr_decrypt_boffset(buff, buff, btr, off, AES_CNT_CTRNAND_MODE, info->ctr);
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,12 +97,14 @@ FRESULT fx_write (FIL* fp, const void* buff, UINT btw, UINT* bw) {
|
|||||||
FSIZE_t off = f_tell(fp);
|
FSIZE_t off = f_tell(fp);
|
||||||
FRESULT res = FR_OK;
|
FRESULT res = FR_OK;
|
||||||
if (info && info->fptr) {
|
if (info && info->fptr) {
|
||||||
|
setup_aeskeyY(0x34, info->keyy);
|
||||||
|
use_aeskey(0x34);
|
||||||
*bw = 0;
|
*bw = 0;
|
||||||
for (UINT p = 0; (p < btw) && (res == FR_OK); p += SDCRYPT_BUFFER_SIZE) {
|
for (UINT p = 0; (p < btw) && (res == FR_OK); p += SDCRYPT_BUFFER_SIZE) {
|
||||||
UINT pcount = min(SDCRYPT_BUFFER_SIZE, (btw - p));
|
UINT pcount = min(SDCRYPT_BUFFER_SIZE, (btw - p));
|
||||||
UINT bwl = 0;
|
UINT bwl = 0;
|
||||||
memcpy(SDCRYPT_BUFFER, (u8*) buff + p, pcount);
|
memcpy(SDCRYPT_BUFFER, (u8*) buff + p, pcount);
|
||||||
fx_crypt(info, SDCRYPT_BUFFER, off + p, pcount);
|
ctr_decrypt_boffset(SDCRYPT_BUFFER, SDCRYPT_BUFFER, pcount, off + p, AES_CNT_CTRNAND_MODE, info->ctr);
|
||||||
res = f_write(fp, (const void*) SDCRYPT_BUFFER, pcount, &bwl);
|
res = f_write(fp, (const void*) SDCRYPT_BUFFER, pcount, &bwl);
|
||||||
*bw += bwl;
|
*bw += bwl;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user