Final commit before archive
This commit is contained in:
58
sampy/helpers/TEABlockEncryptor.py
Normal file
58
sampy/helpers/TEABlockEncryptor.py
Normal file
@@ -0,0 +1,58 @@
|
||||
import struct
|
||||
from random import randint
|
||||
|
||||
from ..helpers.checksumHelper import CheckSum
|
||||
from ..network.enums import types as TYPE
|
||||
|
||||
TEA_ROUNDS = 32
|
||||
TEA_XOR_MASK = 0x5E94A3CF
|
||||
KEY = []
|
||||
|
||||
def EncryptBlock(v0, v1):
|
||||
sum = 0
|
||||
|
||||
for i in range(TEA_ROUNDS):
|
||||
v0 += ((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + key[sum & 3])
|
||||
|
||||
def Encrypt(var_input): # bytes
|
||||
var_input_len = len(var_input) + TYPE.SIZEOF_CHAR * 2 # (checksum, encodedPad)
|
||||
paddingBytes = 0
|
||||
|
||||
if var_input_len % 8 != 0:
|
||||
paddingBytes = 8 - (var_input_len % 8)
|
||||
|
||||
finalLen = var_input_len + paddingBytes
|
||||
|
||||
# Randomize pad size for some reason
|
||||
encodedPad = randint(0, TYPE.MAX_UCHAR)
|
||||
encodedPad <<= 4
|
||||
encodedPad &= 0xF0 # Remove bits lost from UCHAR size (C) [BYTE MAGIC]
|
||||
encodedPad |= paddingBytes
|
||||
|
||||
var_output = [0] * finalLen #bytes(finalLen)
|
||||
var_output[2 + paddingBytes:] = [b for b in var_input]
|
||||
|
||||
# Write the pad size variable
|
||||
var_output[1] = encodedPad
|
||||
|
||||
# Write the padding
|
||||
var_output[2:2+len(paddingBytes)] = bytes([randint(0, TYPE.MAX_UCHAR) for _ in range(len(paddingBytes))])
|
||||
|
||||
# Calculate checksum
|
||||
checksum = CheckSum()
|
||||
checksum.add(var_output[1:var_input_len + 1 + paddingBytes])
|
||||
|
||||
var_checksum = checksum.get()
|
||||
var_checksum = (var_checksum << 4) ^ var_checksum
|
||||
var_checksum &= TYPE.MAX_UCHAR # [BYTE MAGIC]
|
||||
|
||||
var_output[0] = var_checksum
|
||||
|
||||
# Encryption
|
||||
for i in range(0, finalLen, 8):
|
||||
v0 = var_output[i]
|
||||
v1 = var_output[i + TYPE.SIZEOF_INT]
|
||||
|
||||
return bytes(var_output)
|
||||
|
||||
|
||||
3
sampy/helpers/__init__.py
Normal file
3
sampy/helpers/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from . import dataHelper
|
||||
from . import TEABlockEncryptor
|
||||
from . import checksumHelper
|
||||
2
sampy/helpers/byteFormater.py
Normal file
2
sampy/helpers/byteFormater.py
Normal file
@@ -0,0 +1,2 @@
|
||||
def readable_bytes(byteStream: bytes) -> str:
|
||||
return " ".join([(hex(b) if b >= 16 else hex(b).replace("x", "x0"))[2:] for b in byteStream])
|
||||
25
sampy/helpers/checksumHelper.py
Normal file
25
sampy/helpers/checksumHelper.py
Normal file
@@ -0,0 +1,25 @@
|
||||
from ..network.enums import types as TYPE
|
||||
# TODO: Single function if Object's state is not needed
|
||||
|
||||
class CheckSum:
|
||||
def __init__(self):
|
||||
self.clear()
|
||||
|
||||
def clear(self):
|
||||
self.sum = 0
|
||||
self.r = 55665
|
||||
self.c1 = 52845
|
||||
self.c2 = 22719
|
||||
|
||||
def add(self, byteArray):
|
||||
[self._add(b) for b in byteArray]
|
||||
|
||||
def _add(self, byte):
|
||||
cipher = byte ^ (self.r >> 8)
|
||||
cipher &= TYPE.MAX_UCHAR # [BYTE MAGIC]
|
||||
self.r = (cipher + self.r) * self.c1 + self.c2
|
||||
self.r &= TYPE.MAX_USHORT # [BYTE MAGIC]
|
||||
self.sum += cipher
|
||||
|
||||
def get(self):
|
||||
return self.sum
|
||||
2
sampy/helpers/dataHelper.py
Normal file
2
sampy/helpers/dataHelper.py
Normal file
@@ -0,0 +1,2 @@
|
||||
def flatten(l):
|
||||
return flatten(l[0]) + (flatten(l[1:]) if len(l) > 1 else []) if type(l) is list else [l]
|
||||
Reference in New Issue
Block a user