Allow no hash specification in plain device constructor (issue 63).
[platform/upstream/cryptsetup.git] / lib / setup.c
1 #include <string.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <stdarg.h>
5 #include <fcntl.h>
6 #include <errno.h>
7
8 #include "libcryptsetup.h"
9 #include "luks.h"
10 #include "internal.h"
11
12 struct crypt_device {
13         char *type;
14
15         char *device;
16         struct luks_masterkey *volume_key;
17         uint64_t timeout;
18         uint64_t iteration_time;
19         int tries;
20         int password_verify;
21
22         /* used in CRYPT_LUKS1 */
23         struct luks_phdr hdr;
24         uint64_t PBKDF2_per_sec;
25
26         /* used in CRYPT_PLAIN */
27         struct crypt_params_plain plain_hdr;
28         char *plain_cipher;
29         char *plain_cipher_mode;
30         char *plain_uuid;
31
32         /* callbacks definitions */
33         void (*log)(int level, const char *msg, void *usrptr);
34         void *log_usrptr;
35         int (*confirm)(const char *msg, void *usrptr);
36         void *confirm_usrptr;
37         int (*password)(const char *msg, char *buf, size_t length, void *usrptr);
38         void *password_usrptr;
39 };
40
41 /* Log helper */
42 static void (*_default_log)(int level, const char *msg, void *usrptr) = NULL;
43 static int _debug_level = 0;
44
45 void crypt_set_debug_level(int level)
46 {
47         _debug_level = level;
48 }
49
50 int crypt_get_debug_level()
51 {
52         return _debug_level;
53 }
54
55 void crypt_log(struct crypt_device *cd, int level, const char *msg)
56 {
57         if (cd && cd->log)
58                 cd->log(level, msg, cd->log_usrptr);
59         else if (_default_log)
60                 _default_log(level, msg, NULL);
61 }
62
63 void logger(struct crypt_device *cd, int level, const char *file,
64             int line, const char *format, ...)
65 {
66         va_list argp;
67         char *target = NULL;
68
69         va_start(argp, format);
70
71         if (vasprintf(&target, format, argp) > 0) {
72                 if (level >= 0) {
73                         crypt_log(cd, level, target);
74 #ifdef CRYPT_DEBUG
75                 } else if (_debug_level)
76                         printf("# %s:%d %s\n", file ?: "?", line, target);
77 #else
78                 } else if (_debug_level)
79                         printf("# %s\n", target);
80 #endif
81         }
82
83         va_end(argp);
84         free(target);
85 }
86
87 /*
88  * Password processing behaviour matrix of process_key
89  *
90  * from binary file: check if there is sufficently large key material
91  * interactive & from fd: hash if requested, otherwise crop or pad with '0'
92  */
93 static char *process_key(struct crypt_device *cd, const char *hash_name,
94                          const char *key_file, size_t key_size,
95                          const char *pass, size_t passLen)
96 {
97         char *key = safe_alloc(key_size);
98         memset(key, 0, key_size);
99
100         /* key is coming from binary file */
101         if (key_file && strcmp(key_file, "-")) {
102                 if(passLen < key_size) {
103                         log_err(cd, _("Cannot not read %d bytes from key file %s.\n"),
104                                 key_size, key_file);
105                         safe_free(key);
106                         return NULL;
107                 }
108                 memcpy(key, pass, key_size);
109                 return key;
110         }
111
112         /* key is coming from tty, fd or binary stdin */
113         if (hash_name) {
114                 if (hash(NULL, hash_name, key, key_size, pass, passLen) < 0) {
115                         log_err(cd, _("Key processing error (using hash algorithm %s).\n"),
116                                 hash_name);
117                         safe_free(key);
118                         return NULL;
119                 }
120         } else if (passLen > key_size) {
121                 memcpy(key, pass, key_size);
122         } else {
123                 memcpy(key, pass, passLen);
124         }
125
126         return key;
127 }
128
129 int parse_into_name_and_mode(const char *nameAndMode, char *name, char *mode)
130 {
131 /* Token content stringification, see info cpp/stringification */
132 #define str(s) #s
133 #define xstr(s) str(s)
134 #define scanpattern1 "%" xstr(LUKS_CIPHERNAME_L) "[^-]-%" xstr(LUKS_CIPHERMODE_L)  "s"
135 #define scanpattern2 "%" xstr(LUKS_CIPHERNAME_L) "[^-]"
136
137         int r;
138
139         if(sscanf(nameAndMode,scanpattern1, name, mode) != 2) {
140                 if((r = sscanf(nameAndMode,scanpattern2,name)) == 1)
141                         strncpy(mode,"cbc-plain",10);
142                 else
143                         return -EINVAL;
144         }
145
146         return 0;
147
148 #undef scanpattern1
149 #undef scanpattern2
150 #undef str
151 #undef xstr
152 }
153
154 static int isPLAIN(const char *type)
155 {
156         return (type && !strcmp(CRYPT_PLAIN, type));
157 }
158
159 static int isLUKS(const char *type)
160 {
161         return (type && !strcmp(CRYPT_LUKS1, type));
162 }
163
164 /* keyslot helpers */
165 static int keyslot_verify_or_find_empty(struct crypt_device *cd, int *keyslot)
166 {
167         if (*keyslot == CRYPT_ANY_SLOT) {
168                 *keyslot = LUKS_keyslot_find_empty(&cd->hdr);
169                 if (*keyslot < 0) {
170                         log_err(cd, _("All key slots full.\n"));
171                         return -EINVAL;
172                 }
173         }
174
175         switch (LUKS_keyslot_info(&cd->hdr, *keyslot)) {
176                 case CRYPT_SLOT_INVALID:
177                         log_err(cd, _("Key slot %d is invalid, please select between 0 and %d.\n"),
178                                 *keyslot, LUKS_NUMKEYS - 1);
179                         return -EINVAL;
180                 case CRYPT_SLOT_INACTIVE:
181                         break;
182                 default:
183                         log_err(cd, _("Key slot %d is full, please select another one.\n"),
184                                 *keyslot);
185                         return -EINVAL;
186         }
187
188         return 0;
189 }
190
191 static int verify_other_keyslot(struct crypt_device *cd,
192                                 const char *key_file,
193                                 unsigned int flags,
194                                 int keyIndex)
195 {
196         struct luks_masterkey *mk;
197         crypt_keyslot_info ki;
198         int openedIndex;
199         char *password = NULL;
200         unsigned int passwordLen;
201
202         get_key(_("Enter any remaining LUKS passphrase: "), &password,
203                 &passwordLen, 0, key_file, cd->timeout, flags, cd);
204         if(!password)
205                 return -EINVAL;
206
207         ki = crypt_keyslot_status(cd, keyIndex);
208         if (ki == CRYPT_SLOT_ACTIVE) /* Not last slot */
209                 LUKS_keyslot_set(&cd->hdr, keyIndex, 0);
210
211         openedIndex = LUKS_open_key_with_hdr(cd->device, CRYPT_ANY_SLOT,
212                                              password, passwordLen,
213                                              &cd->hdr, &mk, cd);
214
215         if (ki == CRYPT_SLOT_ACTIVE)
216                 LUKS_keyslot_set(&cd->hdr, keyIndex, 1);
217         LUKS_dealloc_masterkey(mk);
218         safe_free(password);
219
220         if (openedIndex < 0)
221                 return -EPERM;
222
223         log_std(cd, _("Key slot %d verified.\n"), openedIndex);
224         return 0;
225 }
226
227 static int find_keyslot_by_passphrase(struct crypt_device *cd,
228                                       const char *key_file,
229                                       unsigned int flags,
230                                       char *message)
231 {
232         struct luks_masterkey *mk;
233         char *password = NULL;
234         unsigned int passwordLen;
235         int keyIndex;
236
237         get_key(message,&password,&passwordLen, 0, key_file,
238                 cd->timeout, flags, cd);
239         if(!password)
240                 return -EINVAL;
241
242         keyIndex = LUKS_open_key_with_hdr(cd->device, CRYPT_ANY_SLOT, password,
243                                           passwordLen, &cd->hdr, &mk, cd);
244         LUKS_dealloc_masterkey(mk);
245         safe_free(password);
246
247         return keyIndex;
248 }
249
250 static int device_check_and_adjust(struct crypt_device *cd,
251                                    const char *device,
252                                    uint64_t *size, uint64_t *offset,
253                                    int *read_only)
254 {
255         struct device_infos infos;
256
257         if (get_device_infos(device, &infos, cd) < 0) {
258                 log_err(cd, _("Cannot get info about device %s.\n"), device);
259                 return -ENOTBLK;
260         }
261
262         if (!*size) {
263                 *size = infos.size;
264                 if (!*size) {
265                         log_err(cd, _("Device %s has zero size.\n"), device);
266                         return -ENOTBLK;
267                 }
268                 if (*size < *offset) {
269                         log_err(cd, _("Device %s is too small.\n"), device);
270                         return -EINVAL;
271                 }
272                 *size -= *offset;
273         }
274
275         if (infos.readonly)
276                 *read_only = 1;
277
278         log_dbg("Calculated device size is %" PRIu64 " sectors (%s), offset %" PRIu64 ".",
279                 *size, *read_only ? "RO" : "RW", *offset);
280         return 0;
281 }
282
283 static int luks_remove_helper(struct crypt_device *cd,
284                               int key_slot,
285                               const char *other_key_file,
286                               const char *key_file,
287                               int verify)
288 {
289         crypt_keyslot_info ki;
290         int r = -EINVAL;
291
292         if (key_slot == CRYPT_ANY_SLOT) {
293                 key_slot = find_keyslot_by_passphrase(cd, key_file, 0,
294                                 _("Enter LUKS passphrase to be deleted: "));
295                 if(key_slot < 0) {
296                         r = -EPERM;
297                         goto out;
298                 }
299
300                 log_std(cd, _("key slot %d selected for deletion.\n"), key_slot);
301         }
302
303         ki = crypt_keyslot_status(cd, key_slot);
304         if (ki == CRYPT_SLOT_INVALID) {
305                 log_err(cd, _("Key slot %d is invalid, please select between 0 and %d.\n"),
306                         key_slot, LUKS_NUMKEYS - 1);
307                 r = -EINVAL;
308                 goto out;
309         }
310         if (ki <= CRYPT_SLOT_INACTIVE) {
311                 log_err(cd, _("Key %d not active. Can't wipe.\n"), key_slot);
312                 r = -EINVAL;
313                 goto out;
314         }
315
316         if (ki == CRYPT_SLOT_ACTIVE_LAST && cd->confirm &&
317             !(cd->confirm(_("This is the last keyslot."
318                             " Device will become unusable after purging this key."),
319                          cd->confirm_usrptr))) {
320                 r = -EINVAL;
321                 goto out;
322         }
323
324         if(verify)
325                 r = verify_other_keyslot(cd, other_key_file, 0, key_slot);
326         else
327                 r = 0;
328
329         if (!r)
330                 r = crypt_keyslot_destroy(cd, key_slot);
331 out:
332         return (r < 0) ? r : 0;
333 }
334
335 static int create_device_helper(struct crypt_device *cd,
336                                 const char *name,
337                                 const char *hash,
338                                 const char *cipher,
339                                 const char *cipher_mode,
340                                 const char *key_file,
341                                 const char *key,
342                                 unsigned int keyLen,
343                                 int key_size,
344                                 uint64_t size,
345                                 uint64_t skip,
346                                 uint64_t offset,
347                                 const char *uuid,
348                                 int read_only,
349                                 unsigned int flags,
350                                 int reload)
351 {
352         crypt_status_info ci;
353         char *dm_cipher = NULL;
354         char *processed_key = NULL;
355         int r;
356
357         ci = crypt_status(cd, name);
358         if (ci == CRYPT_INVALID)
359                 return -EINVAL;
360
361         if (reload && ci < CRYPT_ACTIVE)
362                 return -EINVAL;
363
364         if (!reload && ci >= CRYPT_ACTIVE) {
365                 log_err(cd, _("Device %s already exists.\n"), name);
366                 return -EEXIST;
367         }
368
369         if (key_size < 0 || key_size > 1024) {
370                 log_err(cd, _("Invalid key size %d.\n"), key_size);
371                 return -EINVAL;
372         }
373
374         r = device_check_and_adjust(cd, cd->device, &size, &offset, &read_only);
375         if (r)
376                 return r;
377
378         if (cipher_mode && asprintf(&dm_cipher, "%s-%s", cipher, cipher_mode) < 0)
379                 return -ENOMEM;
380
381         processed_key = process_key(cd, hash, key_file, key_size, key, keyLen);
382         if (!processed_key)
383                 return -ENOENT;
384
385         r = dm_create_device(name, cd->device, dm_cipher ?: cipher, cd->type, uuid, size, skip, offset,
386                              key_size, processed_key, read_only, reload);
387
388         free(dm_cipher);
389         safe_free(processed_key);
390         return r;
391 }
392
393 static int open_from_hdr_and_mk(struct crypt_device *cd,
394                                 struct luks_masterkey *mk,
395                                 const char *name,
396                                 uint32_t flags)
397 {
398         uint64_t size, offset;
399         char *cipher;
400         int read_only, no_uuid, r;
401
402         size = 0;
403         offset = crypt_get_data_offset(cd);
404         read_only = flags & CRYPT_ACTIVATE_READONLY;
405         no_uuid = flags & CRYPT_ACTIVATE_NO_UUID;
406
407         r = device_check_and_adjust(cd, cd->device, &size, &offset, &read_only);
408         if (r)
409                 return r;
410
411         if (asprintf(&cipher, "%s-%s", crypt_get_cipher(cd),
412                      crypt_get_cipher_mode(cd)) < 0)
413                 r = -ENOMEM;
414         else
415                 r = dm_create_device(name, cd->device, cipher, cd->type,
416                                      no_uuid ? NULL : crypt_get_uuid(cd),
417                                      size, 0, offset, mk->keyLength, mk->key,
418                                      read_only, 0);
419         free(cipher);
420         return r;
421 }
422
423 static void log_wrapper(int level, const char *msg, void *usrptr)
424 {
425         void (*xlog)(int level, char *msg) = usrptr;
426         xlog(level, (char *)msg);
427 }
428
429 static int yesDialog_wrapper(const char *msg, void *usrptr)
430 {
431         int (*xyesDialog)(char *msg) = usrptr;
432         return xyesDialog((char*)msg);
433 }
434
435 int crypt_confirm(struct crypt_device *cd, const char *msg)
436 {
437         if (!cd || !cd->confirm)
438                 return 1;
439         else
440                 return cd->confirm(msg, cd->confirm_usrptr);
441 }
442
443 static void key_from_terminal(struct crypt_device *cd, char *msg, char **key,
444                               unsigned int *key_len, int force_verify)
445 {
446         int r, flags = 0;
447
448         if (cd->password) {
449                 *key = safe_alloc(MAX_TTY_PASSWORD_LEN);
450                 if (*key)
451                         return;
452                 r = cd->password(msg, *key, (size_t)key_len, cd->password_usrptr);
453                 if (r < 0) {
454                         safe_free(*key);
455                         *key = NULL;
456                 } else
457                         *key_len = r;
458         } else {
459                 if (force_verify || cd->password_verify)
460                         flags |= CRYPT_FLAG_VERIFY_IF_POSSIBLE;
461                 get_key(msg, key, key_len, 0, NULL, cd->timeout, flags, cd);
462         }
463 }
464
465 static int volume_key_by_terminal_passphrase(struct crypt_device *cd, int keyslot,
466                                              struct luks_masterkey **mk)
467 {
468         char *prompt = NULL, *passphrase_read = NULL;
469         unsigned int passphrase_size_read;
470         int r = -EINVAL, tries = cd->tries;
471
472         if(asprintf(&prompt, _("Enter passphrase for %s: "), cd->device) < 0)
473                 return -ENOMEM;
474
475         *mk = NULL;
476         do {
477                 if (*mk)
478                         LUKS_dealloc_masterkey(*mk);
479                 *mk = NULL;
480
481                 key_from_terminal(cd, prompt, &passphrase_read,
482                                   &passphrase_size_read, 0);
483                 if(!passphrase_read) {
484                         r = -EINVAL;
485                         break;
486                 }
487
488                 r = LUKS_open_key_with_hdr(cd->device, keyslot, passphrase_read,
489                                            passphrase_size_read, &cd->hdr, mk, cd);
490                 safe_free(passphrase_read);
491                 passphrase_read = NULL;
492         } while (r == -EPERM && (--tries > 0));
493
494         if (r < 0 && *mk) {
495                 LUKS_dealloc_masterkey(*mk);
496                 *mk = NULL;
497         }
498         free(prompt);
499
500         return r;
501
502 }
503
504 static void key_from_file(struct crypt_device *cd, char *msg,
505                           char **key, unsigned int *key_len,
506                           const char *key_file, size_t key_size)
507 {
508         get_key(msg, key, key_len, key_size, key_file, cd->timeout, 0, cd);
509 }
510
511 static int _crypt_init(struct crypt_device **cd,
512                        const char *type,
513                        struct crypt_options *options,
514                        int load, int need_dm)
515 {
516         int init_by_name, r;
517
518         /* if it is plain device and mapping table is being reloaded
519         initialize it by name*/
520         init_by_name = (type && !strcmp(type, CRYPT_PLAIN) && load);
521
522         /* Some of old API calls do not require DM in kernel,
523            fake initialisation by initialise it with kernel_check disabled */
524         if (!need_dm)
525                 (void)dm_init(NULL, 0);
526         if (init_by_name)
527                 r = crypt_init_by_name(cd, options->name);
528         else
529                 r = crypt_init(cd, options->device);
530         if (!need_dm)
531                 dm_exit();
532
533         if (r)
534                 return -EINVAL;
535
536         crypt_set_log_callback(*cd, log_wrapper, options->icb->log);
537         crypt_set_confirm_callback(*cd, yesDialog_wrapper, options->icb->yesDialog);
538
539         crypt_set_timeout(*cd, options->timeout);
540         crypt_set_password_retry(*cd, options->tries);
541         crypt_set_iterarion_time(*cd, options->iteration_time ?: 1000);
542         crypt_set_password_verify(*cd, options->flags & CRYPT_FLAG_VERIFY);
543
544         if (load && !init_by_name)
545                 r = crypt_load(*cd, type, NULL);
546
547         if (!r && type && !(*cd)->type) {
548                 (*cd)->type = strdup(type);
549                 if (!(*cd)->type)
550                         r = -ENOMEM;
551         }
552
553         if (r)
554                 crypt_free(*cd);
555
556         return r;
557 }
558
559 void crypt_set_log_callback(struct crypt_device *cd,
560         void (*log)(int level, const char *msg, void *usrptr),
561         void *usrptr)
562 {
563         if (!cd)
564                 _default_log = log;
565         else {
566                 cd->log = log;
567                 cd->log_usrptr = usrptr;
568         }
569 }
570
571 void crypt_set_confirm_callback(struct crypt_device *cd,
572         int (*confirm)(const char *msg, void *usrptr),
573         void *usrptr)
574 {
575         cd->confirm = confirm;
576         cd->confirm_usrptr = usrptr;
577 }
578
579 void crypt_set_password_callback(struct crypt_device *cd,
580         int (*password)(const char *msg, char *buf, size_t length, void *usrptr),
581         void *usrptr)
582 {
583         cd->password = password;
584         cd->password_usrptr = usrptr;
585 }
586
587 /* OPTIONS: name, cipher, device, hash, key_file, key_size, key_slot,
588  *          offset, size, skip, timeout, tries, passphrase_fd (ignored),
589  *          flags, icb */
590 int crypt_create_device(struct crypt_options *options)
591 {
592         struct crypt_device *cd = NULL;
593         char *key = NULL;
594         unsigned int keyLen;
595         int r;
596
597         r = _crypt_init(&cd, CRYPT_PLAIN, options, 0, 1);
598         if (r)
599                 return r;
600
601         get_key(_("Enter passphrase: "), &key, &keyLen, options->key_size,
602                 options->key_file, cd->timeout, options->flags, cd);
603         if (!key)
604                 r = -ENOENT;
605         else
606                 r = create_device_helper(cd, options->name, options->hash,
607                         options->cipher, NULL, options->key_file, key, keyLen,
608                         options->key_size, options->size, options->skip,
609                         options->offset, NULL, options->flags & CRYPT_FLAG_READONLY,
610                         options->flags, 0);
611
612         safe_free(key);
613         crypt_free(cd);
614         return r;
615 }
616
617 /* OPTIONS: same as create above */
618 int crypt_update_device(struct crypt_options *options)
619 {
620         struct crypt_device *cd = NULL;
621         char *key = NULL;
622         unsigned int keyLen;
623         int r;
624
625         r = _crypt_init(&cd, CRYPT_PLAIN, options, 1, 1);
626         if (r)
627                 return r;
628
629         get_key(_("Enter passphrase: "), &key, &keyLen, options->key_size,
630                 options->key_file, cd->timeout, options->flags, cd);
631         if (!key)
632                 r = -ENOENT;
633         else
634                 r = create_device_helper(cd, options->name, options->hash,
635                         options->cipher, NULL, options->key_file, key, keyLen,
636                         options->key_size, options->size, options->skip,
637                         options->offset, NULL, options->flags & CRYPT_FLAG_READONLY,
638                         options->flags, 1);
639
640         safe_free(key);
641         crypt_free(cd);
642         return r;
643 }
644
645 /* OPTIONS: name, size, icb */
646 int crypt_resize_device(struct crypt_options *options)
647 {
648         struct crypt_device *cd = NULL;
649         char *device = NULL, *cipher = NULL, *uuid = NULL, *key = NULL;
650         char *type = NULL;
651         uint64_t size, skip, offset;
652         int key_size, read_only, r;
653
654         log_dbg("Resizing device %s to %" PRIu64 " sectors.", options->name, options->size);
655
656         if (dm_init(NULL, 1) < 0)
657                 return -ENOSYS;
658
659         r = dm_query_device(options->name, &device, &size, &skip, &offset,
660                             &cipher, &key_size, &key, &read_only, NULL, &uuid);
661         if (r < 0) {
662                 log_err(NULL, _("Device %s is not active.\n"), options->name);
663                 goto out;
664         }
665
666         /* Try to determine type of device from UUID */
667         type = CRYPT_PLAIN;
668         if (uuid) {
669                 if (!strncmp(uuid, CRYPT_PLAIN, strlen(CRYPT_PLAIN))) {
670                         type = CRYPT_PLAIN;
671                         free (uuid);
672                         uuid = NULL;
673                 } else if (!strncmp(uuid, CRYPT_LUKS1, strlen(CRYPT_LUKS1)))
674                         type = CRYPT_LUKS1;
675         }
676
677         if (!options->device)
678                 options->device = device;
679
680         r = _crypt_init(&cd, type, options, 1, 1);
681         if (r)
682                 goto out;
683
684         size = options->size;
685         r = device_check_and_adjust(cd, device, &size, &offset, &read_only);
686         if (r)
687                 goto out;
688
689         r = dm_create_device(options->name, device, cipher, type,
690                              crypt_get_uuid(cd), size, skip, offset,
691                              key_size, key, read_only, 1);
692 out:
693         safe_free(key);
694         free(cipher);
695         if (options->device == device)
696                 options->device = NULL;
697         free(device);
698         free(uuid);
699         crypt_free(cd);
700         dm_exit();
701         return r;
702 }
703
704 /* OPTIONS: name, icb */
705 int crypt_query_device(struct crypt_options *options)
706 {
707         int read_only, r;
708
709         log_dbg("Query device %s.", options->name);
710
711         if (dm_init(NULL, 1) < 0)
712                 return -ENOSYS;
713
714         r = dm_status_device(options->name);
715         if (r == -ENODEV) {
716                 dm_exit();
717                 return 0;
718         }
719
720         r = dm_query_device(options->name, (char **)&options->device, &options->size,
721                             &options->skip, &options->offset, (char **)&options->cipher,
722                             &options->key_size, NULL, &read_only, NULL, NULL);
723
724         dm_exit();
725         if (r < 0)
726                 return r;
727
728         if (read_only)
729                 options->flags |= CRYPT_FLAG_READONLY;
730
731         options->flags |= CRYPT_FLAG_FREE_DEVICE;
732         options->flags |= CRYPT_FLAG_FREE_CIPHER;
733
734         return 1;
735 }
736
737 /* OPTIONS: name, icb */
738 int crypt_remove_device(struct crypt_options *options)
739 {
740         struct crypt_device *cd = NULL;
741         int r;
742
743         r = crypt_init_by_name(&cd, options->name);
744         if (r)
745                 return r;
746
747         r = crypt_deactivate(cd, options->name);
748
749         crypt_free(cd);
750         return r;
751
752 }
753
754 /* OPTIONS: device, cipher, hash, align_payload, key_size (master key), key_slot
755  *          new_key_file, iteration_time, timeout, flags, icb */
756 int crypt_luksFormat(struct crypt_options *options)
757 {
758         char cipherName[LUKS_CIPHERNAME_L];
759         char cipherMode[LUKS_CIPHERMODE_L];
760         char *password=NULL;
761         unsigned int passwordLen;
762         struct crypt_device *cd;
763         struct crypt_params_luks1 cp = {
764                 .hash = options->hash,
765                 .data_alignment = options->align_payload
766         };
767         int r;
768
769         r = parse_into_name_and_mode(options->cipher, cipherName, cipherMode);
770         if(r < 0) {
771                 log_err(cd, _("No known cipher specification pattern detected.\n"));
772                 return r;
773         }
774
775         if ((r = _crypt_init(&cd, CRYPT_LUKS1, options, 0, 1)))
776                 return r;
777
778         if (options->key_slot >= LUKS_NUMKEYS && options->key_slot != CRYPT_ANY_SLOT) {
779                 log_err(cd, _("Key slot %d is invalid, please select between 0 and %d.\n"),
780                         options->key_slot, LUKS_NUMKEYS - 1);
781                 r = -EINVAL;
782                 goto out;
783         }
784
785         get_key(_("Enter LUKS passphrase: "), &password, &passwordLen, 0,
786                 options->new_key_file, options->timeout, options->flags, cd);
787
788         if(!password) {
789                 r = -EINVAL;
790                 goto out;
791         }
792
793         r = crypt_format(cd, CRYPT_LUKS1, cipherName, cipherMode,
794                          NULL, NULL, options->key_size, &cp);
795         if (r < 0)
796                 goto out;
797
798         /* Add keyslot using internally stored volume key generated during format */
799         r = crypt_keyslot_add_by_volume_key(cd, options->key_slot, NULL, 0,
800                                             password, passwordLen);
801 out:
802         crypt_free(cd);
803         safe_free(password);
804         return (r < 0) ? r : 0;
805 }
806
807 /* OPTIONS: name, device, key_size, key_file, timeout, tries, flags, icb */
808 int crypt_luksOpen(struct crypt_options *options)
809 {
810         struct crypt_device *cd = NULL;
811         uint32_t flags = 0;
812         int r;
813
814         if (!options->name)
815                 return -EINVAL;
816
817         r = _crypt_init(&cd, CRYPT_LUKS1, options, 1, 1);
818         if (r)
819                 return r;
820
821         if (options->flags & CRYPT_FLAG_READONLY)
822                 flags |= CRYPT_ACTIVATE_READONLY;
823
824         if (options->flags & CRYPT_FLAG_NON_EXCLUSIVE_ACCESS)
825                 flags |= CRYPT_ACTIVATE_NO_UUID;
826
827         if (options->key_file)
828                 r = crypt_activate_by_keyfile(cd, options->name,
829                         CRYPT_ANY_SLOT, options->key_file, options->key_size,
830                         flags);
831         else
832                 r = crypt_activate_by_passphrase(cd, options->name,
833                         CRYPT_ANY_SLOT, options->passphrase,
834                         options->passphrase ? strlen(options->passphrase) : 0,
835                         flags);
836
837         crypt_free(cd);
838         return (r < 0) ? r : 0;
839 }
840
841 /* OPTIONS: device, keys_slot, key_file, timeout, flags, icb */
842 int crypt_luksKillSlot(struct crypt_options *options)
843 {
844         struct crypt_device *cd = NULL;
845         int r;
846
847         r = _crypt_init(&cd, CRYPT_LUKS1, options, 1, 1);
848         if (r)
849                 return r;
850
851         r = luks_remove_helper(cd, options->key_slot, options->key_file, NULL,
852                                options->flags & CRYPT_FLAG_VERIFY_ON_DELKEY);
853
854         crypt_free(cd);
855         return (r < 0) ? r : 0;
856 }
857
858 /* OPTIONS: device, new_key_file, key_file, timeout, flags, icb */
859 int crypt_luksRemoveKey(struct crypt_options *options)
860 {
861         struct crypt_device *cd = NULL;
862         int r;
863
864         r = _crypt_init(&cd, CRYPT_LUKS1, options, 1, 1);
865         if (r)
866                 return r;
867
868         r = luks_remove_helper(cd, CRYPT_ANY_SLOT, options->key_file, options->new_key_file,
869                                options->flags & CRYPT_FLAG_VERIFY_ON_DELKEY);
870
871         crypt_free(cd);
872         return (r < 0) ? r : 0;
873 }
874
875
876 /* OPTIONS: device, new_key_file, key_file, key_slot, flags,
877             iteration_time, timeout, icb */
878 int crypt_luksAddKey(struct crypt_options *options)
879 {
880         struct crypt_device *cd = NULL;
881         int r = -EINVAL;
882
883         r = _crypt_init(&cd, CRYPT_LUKS1, options, 1, 1);
884         if (r)
885                 return r;
886
887         if (options->key_file || options->new_key_file)
888                 r = crypt_keyslot_add_by_keyfile(cd, options->key_slot,
889                                                  options->key_file, 0,
890                                                  options->new_key_file, 0);
891         else
892                 r = crypt_keyslot_add_by_passphrase(cd, options->key_slot,
893                                                     NULL, 0, NULL, 0);
894
895         crypt_free(cd);
896         return (r < 0) ? r : 0;
897 }
898
899 /* OPTIONS: device, icb */
900 int crypt_luksUUID(struct crypt_options *options)
901 {
902         struct crypt_device *cd = NULL;
903         char *uuid;
904         int r;
905
906         r = _crypt_init(&cd, CRYPT_LUKS1, options, 1, 0);
907         if (r)
908                 return r;
909
910         uuid = (char *)crypt_get_uuid(cd);
911         log_std(cd, uuid ?: "");
912         log_std(cd, "\n");
913         crypt_free(cd);
914         return 0;
915 }
916
917 /* OPTIONS: device, icb */
918 int crypt_isLuks(struct crypt_options *options)
919 {
920         struct crypt_device *cd = NULL;
921         int r;
922
923         log_dbg("Check device %s for LUKS header.", options->device);
924
925         r = crypt_init(&cd, options->device);
926         if (r < 0)
927                 return -EINVAL;
928
929         /* Do print fail here, no need to crypt_load() */
930         r = LUKS_read_phdr(cd->device, &cd->hdr, 0, cd) ? -EINVAL : 0;
931
932         crypt_free(cd);
933         return r;
934 }
935
936 /* OPTIONS: device, icb */
937 int crypt_luksDump(struct crypt_options *options)
938 {
939         struct crypt_device *cd = NULL;
940         int r;
941
942         r = _crypt_init(&cd, CRYPT_LUKS1, options, 1, 0);
943         if(r < 0)
944                 return r;
945
946         r = crypt_dump(cd);
947
948         crypt_free(cd);
949         return 0;
950 }
951
952 void crypt_get_error(char *buf, size_t size)
953 {
954         const char *error = get_error();
955
956         if (!buf || size < 1)
957                 set_error(NULL);
958         else if (error) {
959                 strncpy(buf, error, size - 1);
960                 buf[size - 1] = '\0';
961                 set_error(NULL);
962         } else
963                 buf[0] = '\0';
964 }
965
966 void crypt_put_options(struct crypt_options *options)
967 {
968         if (options->flags & CRYPT_FLAG_FREE_DEVICE) {
969                 free((char *)options->device);
970                 options->device = NULL;
971                 options->flags &= ~CRYPT_FLAG_FREE_DEVICE;
972         }
973         if (options->flags & CRYPT_FLAG_FREE_CIPHER) {
974                 free((char *)options->cipher);
975                 options->cipher = NULL;
976                 options->flags &= ~CRYPT_FLAG_FREE_CIPHER;
977         }
978 }
979
980 const char *crypt_get_dir(void)
981 {
982         return dm_get_dir();
983 }
984
985 /////////////////////////////////
986 //
987 // New API
988 //
989
990 int crypt_init(struct crypt_device **cd, const char *device)
991 {
992         struct crypt_device *h = NULL;
993
994         if (!cd)
995                 return -EINVAL;
996
997         log_dbg("Allocating crypt device %s context.", device);
998
999         if (device && !device_ready(NULL, device, O_RDONLY))
1000                 return -ENOTBLK;
1001
1002         if (!(h = malloc(sizeof(struct crypt_device))))
1003                 return -ENOMEM;
1004
1005         memset(h, 0, sizeof(*h));
1006
1007         if (device) {
1008                 h->device = strdup(device);
1009                 if (!h->device) {
1010                         free(h);
1011                         return -ENOMEM;
1012                 }
1013         } else
1014                 h->device = NULL;
1015
1016         if (dm_init(h, 1) < 0) {
1017                 free(h);
1018                 return -ENOSYS;
1019         }
1020
1021         h->iteration_time = 1000;
1022         h->password_verify = 0;
1023         h->tries = 3;
1024         *cd = h;
1025         return 0;
1026 }
1027
1028 int crypt_init_by_name(struct crypt_device **cd, const char *name)
1029 {
1030         crypt_status_info ci;
1031         char *device = NULL;
1032         int r;
1033
1034         log_dbg("Allocating crypt device context by device %s.", name);
1035
1036         ci = crypt_status(NULL, name);
1037         if (ci == CRYPT_INVALID)
1038                 return -ENODEV;
1039
1040         if (ci < CRYPT_ACTIVE) {
1041                 log_err(NULL, _("Device %s is not active.\n"), name);
1042                 return -ENODEV;
1043         }
1044
1045         r = dm_query_device(name, &device, NULL, NULL, NULL,
1046                             NULL, NULL, NULL, NULL, NULL, NULL);
1047         if (r >= 0)
1048                 r = crypt_init(cd, device);
1049
1050         free(device);
1051         return r;
1052 }
1053
1054 static int _crypt_format_plain(struct crypt_device *cd,
1055                                const char *cipher,
1056                                const char *cipher_mode,
1057                                const char *uuid,
1058                                struct crypt_params_plain *params)
1059 {
1060         if (!cipher || !cipher_mode) {
1061                 log_err(cd, _("Invalid plain crypt parameters.\n"));
1062                 return -EINVAL;
1063         }
1064
1065         if (cd->volume_key->keyLength > 1024) {
1066                 log_err(cd, _("Invalid key size.\n"));
1067                 return -EINVAL;
1068         }
1069
1070         cd->plain_cipher = strdup(cipher);
1071         cd->plain_cipher_mode = strdup(cipher_mode);
1072
1073         if (uuid)
1074                 cd->plain_uuid = strdup(uuid);
1075
1076         if (params && params->hash)
1077                 cd->plain_hdr.hash = strdup(params->hash);
1078
1079         cd->plain_hdr.offset = params ? params->offset : 0;
1080         cd->plain_hdr.skip = params ? params->skip : 0;
1081
1082         if (!cd->plain_cipher || !cd->plain_cipher_mode)
1083                 return -ENOMEM;
1084
1085         return 0;
1086 }
1087
1088 static int _crypt_format_luks1(struct crypt_device *cd,
1089                                const char *cipher,
1090                                const char *cipher_mode,
1091                                const char *uuid,
1092                                struct crypt_params_luks1 *params)
1093 {
1094         int r;
1095         unsigned long required_alignment = DEFAULT_ALIGNMENT;
1096         unsigned long alignment_offset = 0;
1097
1098         if (!cd->device) {
1099                 log_err(cd, _("Can't format LUKS without device.\n"));
1100                 return -EINVAL;
1101         }
1102
1103         if (params && params->data_alignment)
1104                 required_alignment = params->data_alignment * SECTOR_SIZE;
1105         else
1106                 get_topology_alignment(cd->device, &required_alignment,
1107                                        &alignment_offset, DEFAULT_ALIGNMENT);
1108
1109         r = LUKS_generate_phdr(&cd->hdr, cd->volume_key, cipher, cipher_mode,
1110                                (params && params->hash) ? params->hash : "sha1",
1111                                uuid, LUKS_STRIPES,
1112                                required_alignment / SECTOR_SIZE,
1113                                alignment_offset / SECTOR_SIZE,
1114                                cd->iteration_time, &cd->PBKDF2_per_sec, cd);
1115         if(r < 0)
1116                 return r;
1117
1118         /* Wipe first 8 sectors - fs magic numbers etc. */
1119         r = wipe_device_header(cd->device, 8);
1120         if(r < 0) {
1121                 log_err(cd, _("Can't wipe header on device %s.\n"), cd->device);
1122                 return r;
1123         }
1124
1125         r = LUKS_write_phdr(cd->device, &cd->hdr, cd);
1126
1127         return r;
1128 }
1129
1130 int crypt_format(struct crypt_device *cd,
1131         const char *type,
1132         const char *cipher,
1133         const char *cipher_mode,
1134         const char *uuid,
1135         const char *volume_key,
1136         size_t volume_key_size,
1137         void *params)
1138 {
1139         int r;
1140
1141         log_dbg("Formatting device %s as type %s.", cd->device ?: "(none)", cd->type ?: "(none)");
1142
1143         if (!type)
1144                 return -EINVAL;
1145
1146         /* Some hash functions need initialized gcrypt library */
1147         if (init_crypto()) {
1148                 log_err(cd, _("Cannot initialize crypto backend.\n"));
1149                 return -ENOSYS;
1150         }
1151
1152         if (volume_key)
1153                 cd->volume_key = LUKS_alloc_masterkey(volume_key_size, 
1154                                                       volume_key);
1155         else
1156                 cd->volume_key = LUKS_generate_masterkey(volume_key_size);
1157
1158         if(!cd->volume_key)
1159                 return -ENOMEM;
1160
1161         if (isPLAIN(type))
1162                 r = _crypt_format_plain(cd, cipher, cipher_mode,
1163                                         uuid, params);
1164         else if (isLUKS(type))
1165                 r = _crypt_format_luks1(cd, cipher, cipher_mode,
1166                                         uuid, params);
1167         else {
1168                 /* FIXME: allow plugins here? */
1169                 log_err(cd, _("Unknown crypt device type %s requested.\n"), type);
1170                 r = -EINVAL;
1171         }
1172
1173         if (!r && !(cd->type = strdup(type)))
1174                 r = -ENOMEM;
1175
1176         if (r < 0) {
1177                 LUKS_dealloc_masterkey(cd->volume_key);
1178                 cd->volume_key = NULL;
1179         }
1180
1181         return r;
1182 }
1183
1184 int crypt_load(struct crypt_device *cd,
1185                const char *requested_type,
1186                void *params)
1187 {
1188         struct luks_phdr hdr;
1189         int r;
1190
1191         log_dbg("Trying to load %s crypt type from device %s.",
1192                 requested_type ?: "any", cd->device ?: "(none)");
1193
1194         if (!cd->device)
1195                 return -EINVAL;
1196
1197         if (requested_type && !isLUKS(requested_type))
1198                 return -EINVAL;
1199
1200         /* Some hash functions need initialized gcrypt library */
1201         if (init_crypto()) {
1202                 log_err(cd, _("Cannot initialize crypto backend.\n"));
1203                 return -ENOSYS;
1204         }
1205
1206         r = LUKS_read_phdr(cd->device, &hdr, 1, cd);
1207
1208         if (!r) {
1209                 memcpy(&cd->hdr, &hdr, sizeof(hdr));
1210                 cd->type = strdup(requested_type);
1211                 if (!cd->type)
1212                         r = -ENOMEM;
1213         }
1214
1215         return r;
1216 }
1217
1218 int crypt_header_backup(struct crypt_device *cd,
1219                         const char *requested_type,
1220                         const char *backup_file)
1221 {
1222         if ((requested_type && !isLUKS(requested_type)) || !backup_file)
1223                 return -EINVAL;
1224
1225         /* Some hash functions need initialized gcrypt library */
1226         if (init_crypto()) {
1227                 log_err(cd, _("Cannot initialize crypto backend.\n"));
1228                 return -ENOSYS;
1229         }
1230
1231         log_dbg("Requested header backup of device %s (%s) to "
1232                 "file %s.", cd->device, requested_type, backup_file);
1233
1234         return LUKS_hdr_backup(backup_file, cd->device, &cd->hdr, cd);
1235 }
1236
1237 int crypt_header_restore(struct crypt_device *cd,
1238                          const char *requested_type,
1239                          const char *backup_file)
1240 {
1241         if (requested_type && !isLUKS(requested_type))
1242                 return -EINVAL;
1243
1244         /* Some hash functions need initialized gcrypt library */
1245         if (init_crypto()) {
1246                 log_err(cd, _("Cannot initialize crypto backend.\n"));
1247                 return -ENOSYS;
1248         }
1249
1250         log_dbg("Requested header restore to device %s (%s) from "
1251                 "file %s.", cd->device, requested_type, backup_file);
1252
1253         return LUKS_hdr_restore(backup_file, cd->device, &cd->hdr, cd);
1254 }
1255
1256 void crypt_free(struct crypt_device *cd)
1257 {
1258         if (cd) {
1259                 log_dbg("Releasing crypt device %s context.", cd->device);
1260
1261                 dm_exit();
1262                 if (cd->volume_key)
1263                         LUKS_dealloc_masterkey(cd->volume_key);
1264
1265                 free(cd->device);
1266                 free(cd->type);
1267
1268                 /* used in plain device only */
1269                 free((char*)cd->plain_hdr.hash);
1270                 free(cd->plain_cipher);
1271                 free(cd->plain_cipher_mode);
1272                 free(cd->plain_uuid);
1273
1274                 free(cd);
1275         }
1276 }
1277
1278 int crypt_suspend(struct crypt_device *cd,
1279                   const char *name)
1280 {
1281         crypt_status_info ci;
1282         int r, suspended = 0;
1283
1284         log_dbg("Suspending volume %s.", name);
1285
1286         ci = crypt_status(NULL, name);
1287         if (ci < CRYPT_ACTIVE) {
1288                 log_err(cd, _("Volume %s is not active.\n"), name);
1289                 return -EINVAL;
1290         }
1291
1292         if (!cd && dm_init(NULL, 1) < 0)
1293                 return -ENOSYS;
1294
1295         r = dm_query_device(name, NULL, NULL, NULL, NULL,
1296                             NULL, NULL, NULL, NULL, &suspended, NULL);
1297         if (r < 0)
1298                 goto out;
1299
1300         if (suspended) {
1301                 log_err(cd, _("Volume %s is already suspended.\n"), name);
1302                 r = -EINVAL;
1303                 goto out;
1304         }
1305
1306         r = dm_suspend_and_wipe_key(name);
1307         if (r == -ENOTSUP)
1308                 log_err(cd, "Suspend is not supported for device %s.\n", name);
1309         else if (r)
1310                 log_err(cd, "Error during suspending device %s.\n", name);
1311 out:
1312         if (!cd)
1313                 dm_exit();
1314         return r;
1315 }
1316
1317 int crypt_resume_by_passphrase(struct crypt_device *cd,
1318                                const char *name,
1319                                int keyslot,
1320                                const char *passphrase,
1321                                size_t passphrase_size)
1322 {
1323         struct luks_masterkey *mk = NULL;
1324         int r, suspended = 0;
1325
1326         log_dbg("Resuming volume %s.", name);
1327
1328         if (!isLUKS(cd->type)) {
1329                 log_err(cd, _("This operation is supported only for LUKS device.\n"));
1330                 r = -EINVAL;
1331                 goto out;
1332         }
1333
1334         r = dm_query_device(name, NULL, NULL, NULL, NULL,
1335                             NULL, NULL, NULL, NULL, &suspended, NULL);
1336         if (r < 0)
1337                 return r;
1338
1339         if (!suspended) {
1340                 log_err(cd, _("Volume %s is not suspended.\n"), name);
1341                 return -EINVAL;
1342         }
1343
1344         if (passphrase) {
1345                 r = LUKS_open_key_with_hdr(cd->device, keyslot, passphrase,
1346                                            passphrase_size, &cd->hdr, &mk, cd);
1347         } else
1348                 r = volume_key_by_terminal_passphrase(cd, keyslot, &mk);
1349
1350         if (r >= 0) {
1351                 keyslot = r;
1352                 r = dm_resume_and_reinstate_key(name, mk->keyLength, mk->key);
1353                 if (r == -ENOTSUP)
1354                         log_err(cd, "Resume is not supported for device %s.\n", name);
1355                 else if (r)
1356                         log_err(cd, "Error during resuming device %s.\n", name);
1357         } else
1358                 r = keyslot;
1359 out:
1360         LUKS_dealloc_masterkey(mk);
1361         return r < 0 ? r : keyslot;
1362 }
1363
1364 int crypt_resume_by_keyfile(struct crypt_device *cd,
1365                             const char *name,
1366                             int keyslot,
1367                             const char *keyfile,
1368                             size_t keyfile_size)
1369 {
1370         struct luks_masterkey *mk = NULL;
1371         char *passphrase_read = NULL;
1372         unsigned int passphrase_size_read;
1373         int r, suspended = 0;
1374
1375         log_dbg("Resuming volume %s.", name);
1376
1377         if (!isLUKS(cd->type)) {
1378                 log_err(cd, _("This operation is supported only for LUKS device.\n"));
1379                 r = -EINVAL;
1380                 goto out;
1381         }
1382
1383         r = dm_query_device(name, NULL, NULL, NULL, NULL,
1384                             NULL, NULL, NULL, NULL, &suspended, NULL);
1385         if (r < 0)
1386                 return r;
1387
1388         if (!suspended) {
1389                 log_err(cd, _("Volume %s is not suspended.\n"), name);
1390                 return -EINVAL;
1391         }
1392
1393         if (!keyfile)
1394                 return -EINVAL;
1395
1396         key_from_file(cd, _("Enter passphrase: "), &passphrase_read,
1397                       &passphrase_size_read, keyfile, keyfile_size);
1398
1399         if(!passphrase_read)
1400                 r = -EINVAL;
1401         else {
1402                 r = LUKS_open_key_with_hdr(cd->device, keyslot, passphrase_read,
1403                                            passphrase_size_read, &cd->hdr, &mk, cd);
1404                 safe_free(passphrase_read);
1405         }
1406
1407         if (r >= 0) {
1408                 keyslot = r;
1409                 r = dm_resume_and_reinstate_key(name, mk->keyLength, mk->key);
1410                 if (r)
1411                         log_err(cd, "Error during resuming device %s.\n", name);
1412         } else
1413                 r = keyslot;
1414 out:
1415         LUKS_dealloc_masterkey(mk);
1416         return r < 0 ? r : keyslot;
1417 }
1418
1419 // slot manipulation
1420 int crypt_keyslot_add_by_passphrase(struct crypt_device *cd,
1421         int keyslot, // -1 any
1422         const char *passphrase, // NULL -> terminal
1423         size_t passphrase_size,
1424         const char *new_passphrase, // NULL -> terminal
1425         size_t new_passphrase_size)
1426 {
1427         struct luks_masterkey *mk = NULL;
1428         char *password = NULL, *new_password = NULL;
1429         unsigned int passwordLen, new_passwordLen;
1430         int r;
1431
1432         log_dbg("Adding new keyslot, existing passphrase %sprovided,"
1433                 "new passphrase %sprovided.",
1434                 passphrase ? "" : "not ", new_passphrase  ? "" : "not ");
1435
1436         if (!isLUKS(cd->type)) {
1437                 log_err(cd, _("This operation is supported only for LUKS device.\n"));
1438                 return -EINVAL;
1439         }
1440
1441         r = keyslot_verify_or_find_empty(cd, &keyslot);
1442         if (r)
1443                 return r;
1444
1445         if (!LUKS_keyslot_active_count(&cd->hdr)) {
1446                 /* No slots used, try to use pre-generated key in header */
1447                 if (cd->volume_key) {
1448                         mk = LUKS_alloc_masterkey(cd->volume_key->keyLength, cd->volume_key->key);
1449                         r = mk ? 0 : -ENOMEM;
1450                 } else {
1451                         log_err(cd, _("Cannot add key slot, all slots disabled and no volume key provided.\n"));
1452                         return -EINVAL;
1453                 }
1454         } else if (passphrase) {
1455                 /* Passphrase provided, use it to unlock existing keyslot */
1456                 r = LUKS_open_key_with_hdr(cd->device, CRYPT_ANY_SLOT, passphrase,
1457                                            passphrase_size, &cd->hdr, &mk, cd);
1458         } else {
1459                 /* Passphrase not provided, ask first and use it to unlock existing keyslot */
1460                 key_from_terminal(cd, _("Enter any passphrase: "),
1461                                   &password, &passwordLen, 0);
1462                 if (!password) {
1463                         r = -EINVAL;
1464                         goto out;
1465                 }
1466
1467                 r = LUKS_open_key_with_hdr(cd->device, CRYPT_ANY_SLOT, password,
1468                                            passwordLen, &cd->hdr, &mk, cd);
1469                 safe_free(password);
1470         }
1471
1472         if(r < 0)
1473                 goto out;
1474
1475         if (new_passphrase) {
1476                 new_password = (char *)new_passphrase;
1477                 new_passwordLen = new_passphrase_size;
1478         } else {
1479                 key_from_terminal(cd, _("Enter new passphrase for key slot: "),
1480                                   &new_password, &new_passwordLen, 1);
1481                 if(!new_password) {
1482                         r = -EINVAL;
1483                         goto out;
1484                 }
1485         }
1486
1487         r = LUKS_set_key(cd->device, keyslot, new_password, new_passwordLen,
1488                          &cd->hdr, mk, cd->iteration_time, &cd->PBKDF2_per_sec, cd);
1489         if(r < 0) goto out;
1490
1491         r = 0;
1492 out:
1493         if (!new_passphrase)
1494                 safe_free(new_password);
1495         LUKS_dealloc_masterkey(mk);
1496         return r ?: keyslot;
1497 }
1498
1499 int crypt_keyslot_add_by_keyfile(struct crypt_device *cd,
1500         int keyslot,
1501         const char *keyfile,
1502         size_t keyfile_size,
1503         const char *new_keyfile,
1504         size_t new_keyfile_size)
1505 {
1506         struct luks_masterkey *mk=NULL;
1507         char *password=NULL; unsigned int passwordLen;
1508         char *new_password = NULL; unsigned int new_passwordLen;
1509         int r;
1510
1511         log_dbg("Adding new keyslot, existing keyfile %s, new keyfile %s.",
1512                 keyfile ?: "[none]", new_keyfile ?: "[none]");
1513
1514         if (!isLUKS(cd->type)) {
1515                 log_err(cd, _("This operation is supported only for LUKS device.\n"));
1516                 return -EINVAL;
1517         }
1518
1519         r = keyslot_verify_or_find_empty(cd, &keyslot);
1520         if (r)
1521                 return r;
1522
1523         if (!LUKS_keyslot_active_count(&cd->hdr)) {
1524                 /* No slots used, try to use pre-generated key in header */
1525                 if (cd->volume_key) {
1526                         mk = LUKS_alloc_masterkey(cd->volume_key->keyLength, cd->volume_key->key);
1527                         r = mk ? 0 : -ENOMEM;
1528                 } else {
1529                         log_err(cd, _("Cannot add key slot, all slots disabled and no volume key provided.\n"));
1530                         return -EINVAL;
1531                 }
1532         } else {
1533                 /* Read password from file of (if NULL) from terminal */
1534                 if (keyfile)
1535                         key_from_file(cd, _("Enter any passphrase: "), &password, &passwordLen,
1536                                       keyfile, keyfile_size);
1537                 else
1538                         key_from_terminal(cd, _("Enter any passphrase: "),
1539                                         &password, &passwordLen, 0);
1540
1541                 if (!password)
1542                         return -EINVAL;
1543
1544                 r = LUKS_open_key_with_hdr(cd->device, CRYPT_ANY_SLOT, password, passwordLen,
1545                                            &cd->hdr, &mk, cd);
1546                 safe_free(password);
1547         }
1548
1549         if(r < 0)
1550                 goto out;
1551
1552         if (new_keyfile)
1553                 key_from_file(cd, _("Enter new passphrase for key slot: "),
1554                               &new_password, &new_passwordLen, new_keyfile,
1555                               new_keyfile_size);
1556         else
1557                 key_from_terminal(cd, _("Enter new passphrase for key slot: "),
1558                                   &new_password, &new_passwordLen, 1);
1559
1560         if(!new_password) {
1561                 r = -EINVAL;
1562                 goto out;
1563         }
1564
1565         r = LUKS_set_key(cd->device, keyslot, new_password, new_passwordLen,
1566                          &cd->hdr, mk, cd->iteration_time, &cd->PBKDF2_per_sec, cd);
1567 out:
1568         safe_free(new_password);
1569         LUKS_dealloc_masterkey(mk);
1570         return r < 0 ? r : keyslot;
1571 }
1572
1573 int crypt_keyslot_add_by_volume_key(struct crypt_device *cd,
1574         int keyslot,
1575         const char *volume_key,
1576         size_t volume_key_size,
1577         const char *passphrase,
1578         size_t passphrase_size)
1579 {
1580         struct luks_masterkey *mk = NULL;
1581         int r = -EINVAL;
1582         char *new_password = NULL; unsigned int new_passwordLen;
1583
1584         log_dbg("Adding new keyslot %d using volume key.", keyslot);
1585
1586         if (!isLUKS(cd->type)) {
1587                 log_err(cd, _("This operation is supported only for LUKS device.\n"));
1588                 return -EINVAL;
1589         }
1590
1591         if (volume_key)
1592                 mk = LUKS_alloc_masterkey(volume_key_size, volume_key);
1593         else if (cd->volume_key)
1594                 mk = LUKS_alloc_masterkey(cd->volume_key->keyLength, cd->volume_key->key);
1595
1596         if (!mk)
1597                 return -ENOMEM;
1598
1599         r = LUKS_verify_master_key(&cd->hdr, mk);
1600         if (r < 0) {
1601                 log_err(cd, _("Volume key does not match the volume.\n"));
1602                 goto out;
1603         }
1604
1605         r = keyslot_verify_or_find_empty(cd, &keyslot);
1606         if (r)
1607                 goto out;
1608
1609         if (!passphrase) {
1610                 key_from_terminal(cd, _("Enter new passphrase for key slot: "),
1611                                   &new_password, &new_passwordLen, 1);
1612                 passphrase = new_password;
1613                 passphrase_size = new_passwordLen;
1614         }
1615
1616         r = LUKS_set_key(cd->device, keyslot, passphrase, passphrase_size,
1617                          &cd->hdr, mk, cd->iteration_time, &cd->PBKDF2_per_sec, cd);
1618 out:
1619         if (new_password)
1620                 safe_free(new_password);
1621         LUKS_dealloc_masterkey(mk);
1622         return r ?: keyslot;
1623 }
1624
1625 int crypt_keyslot_destroy(struct crypt_device *cd, int keyslot)
1626 {
1627         crypt_keyslot_info ki;
1628
1629         log_dbg("Destroying keyslot %d.", keyslot);
1630
1631         if (!isLUKS(cd->type)) {
1632                 log_err(cd, _("This operation is supported only for LUKS device.\n"));
1633                 return -EINVAL;
1634         }
1635
1636         ki = crypt_keyslot_status(cd, keyslot);
1637         if (ki == CRYPT_SLOT_INVALID) {
1638                 log_err(cd, _("Key slot %d is invalid.\n"), keyslot);
1639                 return -EINVAL;
1640         }
1641
1642         if (ki == CRYPT_SLOT_INACTIVE) {
1643                 log_err(cd, _("Key slot %d is not used.\n"), keyslot);
1644                 return -EINVAL;
1645         }
1646
1647         return LUKS_del_key(cd->device, keyslot, &cd->hdr, cd);
1648 }
1649
1650 // activation/deactivation of device mapping
1651 int crypt_activate_by_passphrase(struct crypt_device *cd,
1652         const char *name,
1653         int keyslot,
1654         const char *passphrase,
1655         size_t passphrase_size,
1656         uint32_t flags)
1657 {
1658         crypt_status_info ci;
1659         struct luks_masterkey *mk = NULL;
1660         char *prompt = NULL;
1661         int r;
1662
1663         log_dbg("%s volume %s [keyslot %d] using %spassphrase.",
1664                 name ? "Activating" : "Checking", name ?: "",
1665                 keyslot, passphrase ? "" : "[none] ");
1666
1667         if (!name)
1668                 return -EINVAL;
1669
1670         /* plain, use hashed passphrase */
1671         if (isPLAIN(cd->type))
1672                 return create_device_helper(cd, name, cd->plain_hdr.hash,
1673                         cd->plain_cipher, cd->plain_cipher_mode, NULL, passphrase, passphrase_size,
1674                         cd->volume_key->keyLength, 0, cd->plain_hdr.skip,
1675                         cd->plain_hdr.offset, cd->plain_uuid, flags & CRYPT_ACTIVATE_READONLY, 0, 0);
1676
1677         if (name) {
1678                 ci = crypt_status(NULL, name);
1679                 if (ci == CRYPT_INVALID)
1680                         return -EINVAL;
1681                 else if (ci >= CRYPT_ACTIVE) {
1682                         log_err(cd, _("Device %s already exists.\n"), name);
1683                         return -EEXIST;
1684                 }
1685         }
1686
1687         if(asprintf(&prompt, _("Enter passphrase for %s: "), cd->device) < 0)
1688                 return -ENOMEM;
1689
1690         /* provided passphrase, do not retry */
1691         if (passphrase) {
1692                 r = LUKS_open_key_with_hdr(cd->device, keyslot, passphrase,
1693                                            passphrase_size, &cd->hdr, &mk, cd);
1694         } else
1695                 r = volume_key_by_terminal_passphrase(cd, keyslot, &mk);
1696
1697         if (r >= 0) {
1698                 keyslot = r;
1699                 if (name)
1700                         r = open_from_hdr_and_mk(cd, mk, name, flags);
1701         }
1702
1703         LUKS_dealloc_masterkey(mk);
1704         free(prompt);
1705
1706         return r < 0  ? r : keyslot;
1707 }
1708
1709 int crypt_activate_by_keyfile(struct crypt_device *cd,
1710         const char *name,
1711         int keyslot,
1712         const char *keyfile,
1713         size_t keyfile_size,
1714         uint32_t flags)
1715 {
1716         crypt_status_info ci;
1717         struct luks_masterkey *mk = NULL;
1718         char *passphrase_read = NULL;
1719         unsigned int passphrase_size_read;
1720         int r;
1721
1722         log_dbg("Activating volume %s [keyslot %d] using keyfile %s.",
1723                 name, keyslot, keyfile ?: "[none]");
1724
1725         if (!isLUKS(cd->type)) {
1726                 log_err(cd, _("This operation is supported only for LUKS device.\n"));
1727                 return -EINVAL;
1728         }
1729
1730         if (name) {
1731                 ci = crypt_status(NULL, name);
1732                 if (ci == CRYPT_INVALID)
1733                         return -EINVAL;
1734                 else if (ci >= CRYPT_ACTIVE) {
1735                         log_err(cd, _("Device %s already exists.\n"), name);
1736                         return -EEXIST;
1737                 }
1738         }
1739
1740         if (!keyfile)
1741                 return -EINVAL;
1742
1743         key_from_file(cd, _("Enter passphrase: "), &passphrase_read,
1744                       &passphrase_size_read, keyfile, keyfile_size);
1745         if(!passphrase_read)
1746                 r = -EINVAL;
1747         else {
1748                 r = LUKS_open_key_with_hdr(cd->device, keyslot, passphrase_read,
1749                                            passphrase_size_read, &cd->hdr, &mk, cd);
1750                 safe_free(passphrase_read);
1751         }
1752
1753         if (r >= 0) {
1754                 keyslot = r;
1755                 r = open_from_hdr_and_mk(cd, mk, name, flags);
1756         }
1757
1758         LUKS_dealloc_masterkey(mk);
1759
1760         return r < 0 ? r : keyslot;
1761 }
1762
1763 int crypt_activate_by_volume_key(struct crypt_device *cd,
1764         const char *name,
1765         const char *volume_key,
1766         size_t volume_key_size,
1767         uint32_t flags)
1768 {
1769         crypt_status_info ci;
1770         struct luks_masterkey *mk;
1771         int r;
1772
1773         log_dbg("Activating volume %s by volume key.", name);
1774
1775         /* use key directly, no hash */
1776         if (isPLAIN(cd->type))
1777                 return create_device_helper(cd, name, NULL,
1778                         cd->plain_cipher, cd->plain_cipher_mode, NULL, volume_key, volume_key_size,
1779                         cd->volume_key->keyLength, 0, cd->plain_hdr.skip,
1780                         cd->plain_hdr.offset, cd->plain_uuid, flags & CRYPT_ACTIVATE_READONLY, 0, 0);
1781
1782         if (!isLUKS(cd->type)) {
1783                 log_err(cd, _("This operation is supported only for LUKS device.\n"));
1784                 return -EINVAL;
1785         }
1786
1787         if (name) {
1788                 ci = crypt_status(NULL, name);
1789                 if (ci == CRYPT_INVALID)
1790                         return -EINVAL;
1791                 else if (ci >= CRYPT_ACTIVE) {
1792                         log_err(cd, _("Device %s already exists.\n"), name);
1793                         return -EEXIST;
1794                 }
1795         }
1796
1797         mk = LUKS_alloc_masterkey(volume_key_size, volume_key);
1798         if (!mk)
1799                 return -ENOMEM;
1800         r = LUKS_verify_master_key(&cd->hdr, mk);
1801
1802         if (r == -EPERM)
1803                 log_err(cd, _("Volume key does not match the volume.\n"));
1804
1805         if (!r && name)
1806                 r = open_from_hdr_and_mk(cd, mk, name, flags);
1807
1808         LUKS_dealloc_masterkey(mk);
1809
1810         return r;
1811 }
1812
1813 int crypt_deactivate(struct crypt_device *cd, const char *name)
1814 {
1815         int r;
1816
1817         if (!name)
1818                 return -EINVAL;
1819
1820         log_dbg("Deactivating volume %s.", name);
1821
1822         if (!cd && dm_init(NULL, 1) < 0)
1823                 return -ENOSYS;
1824
1825         switch (crypt_status(cd, name)) {
1826                 case CRYPT_ACTIVE:
1827                         r = dm_remove_device(name, 0, 0);
1828                         break;
1829                 case CRYPT_BUSY:
1830                         log_err(cd, _("Device %s is busy.\n"), name);
1831                         r = -EBUSY;
1832                         break;
1833                 case CRYPT_INACTIVE:
1834                         log_err(cd, _("Device %s is not active.\n"), name);
1835                         r = -ENODEV;
1836                         break;
1837                 default:
1838                         log_err(cd, _("Invalid device %s.\n"), name);
1839                         r = -EINVAL;
1840         }
1841
1842         if (!cd)
1843                 dm_exit();
1844
1845         return r;
1846 }
1847
1848 // misc helper functions
1849 int crypt_volume_key_get(struct crypt_device *cd,
1850         int keyslot,
1851         char *volume_key,
1852         size_t *volume_key_size,
1853         const char *passphrase,
1854         size_t passphrase_size)
1855 {
1856         struct luks_masterkey *mk;
1857         char *processed_key = NULL;
1858         int r, key_len;
1859
1860         key_len = crypt_get_volume_key_size(cd);
1861         if (key_len > *volume_key_size) {
1862                 log_err(cd, _("Volume key buffer too small.\n"));
1863                 return -ENOMEM;
1864         }
1865
1866         if (isPLAIN(cd->type) && cd->plain_hdr.hash) {
1867                 processed_key = process_key(cd, cd->plain_hdr.hash, NULL, key_len,
1868                                             passphrase, passphrase_size);
1869                 if (!processed_key) {
1870                         log_err(cd, _("Cannot retrieve volume key for plain device.\n"));
1871                         return -EINVAL;
1872                 }
1873                 memcpy(volume_key, processed_key, key_len);
1874                 *volume_key_size = key_len;
1875                 safe_free(processed_key);
1876                 return 0;
1877         }
1878
1879         if (isLUKS(cd->type)) {
1880                 r = LUKS_open_key_with_hdr(cd->device, keyslot, passphrase,
1881                                         passphrase_size, &cd->hdr, &mk, cd);
1882
1883                 if (r >= 0) {
1884                         memcpy(volume_key, mk->key, mk->keyLength);
1885                         *volume_key_size = mk->keyLength;
1886                 }
1887
1888                 LUKS_dealloc_masterkey(mk);
1889                 return r;
1890         }
1891
1892         log_err(cd, _("This operation is not supported for %s crypt device.\n"), cd->type ?: "(none)");
1893         return -EINVAL;
1894 }
1895
1896 int crypt_volume_key_verify(struct crypt_device *cd,
1897         const char *volume_key,
1898         size_t volume_key_size)
1899 {
1900         struct luks_masterkey *mk;
1901         int r;
1902
1903         if (!isLUKS(cd->type)) {
1904                 log_err(cd, _("This operation is supported only for LUKS device.\n"));
1905                 return -EINVAL;
1906         }
1907
1908         mk = LUKS_alloc_masterkey(volume_key_size, volume_key);
1909         if (!mk)
1910                 return -ENOMEM;
1911
1912         r = LUKS_verify_master_key(&cd->hdr, mk);
1913
1914         if (r == -EPERM)
1915                 log_err(cd, _("Volume key does not match the volume.\n"));
1916
1917         LUKS_dealloc_masterkey(mk);
1918
1919         return r;
1920 }
1921
1922 void crypt_set_timeout(struct crypt_device *cd, uint64_t timeout_sec)
1923 {
1924         log_dbg("Timeout set to %" PRIu64 " miliseconds.", timeout_sec);
1925         cd->timeout = timeout_sec;
1926 }
1927
1928 void crypt_set_password_retry(struct crypt_device *cd, int tries)
1929 {
1930         log_dbg("Password retry count set to %d.", tries);
1931         cd->tries = tries;
1932 }
1933
1934 void crypt_set_iterarion_time(struct crypt_device *cd, uint64_t iteration_time_ms)
1935 {
1936         log_dbg("Iteration time set to %" PRIu64 " miliseconds.", iteration_time_ms);
1937         cd->iteration_time = iteration_time_ms;
1938 }
1939
1940 void crypt_set_password_verify(struct crypt_device *cd, int password_verify)
1941 {
1942         log_dbg("Password verification %s.", password_verify ? "enabled" : "disabled");
1943         cd->password_verify = password_verify ? 1 : 0;
1944 }
1945
1946 int crypt_memory_lock(struct crypt_device *cd, int lock)
1947 {
1948         return lock ? crypt_memlock_inc(cd) : crypt_memlock_dec(cd);
1949 }
1950
1951 // reporting
1952 crypt_status_info crypt_status(struct crypt_device *cd, const char *name)
1953 {
1954         int r;
1955
1956         if (!cd && dm_init(NULL, 1) < 0)
1957                 return CRYPT_INVALID;
1958
1959         r = dm_status_device(name);
1960
1961         if (!cd)
1962                 dm_exit();
1963
1964         if (r < 0 && r != -ENODEV)
1965                 return CRYPT_INVALID;
1966
1967         if (r == 0)
1968                 return CRYPT_ACTIVE;
1969
1970         if (r > 0)
1971                 return CRYPT_BUSY;
1972
1973         return CRYPT_INACTIVE;
1974 }
1975
1976 static void hexprintICB(struct crypt_device *cd, char *d, int n)
1977 {
1978         int i;
1979         for(i = 0; i < n; i++)
1980                 log_std(cd, "%02hhx ", (char)d[i]);
1981 }
1982
1983 int crypt_dump(struct crypt_device *cd)
1984 {
1985         int i;
1986         if (!isLUKS(cd->type)) { //FIXME
1987                 log_err(cd, _("This operation is supported only for LUKS device.\n"));
1988                 return -EINVAL;
1989         }
1990
1991         log_std(cd, "LUKS header information for %s\n\n", cd->device);
1992         log_std(cd, "Version:       \t%d\n", cd->hdr.version);
1993         log_std(cd, "Cipher name:   \t%s\n", cd->hdr.cipherName);
1994         log_std(cd, "Cipher mode:   \t%s\n", cd->hdr.cipherMode);
1995         log_std(cd, "Hash spec:     \t%s\n", cd->hdr.hashSpec);
1996         log_std(cd, "Payload offset:\t%d\n", cd->hdr.payloadOffset);
1997         log_std(cd, "MK bits:       \t%d\n", cd->hdr.keyBytes * 8);
1998         log_std(cd, "MK digest:     \t");
1999         hexprintICB(cd, cd->hdr.mkDigest, LUKS_DIGESTSIZE);
2000         log_std(cd, "\n");
2001         log_std(cd, "MK salt:       \t");
2002         hexprintICB(cd, cd->hdr.mkDigestSalt, LUKS_SALTSIZE/2);
2003         log_std(cd, "\n               \t");
2004         hexprintICB(cd, cd->hdr.mkDigestSalt+LUKS_SALTSIZE/2, LUKS_SALTSIZE/2);
2005         log_std(cd, "\n");
2006         log_std(cd, "MK iterations: \t%d\n", cd->hdr.mkDigestIterations);
2007         log_std(cd, "UUID:          \t%s\n\n", cd->hdr.uuid);
2008         for(i = 0; i < LUKS_NUMKEYS; i++) {
2009                 if(cd->hdr.keyblock[i].active == LUKS_KEY_ENABLED) {
2010                         log_std(cd, "Key Slot %d: ENABLED\n",i);
2011                         log_std(cd, "\tIterations:         \t%d\n",
2012                                 cd->hdr.keyblock[i].passwordIterations);
2013                         log_std(cd, "\tSalt:               \t");
2014                         hexprintICB(cd, cd->hdr.keyblock[i].passwordSalt,
2015                                     LUKS_SALTSIZE/2);
2016                         log_std(cd, "\n\t                      \t");
2017                         hexprintICB(cd, cd->hdr.keyblock[i].passwordSalt +
2018                                     LUKS_SALTSIZE/2, LUKS_SALTSIZE/2);
2019                         log_std(cd, "\n");
2020
2021                         log_std(cd, "\tKey material offset:\t%d\n",
2022                                 cd->hdr.keyblock[i].keyMaterialOffset);
2023                         log_std(cd, "\tAF stripes:            \t%d\n",
2024                                 cd->hdr.keyblock[i].stripes);
2025                 }
2026                 else 
2027                         log_std(cd, "Key Slot %d: DISABLED\n", i);
2028         }
2029         return 0;
2030 }
2031
2032 const char *crypt_get_cipher(struct crypt_device *cd)
2033 {
2034         if (isPLAIN(cd->type))
2035                 return cd->plain_cipher;
2036
2037         if (isLUKS(cd->type))
2038                 return cd->hdr.cipherName;
2039
2040         return NULL;
2041 }
2042
2043 const char *crypt_get_cipher_mode(struct crypt_device *cd)
2044 {
2045         if (isPLAIN(cd->type))
2046                 return cd->plain_cipher_mode;
2047
2048         if (isLUKS(cd->type))
2049                 return cd->hdr.cipherMode;
2050
2051         return NULL;
2052 }
2053
2054 const char *crypt_get_uuid(struct crypt_device *cd)
2055 {
2056         if (isLUKS(cd->type))
2057                 return cd->hdr.uuid;
2058
2059         return NULL;
2060 }
2061
2062 int crypt_get_volume_key_size(struct crypt_device *cd)
2063 {
2064         if (isPLAIN(cd->type))
2065                 return cd->volume_key->keyLength;
2066
2067         if (isLUKS(cd->type))
2068                 return cd->hdr.keyBytes;
2069
2070         return 0;
2071 }
2072
2073 uint64_t crypt_get_data_offset(struct crypt_device *cd)
2074 {
2075         if (isPLAIN(cd->type))
2076                 return cd->plain_hdr.offset;
2077
2078         if (isLUKS(cd->type))
2079                 return cd->hdr.payloadOffset;
2080
2081         return 0;
2082 }
2083
2084 crypt_keyslot_info crypt_keyslot_status(struct crypt_device *cd, int keyslot)
2085 {
2086         if (!isLUKS(cd->type)) {
2087                 log_err(cd, _("This operation is supported only for LUKS device.\n"));
2088                 return CRYPT_SLOT_INVALID;
2089         }
2090
2091         return LUKS_keyslot_info(&cd->hdr, keyslot);
2092 }