1
0
Fork 0
mirror of https://github.com/s1204IT/Lockpick_RCM.git synced 2024-11-23 02:06:42 +00:00

diskio: Improve emmc xts, double sector cache

This commit is contained in:
shchmue 2020-05-08 15:24:04 -06:00
parent b147f34c53
commit 9130c4b69c

View file

@ -40,14 +40,14 @@ extern emmc_part_t *system_part;
typedef struct { typedef struct {
u32 sector; u32 sector;
u32 visit_count; u32 visit_count;
u8 align[8];
u8 tweak[0x10]; u8 tweak[0x10];
u8 cached_sector[0x200]; u8 cached_sector[0x200];
u8 align[8];
} sector_cache_t; } sector_cache_t;
#define MAX_SEC_CACHE_ENTRIES 64 #define MAX_SEC_CACHE_ENTRIES 128
static sector_cache_t *sector_cache = NULL; static sector_cache_t *sector_cache = NULL;
static u32 secindex = 0; u32 secindex = 0;
bool clear_sector_cache = false; bool clear_sector_cache = false;
DSTATUS disk_status ( DSTATUS disk_status (
@ -80,8 +80,10 @@ static inline void _gf256_mul_x_le(void *block) {
static inline int _emmc_xts(u32 ks1, u32 ks2, u32 enc, u8 *tweak, bool regen_tweak, u32 tweak_exp, u64 sec, void *dst, void *src, u32 secsize) { static inline int _emmc_xts(u32 ks1, u32 ks2, u32 enc, u8 *tweak, bool regen_tweak, u32 tweak_exp, u64 sec, void *dst, void *src, u32 secsize) {
int res = 0; int res = 0;
u8 *pdst = (u8 *)dst; u8 *temptweak = (u8 *)malloc(0x10);
u8 *psrc = (u8 *)src; u32 *pdst = (u32 *)dst;
u32 *psrc = (u32 *)src;
u32 *ptweak = (u32 *)tweak;
if (regen_tweak) { if (regen_tweak) {
for (int i = 0xF; i >= 0; i--) { for (int i = 0xF; i >= 0; i--) {
@ -95,34 +97,33 @@ static inline int _emmc_xts(u32 ks1, u32 ks2, u32 enc, u8 *tweak, bool regen_twe
for (u32 i = 0; i < tweak_exp * 0x20; i++) for (u32 i = 0; i < tweak_exp * 0x20; i++)
_gf256_mul_x_le(tweak); _gf256_mul_x_le(tweak);
u8 temptweak[0x10];
memcpy(temptweak, tweak, 0x10); memcpy(temptweak, tweak, 0x10);
//We are assuming a 0x10-aligned sector size in this implementation. //We are assuming a 0x10-aligned sector size in this implementation.
for (u32 i = 0; i < secsize / 0x10; i++) { for (u32 i = 0; i < secsize / 0x10; i++) {
for (u32 j = 0; j < 0x10; j++) for (u32 j = 0; j < 4; j++)
pdst[j] = psrc[j] ^ tweak[j]; pdst[j] = psrc[j] ^ ptweak[j];
_gf256_mul_x_le(tweak); _gf256_mul_x_le(tweak);
psrc += 0x10; psrc += 4;
pdst += 0x10; pdst += 4;
} }
se_aes_crypt_ecb(ks2, enc, dst, secsize, src, secsize); se_aes_crypt_ecb(ks2, enc, dst, secsize, dst, secsize);
pdst = (u8 *)dst; pdst = (u32 *)dst;
memcpy(tweak, temptweak, 0x10); memcpy(tweak, temptweak, 0x10);
for (u32 i = 0; i < secsize / 0x10; i++) { for (u32 i = 0; i < secsize / 0x10; i++) {
for (u32 j = 0; j < 0x10; j++) for (u32 j = 0; j < 4; j++)
pdst[j] = pdst[j] ^ tweak[j]; pdst[j] = pdst[j] ^ ptweak[j];
_gf256_mul_x_le(tweak); _gf256_mul_x_le(tweak);
pdst += 0x10; pdst += 4;
} }
res = 1; res = 1;
out:; out:;
free(temptweak);
return res; return res;
} }