Much code, many rewrite

This commit is contained in:
2019-12-14 20:08:34 +01:00
parent 3bdd78b61c
commit 2166a30aa9
34 changed files with 852 additions and 58 deletions

View 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)

View File

@@ -0,0 +1,3 @@
from . import dataHelper
from . import TEABlockEncryptor
from . import checksumHelper

2
helpers/byteFormater.py Normal file
View 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
helpers/checksumHelper.py Normal file
View 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