/src/barebox/commands/keystore.c
Line | Count | Source |
1 | | // SPDX-License-Identifier: GPL-2.0-only |
2 | | |
3 | | #include <common.h> |
4 | | #include <command.h> |
5 | | #include <getopt.h> |
6 | | #include <libfile.h> |
7 | | #include <crypto/keystore.h> |
8 | | #include <linux/kernel.h> |
9 | | #include <fs.h> |
10 | | |
11 | | static int do_keystore(int argc, char *argv[]) |
12 | 0 | { |
13 | 0 | int opt; |
14 | 0 | int ret; |
15 | 0 | int do_remove = 0; |
16 | 0 | const char *name; |
17 | 0 | const char *file = NULL; |
18 | 0 | char *secret_str = NULL; |
19 | 0 | void *secret; |
20 | 0 | size_t s_len = 0; |
21 | |
|
22 | 0 | while ((opt = getopt(argc, argv, "rs:f:")) > 0) { |
23 | 0 | switch (opt) { |
24 | 0 | case 'r': |
25 | 0 | do_remove = 1; |
26 | 0 | break; |
27 | 0 | case 's': |
28 | 0 | secret_str = optarg; |
29 | 0 | break; |
30 | 0 | case 'f': |
31 | 0 | file = optarg; |
32 | 0 | break; |
33 | 0 | default: |
34 | 0 | return COMMAND_ERROR_USAGE; |
35 | 0 | } |
36 | 0 | } |
37 | | |
38 | 0 | if (argc == optind) |
39 | 0 | return COMMAND_ERROR_USAGE; |
40 | | |
41 | 0 | if (!do_remove && !file && !secret_str) |
42 | 0 | return COMMAND_ERROR_USAGE; |
43 | | |
44 | 0 | if (file && secret_str) |
45 | 0 | return COMMAND_ERROR_USAGE; |
46 | | |
47 | 0 | name = argv[optind]; |
48 | |
|
49 | 0 | if (do_remove) { |
50 | 0 | keystore_forget_secret(name); |
51 | 0 | printf("forgotten secret for key %s\n", name); |
52 | 0 | return 0; |
53 | 0 | } |
54 | | |
55 | 0 | if (file) { |
56 | 0 | ret = read_file_2(file, &s_len, (void *)&secret_str, FILESIZE_MAX); |
57 | 0 | if (ret) { |
58 | 0 | printf("Cannot open %s: %pe\n", file, ERR_PTR(ret)); |
59 | 0 | return 1; |
60 | 0 | } |
61 | 0 | } else if (secret_str) { |
62 | 0 | s_len = strlen(secret_str); |
63 | 0 | } |
64 | | |
65 | 0 | if (s_len & 1) { |
66 | 0 | printf("invalid secret len. Must be whole bytes\n"); |
67 | 0 | return 1; |
68 | 0 | } |
69 | | |
70 | 0 | secret = xzalloc(s_len / 2); |
71 | 0 | ret = hex2bin(secret, secret_str, s_len / 2); |
72 | 0 | if (ret) { |
73 | 0 | printf("Cannot convert %s to binary: %pe\n", secret_str, ERR_PTR(ret)); |
74 | 0 | return 1; |
75 | 0 | } |
76 | | |
77 | 0 | ret = keystore_set_secret(name, secret, s_len / 2); |
78 | 0 | if (ret) |
79 | 0 | printf("cannot set secret for key %s: %pe\n", name, ERR_PTR(ret)); |
80 | 0 | else |
81 | 0 | printf("Added secret for key %s\n", name); |
82 | |
|
83 | 0 | free(secret); |
84 | |
|
85 | 0 | return ret ? 1 : 0; |
86 | 0 | } |
87 | | |
88 | | BAREBOX_CMD_HELP_START(keystore) |
89 | | BAREBOX_CMD_HELP_TEXT("") |
90 | | BAREBOX_CMD_HELP_TEXT("Options:") |
91 | | BAREBOX_CMD_HELP_OPT("-r", "remove a key from the keystore") |
92 | | BAREBOX_CMD_HELP_OPT("-s <key>", "set a key in the keystore") |
93 | | BAREBOX_CMD_HELP_OPT("-f <keyfile>", "set a key in the keystore, read secret from file") |
94 | | BAREBOX_CMD_HELP_END |
95 | | |
96 | | BAREBOX_CMD_START(keystore) |
97 | | .cmd = do_keystore, |
98 | | BAREBOX_CMD_DESC("manage keys") |
99 | | BAREBOX_CMD_OPTS("[-rsf] <keyname>") |
100 | | BAREBOX_CMD_GROUP(CMD_GRP_SECURITY) |
101 | | BAREBOX_CMD_HELP(cmd_keystore_help) |
102 | | BAREBOX_CMD_END |