void MaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero)\r
{\r
char Key[FMAX_PATH*2+1];\r
- ulong Hash[5];\r
+ BYTE* p;\r
DWORD i;\r
+ DWORD j;\r
+ ulong Hash[5];\r
BYTE Mask[20];\r
- BYTE* p;\r
memcpy(&Key[0], SecretKey, SecretKeyLength);\r
memcpy(&Key[SecretKeyLength], Salt, SaltLength);\r
- sha_memory(Key, SecretKeyLength + SaltLength, Hash);\r
- // sha.cはビッグエンディアンのため\r
- for(i = 0; i < 5; i++)\r
- Hash[i] = _byteswap_ulong(Hash[i]);\r
- memcpy(&Mask, &Hash, 20);\r
p = (BYTE*)Data;\r
for(i = 0; i < Size; i++)\r
{\r
- if(EscapeZero == YES)\r
+ if(i % 20 == 0)\r
{\r
- if(p[i] != 0 && p[i] != Mask[i % sizeof(Mask)])\r
- p[i] ^= Mask[i % sizeof(Mask)];\r
+ memcpy(&Key[SecretKeyLength + SaltLength], &i, 4);\r
+ sha_memory(Key, SecretKeyLength + SaltLength + 4, Hash);\r
+ // sha.cはビッグエンディアンのため\r
+ for(j = 0; j < 5; j++)\r
+ Hash[j] = _byteswap_ulong(Hash[j]);\r
+ memcpy(&Mask, &Hash, 20);\r
}\r
- else\r
- p[i] ^= Mask[i % sizeof(Mask)];\r
+ if(EscapeZero == NO || (p[i] != 0 && p[i] != Mask[i % 20]))\r
+ p[i] ^= Mask[i % 20];\r
}\r
}\r
\r
void UnmaskSettingsData(const char* Salt, int SaltLength, void* Data, DWORD Size, int EscapeZero)\r
{\r
- char Key[FMAX_PATH*2+1];\r
- ulong Hash[5];\r
- DWORD i;\r
- BYTE Mask[20];\r
- BYTE* p;\r
- memcpy(&Key[0], SecretKey, SecretKeyLength);\r
- memcpy(&Key[SecretKeyLength], Salt, SaltLength);\r
- sha_memory(Key, SecretKeyLength + SaltLength, Hash);\r
- // sha.cはビッグエンディアンのため\r
- for(i = 0; i < 5; i++)\r
- Hash[i] = _byteswap_ulong(Hash[i]);\r
- memcpy(&Mask, &Hash, 20);\r
- p = (BYTE*)Data;\r
- for(i = 0; i < Size; i++)\r
- {\r
- if(EscapeZero == YES)\r
- {\r
- if(p[i] != 0 && p[i] != Mask[i % sizeof(Mask)])\r
- p[i] ^= Mask[i % sizeof(Mask)];\r
- }\r
- else\r
- p[i] ^= Mask[i % sizeof(Mask)];\r
- }\r
+ MaskSettingsData(Salt, SaltLength, Data, Size, EscapeZero);\r
}\r
\r
void CalculateSettingsDataChecksum(void* Data, DWORD Size)\r