]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/home/modhex.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
7 #include "memory-util.h"
9 const char modhex_alphabet
[16] = {
10 'c', 'b', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'r', 't', 'u', 'v'
13 int decode_modhex_char(char x
) {
15 for (size_t i
= 0; i
< ELEMENTSOF(modhex_alphabet
); i
++)
16 /* Check both upper and lowercase */
17 if (modhex_alphabet
[i
] == x
|| (modhex_alphabet
[i
] - 32) == x
)
23 int normalize_recovery_key(const char *password
, char **ret
) {
24 _cleanup_(erase_and_freep
) char *mangled
= NULL
;
32 MODHEX_RAW_LENGTH
*2, /* syntax without dashes */
33 MODHEX_FORMATTED_LENGTH
-1)) /* syntax with dashes */
36 mangled
= new(char, MODHEX_FORMATTED_LENGTH
);
40 for (size_t i
= 0, j
= 0; i
< MODHEX_RAW_LENGTH
; i
++) {
44 if (l
== MODHEX_RAW_LENGTH
*2)
45 /* Syntax without dashes */
48 /* Syntax with dashes */
49 assert(l
== MODHEX_FORMATTED_LENGTH
-1);
52 if (i
> 0 && i
% 4 == 0 && password
[k
-1] != '-')
56 a
= decode_modhex_char(password
[k
]);
59 b
= decode_modhex_char(password
[k
+1]);
63 mangled
[j
++] = modhex_alphabet
[a
];
64 mangled
[j
++] = modhex_alphabet
[b
];
70 mangled
[MODHEX_FORMATTED_LENGTH
-1] = 0;
72 *ret
= TAKE_PTR(mangled
);