anchor.diff:          _ ->
               false
       end.
  +
  +scram_sha_auth_payload(none) -> <<"y,,">>;
  +scram_sha_auth_payload(tls_unique) -> <<"p=tls-unique,,">>.
   
   hex_md5(Data) ->
       base16:encode(crypto:hash(md5, Data)).
  
positive.code:     Username = get_property(username, Props),
      Nonce = base64:encode(crypto:strong_rand_bytes(16)),
      ClientFirstMessageBare = csvkv:format([{<<"n">>, Username}, {<<"r">>, Nonce}], false),
      GS2Header = <<"n,,">>,
      Payload = <<GS2Header/binary,ClientFirstMessageBare/binary>>,
      Stanza = escalus_stanza:auth(XMPPMethod, [base64_cdata(Payload)]),
      ok = escalus_connection:send(Conn, Stanza),
      {Response, SaltedPassword, AuthMessage} =
          scram_sha_response(HashMethod, Conn, GS2Header, ClientFirstMessageBare, Props),
      ResponseStanza = escalus_stanza:auth_response([Response]),
      ok = escalus_connection:send(Conn, ResponseStanza),
      AuthReply = escalus_connection:get_stanza(Conn, auth_reply),
      case AuthReply of
          #xmlel{name = <<"success">>, children = [#xmlcdata{content = CData}]} ->
  
negative.code:         {<<"authzid">>, FullJid}
      ])).
  
  scram_sha_response(PlusVariant, HashMethod, Conn, GS2Headers, ClientFirstMessageBare, Props) ->
      Challenge = get_challenge(Conn, challenge1, false),
      ChallengeData = csvkv:parse(Challenge),
      Password = get_property(password, Props),
  