{
struct device_infos infos;
- if (get_device_infos(device, &infos, cd) < 0) {
- log_err(cd, _("Cannot get info about device %s.\n"), device);
+ if (!device || get_device_infos(device, &infos, cd) < 0) {
+ log_err(cd, _("Cannot get info about device %s.\n"),
+ device ?: "[none]");
return -ENOTBLK;
}
/* OPTIONS: name, cipher, device, hash, key_file, key_size, key_slot,
* offset, size, skip, timeout, tries, passphrase_fd (ignored),
* flags, icb */
-int crypt_create_device(struct crypt_options *options)
+static int crypt_create_and_update_device(struct crypt_options *options, int update)
{
struct crypt_device *cd = NULL;
char *key = NULL;
options->cipher, NULL, options->key_file, key, keyLen,
options->key_size, options->size, options->skip,
options->offset, NULL, options->flags & CRYPT_FLAG_READONLY,
- options->flags, 0);
+ options->flags, update);
safe_free(key);
crypt_free(cd);
return r;
}
-/* OPTIONS: same as create above */
-int crypt_update_device(struct crypt_options *options)
+int crypt_create_device(struct crypt_options *options)
{
- struct crypt_device *cd = NULL;
- char *key = NULL;
- unsigned int keyLen;
- int r;
-
- r = _crypt_init(&cd, CRYPT_PLAIN, options, 1, 1);
- if (r)
- return r;
-
- get_key(_("Enter passphrase: "), &key, &keyLen, options->key_size,
- options->key_file, cd->timeout, options->flags, cd);
- if (!key)
- r = -ENOENT;
- else
- r = create_device_helper(cd, options->name, options->hash,
- options->cipher, NULL, options->key_file, key, keyLen,
- options->key_size, options->size, options->skip,
- options->offset, NULL, options->flags & CRYPT_FLAG_READONLY,
- options->flags, 1);
+ return crypt_create_and_update_device(options, 0);
+}
- safe_free(key);
- crypt_free(cd);
- return r;
+int crypt_update_device(struct crypt_options *options)
+{
+ return crypt_create_and_update_device(options, 1);
}
/* OPTIONS: name, size, icb */
co.size = 0;
OK_(crypt_resize_device(&co));
EQ_(_get_device_size(DMDIR CDEVICE_2), (orig_size - 333));
-
co.size = 0;
co.offset = 444;
co.skip = 555;
EQ_(co.key_size, 128 / 8);
EQ_(co.offset, 444);
EQ_(co.skip, 555);
- OK_(crypt_remove_device(&co));
+ crypt_put_options(&co);
+
+ // dangerous switch device still works
+ memset(&co, 0, sizeof(co));
+ co.name = CDEVICE_2,
+ co.device = DEVICE_1;
+ co.key_file = KEYFILE2;
+ co.key_size = 128 / 8;
+ co.cipher = "aes-cbc-plain";
+ co.hash = "sha1";
+ co.icb = &cmd_icb;
+ OK_(crypt_update_device(&co));
+ memset(&co, 0, sizeof(co));
+ co.icb = &cmd_icb,
+ co.name = CDEVICE_2;
+ EQ_(crypt_query_device(&co), 1);
+ EQ_(strcmp(co.cipher, "aes-cbc-plain"), 0);
+ EQ_(co.key_size, 128 / 8);
+ EQ_(co.offset, 0);
+ EQ_(co.skip, 0);
+ // This expect lookup returns prefered /dev/loopX
+ EQ_(strcmp(co.device, DEVICE_1), 0);
crypt_put_options(&co);
+ memset(&co, 0, sizeof(co));
+ co.icb = &cmd_icb,
+ co.name = CDEVICE_2;
+ OK_(crypt_remove_device(&co));
+
_remove_keyfiles();
}