Coverage Report

Created: 2026-10-13 06:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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