Aff info function for integrity device and print info ion status.

This commit is contained in:
Milan Broz
2017-07-31 16:48:29 +02:00
parent cf9428fba1
commit 01598028c4
5 changed files with 74 additions and 9 deletions

View File

@@ -1041,6 +1041,18 @@ int crypt_get_sector_size(struct crypt_device *cd);
*/
int crypt_get_verity_info(struct crypt_device *cd,
struct crypt_params_verity *vp);
/**
* Get device parameters for INTEGRITY device.
*
* @param cd crypt device handle
* @param vp verity device info
*
* @e 0 on success or negative errno value otherwise.
*
*/
int crypt_get_integrity_info(struct crypt_device *cd,
struct crypt_params_integrity *ip);
/** @} */
/**

View File

@@ -44,6 +44,7 @@ CRYPTSETUP_2.0 {
crypt_get_integrity_key_size;
crypt_get_integrity_tag_size;
crypt_get_integrity_sectors;
crypt_get_integrity_info;
crypt_get_uuid;
crypt_get_data_offset;
crypt_get_iv_offset;

View File

@@ -1529,11 +1529,15 @@ static int _dm_query_integrity(uint32_t get_flags,
if (r)
return r;
}
} else if (!strncmp(arg, "journal_crypt:", 14))
;/* ignore it for now */
else if (!strncmp(arg, "journal_mac:", 12))
;/* ignore it for now */
else /* unknown option */
} else if (!strncmp(arg, "journal_crypt:", 14)) {
str = &arg[14];
arg = strsep(&str, ":");
dmd->u.integrity.journal_crypt = strdup(arg);
} else if (!strncmp(arg, "journal_mac:", 12)) {
str = &arg[12];
arg = strsep(&str, ":");
dmd->u.integrity.journal_integrity = strdup(arg);
} else /* unknown option */
return -EINVAL;
}

View File

@@ -838,6 +838,9 @@ static int _init_by_name_integrity(struct crypt_device *cd, const char *name)
cd->u.integrity.params.interleave_sectors = dmd.u.integrity.interleave_sectors;
cd->u.integrity.params.buffer_sectors = dmd.u.integrity.buffer_sectors;
cd->u.integrity.params.integrity = dmd.u.integrity.integrity;
cd->u.integrity.params.journal_integrity = dmd.u.integrity.journal_integrity;
cd->u.integrity.params.journal_crypt = dmd.u.integrity.journal_crypt;
//FIXME init keys?
}
out:
@@ -2798,6 +2801,33 @@ int crypt_get_verity_info(struct crypt_device *cd,
return 0;
}
int crypt_get_integrity_info(struct crypt_device *cd,
struct crypt_params_integrity *ip)
{
if (!isINTEGRITY(cd->type) || !ip)
return -EINVAL;
ip->journal_size = cd->u.integrity.params.journal_size;
ip->journal_watermark = cd->u.integrity.params.journal_watermark;
ip->journal_commit_time = cd->u.integrity.params.journal_commit_time;
ip->interleave_sectors = cd->u.integrity.params.interleave_sectors;
ip->tag_size = cd->u.integrity.params.tag_size;
ip->sector_size = cd->u.integrity.params.sector_size;
ip->buffer_sectors = cd->u.integrity.params.buffer_sectors;
ip->integrity = cd->u.integrity.params.integrity;
ip->journal_integrity = cd->u.integrity.params.journal_integrity;
ip->journal_integrity_key_size = cd->u.integrity.params.journal_integrity_key_size;
ip->journal_integrity_key = NULL;
ip->journal_crypt = cd->u.integrity.params.journal_crypt;
ip->journal_crypt_key_size = cd->u.integrity.params.journal_crypt_key_size;
ip->journal_crypt_key = NULL;
return 0;
}
int crypt_get_active_device(struct crypt_device *cd, const char *name,
struct crypt_active_device *cad)
{

View File

@@ -334,6 +334,7 @@ static int action_status(int arg)
{
crypt_status_info ci;
struct crypt_active_device cad;
struct crypt_params_integrity ip = {};
struct crypt_device *cd = NULL;
char *backing_file;
const char *device;
@@ -374,8 +375,12 @@ static int action_status(int arg)
if (r < 0)
goto out;
log_std(" tag size: %u\n", crypt_get_integrity_tag_size(cd));
log_std(" integrity: %s\n", crypt_get_integrity(cd) ?: "(none)");
r = crypt_get_integrity_info(cd, &ip);
if (r < 0)
goto out;
log_std(" tag size: %u\n", ip.tag_size);
log_std(" integrity: %s\n", ip.integrity ?: "(none)");
device = crypt_get_device_name(cd);
log_std(" device: %s\n", device);
if (crypt_loop_device(device)) {
@@ -384,9 +389,22 @@ static int action_status(int arg)
free(backing_file);
}
log_std(" sector size: %u sectors\n", crypt_get_sector_size(cd));
log_std(" interleave sectors: %u\n", ip.interleave_sectors);
log_std(" size: %" PRIu64 " sectors\n", cad.size);
log_std(" mode: %s\n", cad.flags & CRYPT_ACTIVATE_READONLY ?
"readonly" : "read/write");
log_std(" mode: %s%s\n",
cad.flags & CRYPT_ACTIVATE_READONLY ? "readonly" : "read/write",
cad.flags & CRYPT_ACTIVATE_RECOVERY ? " recovery" : "");
if (cad.flags & CRYPT_ACTIVATE_NO_JOURNAL) {
log_std(" journal: not active\n");
} else {
log_std(" journal size: %" PRIu64 " bytes\n", ip.journal_size);
log_std(" journal watermark: %u%%\n", ip.journal_watermark);
log_std(" journal commit time: %u ms\n", ip.journal_commit_time);
if (ip.journal_integrity)
log_std(" journal integrity MAC: %s\n", ip.journal_integrity);
if (ip.journal_crypt)
log_std(" journal encryption: %s\n", ip.journal_crypt);
}
}
out:
crypt_free(cd);