If MCU supports the FEAT_CRYPTO feature, read board ECDSA public key from MCU and print it.
Signed-off-by: Marek Behún <[email protected]> --- board/CZ.NIC/turris_omnia/turris_omnia.c | 29 +++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/board/CZ.NIC/turris_omnia/turris_omnia.c b/board/CZ.NIC/turris_omnia/turris_omnia.c index 7a51ed3ace5..46f576a460e 100644 --- a/board/CZ.NIC/turris_omnia/turris_omnia.c +++ b/board/CZ.NIC/turris_omnia/turris_omnia.c @@ -75,6 +75,9 @@ enum mcu_commands { /* available if EXT_CMD bit set in features */ CMD_EXT_CONTROL = 0x12, + /* available if CRYPTO bit set in features */ + CMD_CRYPTO_GET_PUBLIC_KEY = 0x29, + /* available if BOARD_INFO it set in features */ CMD_BOARD_INFO_GET = 0x2c, }; @@ -94,6 +97,7 @@ enum status_word_bits { enum features_e { FEAT_PERIPH_MCU = BIT(0), FEAT_EXT_CMDS = BIT(1), + FEAT_CRYPTO = BIT(14), FEAT_BOARD_INFO = BIT(15), }; @@ -285,6 +289,24 @@ static int omnia_mcu_board_info(char *serial, u8 *mac, char *version) return 0; } +static int omnia_mcu_get_board_public_key(char pub_key[static 67]) +{ + u8 reply[34]; + int ret; + + ret = omnia_mcu_read(CMD_CRYPTO_GET_PUBLIC_KEY, reply, sizeof(reply)); + if (ret) + return ret; + + if (reply[0] != 33) + return -EBADMSG; + + bin2hex(pub_key, &reply[1], 33); + reply[66] = '\0'; + + return 0; +} + static void enable_a385_watchdog(unsigned int timeout_minutes) { struct sar_freq_modes sar_freq; @@ -1060,7 +1082,7 @@ int board_late_init(void) int checkboard(void) { - char serial[17], version[4]; + char serial[17], version[4], pub_key[67]; bool has_version; int err; @@ -1080,6 +1102,11 @@ int checkboard(void) printf(" Board version: %s\n", has_version ? version : "unknown"); printf(" Serial Number: %s\n", !err ? serial : "unknown"); + if (omnia_mcu_has_feature(FEAT_CRYPTO)) { + err = omnia_mcu_get_board_public_key(pub_key); + printf(" ECDSA Public Key: %s\n", !err ? pub_key : "unknown"); + } + return 0; } -- 2.43.0

