From 9724eb56f4c6a6bbaa473fde5e695896b388e28e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matteo=20=E2=84=B1an?= <SystemRage@protonmail.com> Date: Tue, 14 May 2019 22:03:35 +0200 Subject: [PATCH] Delete kmsRequestV4.py --- py3-kms/kmsRequestV4.py | 130 ---------------------------------------- 1 file changed, 130 deletions(-) delete mode 100644 py3-kms/kmsRequestV4.py diff --git a/py3-kms/kmsRequestV4.py b/py3-kms/kmsRequestV4.py deleted file mode 100644 index 263822c..0000000 --- a/py3-kms/kmsRequestV4.py +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env python3 - -import binascii -import time -import logging - -from kmsBase import kmsBase -from structure import Structure -from aes import AES -from formatText import shell_message, justify, byterize - -logger = logging.getLogger('root') - -# v4 AES Key -key = bytearray([0x05, 0x3D, 0x83, 0x07, 0xF9, 0xE5, 0xF0, 0x88, 0xEB, 0x5E, 0xA6, 0x68, 0x6C, 0xF0, 0x37, 0xC7, 0xE4, 0xEF, 0xD2, 0xD6]) - -# Xor Buffer -def xorBuffer(source, offset, destination, size): - for i in range(0, size): - destination[i] ^= source[i + offset] - -class kmsRequestV4(kmsBase): - class RequestV4(Structure): - commonHdr = () - structure = ( - ('bodyLength1', '<I'), - ('bodyLength2', '<I'), - ('request', ':', kmsBase.kmsRequestStruct), - ('hash', '16s'), - ('padding', ':'), - ) - - class ResponseV4(Structure): - commonHdr = () - structure = ( - ('bodyLength1', '<I'), - ('unknown', '!I=0x00000200'), - ('bodyLength2', '<I'), - ('response', ':', kmsBase.kmsResponseStruct), - ('hash', '16s'), - ('padding', ':'), - ) - - def executeRequestLogic(self): - requestData = self.RequestV4(self.data) - - response = self.serverLogic(requestData['request']) - thehash = self.generateHash(bytearray(str(response).encode('latin-1'))) - - responseData = self.generateResponse(response, thehash) - - time.sleep(1) # request sent back too quick for Windows 2008 R2, slow it down. - - return responseData - - def generateHash(self, message): - """ - The KMS v4 hash is a variant of CMAC-AES-128. There are two key differences: - * The 'AES' used is modified in particular ways: - * The basic algorithm is Rjindael with a conceptual 160bit key and 128bit blocks. - This isn't part of the AES standard, but it works the way you'd expect. - Accordingly, the algorithm uses 11 rounds and a 192 byte expanded key. - * The trailing block is not XORed with a generated subkey, as defined in CMAC. - This is probably because the subkey generation algorithm is only defined for - situations where block and key size are the same. - """ - aes = AES() - - messageSize = len(message) - lastBlock = bytearray(16) - hashBuffer = bytearray(16) - - # MessageSize / Blocksize. - j = messageSize >> 4 - - # Remainding bytes. - k = messageSize & 0xf - - # Hash. - for i in range(0, j): - xorBuffer(message, i << 4, hashBuffer, 16) - hashBuffer = bytearray(aes.encrypt(hashBuffer, key, len(key))) - - # Bit Padding. - ii = 0 - for i in range(j << 4, k + (j << 4)): - lastBlock[ii] = message[i] - ii += 1 - lastBlock[k] = 0x80 - - xorBuffer(lastBlock, 0, hashBuffer, 16) - hashBuffer = bytearray(aes.encrypt(hashBuffer, key, len(key))) - - return hashBuffer - - def generateResponse(self, responseBuffer, thehash): - response = self.ResponseV4() - bodyLength = len(responseBuffer) + len(thehash) - response['bodyLength1'] = bodyLength - response['bodyLength2'] = bodyLength - response['response'] = responseBuffer - response['hash'] = thehash.decode('latin-1') - response['padding'] = bytearray(self.getPadding(bodyLength)).decode('latin-1') - - ## Debug stuff. - shell_message(nshell = 16) - response = byterize(response) - logger.debug("KMS V4 Response: \n%s\n" % justify(response.dump(print_to_stdout = False))) - logger.debug("KMS V4 Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response).encode('latin-1')).decode('utf-8'))) - - return str(response) - - def generateRequest(self, requestBase): - thehash = self.generateHash(bytearray(str(requestBase).encode('latin-1'))) - - request = kmsRequestV4.RequestV4() - bodyLength = len(requestBase) + len(thehash) - request['bodyLength1'] = bodyLength - request['bodyLength2'] = bodyLength - request['request'] = requestBase - request['hash'] = thehash.decode('latin-1') - request['padding'] = bytearray(self.getPadding(bodyLength)).decode('latin-1') - - ## Debug stuff. - shell_message(nshell = 10) - request = byterize(request) - logger.debug("Request V4 Data: \n%s\n" % justify(request.dump(print_to_stdout = False))) - logger.debug("Request V4: \n%s\n" % justify(binascii.b2a_hex(str(request).encode('latin-1')).decode('utf-8'))) - - return request