From: Stephan Bosch Date: Mon, 26 Sep 2022 23:32:28 +0000 (+0200) Subject: auth: mech-scram - Move verify_credentials() to auth-scram-server.c. X-Git-Tag: 2.4.0~3144 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0cbfda1f1d0e7321a673bfc0a8ac1726b3041943;p=thirdparty%2Fdovecot%2Fcore.git auth: mech-scram - Move verify_credentials() to auth-scram-server.c. --- diff --git a/src/auth/auth-scram-server.c b/src/auth/auth-scram-server.c index 7eb3c34454..731d5c7f3e 100644 --- a/src/auth/auth-scram-server.c +++ b/src/auth/auth-scram-server.c @@ -197,3 +197,44 @@ get_scram_server_first(struct scram_auth_request *request, salt, iter); return str_c(str); } + +static bool verify_credentials(struct scram_auth_request *request) +{ + const struct hash_method *hmethod = request->hash_method; + struct hmac_context ctx; + const char *auth_message; + unsigned char client_key[hmethod->digest_size]; + unsigned char client_signature[hmethod->digest_size]; + unsigned char stored_key[hmethod->digest_size]; + size_t i; + + /* RFC 5802, Section 3: + + AuthMessage := client-first-message-bare + "," + + server-first-message + "," + + client-final-message-without-proof + ClientSignature := HMAC(StoredKey, AuthMessage) + */ + auth_message = t_strconcat(request->client_first_message_bare, ",", + request->server_first_message, ",", + request->client_final_message_without_proof, NULL); + + hmac_init(&ctx, request->stored_key, hmethod->digest_size, hmethod); + hmac_update(&ctx, auth_message, strlen(auth_message)); + hmac_final(&ctx, client_signature); + + /* ClientProof := ClientKey XOR ClientSignature */ + const unsigned char *proof_data = request->proof->data; + for (i = 0; i < sizeof(client_signature); i++) + client_key[i] = proof_data[i] ^ client_signature[i]; + + /* StoredKey := H(ClientKey) */ + hash_method_get_digest(hmethod, client_key, sizeof(client_key), + stored_key); + + safe_memset(client_key, 0, sizeof(client_key)); + safe_memset(client_signature, 0, sizeof(client_signature)); + + return mem_equals_timing_safe(stored_key, request->stored_key, + sizeof(stored_key)); +} diff --git a/src/auth/mech-scram.c b/src/auth/mech-scram.c index 39c8806f8e..b506d19056 100644 --- a/src/auth/mech-scram.c +++ b/src/auth/mech-scram.c @@ -89,47 +89,6 @@ static const char *get_scram_server_final(struct scram_auth_request *request) #include "auth-scram-server.c" -static bool verify_credentials(struct scram_auth_request *request) -{ - const struct hash_method *hmethod = request->hash_method; - struct hmac_context ctx; - const char *auth_message; - unsigned char client_key[hmethod->digest_size]; - unsigned char client_signature[hmethod->digest_size]; - unsigned char stored_key[hmethod->digest_size]; - size_t i; - - /* RFC 5802, Section 3: - - AuthMessage := client-first-message-bare + "," + - server-first-message + "," + - client-final-message-without-proof - ClientSignature := HMAC(StoredKey, AuthMessage) - */ - auth_message = t_strconcat(request->client_first_message_bare, ",", - request->server_first_message, ",", - request->client_final_message_without_proof, NULL); - - hmac_init(&ctx, request->stored_key, hmethod->digest_size, hmethod); - hmac_update(&ctx, auth_message, strlen(auth_message)); - hmac_final(&ctx, client_signature); - - /* ClientProof := ClientKey XOR ClientSignature */ - const unsigned char *proof_data = request->proof->data; - for (i = 0; i < sizeof(client_signature); i++) - client_key[i] = proof_data[i] ^ client_signature[i]; - - /* StoredKey := H(ClientKey) */ - hash_method_get_digest(hmethod, client_key, sizeof(client_key), - stored_key); - - safe_memset(client_key, 0, sizeof(client_key)); - safe_memset(client_signature, 0, sizeof(client_signature)); - - return mem_equals_timing_safe(stored_key, request->stored_key, - sizeof(stored_key)); -} - static void credentials_callback(enum passdb_result result, const unsigned char *credentials, size_t size,