Allocate internal buffer in LUKS2 keyring token with crypt_safe_alloc.

With changes in db65a5ceac and subsequent
drop of library memlock_all we should lock keyring key material buffer
in memory system memory as well.
This commit is contained in:
Ondrej Kozina
2022-11-10 16:44:09 +01:00
committed by Milan Broz
parent dab00bfd4f
commit cdfa213ad0
5 changed files with 11 additions and 6 deletions

View File

@@ -189,6 +189,8 @@ void keyring_dump(struct crypt_device *cd, const char *json);
int keyring_validate(struct crypt_device *cd, const char *json); int keyring_validate(struct crypt_device *cd, const char *json);
void keyring_buffer_free(void *buffer, size_t buffer_size);
struct crypt_token_handler_v2 { struct crypt_token_handler_v2 {
const char *name; const char *name;
crypt_token_open_func open; crypt_token_open_func open;

View File

@@ -37,6 +37,7 @@ static struct crypt_token_handler_internal token_handlers[LUKS2_TOKENS_MAX] = {
.u = { .u = {
.v1 = { .name = LUKS2_TOKEN_KEYRING, .v1 = { .name = LUKS2_TOKEN_KEYRING,
.open = keyring_open, .open = keyring_open,
.buffer_free = keyring_buffer_free,
.validate = keyring_validate, .validate = keyring_validate,
.dump = keyring_dump } .dump = keyring_dump }
} }

View File

@@ -137,3 +137,8 @@ int LUKS2_token_keyring_get(struct luks2_hdr *hdr,
return token; return token;
} }
void keyring_buffer_free(void *buffer, size_t buffer_len __attribute__((unused)))
{
crypt_safe_free(buffer);
}

View File

@@ -6491,8 +6491,7 @@ int crypt_activate_by_keyring(struct crypt_device *cd,
r = _activate_by_passphrase(cd, name, keyslot, passphrase, passphrase_size, flags); r = _activate_by_passphrase(cd, name, keyslot, passphrase, passphrase_size, flags);
crypt_safe_memzero(passphrase, passphrase_size); crypt_safe_free(passphrase);
free(passphrase);
return r; return r;
} }

View File

@@ -163,7 +163,7 @@ int keyring_get_passphrase(const char *key_desc,
ret = keyctl_read(kid, NULL, 0); ret = keyctl_read(kid, NULL, 0);
if (ret > 0) { if (ret > 0) {
len = ret; len = ret;
buf = malloc(len); buf = crypt_safe_alloc(len);
if (!buf) if (!buf)
return -ENOMEM; return -ENOMEM;
@@ -173,9 +173,7 @@ int keyring_get_passphrase(const char *key_desc,
if (ret < 0) { if (ret < 0) {
err = errno; err = errno;
if (buf) crypt_safe_free(buf);
crypt_safe_memzero(buf, len);
free(buf);
return -err; return -err;
} }