2 * LUKS - Linux Unified Key Setup v2, token handling
4 * Copyright (C) 2016-2023 Red Hat, Inc. All rights reserved.
5 * Copyright (C) 2016-2023 Milan Broz
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 #include "luks2_internal.h"
27 #if USE_EXTERNAL_TOKENS
28 static bool external_tokens_enabled = true;
30 static bool external_tokens_enabled = false;
33 static struct crypt_token_handler_internal token_handlers[LUKS2_TOKENS_MAX] = {
34 /* keyring builtin token */
38 .v1 = { .name = LUKS2_TOKEN_KEYRING,
40 .buffer_free = keyring_buffer_free,
41 .validate = keyring_validate,
42 .dump = keyring_dump }
47 void crypt_token_external_disable(void)
49 external_tokens_enabled = false;
52 const char *crypt_token_external_path(void)
54 return external_tokens_enabled ? EXTERNAL_LUKS2_TOKENS_PATH : NULL;
57 #if USE_EXTERNAL_TOKENS
58 static void *token_dlvsym(struct crypt_device *cd,
67 log_dbg(cd, "Loading symbol %s@%s.", symbol, version);
68 sym = dlvsym(handle, symbol, version);
70 log_dbg(cd, "Loading default version of symbol %s.", symbol);
71 sym = dlsym(handle, symbol);
76 log_dbg(cd, "%s", error);
82 static bool token_validate_v1(struct crypt_device *cd, const crypt_token_handler *h)
88 log_dbg(cd, "Error: token handler does not provide name attribute.");
93 log_dbg(cd, "Error: token handler does not provide open function.");
100 #if USE_EXTERNAL_TOKENS
101 static bool token_validate_v2(struct crypt_device *cd, const struct crypt_token_handler_internal *h)
106 if (!token_validate_v1(cd, &h->u.v1))
109 if (!h->u.v2.version) {
110 log_dbg(cd, "Error: token handler does not provide " CRYPT_TOKEN_ABI_VERSION " function.");
117 static bool external_token_name_valid(const char *name)
119 if (!*name || strlen(name) > LUKS2_TOKEN_NAME_MAX)
123 if (!isalnum(*name) && *name != '-' && *name != '_')
133 crypt_token_load_external(struct crypt_device *cd, const char *name, struct crypt_token_handler_internal *ret)
135 #if USE_EXTERNAL_TOKENS
136 struct crypt_token_handler_v2 *token;
141 if (!external_tokens_enabled)
147 if (!external_token_name_valid(name)) {
148 log_dbg(cd, "External token name (%.*s) invalid.", LUKS2_TOKEN_NAME_MAX, name);
154 r = snprintf(buf, sizeof(buf), "%s/libcryptsetup-token-%s.so", crypt_token_external_path(), name);
155 if (r < 0 || (size_t)r >= sizeof(buf))
160 log_dbg(cd, "Trying to load %s.", buf);
162 h = dlopen(buf, RTLD_LAZY);
164 log_dbg(cd, "%s", dlerror());
169 token->name = strdup(name);
170 token->open = token_dlvsym(cd, h, CRYPT_TOKEN_ABI_OPEN, CRYPT_TOKEN_ABI_VERSION1);
171 token->buffer_free = token_dlvsym(cd, h, CRYPT_TOKEN_ABI_BUFFER_FREE, CRYPT_TOKEN_ABI_VERSION1);
172 token->validate = token_dlvsym(cd, h, CRYPT_TOKEN_ABI_VALIDATE, CRYPT_TOKEN_ABI_VERSION1);
173 token->dump = token_dlvsym(cd, h, CRYPT_TOKEN_ABI_DUMP, CRYPT_TOKEN_ABI_VERSION1);
174 token->open_pin = token_dlvsym(cd, h, CRYPT_TOKEN_ABI_OPEN_PIN, CRYPT_TOKEN_ABI_VERSION1);
175 token->version = token_dlvsym(cd, h, CRYPT_TOKEN_ABI_VERSION, CRYPT_TOKEN_ABI_VERSION1);
177 if (!token_validate_v2(cd, ret)) {
178 free(CONST_CAST(void *)token->name);
180 memset(token, 0, sizeof(*token));
184 /* Token loaded, possible error here means only debug message fail and can be ignored */
185 r = snprintf(buf, sizeof(buf), "%s", token->version() ?: "");
186 if (r < 0 || (size_t)r >= sizeof(buf))
189 log_dbg(cd, "Token handler %s-%s loaded successfully.", token->name, buf);
200 static int is_builtin_candidate(const char *type)
202 return !strncmp(type, LUKS2_BUILTIN_TOKEN_PREFIX, LUKS2_BUILTIN_TOKEN_PREFIX_LEN);
205 static int crypt_token_find_free(struct crypt_device *cd, const char *name, int *index)
209 if (is_builtin_candidate(name)) {
210 log_dbg(cd, "'" LUKS2_BUILTIN_TOKEN_PREFIX "' is reserved prefix for builtin tokens.");
214 for (i = 0; i < LUKS2_TOKENS_MAX && token_handlers[i].u.v1.name; i++) {
215 if (!strcmp(token_handlers[i].u.v1.name, name)) {
216 log_dbg(cd, "Keyslot handler %s is already registered.", name);
221 if (i == LUKS2_TOKENS_MAX)
230 int crypt_token_register(const crypt_token_handler *handler)
234 if (!token_validate_v1(NULL, handler))
237 r = crypt_token_find_free(NULL, handler->name, &i);
241 token_handlers[i].version = 1;
242 token_handlers[i].u.v1 = *handler;
246 void crypt_token_unload_external_all(struct crypt_device *cd)
248 #if USE_EXTERNAL_TOKENS
251 for (i = LUKS2_TOKENS_MAX - 1; i >= 0; i--) {
252 if (token_handlers[i].version < 2)
255 log_dbg(cd, "Unloading %s token handler.", token_handlers[i].u.v2.name);
257 free(CONST_CAST(void *)token_handlers[i].u.v2.name);
259 if (dlclose(CONST_CAST(void *)token_handlers[i].u.v2.dlhandle))
260 log_dbg(cd, "%s", dlerror());
266 *LUKS2_token_handler_type(struct crypt_device *cd, const char *type)
270 for (i = 0; i < LUKS2_TOKENS_MAX && token_handlers[i].u.v1.name; i++)
271 if (!strcmp(token_handlers[i].u.v1.name, type))
272 return &token_handlers[i].u;
274 if (i >= LUKS2_TOKENS_MAX)
277 if (is_builtin_candidate(type))
280 if (crypt_token_load_external(cd, type, &token_handlers[i]))
283 return &token_handlers[i].u;
287 *LUKS2_token_handler(struct crypt_device *cd, int token)
289 struct luks2_hdr *hdr;
290 json_object *jobj1, *jobj2;
295 if (!(hdr = crypt_get_hdr(cd, CRYPT_LUKS2)))
298 if (!(jobj1 = LUKS2_get_token_jobj(hdr, token)))
301 if (!json_object_object_get_ex(jobj1, "type", &jobj2))
304 return LUKS2_token_handler_type(cd, json_object_get_string(jobj2));
307 static int LUKS2_token_find_free(struct luks2_hdr *hdr)
311 for (i = 0; i < LUKS2_TOKENS_MAX; i++)
312 if (!LUKS2_get_token_jobj(hdr, i))
318 int LUKS2_token_create(struct crypt_device *cd,
319 struct luks2_hdr *hdr,
324 const crypt_token_handler *h;
325 json_object *jobj_tokens, *jobj_type, *jobj;
326 enum json_tokener_error jerr;
329 if (token == CRYPT_ANY_TOKEN) {
332 token = LUKS2_token_find_free(hdr);
335 if (token < 0 || token >= LUKS2_TOKENS_MAX)
338 if (!json_object_object_get_ex(hdr->jobj, "tokens", &jobj_tokens))
341 if (snprintf(num, sizeof(num), "%d", token) < 0)
346 json_object_object_del(jobj_tokens, num);
349 jobj = json_tokener_parse_verbose(json, &jerr);
351 log_dbg(cd, "Token JSON parse failed.");
355 if (LUKS2_token_validate(cd, hdr->jobj, jobj, num)) {
356 json_object_put(jobj);
360 json_object_object_get_ex(jobj, "type", &jobj_type);
361 h = LUKS2_token_handler_type(cd, json_object_get_string(jobj_type));
363 if (is_builtin_candidate(json_object_get_string(jobj_type)) && !h) {
364 log_dbg(cd, "%s is builtin token candidate with missing handler",
365 json_object_get_string(jobj_type));
366 json_object_put(jobj);
370 if (h && h->validate && h->validate(cd, json)) {
371 json_object_put(jobj);
372 log_dbg(cd, "Token type %s validation failed.", h->name);
376 json_object_object_add(jobj_tokens, num, jobj);
377 if (LUKS2_check_json_size(cd, hdr)) {
378 log_dbg(cd, "Not enough space in header json area for new token.");
379 json_object_object_del(jobj_tokens, num);
385 return LUKS2_hdr_write(cd, hdr) ?: token;
390 crypt_token_info LUKS2_token_status(struct crypt_device *cd,
391 struct luks2_hdr *hdr,
396 const crypt_token_handler *th;
397 json_object *jobj_type, *jobj_token;
399 if (token < 0 || token >= LUKS2_TOKENS_MAX)
400 return CRYPT_TOKEN_INVALID;
402 if (!(jobj_token = LUKS2_get_token_jobj(hdr, token)))
403 return CRYPT_TOKEN_INACTIVE;
405 json_object_object_get_ex(jobj_token, "type", &jobj_type);
406 tmp = json_object_get_string(jobj_type);
408 if ((th = LUKS2_token_handler_type(cd, tmp))) {
411 return is_builtin_candidate(tmp) ? CRYPT_TOKEN_INTERNAL : CRYPT_TOKEN_EXTERNAL;
417 return is_builtin_candidate(tmp) ? CRYPT_TOKEN_INTERNAL_UNKNOWN : CRYPT_TOKEN_EXTERNAL_UNKNOWN;
420 static const char *token_json_to_string(json_object *jobj_token)
422 return json_object_to_json_string_ext(jobj_token,
423 JSON_C_TO_STRING_PLAIN | JSON_C_TO_STRING_NOSLASHESCAPE);
426 static int token_is_usable(struct luks2_hdr *hdr, json_object *jobj_token, int segment,
427 crypt_keyslot_priority minimal_priority, bool requires_keyslot)
429 crypt_keyslot_priority keyslot_priority;
430 json_object *jobj_array;
431 int i, keyslot, len, r = -ENOENT;
436 if (!json_object_object_get_ex(jobj_token, "keyslots", &jobj_array))
439 if (segment < 0 && segment != CRYPT_ANY_SEGMENT)
442 /* no assigned keyslot returns -ENOENT even for CRYPT_ANY_SEGMENT */
443 len = json_object_array_length(jobj_array);
447 if (!requires_keyslot)
453 for (i = 0; i < len; i++) {
454 keyslot = atoi(json_object_get_string(json_object_array_get_idx(jobj_array, i)));
456 keyslot_priority = LUKS2_keyslot_priority_get(hdr, keyslot);
457 if (keyslot_priority == CRYPT_SLOT_PRIORITY_INVALID)
460 if (keyslot_priority < minimal_priority)
463 r = LUKS2_keyslot_for_segment(hdr, keyslot, segment);
471 static int translate_errno(struct crypt_device *cd, int ret_val, const char *type)
473 if ((ret_val > 0 || ret_val == -EINVAL || ret_val == -EPERM) && !is_builtin_candidate(type)) {
474 log_dbg(cd, "%s token handler returned %d. Changing to %d.", type, ret_val, -ENOENT);
481 static int token_open(struct crypt_device *cd,
482 struct luks2_hdr *hdr,
484 json_object *jobj_token,
487 crypt_keyslot_priority priority,
493 bool requires_keyslot)
495 const struct crypt_token_handler_v2 *h;
496 json_object *jobj_type;
501 assert(priority >= 0);
504 if (!json_object_object_get_ex(jobj_token, "type", &jobj_type))
506 if (strcmp(type, json_object_get_string(jobj_type)))
510 r = token_is_usable(hdr, jobj_token, segment, priority, requires_keyslot);
513 log_dbg(cd, "Token %d unusable for segment %d with desired keyslot priority %d.",
514 token, segment, priority);
518 if (!(h = LUKS2_token_handler(cd, token)))
521 if (h->validate && h->validate(cd, token_json_to_string(jobj_token))) {
522 log_dbg(cd, "Token %d (%s) validation failed.", token, h->name);
526 if (pin && !h->open_pin)
529 r = translate_errno(cd, h->open_pin(cd, token, pin, pin_size, buffer, buffer_len, usrptr), h->name);
531 r = translate_errno(cd, h->open(cd, token, buffer, buffer_len, usrptr), h->name);
533 log_dbg(cd, "Token %d (%s) open failed with %d.", token, h->name, r);
538 static void LUKS2_token_buffer_free(struct crypt_device *cd,
543 const crypt_token_handler *h = LUKS2_token_handler(cd, token);
545 if (h && h->buffer_free)
546 h->buffer_free(buffer, buffer_len);
548 crypt_safe_memzero(buffer, buffer_len);
553 static bool break_loop_retval(int r)
555 if (r == -ENOENT || r == -EPERM || r == -EAGAIN || r == -ENOANO)
560 static void update_return_errno(int r, int *stored)
562 if (*stored == -ENOANO)
564 else if (r == -ENOANO)
566 else if (r == -EAGAIN && *stored != -ENOANO)
568 else if (r == -EPERM && (*stored != -ENOANO && *stored != -EAGAIN))
572 static int LUKS2_keyslot_open_by_token(struct crypt_device *cd,
573 struct luks2_hdr *hdr,
576 crypt_keyslot_priority priority,
579 struct volume_key **vk)
581 crypt_keyslot_priority keyslot_priority;
582 json_object *jobj_token, *jobj_token_keyslots, *jobj_type, *jobj;
583 unsigned int num = 0;
584 int i, r = -ENOENT, stored_retval = -ENOENT;
586 jobj_token = LUKS2_get_token_jobj(hdr, token);
590 if (!json_object_object_get_ex(jobj_token, "type", &jobj_type))
593 json_object_object_get_ex(jobj_token, "keyslots", &jobj_token_keyslots);
594 if (!jobj_token_keyslots)
597 /* Try to open keyslot referenced in token */
598 for (i = 0; i < (int) json_object_array_length(jobj_token_keyslots) && r < 0; i++) {
599 jobj = json_object_array_get_idx(jobj_token_keyslots, i);
600 num = atoi(json_object_get_string(jobj));
601 keyslot_priority = LUKS2_keyslot_priority_get(hdr, num);
602 if (keyslot_priority == CRYPT_SLOT_PRIORITY_INVALID)
604 if (keyslot_priority < priority)
606 log_dbg(cd, "Trying to open keyslot %u with token %d (type %s).",
607 num, token, json_object_get_string(jobj_type));
608 r = LUKS2_keyslot_open(cd, num, segment, buffer, buffer_len, vk);
609 /* short circuit on fatal error */
610 if (r < 0 && r != -EPERM && r != -ENOENT)
612 /* save -EPERM in case no other keyslot is usable */
618 return stored_retval;
623 static bool token_is_blocked(int token, uint32_t *block_list)
625 /* it is safe now, but have assert in case LUKS2_TOKENS_MAX grows */
626 assert(token >= 0 && (size_t)token < BITFIELD_SIZE(block_list));
628 return (*block_list & (UINT32_C(1) << token));
631 static void token_block(int token, uint32_t *block_list)
633 /* it is safe now, but have assert in case LUKS2_TOKENS_MAX grows */
634 assert(token >= 0 && (size_t)token < BITFIELD_SIZE(block_list));
636 *block_list |= (UINT32_C(1) << token);
639 static int token_open_priority(struct crypt_device *cd,
640 struct luks2_hdr *hdr,
641 json_object *jobj_tokens,
644 crypt_keyslot_priority priority,
649 uint32_t *block_list,
650 struct volume_key **vk)
656 assert(stored_retval);
659 json_object_object_foreach(jobj_tokens, slot, val) {
661 if (token_is_blocked(token, block_list))
663 r = token_open(cd, hdr, token, val, type, segment, priority, pin, pin_size, &buffer, &buffer_size, usrptr, true);
665 r = LUKS2_keyslot_open_by_token(cd, hdr, token, segment, priority,
666 buffer, buffer_size, vk);
667 LUKS2_token_buffer_free(cd, token, buffer, buffer_size);
671 token_block(token, block_list);
673 if (break_loop_retval(r))
676 update_return_errno(r, stored_retval);
679 return *stored_retval;
682 static int token_open_any(struct crypt_device *cd, struct luks2_hdr *hdr, const char *type, int segment,
683 const char *pin, size_t pin_size, void *usrptr, struct volume_key **vk)
685 json_object *jobj_tokens;
686 int r, retval = -ENOENT;
687 uint32_t blocked = 0; /* bitmap with tokens blocked from loop by returning -ENOANO (wrong/missing pin) */
689 json_object_object_get_ex(hdr->jobj, "tokens", &jobj_tokens);
691 /* passing usrptr for CRYPT_ANY_TOKEN does not make sense without specific type */
695 r = token_open_priority(cd, hdr, jobj_tokens, type, segment, CRYPT_SLOT_PRIORITY_PREFER,
696 pin, pin_size, usrptr, &retval, &blocked, vk);
697 if (break_loop_retval(r))
700 return token_open_priority(cd, hdr, jobj_tokens, type, segment, CRYPT_SLOT_PRIORITY_NORMAL,
701 pin, pin_size, usrptr, &retval, &blocked, vk);
704 int LUKS2_token_unlock_key(struct crypt_device *cd,
705 struct luks2_hdr *hdr,
712 struct volume_key **vk)
716 json_object *jobj_token;
721 if (segment == CRYPT_DEFAULT_SEGMENT)
722 segment = LUKS2_get_default_segment(hdr);
724 if (segment < 0 && segment != CRYPT_ANY_SEGMENT)
727 if (token >= 0 && token < LUKS2_TOKENS_MAX) {
728 if ((jobj_token = LUKS2_get_token_jobj(hdr, token))) {
729 r = token_open(cd, hdr, token, jobj_token, type, segment, CRYPT_SLOT_PRIORITY_IGNORE,
730 pin, pin_size, &buffer, &buffer_size, usrptr, true);
732 r = LUKS2_keyslot_open_by_token(cd, hdr, token, segment, CRYPT_SLOT_PRIORITY_IGNORE,
733 buffer, buffer_size, vk);
734 LUKS2_token_buffer_free(cd, token, buffer, buffer_size);
737 } else if (token == CRYPT_ANY_TOKEN)
739 * return priorities (ordered form least to most significant):
740 * ENOENT - unusable for activation (no token handler, invalid token metadata, not assigned to volume segment, etc)
741 * EPERM - usable but token provided passphrase did not unlock any assigned keyslot
742 * EAGAIN - usable but not ready (token HW is missing)
743 * ENOANO - ready, but token pin is wrong or missing
745 * success (>= 0) or any other negative errno short-circuits token activation loop
748 r = token_open_any(cd, hdr, type, segment, pin, pin_size, usrptr, vk);
755 int LUKS2_token_open_and_activate(struct crypt_device *cd,
756 struct luks2_hdr *hdr,
766 int keyslot, r, segment;
767 struct volume_key *vk = NULL;
769 if (flags & CRYPT_ACTIVATE_ALLOW_UNBOUND_KEY)
770 segment = CRYPT_ANY_SEGMENT;
772 segment = CRYPT_DEFAULT_SEGMENT;
774 r = LUKS2_token_unlock_key(cd, hdr, token, type, pin, pin_size, segment, usrptr, &vk);
782 if (!crypt_use_keyring_for_vk(cd))
785 use_keyring = ((name && !crypt_is_cipher_null(crypt_get_cipher(cd))) ||
786 (flags & CRYPT_ACTIVATE_KEYRING_KEY));
789 if (!(r = LUKS2_volume_key_load_in_keyring_by_keyslot(cd, hdr, vk, keyslot)))
790 flags |= CRYPT_ACTIVATE_KEYRING_KEY;
794 r = LUKS2_activate(cd, name, vk, flags);
797 crypt_drop_keyring_key(cd, vk);
798 crypt_free_volume_key(vk);
800 return r < 0 ? r : keyslot;
803 void LUKS2_token_dump(struct crypt_device *cd, int token)
805 const crypt_token_handler *h;
806 json_object *jobj_token;
808 h = LUKS2_token_handler(cd, token);
810 jobj_token = LUKS2_get_token_jobj(crypt_get_hdr(cd, CRYPT_LUKS2), token);
812 h->dump(cd, json_object_to_json_string_ext(jobj_token,
813 JSON_C_TO_STRING_PLAIN | JSON_C_TO_STRING_NOSLASHESCAPE));
817 int LUKS2_token_json_get(struct luks2_hdr *hdr, int token, const char **json)
819 json_object *jobj_token;
821 jobj_token = LUKS2_get_token_jobj(hdr, token);
825 *json = token_json_to_string(jobj_token);
829 static int assign_one_keyslot(struct crypt_device *cd, struct luks2_hdr *hdr,
830 int token, int keyslot, int assign)
832 json_object *jobj1, *jobj_token, *jobj_token_keyslots;
835 log_dbg(cd, "Keyslot %i %s token %i.", keyslot, assign ? "assigned to" : "unassigned from", token);
837 jobj_token = LUKS2_get_token_jobj(hdr, token);
841 json_object_object_get_ex(jobj_token, "keyslots", &jobj_token_keyslots);
842 if (!jobj_token_keyslots)
845 if (snprintf(num, sizeof(num), "%d", keyslot) < 0)
849 jobj1 = LUKS2_array_jobj(jobj_token_keyslots, num);
851 json_object_array_add(jobj_token_keyslots, json_object_new_string(num));
853 jobj1 = LUKS2_array_remove(jobj_token_keyslots, num);
855 json_object_object_add(jobj_token, "keyslots", jobj1);
861 static int assign_one_token(struct crypt_device *cd, struct luks2_hdr *hdr,
862 int keyslot, int token, int assign)
864 json_object *jobj_keyslots;
867 if (!LUKS2_get_token_jobj(hdr, token))
870 if (keyslot == CRYPT_ANY_SLOT) {
871 json_object_object_get_ex(hdr->jobj, "keyslots", &jobj_keyslots);
873 json_object_object_foreach(jobj_keyslots, key, val) {
875 r = assign_one_keyslot(cd, hdr, token, atoi(key), assign);
880 r = assign_one_keyslot(cd, hdr, token, keyslot, assign);
885 int LUKS2_token_assign(struct crypt_device *cd, struct luks2_hdr *hdr,
886 int keyslot, int token, int assign, int commit)
888 json_object *jobj_tokens;
891 if ((keyslot < 0 && keyslot != CRYPT_ANY_SLOT) || keyslot >= LUKS2_KEYSLOTS_MAX ||
892 (token < 0 && token != CRYPT_ANY_TOKEN) || token >= LUKS2_TOKENS_MAX)
895 if (token == CRYPT_ANY_TOKEN) {
896 json_object_object_get_ex(hdr->jobj, "tokens", &jobj_tokens);
898 json_object_object_foreach(jobj_tokens, key, val) {
900 r = assign_one_token(cd, hdr, keyslot, atoi(key), assign);
905 r = assign_one_token(cd, hdr, keyslot, token, assign);
911 return LUKS2_hdr_write(cd, hdr) ?: token;
916 static int token_is_assigned(struct luks2_hdr *hdr, int keyslot, int token)
919 json_object *jobj, *jobj_token_keyslots,
920 *jobj_token = LUKS2_get_token_jobj(hdr, token);
925 json_object_object_get_ex(jobj_token, "keyslots", &jobj_token_keyslots);
927 for (i = 0; i < (int) json_object_array_length(jobj_token_keyslots); i++) {
928 jobj = json_object_array_get_idx(jobj_token_keyslots, i);
929 if (keyslot == atoi(json_object_get_string(jobj)))
936 int LUKS2_token_is_assigned(struct luks2_hdr *hdr, int keyslot, int token)
938 if (keyslot < 0 || keyslot >= LUKS2_KEYSLOTS_MAX || token < 0 || token >= LUKS2_TOKENS_MAX)
941 return token_is_assigned(hdr, keyslot, token);
944 int LUKS2_tokens_count(struct luks2_hdr *hdr)
946 json_object *jobj_tokens = LUKS2_get_tokens_jobj(hdr);
950 return json_object_object_length(jobj_tokens);
953 int LUKS2_token_assignment_copy(struct crypt_device *cd,
954 struct luks2_hdr *hdr,
961 if (keyslot_from < 0 || keyslot_from >= LUKS2_KEYSLOTS_MAX || keyslot_to < 0 || keyslot_to >= LUKS2_KEYSLOTS_MAX)
964 r = LUKS2_tokens_count(hdr);
968 for (i = 0; i < LUKS2_TOKENS_MAX; i++) {
969 if (!token_is_assigned(hdr, keyslot_from, i)) {
970 if ((r = assign_one_token(cd, hdr, keyslot_to, i, 1)))
975 return commit ? LUKS2_hdr_write(cd, hdr) : 0;
978 int LUKS2_token_unlock_passphrase(struct crypt_device *cd,
979 struct luks2_hdr *hdr,
986 size_t *passphrase_size)
990 json_object *jobj_token, *jobj_tokens;
991 int r = -ENOENT, retval = -ENOENT;
996 if (token >= 0 && token < LUKS2_TOKENS_MAX) {
997 if ((jobj_token = LUKS2_get_token_jobj(hdr, token)))
998 r = token_open(cd, hdr, token, jobj_token, type, CRYPT_ANY_SEGMENT, CRYPT_SLOT_PRIORITY_IGNORE,
999 pin, pin_size, &buffer, &buffer_size, usrptr, false);
1000 } else if (token == CRYPT_ANY_TOKEN) {
1001 json_object_object_get_ex(hdr->jobj, "tokens", &jobj_tokens);
1006 json_object_object_foreach(jobj_tokens, slot, val) {
1008 r = token_open(cd, hdr, token, val, type, CRYPT_ANY_SEGMENT, CRYPT_SLOT_PRIORITY_IGNORE,
1009 pin, pin_size, &buffer, &buffer_size, usrptr, false);
1012 * return priorities (ordered form least to most significant):
1013 * ENOENT - unusable for activation (no token handler, invalid token metadata, etc)
1014 * EAGAIN - usable but not ready (token HW is missing)
1015 * ENOANO - ready, but token pin is wrong or missing
1017 * success (>= 0) or any other negative errno short-circuits token activation loop
1020 if (break_loop_retval(r))
1023 update_return_errno(r, &retval);
1030 *passphrase = crypt_safe_alloc(buffer_size);
1032 memcpy(*passphrase, buffer, buffer_size);
1033 *passphrase_size = buffer_size;
1036 LUKS2_token_buffer_free(cd, token, buffer, buffer_size);