aboutsummaryrefslogtreecommitdiff
path: root/projects/hsm
diff options
context:
space:
mode:
Diffstat (limited to 'projects/hsm')
-rw-r--r--projects/hsm/Makefile3
-rw-r--r--projects/hsm/mgmt-cli.c12
-rw-r--r--projects/hsm/mgmt-fpga.c13
-rw-r--r--projects/hsm/mgmt-keystore.c72
4 files changed, 70 insertions, 30 deletions
diff --git a/projects/hsm/Makefile b/projects/hsm/Makefile
index acb9962..0ab4bff 100644
--- a/projects/hsm/Makefile
+++ b/projects/hsm/Makefile
@@ -8,8 +8,7 @@ OBJS = crc32.o \
mgmt-fpga.c \
mgmt-keystore.c \
mgmt-masterkey.c \
- mgmt-misc.c \
- mgmt-show.c
+ mgmt-misc.c
BOARD_OBJS = \
$(TOPLEVEL)/stm-init.o \
diff --git a/projects/hsm/mgmt-cli.c b/projects/hsm/mgmt-cli.c
index eeeaef5..a610db6 100644
--- a/projects/hsm/mgmt-cli.c
+++ b/projects/hsm/mgmt-cli.c
@@ -195,7 +195,7 @@ static int embedded_cli_loop(struct cli_def *cli)
}
if (ctx.l < 0)
- continue;
+ break;
/* cli_print(cli, "Process command: '%s'", ctx.cmd); */
n = cli_loop_process_cmd(cli, &ctx);
@@ -249,13 +249,15 @@ int cli_main(void)
mgmt_cli_init(&cli);
cli_set_auth_callback(&cli, check_auth);
- configure_cli_show(&cli);
+ /* we don't have any privileged commands at the moment */
+ cli_unregister_command(&cli, "enable");
+
configure_cli_fpga(&cli);
- configure_cli_misc(&cli);
- configure_cli_firmware(&cli);
- configure_cli_bootloader(&cli);
configure_cli_keystore(&cli);
configure_cli_masterkey(&cli);
+ configure_cli_firmware(&cli);
+ configure_cli_bootloader(&cli);
+ configure_cli_misc(&cli);
while (1) {
embedded_cli_loop(&cli);
diff --git a/projects/hsm/mgmt-fpga.c b/projects/hsm/mgmt-fpga.c
index 5092599..adb45b3 100644
--- a/projects/hsm/mgmt-fpga.c
+++ b/projects/hsm/mgmt-fpga.c
@@ -124,17 +124,16 @@ static int cmd_fpga_reset(struct cli_def *cli, const char *command, char *argv[]
return CLI_OK;
}
-static int cmd_fpga_show_status(struct cli_def *cli, const char *command, char *argv[], int argc)
-{
- cli_print(cli, "FPGA has %sloaded a bitstream", fpgacfg_check_done() ? "":"NOT ");
- return CLI_OK;
-}
-
static int cmd_fpga_show_cores(struct cli_def *cli, const char *command, char *argv[], int argc)
{
const hal_core_t *core;
const hal_core_info_t *info;
+ if (! fpgacfg_check_done()) {
+ cli_print(cli, "FPGA has not loaded a bitstream");
+ return CLI_OK;
+ }
+
for (core = hal_core_iterate(NULL); core != NULL; core = hal_core_iterate(core)) {
info = hal_core_info(core);
cli_print(cli, "%04x: %8.8s %4.4s",
@@ -150,8 +149,6 @@ void configure_cli_fpga(struct cli_def *cli)
cli_command_root(fpga);
cli_command_branch(fpga, show);
- /* show fpga status*/
- cli_command_node(fpga_show, status, "Show status about the FPGA");
/* show fpga cores*/
cli_command_node(fpga_show, cores, "Show FPGA core names and versions");
diff --git a/projects/hsm/mgmt-keystore.c b/projects/hsm/mgmt-keystore.c
index d598cf7..0471430 100644
--- a/projects/hsm/mgmt-keystore.c
+++ b/projects/hsm/mgmt-keystore.c
@@ -32,8 +32,8 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+/* Rename both CMSIS HAL_OK and libhal HAL_OK to disambiguate */
#define HAL_OK CMSIS_HAL_OK
-
#include "stm-init.h"
#include "stm-keystore.h"
#include "stm-fpgacfg.h"
@@ -42,7 +42,6 @@
#include "mgmt-cli.h"
#include "mgmt-show.h"
-/* Rename both CMSIS HAL_OK and libhal HAL_OK to disambiguate */
#undef HAL_OK
#define LIBHAL_OK HAL_OK
#include "hal.h"
@@ -52,6 +51,7 @@
#include <stdlib.h>
#include <string.h>
+#include <ctype.h>
int cmd_keystore_set_pin(struct cli_def *cli, const char *command, char *argv[], int argc)
@@ -150,6 +150,7 @@ int cmd_keystore_set_pin_iterations(struct cli_def *cli, const char *command, ch
return CLI_OK;
}
+#if 0
int cmd_keystore_set_key(struct cli_def *cli, const char *command, char *argv[], int argc)
{
hal_error_t status;
@@ -176,6 +177,7 @@ int cmd_keystore_set_key(struct cli_def *cli, const char *command, char *argv[],
return CLI_OK;
}
+#endif
static int key_by_index(struct cli_def *cli, char *str, const uint8_t **name, size_t *name_len, hal_key_type_t *type)
{
@@ -233,6 +235,13 @@ int cmd_keystore_delete_key(struct cli_def *cli, const char *command, char *argv
}
if ((status = hal_ks_delete(type, name, name_len, &hint)) != LIBHAL_OK) {
+ if (status == HAL_ERROR_KEY_NOT_FOUND) {
+ /* sigh, try again including the terminal nul */
+ if ((status = hal_ks_delete(type, name, name_len+1, &hint)) == LIBHAL_OK) {
+ cli_print(cli, "Deleted key %i", hint);
+ return CLI_OK;
+ }
+ }
cli_print(cli, "Failed deleting key: %s", hal_error_string(status));
return CLI_ERROR;
}
@@ -269,6 +278,13 @@ int cmd_keystore_rename_key(struct cli_def *cli, const char *command, char *argv
}
if ((status = hal_ks_rename(type, name, name_len, (uint8_t *)argv[1], strlen(argv[1]), &hint)) != LIBHAL_OK) {
+ if (status == HAL_ERROR_KEY_NOT_FOUND) {
+ /* sigh, try again including the terminal nul */
+ if ((status = hal_ks_rename(type, name, name_len+1, (uint8_t *)argv[1], strlen(argv[1]), &hint)) == LIBHAL_OK) {
+ cli_print(cli, "Renamed key %i", hint);
+ return CLI_OK;
+ }
+ }
cli_print(cli, "Failed renaming key: %s", hal_error_string(status));
return CLI_ERROR;
}
@@ -281,7 +297,6 @@ int cmd_keystore_rename_key(struct cli_def *cli, const char *command, char *argv
int cmd_keystore_show_keys(struct cli_def *cli, const char *command, char *argv[], int argc)
{
const hal_ks_keydb_t *db;
- uint8_t name[HAL_RPC_PKEY_NAME_MAX + 1];
char *type;
db = hal_ks_get_keydb();
@@ -314,10 +329,35 @@ int cmd_keystore_show_keys(struct cli_def *cli, const char *command, char *argv[
type = "unknown";
break;
}
- /* name is nul-terminated */
- memcpy(name, db->keys[i].name, db->keys[i].name_len);
- name[db->keys[i].name_len] = '\0';
- cli_print(cli, "Key %i, type %s, name '%s'", i, type, name);
+ int printable = 1;
+ for (int j = 0; j < db->keys[i].name_len; ++j) {
+ if (!isprint(db->keys[i].name[j])) {
+ printable = 0;
+ break;
+ }
+ }
+ if (printable) {
+ /* name may not be nul-terminated in the db, and %*s
+ * doesn't seem to be working properly, so copy it
+ */
+ uint8_t name[db->keys[i].name_len + 1];
+ memcpy(name, db->keys[i].name, db->keys[i].name_len);
+ name[db->keys[i].name_len] = '\0';
+ cli_print(cli, "Key %i, type %s, name '%s'", i, type, name);
+ }
+ else {
+ /* hexdump name */
+ uint8_t name[db->keys[i].name_len * 3];
+ for (int j = 0; j < db->keys[i].name_len; ++j) {
+ uint8_t b = db->keys[i].name[j];
+ #define hexify(n) (((n) < 10) ? ((n) + '0') : ((n) - 10 + 'A'))
+ name[j*3] = hexify((b & 0xf0) >> 4);
+ name[j*3+1] = hexify(b & 0x0f);
+ name[j*3+2] = ':';
+ }
+ name[sizeof(name)-1] = '\0';
+ cli_print(cli, "Key %i, type %s, name %s", i, type, name);
+ }
}
}
@@ -366,9 +406,6 @@ void configure_cli_keystore(struct cli_def *cli)
/* keystore show */
cli_command_branch(keystore, show);
- /* keystore erase */
- cli_command_node(keystore, erase, "Erase the whole keystore");
-
/* keystore set pin */
cli_command_node(keystore_set, pin, "Set either 'wheel', 'user' or 'so' PIN");
@@ -378,15 +415,20 @@ void configure_cli_keystore(struct cli_def *cli)
/* keystore clear pin */
cli_command_node(keystore_clear, pin, "Clear either 'wheel', 'user' or 'so' PIN");
+ /* keystore show keys */
+ cli_command_node(keystore_show, keys, "Show what PINs and keys are in the keystore");
+
+#if 0
/* keystore set key */
cli_command_node(keystore_set, key, "Set a key");
-
- /* keystore delete key */
- cli_command_node(keystore_delete, key, "Delete a key");
+#endif
/* keystore rename key */
cli_command_node(keystore_rename, key, "Rename a key");
- /* keystore show keys */
- cli_command_node(keystore_show, keys, "Show what PINs and keys are in the keystore");
+ /* keystore delete key */
+ cli_command_node(keystore_delete, key, "Delete a key");
+
+ /* keystore erase */
+ cli_command_node(keystore, erase, "Erase the whole keystore");
}
Presumably you're security

concious (otherwise, why are you installing this stuff?), so you may want to pay attention to what gpg --check-sig says here.

$ id=37A8E93F5D7E7B9A $ wget https://apt.cryptech.is/apt-gpg-key.gpg $ gpg --recv-key $id $ gpg --check-sig $id

these days the cool kids use the /etc/apt/trusted.gpg.d/ directory:

$ sudo chown root:root apt-gpg-key.gpg $ sudo mv apt-gpg-key.gpg /etc/apt/trusted.gpg.d/cryptech.gpg

entries to /etc/apt/source.list.d/; which entries you need to add depends on which distribution you're running.

* For Debian Stretch, do:
```
$ sudo wget -q -O /etc/apt/sources.list.d/cryptech.list http://apt.cryptech.is/sources.stretch.list

```

* For Debian Buster, do:
```
$ sudo wget -q -O /etc/apt/sources.list.d/cryptech.list http://apt.cryptech.is/sources.buster.list

```

* For Ubuntu Xenial, do:
```
$ sudo wget -q -O /etc/apt/sources.list.d/cryptech.list http://apt.cryptech.is/sources.xenial.list

```

* For Ubuntu Bionic, do:
```
$ sudo wget -q -O /etc/apt/sources.list.d/cryptech.list http://apt.cryptech.is/sources.bionic.list

```

$ sudo apt-get update

$ sudo apt-get install cryptech-alpha

Updating APT packages

Once you've performed the steps above you should be able to upgrade to newer version of the code using the normal APT upgrade process:

$ sudo apt-get update
$ sudo apt-get upgrade

How to get Homebrew packages for Mac OS X

concious (otherwise, why are you installing this stuff?), so you may want to pay attention to what gpg --check-sig says here.

$ id=37A8E93F5D7E7B9A $ gpg --recv-key $id $ gpg --check-sig $id

$ brew tap cryptech/sw https://brew.cryptech.is/tap

$ brew update

This is optional (Homebrew doesn't care whether you do this), but if you want to know whether the formula was signed by the Cryptech project, this is how to check.

$ brew log --max-count=1 --show-signature cryptech-alpha

available as a Homebrew source package due to licensing issues in the MacOS Xcode SDK, so the installation will probably take several minutes, as some of the libraries are a bit slow to compile (sorry...).

$ brew install cryptech-alpha

Updating Homebrew packages

Once you've performed the steps above you should be able to upgrade to newer version of the code using the normal Homebrew upgrade process:

$ brew update
$ brew upgrade
$ brew cleanup