mirror of
https://gitlab.com/cryptsetup/cryptsetup.git
synced 2026-01-05 23:15:34 +01:00
TCRYPT: show proper device in status for chained mode
This commit is contained in:
16
lib/setup.c
16
lib/setup.c
@@ -755,8 +755,8 @@ static int _init_by_name_crypt(struct crypt_device *cd, const char *name)
|
||||
}
|
||||
}
|
||||
} else if (isTCRYPT(cd->type)) {
|
||||
r = TCRYPT_init_by_name(cd, name, &dmd, &cd->tcrypt_params,
|
||||
&cd->tcrypt_hdr);
|
||||
r = TCRYPT_init_by_name(cd, name, &dmd, &cd->device,
|
||||
&cd->tcrypt_params, &cd->tcrypt_hdr);
|
||||
}
|
||||
out:
|
||||
crypt_free_volume_key(dmd.u.crypt.vk);
|
||||
@@ -2507,8 +2507,7 @@ int crypt_get_verity_info(struct crypt_device *cd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int crypt_get_active_device(struct crypt_device *cd __attribute__((unused)),
|
||||
const char *name,
|
||||
int crypt_get_active_device(struct crypt_device *cd, const char *name,
|
||||
struct crypt_active_device *cad)
|
||||
{
|
||||
struct crypt_dm_active_device dmd;
|
||||
@@ -2521,8 +2520,13 @@ int crypt_get_active_device(struct crypt_device *cd __attribute__((unused)),
|
||||
if (dmd.target != DM_CRYPT && dmd.target != DM_VERITY)
|
||||
return -ENOTSUP;
|
||||
|
||||
cad->offset = dmd.u.crypt.offset;
|
||||
cad->iv_offset = dmd.u.crypt.iv_offset;
|
||||
if (cd && isTCRYPT(cd->type)) {
|
||||
cad->offset = TCRYPT_get_data_offset(&cd->tcrypt_hdr);
|
||||
cad->iv_offset = TCRYPT_get_iv_offset(&cd->tcrypt_hdr);
|
||||
} else {
|
||||
cad->offset = dmd.u.crypt.offset;
|
||||
cad->iv_offset = dmd.u.crypt.iv_offset;
|
||||
}
|
||||
cad->size = dmd.size;
|
||||
cad->flags = dmd.flags;
|
||||
|
||||
|
||||
@@ -653,7 +653,8 @@ out:
|
||||
|
||||
static int status_one(struct crypt_device *cd, const char *name,
|
||||
const char *base_uuid, int index,
|
||||
size_t *key_size, char *cipher)
|
||||
size_t *key_size, char *cipher, uint64_t *data_offset,
|
||||
struct device **device)
|
||||
{
|
||||
struct crypt_dm_active_device dmd = {};
|
||||
char dm_name[PATH_MAX], *c;
|
||||
@@ -666,7 +667,8 @@ static int status_one(struct crypt_device *cd, const char *name,
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = dm_query_device(cd, dm_name, DM_ACTIVE_UUID |
|
||||
r = dm_query_device(cd, dm_name, DM_ACTIVE_DEVICE |
|
||||
DM_ACTIVE_UUID |
|
||||
DM_ACTIVE_CRYPT_CIPHER |
|
||||
DM_ACTIVE_CRYPT_KEYSIZE, &dmd);
|
||||
if (r > 0)
|
||||
@@ -677,8 +679,13 @@ static int status_one(struct crypt_device *cd, const char *name,
|
||||
strcat(cipher, "-");
|
||||
strncat(cipher, dmd.u.crypt.cipher, MAX_CIPHER_LEN);
|
||||
*key_size += dmd.u.crypt.vk->keylength;
|
||||
} else
|
||||
*data_offset = dmd.u.crypt.offset * SECTOR_SIZE;
|
||||
device_free(*device);
|
||||
*device = dmd.data_device;
|
||||
} else {
|
||||
device_free(dmd.data_device);
|
||||
r = -ENODEV;
|
||||
}
|
||||
|
||||
free(CONST_CAST(void*)dmd.uuid);
|
||||
free(CONST_CAST(void*)dmd.u.crypt.cipher);
|
||||
@@ -688,6 +695,7 @@ static int status_one(struct crypt_device *cd, const char *name,
|
||||
|
||||
int TCRYPT_init_by_name(struct crypt_device *cd, const char *name,
|
||||
const struct crypt_dm_active_device *dmd,
|
||||
struct device **device,
|
||||
struct crypt_params_tcrypt *tcrypt_params,
|
||||
struct tcrypt_phdr *tcrypt_hdr)
|
||||
{
|
||||
@@ -695,6 +703,9 @@ int TCRYPT_init_by_name(struct crypt_device *cd, const char *name,
|
||||
|
||||
memset(tcrypt_params, 0, sizeof(*tcrypt_params));
|
||||
memset(tcrypt_hdr, 0, sizeof(*tcrypt_hdr));
|
||||
tcrypt_hdr->d.sector_size = SECTOR_SIZE;
|
||||
tcrypt_hdr->d.mk_offset = dmd->u.crypt.offset * SECTOR_SIZE;
|
||||
|
||||
strncpy(cipher, dmd->u.crypt.cipher, MAX_CIPHER_LEN);
|
||||
|
||||
if ((mode = strchr(cipher, '-'))) {
|
||||
@@ -703,8 +714,10 @@ int TCRYPT_init_by_name(struct crypt_device *cd, const char *name,
|
||||
}
|
||||
tcrypt_params->key_size = dmd->u.crypt.vk->keylength;
|
||||
|
||||
if (!status_one(cd, name, dmd->uuid, 1, &tcrypt_params->key_size, cipher))
|
||||
status_one(cd, name, dmd->uuid, 2, &tcrypt_params->key_size, cipher);
|
||||
if (!status_one(cd, name, dmd->uuid, 1, &tcrypt_params->key_size,
|
||||
cipher, &tcrypt_hdr->d.mk_offset, device))
|
||||
status_one(cd, name, dmd->uuid, 2, &tcrypt_params->key_size,
|
||||
cipher, &tcrypt_hdr->d.mk_offset, device);
|
||||
|
||||
tcrypt_params->cipher = strdup(cipher);
|
||||
return 0;
|
||||
|
||||
@@ -64,7 +64,8 @@ struct tcrypt_phdr {
|
||||
};
|
||||
} __attribute__((__packed__));
|
||||
|
||||
struct crypt_dm_active_device dmd;
|
||||
struct crypt_dm_active_device;
|
||||
struct device;
|
||||
|
||||
int TCRYPT_read_phdr(struct crypt_device *cd,
|
||||
struct tcrypt_phdr *hdr,
|
||||
@@ -72,6 +73,7 @@ int TCRYPT_read_phdr(struct crypt_device *cd,
|
||||
|
||||
int TCRYPT_init_by_name(struct crypt_device *cd, const char *name,
|
||||
const struct crypt_dm_active_device *dmd,
|
||||
struct device **device,
|
||||
struct crypt_params_tcrypt *tcrypt_params,
|
||||
struct tcrypt_phdr *tcrypt_hdr);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user