code: def process_server_first_message(self, server_first_message):
      self.auth_message += "," + server_first_message
      params = dict(
          pair.split("=", 1) for pair in server_first_message.split(",")
      )
      server_nonce = params["r"]
      if not server_nonce.startswith(self.nonce):
          raise ValueError(
              "Server nonce, did not start with client nonce!"
          )
      self.nonce = server_nonce
      self.auth_message += ",c=biws,r=" + self.nonce
  
      salt = base64.b64decode(params["s"].encode("utf-8"))
      iterations = int(params["i"])
      self.create_salted_password(salt, iterations)
  
      self.client_key = self.hmac(self.salted_password, b"Client Key")
      self.stored_key = self.hashfunc(self.client_key).digest()
      self.client_signature = self.hmac(
          self.stored_key, self.auth_message.encode("utf-8")
      )
      self.client_proof = xor_bytes(
          self.client_key, self.client_signature
      )
      self.server_key = self.hmac(self.salted_password, b"Server Key")
      self.server_signature = self.hmac(
          self.server_key, self.auth_message.encode("utf-8")
      )
  
file_path: kafka-python/kafka/scram.py
imports: from __future__ import absolute_import
  import base64
  import hashlib
  import hmac
  import uuid
  from kafka.vendor import six
label_desc: Use image node_id 3 for calling the ScramClient obj's underlying member method code with example usage: obj.process_server_first_message(server_first_message) without return types