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