code: def split(self):
          
          # Sets temp_k1, temp_k2 = HKDF(ck, b'', 2).
          temp_k1, temp_k2 = self.noise_protocol.hkdf(self.ck, b'', 2)
  
          # If HASHLEN is 64, then truncates temp_k1 and temp_k2 to 32 bytes.
          if self.noise_protocol.hash_fn.hashlen == 64:
              temp_k1 = temp_k1[:32]
              temp_k2 = temp_k2[:32]
  
          # Creates two new CipherState objects c1 and c2.
          # Calls c1.InitializeKey(temp_k1) and c2.InitializeKey(temp_k2).
          c1, c2 = CipherState(self.noise_protocol), CipherState(self.noise_protocol)
          c1.initialize_key(temp_k1)
          c2.initialize_key(temp_k2)
          if self.noise_protocol.handshake_state.initiator:
              self.noise_protocol.cipher_state_encrypt = c1
              self.noise_protocol.cipher_state_decrypt = c2
          else:
              self.noise_protocol.cipher_state_encrypt = c2
              self.noise_protocol.cipher_state_decrypt = c1
  
          self.noise_protocol.handshake_done()
  
          # Returns the pair (c1, c2).
          return c1, c2
docs: Returns a pair of CipherState objects for encrypting/decrypting transport messages.
  
          :return: tuple (CipherState, CipherState)