Source code for eolib.encrypt.encryption_utils
[docs]
def interleave(data: bytearray) -> None:
"""
Interleaves a sequence of bytes. When encrypting EO data, bytes are "woven" into each other.
Used when encrypting packets and data files.
Example:
>>> interleave([0, 1, 2, 3, 4, 5])
[0, 5, 1, 4, 2, 3]
This is an in-place operation.
Args:
data (bytearray): The data to interleave.
"""
buffer = bytearray(len(data))
i = 0
ii = 0
while i < len(data):
buffer[i] = data[ii]
i += 2
ii += 1
i -= 1
if len(data) % 2 != 0:
i -= 2
while i >= 0:
buffer[i] = data[ii]
i -= 2
ii += 1
data[:] = buffer
[docs]
def deinterleave(data: bytearray) -> None:
"""
Deinterleaves a sequence of bytes. This is the reverse of interleave.
Used when decrypting packets and data files.
Example:
>>> deinterleave([0, 1, 2, 3, 4, 5])
[0, 2, 4, 5, 3, 1]
This is an in-place operation.
Args:
data (bytearray): The data to deinterleave.
"""
buffer = bytearray(len(data))
i = 0
ii = 0
while i < len(data):
buffer[ii] = data[i]
i += 2
ii += 1
i -= 1
if len(data) % 2 != 0:
i -= 2
while i >= 0:
buffer[ii] = data[i]
i -= 2
ii += 1
data[:] = buffer
[docs]
def flip_msb(data: bytearray) -> None:
"""
Flips the most significant bits of each byte in a sequence of bytes.
(Values 0 and 128 are not flipped.)
Used when encrypting and decrypting packets.
Example:
>>> flip_msb([0, 1, 127, 128, 129, 254, 255])
[0, 129, 255, 128, 1, 126, 127]
This is an in-place operation.
Args:
data (bytearray): The data to flip most significant bits on.
"""
for i in range(len(data)):
if data[i] & 0x7F != 0:
data[i] = data[i] ^ 0x80
[docs]
def swap_multiples(data: bytearray, multiple: int) -> None:
"""
Swaps the order of contiguous bytes in a sequence of bytes that are divisible by a given
multiple value.
Used when encrypting and decrypting packets and data files.
Example:
>>> swap_multiples([10, 21, 27], 3)
[10, 27, 21]
This is an in-place operation.
Args:
data (bytearray): The data to swap bytes in.
multiple (int): The multiple value.
Raises:
ValueError: If multiple is less than 1.
"""
if multiple < 0:
raise ValueError("multiple must be a positive number")
if multiple == 0:
return
sequence_length = 0
for i in range(len(data) + 1):
if i != len(data) and data[i] % multiple == 0:
sequence_length += 1
else:
if sequence_length > 1:
for ii in range(sequence_length // 2):
b = data[i - sequence_length + ii]
data[i - sequence_length + ii] = data[i - ii - 1]
data[i - ii - 1] = b
sequence_length = 0