public function getClientFinalMessage()
    {
        $final_msg = 'c=biws,r=' . $this->_nonce;

        /* Salted password. */
        $s_pass = strval(new Horde_Crypt_Blowfish_Pbkdf2(
            $this->_pass,
            strlen(hash($this->_hash, '', true)),
            array(
                'algo' => $this->_hash,
                'i_count' => $this->_iterations,
                'salt' => $this->_salt
            )
        ));

        /* Client key. */
        $c_key = hash_hmac($this->_hash, 'Client Key', $s_pass, true);

        /* Stored key. */
        $s_key = hash($this->_hash, $c_key, true);

        /* Client signature. */
        $auth_msg = $this->_authmsg . ',' . $final_msg;
        $c_sig = hash_hmac($this->_hash, $auth_msg, $s_key, true);

        /* Proof. */
        $proof = $c_key ^ $c_sig;

        /* Server signature. */
        $this->_serversig = hash_hmac(
            $this->_hash,
            $auth_msg,
            hash_hmac($this->_hash, 'Server Key', $s_pass, true),
            true
        );

        /* c=biws: channel-binding ("biws" = base64('n,,')),
         * p=<proof>: base64 encoded ClientProof,
         * r=<nonce>: Nonce as returned from the server. */
        return $final_msg . ',p=' . base64_encode($proof);
    }