mirror of
https://gitlab.com/cryptsetup/cryptsetup.git
synced 2025-12-15 04:40:05 +01:00
Support specifying volume key keyring type.
Currently only logon keyring type is supported. Add --volume-key-type to allow specifying arbitrary type for the volume key.
This commit is contained in:
@@ -545,7 +545,7 @@ static char *_uf(char *buf, size_t buf_size, const char *s, unsigned u)
|
||||
}
|
||||
|
||||
/* https://gitlab.com/cryptsetup/cryptsetup/wikis/DMCrypt */
|
||||
static char *get_dm_crypt_params(const struct dm_target *tgt, uint32_t flags)
|
||||
static char *get_dm_crypt_params(const struct dm_target *tgt, uint32_t flags, key_type_t key_type)
|
||||
{
|
||||
int r, max_size, null_cipher = 0, num_options = 0, keystr_len = 0;
|
||||
char *params = NULL, *hexkey = NULL;
|
||||
@@ -602,7 +602,8 @@ static char *get_dm_crypt_params(const struct dm_target *tgt, uint32_t flags)
|
||||
hexkey = crypt_safe_alloc(keystr_len);
|
||||
if (!hexkey)
|
||||
goto out;
|
||||
r = snprintf(hexkey, keystr_len, ":%zu:logon:%s", tgt->u.crypt.vk->keylength, tgt->u.crypt.vk->key_description);
|
||||
r = snprintf(hexkey, keystr_len, ":%zu:%s:%s", tgt->u.crypt.vk->keylength,
|
||||
key_type_name(key_type), tgt->u.crypt.vk->key_description);
|
||||
if (r < 0 || r >= keystr_len)
|
||||
goto out;
|
||||
} else
|
||||
@@ -1246,14 +1247,14 @@ static void _destroy_dm_targets_params(struct crypt_dm_active_device *dmd)
|
||||
} while (t);
|
||||
}
|
||||
|
||||
static int _create_dm_targets_params(struct crypt_dm_active_device *dmd)
|
||||
static int _create_dm_targets_params(struct crypt_dm_active_device *dmd, key_type_t key_type)
|
||||
{
|
||||
int r;
|
||||
struct dm_target *tgt = &dmd->segment;
|
||||
|
||||
do {
|
||||
if (tgt->type == DM_CRYPT)
|
||||
tgt->params = get_dm_crypt_params(tgt, dmd->flags);
|
||||
tgt->params = get_dm_crypt_params(tgt, dmd->flags, key_type);
|
||||
else if (tgt->type == DM_VERITY)
|
||||
tgt->params = get_dm_verity_params(tgt, dmd->flags);
|
||||
else if (tgt->type == DM_INTEGRITY)
|
||||
@@ -1311,7 +1312,7 @@ static int _dm_create_device(struct crypt_device *cd, const char *name, const ch
|
||||
if ((dmd->flags & CRYPT_ACTIVATE_READONLY) && !dm_task_set_ro(dmt))
|
||||
goto out;
|
||||
|
||||
r = _create_dm_targets_params(dmd);
|
||||
r = _create_dm_targets_params(dmd, key_type_by_name(crypt_get_vk_keyring_type(cd)));
|
||||
if (r)
|
||||
goto out;
|
||||
|
||||
@@ -1423,7 +1424,7 @@ static int _dm_reload_device(struct crypt_device *cd, const char *name,
|
||||
if ((dmd->flags & CRYPT_ACTIVATE_READONLY) && !dm_task_set_ro(dmt))
|
||||
goto out;
|
||||
|
||||
r = _create_dm_targets_params(dmd);
|
||||
r = _create_dm_targets_params(dmd, key_type_by_name(crypt_get_vk_keyring_type(cd)));
|
||||
if (r)
|
||||
goto out;
|
||||
|
||||
@@ -1906,7 +1907,7 @@ static int _dm_target_query_crypt(struct crypt_device *cd, uint32_t get_flags,
|
||||
int r;
|
||||
size_t key_size;
|
||||
struct device *data_device = NULL;
|
||||
char *cipher = NULL, *integrity = NULL;
|
||||
char *cipher = NULL, *integrity = NULL, *key_type = NULL;
|
||||
struct volume_key *vk = NULL;
|
||||
|
||||
tgt->type = DM_CRYPT;
|
||||
@@ -2025,12 +2026,16 @@ static int _dm_target_query_crypt(struct crypt_device *cd, uint32_t get_flags,
|
||||
/* :<key_size>:<key_type>:<key_description> */
|
||||
key_desc = NULL;
|
||||
endp = strpbrk(key_ + 1, ":");
|
||||
key_type = endp + 1;
|
||||
if (endp)
|
||||
key_desc = strpbrk(endp + 1, ":");
|
||||
if (!key_desc) {
|
||||
r = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
/* replace colon with zero character */
|
||||
key_desc[0] = '\0';
|
||||
|
||||
key_desc++;
|
||||
crypt_volume_key_set_description(vk, key_desc);
|
||||
} else {
|
||||
@@ -2056,6 +2061,8 @@ static int _dm_target_query_crypt(struct crypt_device *cd, uint32_t get_flags,
|
||||
tgt->data_device = data_device;
|
||||
if (vk)
|
||||
tgt->u.crypt.vk = vk;
|
||||
if (key_type)
|
||||
crypt_set_vk_keyring_type(cd, key_type);
|
||||
return 0;
|
||||
err:
|
||||
free(cipher);
|
||||
@@ -2994,7 +3001,8 @@ int dm_resume_and_reinstate_key(struct crypt_device *cd, const char *name,
|
||||
}
|
||||
|
||||
if (vk->key_description) {
|
||||
r = snprintf(msg, msg_size, "key set :%zu:logon:%s", vk->keylength, vk->key_description);
|
||||
r = snprintf(msg, msg_size, "key set :%zu:%s:%s", vk->keylength,
|
||||
crypt_get_vk_keyring_type(cd), vk->key_description);
|
||||
} else {
|
||||
key = crypt_bytes_to_hex(vk->keylength, vk->key);
|
||||
if (!key) {
|
||||
|
||||
Reference in New Issue
Block a user