if (r < 0)
goto bad;
- if (dm_init(h, 1) < 0) {
- r = -ENOSYS;
- goto bad;
- }
+ dm_backend_init();
h->iteration_time = 1000;
h->password_verify = 0;
if (r < 0)
return r;
- if (params->flags & CRYPT_VERITY_NO_HEADER)
+ if (params && params->flags & CRYPT_VERITY_NO_HEADER)
return -EINVAL;
if (params)
&required_alignment,
&alignment_offset, DEFAULT_DISK_ALIGNMENT);
+ /* Check early if we cannot allocate block device for key slot access */
+ r = device_block_adjust(cd, cd->device, DEV_OK, 0, NULL, NULL);
+ if(r < 0)
+ return r;
+
r = LUKS_generate_phdr(&cd->hdr, cd->volume_key, cipher, cipher_mode,
(params && params->hash) ? params->hash : "sha1",
uuid, LUKS_STRIPES,
return -ENOMEM;
cd->verity_hdr.flags = params->flags;
- cd->verity_hdr.hash_name = strdup(params->hash_name);
+ if (!(cd->verity_hdr.hash_name = strdup(params->hash_name)))
+ return -ENOMEM;
cd->verity_hdr.data_device = NULL;
cd->verity_hdr.data_block_size = params->data_block_size;
cd->verity_hdr.hash_block_size = params->hash_block_size;
cd->verity_hdr.hash_type = params->hash_type;
cd->verity_hdr.flags = params->flags;
cd->verity_hdr.salt_size = params->salt_size;
- cd->verity_hdr.salt = malloc(params->salt_size);
+ if (!(cd->verity_hdr.salt = malloc(params->salt_size)))
+ return -ENOMEM;
+
if (params->salt)
memcpy(CONST_CAST(char*)cd->verity_hdr.salt, params->salt,
params->salt_size);
if (cd) {
log_dbg("Releasing crypt device %s context.", mdata_device_path(cd));
- dm_exit();
+ dm_backend_exit();
crypt_free_volume_key(cd->volume_key);
device_free(cd->device);
log_dbg("Suspending volume %s.", name);
- if (!isLUKS(cd->type)) {
+ if (!cd || !isLUKS(cd->type)) {
log_err(cd, _("This operation is supported only for LUKS device.\n"));
r = -EINVAL;
goto out;
return -EINVAL;
}
- if (!cd && dm_init(NULL, 1) < 0)
- return -ENOSYS;
+ dm_backend_init();
r = dm_status_suspended(cd, name);
if (r < 0)
else if (r)
log_err(cd, "Error during suspending device %s.\n", name);
out:
- if (!cd)
- dm_exit();
+ dm_backend_exit();
return r;
}
log_dbg("Deactivating volume %s.", name);
- if (!cd && dm_init(NULL, 1) < 0)
- return -ENOSYS;
+ if (!cd)
+ dm_backend_init();
switch (crypt_status(cd, name)) {
case CRYPT_ACTIVE:
}
if (!cd)
- dm_exit();
+ dm_backend_exit();
return r;
}
{
int r;
- if (!cd && dm_init(NULL, 1) < 0)
- return CRYPT_INVALID;
+ if (!cd)
+ dm_backend_init();
r = dm_status_device(cd, name);
if (!cd)
- dm_exit();
+ dm_backend_exit();
if (r < 0 && r != -ENODEV)
return CRYPT_INVALID;
return -EINVAL;
}
+int crypt_keyslot_area(struct crypt_device *cd,
+ int keyslot,
+ uint64_t *offset,
+ uint64_t *length)
+{
+ if (!isLUKS(cd->type))
+ return -EINVAL;
+
+ return LUKS_keyslot_area(&cd->hdr, keyslot, offset, length);
+}
+
const char *crypt_get_type(struct crypt_device *cd)
{
return cd->type;