mirror of
https://github.com/crskycode/GARbro.git
synced 2024-12-23 11:24:14 +08:00
(LibCfiScheme): added 'rotate key' scheme parameter.
This commit is contained in:
parent
0b80548a81
commit
651aad92a2
@ -80,15 +80,17 @@ namespace GameRes.Formats.Malie
|
||||
public class LibCfiScheme : LibScheme
|
||||
{
|
||||
public byte[] Key { get; set; }
|
||||
public uint[] RotateKey { get; set; }
|
||||
|
||||
public LibCfiScheme (uint align, byte[] key) : base (align)
|
||||
public LibCfiScheme (uint align, byte[] key, uint[] rot_key) : base (align)
|
||||
{
|
||||
Key = key;
|
||||
RotateKey = rot_key;
|
||||
}
|
||||
|
||||
public override IMalieDecryptor CreateDecryptor ()
|
||||
{
|
||||
return new CfiDecryptor (Key);
|
||||
return new CfiDecryptor (Key, RotateKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -53,10 +53,12 @@ namespace GameRes.Formats.Malie
|
||||
public class CfiDecryptor : IMalieDecryptor
|
||||
{
|
||||
byte[] m_key;
|
||||
uint[] m_rotate_key;
|
||||
|
||||
public CfiDecryptor (byte[] key)
|
||||
public CfiDecryptor (byte[] key, uint[] rotate_key)
|
||||
{
|
||||
m_key = key;
|
||||
m_rotate_key = rotate_key;
|
||||
}
|
||||
|
||||
public void DecryptBlock (long block_offset, byte[] data, int index)
|
||||
@ -79,13 +81,13 @@ namespace GameRes.Formats.Malie
|
||||
fixed (byte* data8 = &data[index])
|
||||
{
|
||||
uint* data32 = (uint*)data8;
|
||||
uint k = Binary.RotR (0x39653542, m_key[offset & 0x1F] ^ 0xA5);
|
||||
uint k = Binary.RotR (m_rotate_key[0], m_key[offset & 0x1F] ^ 0xA5);
|
||||
data32[0] = Binary.RotR (data32[0] ^ k, m_key[(offset + 12) & 0x1F] ^ 0xA5);
|
||||
k = Binary.RotL (0x76706367, m_key[(offset + 3) & 0x1F] ^ 0xA5);
|
||||
k = Binary.RotL (m_rotate_key[1], m_key[(offset + 3) & 0x1F] ^ 0xA5);
|
||||
data32[1] = Binary.RotL (data32[1] ^ k, m_key[(offset + 15) & 0x1F] ^ 0xA5);
|
||||
k = Binary.RotR (0x69454462, m_key[(offset + 6) & 0x1F] ^ 0xA5);
|
||||
k = Binary.RotR (m_rotate_key[2], m_key[(offset + 6) & 0x1F] ^ 0xA5);
|
||||
data32[2] = Binary.RotR (data32[2] ^ k, m_key[(offset - 14) & 0x1F] ^ 0xA5);
|
||||
k = Binary.RotL (0x71334334, m_key[(offset + 9) & 0x1F] ^ 0xA5);
|
||||
k = Binary.RotL (m_rotate_key[3], m_key[(offset + 9) & 0x1F] ^ 0xA5);
|
||||
data32[3] = Binary.RotL (data32[3] ^ k, m_key[(offset - 11) & 0x1F] ^ 0xA5);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user