From: Stephan Bosch Date: Mon, 7 Nov 2022 23:54:38 +0000 (+0100) Subject: lib-auth: auth-scram-server - Diligently clean key data. X-Git-Tag: 2.4.0~3125 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e378bcc7e1d0158c4621d46d743978f48bdf0c9d;p=thirdparty%2Fdovecot%2Fcore.git lib-auth: auth-scram-server - Diligently clean key data. --- diff --git a/src/lib-auth/auth-scram-server.c b/src/lib-auth/auth-scram-server.c index 3ed3953aae..7f6b90f6a5 100644 --- a/src/lib-auth/auth-scram-server.c +++ b/src/lib-auth/auth-scram-server.c @@ -69,6 +69,9 @@ void auth_scram_server_init(struct auth_scram_server *server_r, pool_t pool, void auth_scram_server_deinit(struct auth_scram_server *server) { i_assert(server->hash_method != NULL); + if (server->proof != NULL) + buffer_clear_safe(server->proof); + auth_scram_key_data_clear(&server->key_data); pool_unref(&server->pool); } @@ -318,6 +321,7 @@ auth_scram_server_verify_credentials(struct auth_scram_server *server) const unsigned char *proof_data = server->proof->data; for (i = 0; i < sizeof(client_signature); i++) client_key[i] = proof_data[i] ^ client_signature[i]; + buffer_clear_safe(server->proof); /* StoredKey := H(ClientKey) */ hash_method_get_digest(hmethod, client_key, sizeof(client_key), diff --git a/src/lib-auth/auth-scram.c b/src/lib-auth/auth-scram.c index 50be682e14..a1b5460e8d 100644 --- a/src/lib-auth/auth-scram.c +++ b/src/lib-auth/auth-scram.c @@ -1,10 +1,28 @@ /* Copyright (c) 2022-2023 Dovecot authors, see the included COPYING file */ #include "lib.h" +#include "safe-memset.h" #include "hmac.h" #include "auth-scram.h" +void auth_scram_key_data_clear(struct auth_scram_key_data *data) +{ + if (data->hmethod != NULL) { + if (data->stored_key != NULL) { + safe_memset(data->stored_key, 0, + data->hmethod->digest_size); + } + if (data->server_key != NULL) { + safe_memset(data->server_key, 0, + data->hmethod->digest_size); + } + } else { + i_assert(data->stored_key == NULL); + i_assert(data->server_key == NULL); + } +} + void auth_scram_hi(const struct hash_method *hmethod, const unsigned char *str, size_t str_size, const unsigned char *salt, size_t salt_size, unsigned int i, diff --git a/src/lib-auth/auth-scram.h b/src/lib-auth/auth-scram.h index ea9194b287..91fff2b8dc 100644 --- a/src/lib-auth/auth-scram.h +++ b/src/lib-auth/auth-scram.h @@ -11,6 +11,8 @@ struct auth_scram_key_data { unsigned char *server_key; }; +void auth_scram_key_data_clear(struct auth_scram_key_data *data); + void auth_scram_hi(const struct hash_method *hmethod, const unsigned char *str, size_t str_size, const unsigned char *salt, size_t salt_size, unsigned int i,