Add --keyfile-offset and --new-keyfile-offset to cryptsetup.

Add resume_by_keyfile_offset, add_kesylot_by_keyfile_offset and
activate_by_keyfile_offset to API.

Thanks to Matthew Monaco <matthew.monaco@0x01b.net>
This commit is contained in:
Milan Broz
2012-03-29 18:35:07 +02:00
parent 570b0ecd49
commit 9511c91a79
11 changed files with 228 additions and 79 deletions

View File

@@ -257,14 +257,14 @@ out_err:
*/
int crypt_get_key(const char *prompt,
char **key, size_t *key_size,
size_t keyfile_size_max, const char *key_file,
int timeout, int verify,
size_t keyfile_offset, size_t keyfile_size_max,
const char *key_file, int timeout, int verify,
struct crypt_device *cd)
{
int fd, regular_file, read_stdin, char_read, unlimited_read = 0;
int r = -EINVAL;
char *pass = NULL;
size_t buflen, i;
char *pass = NULL, tmp;
size_t buflen, i, file_read_size;
struct stat st;
*key = NULL;
@@ -273,8 +273,13 @@ int crypt_get_key(const char *prompt,
/* Passphrase read from stdin? */
read_stdin = (!key_file || !strcmp(key_file, "-")) ? 1 : 0;
if (read_stdin && isatty(STDIN_FILENO))
if (read_stdin && isatty(STDIN_FILENO)) {
if (keyfile_offset) {
log_err(cd, _("Cannot use offset with terminal input.\n"));
return -EINVAL;
}
return crypt_get_key_tty(prompt, key, key_size, timeout, verify, cd);
}
if (read_stdin)
log_dbg("STDIN descriptor passphrase entry requested.");
@@ -303,11 +308,19 @@ int crypt_get_key(const char *prompt,
}
if(S_ISREG(st.st_mode)) {
regular_file = 1;
file_read_size = (size_t)st.st_size;
if (keyfile_offset > file_read_size) {
log_err(cd, _("Cannot seek to requested keyfile offset.\n"));
goto out_err;
}
file_read_size -= keyfile_offset;
/* known keyfile size, alloc it in one step */
if ((size_t)st.st_size >= keyfile_size_max)
if (file_read_size >= keyfile_size_max)
buflen = keyfile_size_max;
else if (st.st_size)
buflen = st.st_size;
else if (file_read_size)
buflen = file_read_size;
}
}
@@ -317,6 +330,13 @@ int crypt_get_key(const char *prompt,
goto out_err;
}
/* Discard keyfile_offset bytes on input */
for(i = 0; i < keyfile_offset; i++)
if (read(fd, &tmp, 1) != 1) {
log_err(cd, _("Cannot seek to requested keyfile offset.\n"));
goto out_err;
}
for(i = 0; i < keyfile_size_max; i++) {
if(i == buflen) {
buflen += 4096;