def get_packet_header(self, length): iiv = self.send[3] & 0xFF iiv |= (self.send[2] << 8) & 0xFF00 iiv ^= self.send_mapleversion mlength = ((length << 8) & 0xFF00) | (BitUtils.unsigned_right_shift(length, 8)) xoredIv = iiv ^ mlength return [ BitUtils.unsigned_right_shift(iiv, 8) & 0xFF, iiv & 0xFF, (BitUtils.unsigned_right_shift(xoredIv, 8) & 0xFF), xoredIv & 0xFF, ]
def rotate(self, input_byte, arr): elina = arr[1] anna = input_byte moritz = update_matrix[elina & 0xFF] moritz -= input_byte arr[0] += moritz moritz = arr[2] moritz ^= update_matrix[(int(anna) & 0xFF)] elina -= int(moritz) & 0xFF arr[1] = elina elina = arr[3] moritz = elina elina -= int(arr[0] & 0xFF) moritz = update_matrix[int(moritz & 0xFF)] moritz += input_byte moritz ^= arr[2] arr[2] = moritz elina += int(update_matrix[int(anna) & 0xFF]) & 0xFF arr[3] = elina merry = int(arr[0]) & 0xFF merry |= (arr[1] << 8) & 0xFF00 merry |= (arr[2] << 16) & 0xFF0000 merry |= (arr[3] << 24) & 0xFF000000 ret_value = merry ret_value = BitUtils.unsigned_right_shift(ret_value, 0x1D) merry = merry << 3 ret_value = ret_value | merry arr[0] = ret_value & 0xFF arr[1] = (ret_value >> 8) & 0xFF arr[2] = (ret_value >> 16) & 0xFF arr[3] = (ret_value >> 24) & 0xFF return True
def decode(self, data): data = self.maple_aes(data, self.receive) self.decodeUpdate() # Maple Custom Decryption for j in range(1, 7): remember = 0 data_length = len(data) & 0xFF next_remember = 0 if j % 2 == 0: for i in xrange(len(data)): cur = data[i] cur -= 0x48 cur = ~cur & 0xFF cur = BitUtils.roll_left(cur, data_length & 0xFF) next_remember = cur cur ^= remember remember = next_remember cur -= data_length cur = BitUtils.roll_right(cur, 3) data[i] = cur data_length -= 1 else: for i in reversed(xrange(len(data))): cur = data[i] cur = BitUtils.roll_left(cur, 3) cur ^= 0x13 next_remember = cur cur ^= remember remember = next_remember cur -= data_length cur = BitUtils.roll_right(cur, 4) data[i] = cur data_length -= 1 return struct.pack("<%sB" % len(data), data)
def encode(self, data): header = self.get_packet_header(len(data)) # Maple custom encryption for j in xrange(0, 6): remember = 0 data_length = len(data) & 0xFF if j % 2 == 0: for i in xrange(len(data)): cur = data[i] cur = BitUtils.roll_left(cur, 3) cur += data_length cur ^= remember remember = cur cur = BitUtils.roll_right(cur, data_length & 0xFF) cur = ~cur & 0xFF cur += 0x48 data_length -= 1 data[i] = cur else: for i in reversed(xrange(len(data))): cur = data[i] cur = BitUtils.roll_left(cur, 4) cur += data_length cur ^= remember remember = cur cur ^= 0x13 cur = BitUtils.roll_right(cur, 3) data_length -= 1 data[i] = cur print "After custom ", data data = self.maple_aes(data, self.send) print "After aes ", data self.encodeUpdate() return header + data