};
int r;
- r = crypt_parse_name_and_mode(options->cipher, cipherName, cipherMode);
+ r = crypt_parse_name_and_mode(options->cipher, cipherName, NULL, cipherMode);
if(r < 0) {
log_err(cd, _("No known cipher specification pattern detected.\n"));
return r;
goto out;
}
- r = crypt_parse_name_and_mode(cipher_full, cipher, cipher_mode);
+ r = crypt_parse_name_and_mode(cipher_full, cipher, NULL, cipher_mode);
if (!r) {
(*cd)->plain_cipher = strdup(cipher);
(*cd)->plain_cipher_mode = strdup(cipher_mode);
{
int r;
- log_dbg("Formatting device %s as type %s.", cd->device ?: "(none)", cd->type ?: "(none)");
-
if (!type)
return -EINVAL;
+ log_dbg("Formatting device %s as type %s.", cd->device ?: "(none)", type);
+
r = init_crypto(cd);
if (r < 0)
return r;
if (!keyfile)
return -EINVAL;
- r = key_from_file(cd, _("Enter passphrase: "), &passphrase_read,
- &passphrase_size_read, keyfile, keyfile_size);
- if (r < 0)
- goto out;
-
if (isPLAIN(cd->type)) {
+ r = key_from_file(cd, _("Enter passphrase: "), &passphrase_read,
+ &passphrase_size_read, keyfile, keyfile_size);
+ if (r < 0)
+ goto out;
r = create_device_helper(cd, name, cd->plain_hdr.hash,
cd->plain_cipher, cd->plain_cipher_mode,
NULL, passphrase_read, passphrase_size_read,
cd->plain_hdr.skip, cd->plain_hdr.offset,
cd->plain_uuid,
flags & CRYPT_ACTIVATE_READONLY, 0, 0);
- keyslot = 0;
} else if (isLUKS(cd->type)) {
+ r = key_from_file(cd, _("Enter passphrase: "), &passphrase_read,
+ &passphrase_size_read, keyfile, keyfile_size);
+ if (r < 0)
+ goto out;
r = LUKS_open_key_with_hdr(cd->device, keyslot, passphrase_read,
passphrase_size_read, &cd->hdr, &vk, cd);
if (r < 0)
goto out;
-
keyslot = r;
- if (name)
+ if (name) {
r = open_from_hdr_and_vk(cd, vk, name, flags);
+ if (r < 0)
+ goto out;
+ }
+ r = keyslot;
} else
r = -EINVAL;
crypt_safe_free(passphrase_read);
crypt_free_volume_key(vk);
- return r < 0 ? r : keyslot;
+ return r;
}
int crypt_activate_by_volume_key(struct crypt_device *cd,
char data[0];
};
-int crypt_parse_name_and_mode(const char *s, char *cipher, char *cipher_mode)
+int crypt_parse_name_and_mode(const char *s, char *cipher, int *key_nums,
+ char *cipher_mode)
{
if (sscanf(s, "%" MAX_CIPHER_LEN_STR "[^-]-%" MAX_CIPHER_LEN_STR "s",
cipher, cipher_mode) == 2) {
if (!strcmp(cipher_mode, "plain"))
strncpy(cipher_mode, "cbc-plain", 10);
+ if (key_nums) {
+ char *tmp = strchr(cipher, ':');
+ *key_nums = tmp ? atoi(++tmp) : 1;
+ if (!*key_nums)
+ return -EINVAL;
+ }
+
return 0;
}
if (sscanf(s, "%" MAX_CIPHER_LEN_STR "[^-]", cipher) == 1) {
strncpy(cipher_mode, "cbc-plain", 10);
+ if (key_nums)
+ *key_nums = 1;
return 0;
}
memcpy(&tmp, &orig, sizeof(tmp));
tmp.c_lflag &= ~ECHO;
- if (write(outfd, prompt, strlen(prompt)) < 0)
+ if (prompt && write(outfd, prompt, strlen(prompt)) < 0)
goto out_err;
tcsetattr(infd, TCSAFLUSH, &tmp);
struct crypt_device;
-int crypt_parse_name_and_mode(const char *s, char *cipher, char *cipher_mode);
+int crypt_parse_name_and_mode(const char *s, char *cipher,
+ int *key_nums, char *cipher_mode);
int crypt_get_key(char *prompt, char **key, unsigned int *passLen, int key_size,
const char *key_file, int timeout, int how2verify,
params.hash = NULL;
r = crypt_parse_name_and_mode(opt_cipher ?: DEFAULT_CIPHER(PLAIN),
- cipher, cipher_mode);
+ cipher, NULL, cipher_mode);
if (r < 0) {
log_err("No known cipher specification pattern detected.\n");
goto out;
if (r < 0 || !crypt_get_type(cd))
goto out;
- log_std(" type: %s\n", crypt_get_type(cd));
+ log_std(" type: %s\n", crypt_get_type(cd));
r = crypt_get_active_device(cd, action_argv[0], &cad);
if (r < 0)
goto out;
r = crypt_parse_name_and_mode(opt_cipher ?: DEFAULT_CIPHER(LUKS1),
- cipher, cipher_mode);
+ cipher, NULL, cipher_mode);
if (r < 0) {
log_err("No known cipher specification pattern detected.\n");
goto out;
{
int r;
+ log_dbg("Running command %s.", action->type);
+
if (action->required_memlock)
crypt_memory_lock(NULL, 1);