def __getDecryptedPayload(self, message): if self.isEncrypted: payload = message.getEncryptedPayloadAsBinaryString() encryptedMessageNumber = message.getMessageNumAsBinaryString() # Check the HMAC if not self.__verifyHmac(message.hmac, payload): self.errorCallback(message.sourceNick, errors.ERR_BAD_HMAC) raise exceptions.CryptoError(errno=errors.BAD_HMAC) try: # Check the message number messageNumber = int( self.crypto.aesDecrypt(encryptedMessageNumber)) # If the message number is less than what we're expecting, the message is being replayed if self.incomingMessageNum > messageNumber: raise exceptions.ProtocolError( errno=errors.ERR_MESSAGE_REPLAY) # If the message number is greater than what we're expecting, messages are being deleted elif self.incomingMessageNum < messageNumber: raise exceptions.ProtocolError( errno=errors.ERR_MESSAGE_DELETION) self.incomingMessageNum += 1 # Decrypt the payload payload = self.crypto.aesDecrypt(payload) except exceptions.CryptoError as ce: self.errorCallback(message.sourceNick, errors.ERR_BAD_DECRYPT) raise ce else: payload = message.payload return payload
def __getHandshakeMessagePayload(self, expectedCommand): message = self.messageQueue.get() if message.clientCommand != expectedCommand: if message.clientCommand == constants.COMMAND_END: raise exceptions.ProtocolEnd elif message.clientCommand == constants.COMMAND_REJECT: raise exceptions.ProtocolError(errno=errors.ERR_CONNECTION_REJECTED) else: raise exceptions.ProtocolError(errno=errors.ERR_BAD_HANDSHAKE) payload = self.__getDecryptedPayload(message) self.messageQueue.task_done() return payload