def packet_encryption_request(self, buff): p_server_id = buff.unpack_string() # 1.7.x if self.protocol_version <= 5: p_public_key = buff.unpack_raw(buff.unpack('h')) p_verify_token = buff.unpack_raw(buff.unpack('h')) # 1.8.x else: p_public_key = buff.unpack_raw(buff.unpack_varint()) p_verify_token = buff.unpack_raw(buff.unpack_varint()) if not self.factory.profile.logged_in: raise ProtocolError("Can't log into online-mode server while using" " offline profile") self.shared_secret = crypto.make_shared_secret() self.public_key = crypto.import_public_key(p_public_key) self.verify_token = p_verify_token # make digest digest = crypto.make_digest( p_server_id, self.shared_secret, p_public_key) # do auth deferred = auth.join( self.factory.auth_timeout, digest, self.factory.profile.access_token, self.factory.profile.uuid) deferred.addCallbacks(self.auth_ok, self.auth_failed)
def packet_encryption_response(self, buff): if self.login_expecting != 1: raise ProtocolError("Out-of-order login") # 1.7.x if self.protocol_version <= 5: p_shared_secret = buff.unpack_raw(buff.unpack('h')) p_verify_token = buff.unpack_raw(buff.unpack('h')) # 1.8.x else: p_shared_secret = buff.unpack_raw(buff.unpack_varint()) p_verify_token = buff.unpack_raw(buff.unpack_varint()) shared_secret = crypto.decrypt_secret( self.factory.keypair, p_shared_secret) verify_token = crypto.decrypt_secret( self.factory.keypair, p_verify_token ) self.login_expecting = None if verify_token != self.verify_token: raise ProtocolError("Verify token incorrect") # enable encryption self.cipher.enable(shared_secret) self.logger.debug("Encryption enabled") # make digest digest = crypto.make_digest( self.server_id, shared_secret, self.factory.public_key) # do auth deferred = auth.has_joined( self.factory.auth_timeout, digest, self.username) deferred.addCallbacks(self.auth_ok, self.auth_failed)