import binascii
import kmsBase
import rpcBase
import struct
import uuid
from dcerpc import MSRPCRequestHeader, MSRPCRespHeader
import logging

class handler(rpcBase.rpcBase):
	def parseRequest(self):
		request = MSRPCRequestHeader(self.data)
		logging.debug("RPC Message Request Bytes: %s" % binascii.b2a_hex(self.data))
		logging.debug("RPC Message Request: %s" % request.dump())
		
		return request

	def generateResponse(self):
		request = self.requestData

		responseData = kmsBase.generateKmsResponseData(request['pduData'], self.config)
		envelopeLength = len(responseData)

		response = MSRPCRespHeader()
		response['ver_major'] = request['ver_major']
		response['ver_minor'] = request['ver_minor']
		response['type'] = self.packetType['response']
		response['flags'] = self.packetFlags['firstFrag'] | self.packetFlags['lastFrag']
		response['representation'] = request['representation']
		response['call_id'] = request['call_id']

		response['alloc_hint'] = envelopeLength
		response['ctx_id'] = request['ctx_id']
		response['cancel_count'] = 0

		response['pduData'] = responseData

		logging.debug("RPC Message Response: %s" % response.dump())
		logging.debug("RPC Message Response Bytes: %s" % binascii.b2a_hex(str(response)))

		return response

	def generateRequest(self):
		request = MSRPCRequestHeader()

		request['ver_major'] = 5
		request['ver_minor'] = 0
		request['type'] = self.packetType['request']
		request['flags'] = self.packetFlags['firstFrag'] | self.packetFlags['lastFrag']
		request['representation'] = 0x10
		request['call_id'] = self.config['call_id']
		request['alloc_hint'] = len(self.data)
		request['pduData'] = str(self.data)

		logging.debug("RPC Message Request: %s" % request.dump())
		logging.debug("RPC Message Request Bytes: %s" % binascii.b2a_hex(str(request)))

		return request

	def parseResponse(self):
		return response