From a69cb8a95a05b6672f53ec7277afc516dcb4756e Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 25 Nov 2024 12:55:28 +0100 Subject: [PATCH 01/33] Add CCID SET_CLOCK_AND_FREQUENCY command for latest IFD. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index 8c25e9b..6a18e3a 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit 8c25e9be87f5556738550d309358198163111420 +Subproject commit 6a18e3aa833b4b794cd13d01957a32cf494073fb From 78bc34827e551f0f794743f7347de6f420ff0206 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 25 Nov 2024 13:13:31 +0100 Subject: [PATCH 02/33] Autobuild for Pico SDK 2.0.0 Signed-off-by: Pol Henarejos --- workflows/autobuild.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/workflows/autobuild.sh b/workflows/autobuild.sh index d90e1a4..9b3ceae 100755 --- a/workflows/autobuild.sh +++ b/workflows/autobuild.sh @@ -7,6 +7,7 @@ if [[ $1 == "pico" ]]; then sudo apt install -y cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib git clone https://github.com/raspberrypi/pico-sdk cd pico-sdk +git checkout tags/2.0.0 git submodule update --init cd .. git clone https://github.com/raspberrypi/picotool From e243def565bba6c9492e1447ca61bca13e615b5d Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 25 Nov 2024 15:24:27 +0100 Subject: [PATCH 03/33] Add UP button timeout for PHY. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index 6a18e3a..812f075 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit 6a18e3aa833b4b794cd13d01957a32cf494073fb +Subproject commit 812f075ee4c49b07bce245321f119d71515aa1df From 65a4474dec8ab3bf7e1feca19271707b4562e596 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 25 Nov 2024 23:46:12 +0100 Subject: [PATCH 04/33] Fix build for RP2350. Signed-off-by: Pol Henarejos --- CMakeLists.txt | 2 ++ pico-keys-sdk | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a57b82e..3861ea6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,5 +125,7 @@ if(NOT ESP_PLATFORM) ) endif(APPLE) target_link_libraries(pico_hsm PRIVATE pthread m) + else() + pico_add_extra_outputs(${CMAKE_PROJECT_NAME}) endif() endif() diff --git a/pico-keys-sdk b/pico-keys-sdk index 812f075..a271785 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit 812f075ee4c49b07bce245321f119d71515aa1df +Subproject commit a271785814583757e493bedaab24635a4f8a6a54 From c33ed9b968dc3f9c3723435362fa8001f5e860e7 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 25 Nov 2024 23:59:54 +0100 Subject: [PATCH 05/33] Fix autobuild for Pico SDK 2.1.0 Signed-off-by: Pol Henarejos --- workflows/autobuild.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/autobuild.sh b/workflows/autobuild.sh index 9b3ceae..66c978f 100755 --- a/workflows/autobuild.sh +++ b/workflows/autobuild.sh @@ -7,7 +7,7 @@ if [[ $1 == "pico" ]]; then sudo apt install -y cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib git clone https://github.com/raspberrypi/pico-sdk cd pico-sdk -git checkout tags/2.0.0 +git checkout tags/2.1.0 git submodule update --init cd .. git clone https://github.com/raspberrypi/picotool From a242a28394ca1fcbd4d5cbfe1037da95f176d908 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Wed, 27 Nov 2024 16:11:18 +0100 Subject: [PATCH 06/33] Fix disable secure aut. Signed-off-by: Pol Henarejos --- tools/pico-hsm-tool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pico-hsm-tool.py b/tools/pico-hsm-tool.py index 283da53..944b6b3 100644 --- a/tools/pico-hsm-tool.py +++ b/tools/pico-hsm-tool.py @@ -367,7 +367,7 @@ class SecureLock: def disable_device_aut(self): ct = self.get_skey() - self.picohsm.send(cla=0x80, command=0x64, p1=0x3A, p2=0x04, p3=list(ct)) + self.picohsm.send(cla=0x80, command=0x64, p1=0x3A, p2=0x04, data=list(ct)) def secure(picohsm, args): slck = SecureLock(picohsm) From 866aac8fe33612982c968270d4d5134ed4554287 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Wed, 27 Nov 2024 21:48:04 +0100 Subject: [PATCH 07/33] Add reboot extra command. Signed-off-by: Pol Henarejos --- src/hsm/cmd_extras.c | 10 ++++++++++ tools/pico-hsm-tool.py | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/src/hsm/cmd_extras.c b/src/hsm/cmd_extras.c index f0b6d58..cce598b 100644 --- a/src/hsm/cmd_extras.c +++ b/src/hsm/cmd_extras.c @@ -19,6 +19,7 @@ #include "mbedtls/ecdh.h" #ifdef PICO_PLATFORM #include "pico/aon_timer.h" +#include "hardware/watchdog.h" #else #include #include @@ -35,6 +36,7 @@ #define CMD_DATETIME 0xA #define CMD_DYNOPS 0x6 #define CMD_SECURE_LOCK 0x3A +#define CMD_REBOOT 0xFB #define SECURE_LOCK_KEY_AGREEMENT 0x1 #define SECURE_LOCK_ENABLE 0x2 #define SECURE_LOCK_MASK 0x3 @@ -287,6 +289,14 @@ int cmd_extras() { } } } +#endif +#ifdef PICO_PLATFORM + else if (P1(apdu) == CMD_REBOOT) { + if (apdu.nc != 0) { + return SW_WRONG_LENGTH(); + } + watchdog_reboot(0, 0, 100); + } #endif else { return SW_INCORRECT_P1P2(); diff --git a/tools/pico-hsm-tool.py b/tools/pico-hsm-tool.py index 944b6b3..95ea01a 100644 --- a/tools/pico-hsm-tool.py +++ b/tools/pico-hsm-tool.py @@ -149,6 +149,8 @@ def parse_args(): parser_otp.add_argument('--lock', help='Lock & protect (no other firmwares can be loaded)', action='store_true') parser_otp.add_argument('--index', help='Bootkey index [0-3]', type=int, default=0, choices=[0, 1, 2, 3]) + parser_reboot = subparser.add_parser('reboot', help='Reboots the Pico HSM.') + args = parser.parse_args() return args @@ -507,6 +509,9 @@ def otp(picohsm, args): elif (args.subcommand == 'secure_boot'): picohsm.secure_boot(BOOTKEY, bootkey_index=args.index, lock=args.lock) +def reboot(picohsm, args): + picohsm.reboot() + def main(args): sys.stderr.buffer.write(b'Pico HSM Tool v2.0\n') sys.stderr.buffer.write(b'Author: Pol Henarejos\n') @@ -537,6 +542,8 @@ def main(args): phy(picohsm, args) elif (args.command == 'otp'): otp(picohsm, args) + elif (args.command == 'reboot'): + reboot(picohsm, args) def run(): args = parse_args() From f88aad1e2cbe0a29ea37db3f9e871ec571cae833 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Tue, 3 Dec 2024 08:36:05 +0100 Subject: [PATCH 08/33] Fixed buffer overflow when unlocking the device. Fixes #68. Signed-off-by: Pol Henarejos --- src/hsm/cmd_extras.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hsm/cmd_extras.c b/src/hsm/cmd_extras.c index cce598b..9c2cfe5 100644 --- a/src/hsm/cmd_extras.c +++ b/src/hsm/cmd_extras.c @@ -197,7 +197,7 @@ int cmd_extras() { low_flash_available(); } else if (P2(apdu) == SECURE_LOCK_MASK) { - memcpy(mkek_mask, apdu.data, apdu.nc); + memcpy(mkek_mask, apdu.data, MKEK_KEY_SIZE); has_mkek_mask = true; } } From 053ccf4a8947ca44b4ed40b99f49a198a55cfe39 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Tue, 3 Dec 2024 08:47:44 +0100 Subject: [PATCH 09/33] Fix esp32 build. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index a271785..e9875b3 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit a271785814583757e493bedaab24635a4f8a6a54 +Subproject commit e9875b358c6f59b6440722f87a095b9a3844d1bc From 859dec7e4af5ba73b18fe37c610c6c97adbed29a Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Sun, 8 Dec 2024 01:23:51 +0100 Subject: [PATCH 10/33] Accept mkek mask only if secure lock is enabled. Signed-off-by: Pol Henarejos --- src/hsm/cmd_extras.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/hsm/cmd_extras.c b/src/hsm/cmd_extras.c index 9c2cfe5..4641411 100644 --- a/src/hsm/cmd_extras.c +++ b/src/hsm/cmd_extras.c @@ -162,13 +162,12 @@ int cmd_extras() { if (mse.init == false) { return SW_COMMAND_NOT_ALLOWED(); } - + uint16_t opts = get_device_options(); int ret = mse_decrypt_ct(apdu.data, apdu.nc); if (ret != 0) { return SW_WRONG_DATA(); } if (P2(apdu) == SECURE_LOCK_ENABLE || P2(apdu) == SECURE_LOCK_DISABLE) { // Enable - uint16_t opts = get_device_options(); uint8_t newopts[] = { opts >> 8, (opts & 0xff) }; if ((P2(apdu) == SECURE_LOCK_ENABLE && !(opts & HSM_OPT_SECURE_LOCK)) || (P2(apdu) == SECURE_LOCK_DISABLE && (opts & HSM_OPT_SECURE_LOCK))) { @@ -196,7 +195,7 @@ int cmd_extras() { file_put_data(tf, newopts, sizeof(newopts)); low_flash_available(); } - else if (P2(apdu) == SECURE_LOCK_MASK) { + else if (P2(apdu) == SECURE_LOCK_MASK && (opts & HSM_OPT_SECURE_LOCK)) { memcpy(mkek_mask, apdu.data, MKEK_KEY_SIZE); has_mkek_mask = true; } From 320455815f95c949cb84415304d73d7cb3b57761 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Sun, 8 Dec 2024 01:24:35 +0100 Subject: [PATCH 11/33] Only allow initialize if secure lock is disabled or has mkek mask. Signed-off-by: Pol Henarejos --- src/hsm/cmd_initialize.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hsm/cmd_initialize.c b/src/hsm/cmd_initialize.c index 5137da7..0f513fb 100644 --- a/src/hsm/cmd_initialize.c +++ b/src/hsm/cmd_initialize.c @@ -43,10 +43,14 @@ extern void reset_puk_store(); int cmd_initialize() { if (apdu.nc > 0) { uint8_t mkek[MKEK_SIZE]; + uint16_t opts = get_device_options(); + if (opts & HSM_OPT_SECURE_LOCK && !has_mkek_mask) { + return SW_SECURITY_STATUS_NOT_SATISFIED(); + } int ret_mkek = load_mkek(mkek); //Try loading MKEK with previous session initialize_flash(true); scan_all(); - has_session_pin = has_session_sopin = false; + has_session_pin = has_session_sopin = has_mkek_mask = false; uint16_t tag = 0x0; uint8_t *tag_data = NULL, *p = NULL, *kds = NULL, *dkeks = NULL; uint16_t tag_len = 0; From ff7ef56cdafd89300ee7f38a47d3e7dcbc8da924 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Sun, 8 Dec 2024 01:25:19 +0100 Subject: [PATCH 12/33] Dev options file must be persistent, since it manipulates MKEK which is in turn persistent. Signed-off-by: Pol Henarejos --- src/hsm/files.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hsm/files.c b/src/hsm/files.c index cefc844..ef06e42 100644 --- a/src/hsm/files.c +++ b/src/hsm/files.c @@ -61,7 +61,7 @@ file_t file_entries[] = { .type = FILE_TYPE_INTERNAL_EF | FILE_DATA_FLASH, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = { 0xff } }, //retries PIN (SOPIN) /* 15 */ { .fid = EF_DEVOPS, .parent = 5, .name = NULL, - .type = FILE_TYPE_INTERNAL_EF | FILE_DATA_FLASH, .data = NULL, + .type = FILE_TYPE_INTERNAL_EF | FILE_DATA_FLASH | FILE_PERSISTENT, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = { 0xff } }, //Device options /* 16 */ { .fid = EF_PRKDFS, .parent = 5, .name = NULL, .type = FILE_TYPE_WORKING_EF, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = { 0 } }, //EF.PrKDFs From 3d960b931a697f1e67bc7d1597274dce99a59c57 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Sun, 8 Dec 2024 01:25:31 +0100 Subject: [PATCH 13/33] Fix MKEK masking order. Fixes #69. Signed-off-by: Pol Henarejos --- src/hsm/kek.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/hsm/kek.c b/src/hsm/kek.c index b22de83..2b8b1ac 100644 --- a/src/hsm/kek.c +++ b/src/hsm/kek.c @@ -50,6 +50,14 @@ uint32_t crc32c(const uint8_t *buf, size_t len) { return ~crc; } +void mkek_masked(uint8_t *mkek, const uint8_t *mask) { + if (mask) { + for (int i = 0; i < MKEK_KEY_SIZE; i++) { + MKEK_KEY(mkek)[i] ^= mask[i]; + } + } +} + int load_mkek(uint8_t *mkek) { if (has_session_pin == false && has_session_sopin == false) { return PICOKEY_NO_LOGIN; @@ -73,6 +81,10 @@ int load_mkek(uint8_t *mkek) { return PICOKEY_EXEC_ERROR; } + if (has_mkek_mask) { + mkek_masked(mkek, mkek_mask); + } + int ret = aes_decrypt_cfb_256(pin, MKEK_IV(mkek), MKEK_KEY(mkek), MKEK_KEY_SIZE + MKEK_KEY_CS_SIZE); if (ret != 0) { return PICOKEY_EXEC_ERROR; @@ -80,11 +92,8 @@ int load_mkek(uint8_t *mkek) { if (crc32c(MKEK_KEY(mkek), MKEK_KEY_SIZE) != *(uint32_t *) MKEK_CHECKSUM(mkek)) { return PICOKEY_WRONG_DKEK; } - if (has_mkek_mask || otp_key_1) { - const uint8_t *mask = otp_key_1 ? otp_key_1 : mkek_mask; - for (int i = 0; i < MKEK_KEY_SIZE; i++) { - MKEK_KEY(mkek)[i] ^= mask[i]; - } + if (otp_key_1) { + mkek_masked(mkek, otp_key_1); } return PICOKEY_OK; } From 07d9e225d24aaf958dcd61d318725f599c3fd94a Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 16 Dec 2024 13:12:11 +0100 Subject: [PATCH 14/33] Use PHY value for LED GPIO number. Fixes #71. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index e9875b3..6859ced 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit e9875b358c6f59b6440722f87a095b9a3844d1bc +Subproject commit 6859cedcbf7a98227bd530a40152d9fde7332a73 From 74b635fa3cdd91a825ed57935bd49dd47bb3ae3e Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 23 Dec 2024 20:12:15 +0100 Subject: [PATCH 15/33] Increase TinyUSB task stack size. Signed-off-by: Pol Henarejos --- sdkconfig.defaults | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdkconfig.defaults b/sdkconfig.defaults index e944bdf..08fa973 100755 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -3,6 +3,9 @@ # IGNORE_UNKNOWN_FILES_FOR_MANAGED_COMPONENTS=y +CONFIG_TINYUSB=y +CONFIG_TINYUSB_TASK_STACK_SIZE=16384 + CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="pico-keys-sdk/config/esp32/partitions.csv" CONFIG_PARTITION_TABLE_FILENAME="pico-keys-sdk/config/esp32/partitions.csv" From d56b5403247988483282e9070dfc591ebd42e87c Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 23 Dec 2024 20:24:10 +0100 Subject: [PATCH 16/33] Add support for displaying memory usage. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- src/hsm/cmd_extras.c | 40 +++++++++++++++++++++++++++++++++------- tools/pico-hsm-tool.py | 15 ++++++++++++++- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index 6859ced..ffaf20d 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit 6859cedcbf7a98227bd530a40152d9fde7332a73 +Subproject commit ffaf20da5d65a2dfc6c92026014f818ec9382f21 diff --git a/src/hsm/cmd_extras.c b/src/hsm/cmd_extras.c index 4641411..aa0de9c 100644 --- a/src/hsm/cmd_extras.c +++ b/src/hsm/cmd_extras.c @@ -43,11 +43,13 @@ #define SECURE_LOCK_DISABLE 0x4 #define CMD_PHY 0x1B #define CMD_OTP 0x4C +#define CMD_MEMORY 0x5 int cmd_extras() { + int cmd = P1(apdu); #ifndef ENABLE_EMULATION // Only allow change PHY without PIN - if (!isUserAuthenticated && P1(apdu) != 0x1B) { + if (!isUserAuthenticated && cmd != CMD_PHY && cmd != CMD_MEMORY) { return SW_SECURITY_STATUS_NOT_SATISFIED(); } #endif @@ -55,7 +57,7 @@ int cmd_extras() { if (wait_button_pressed() == true) { return SW_SECURE_MESSAGE_EXEC_ERROR(); } - if (P1(apdu) == CMD_DATETIME) { //datetime operations + if (cmd == CMD_DATETIME) { //datetime operations if (P2(apdu) != 0x0) { return SW_INCORRECT_P1P2(); } @@ -99,7 +101,7 @@ int cmd_extras() { #endif } } - else if (P1(apdu) == CMD_DYNOPS) { //dynamic options + else if (cmd == CMD_DYNOPS) { //dynamic options if (P2(apdu) != 0x0) { return SW_INCORRECT_P1P2(); } @@ -118,7 +120,7 @@ int cmd_extras() { low_flash_available(); } } - else if (P1(apdu) == CMD_SECURE_LOCK) { // secure lock + else if (cmd == CMD_SECURE_LOCK) { // secure lock if (apdu.nc == 0) { return SW_WRONG_LENGTH(); } @@ -202,7 +204,7 @@ int cmd_extras() { } } #ifndef ENABLE_EMULATION - else if (P1(apdu) == CMD_PHY) { // Set PHY + else if (cmd == CMD_PHY) { // Set PHY if (apdu.nc == 0) { if (file_has_data(ef_phy)) { res_APDU_size = file_get_size(ef_phy); @@ -247,7 +249,7 @@ int cmd_extras() { } #endif #if PICO_RP2350 - else if (P1(apdu) == CMD_OTP) { + else if (cmd == CMD_OTP) { if (apdu.nc < 2) { return SW_WRONG_LENGTH(); } @@ -290,13 +292,37 @@ int cmd_extras() { } #endif #ifdef PICO_PLATFORM - else if (P1(apdu) == CMD_REBOOT) { + else if (cmd == CMD_REBOOT) { if (apdu.nc != 0) { return SW_WRONG_LENGTH(); } watchdog_reboot(0, 0, 100); } #endif + else if (cmd == CMD_MEMORY) { + res_APDU_size = 0; + uint32_t free = flash_free_space(), total = flash_total_space(), used = flash_used_space(), nfiles = flash_num_files(), size = flash_size(); + res_APDU[res_APDU_size++] = free >> 24; + res_APDU[res_APDU_size++] = free >> 16; + res_APDU[res_APDU_size++] = free >> 8; + res_APDU[res_APDU_size++] = free; + res_APDU[res_APDU_size++] = used >> 24; + res_APDU[res_APDU_size++] = used >> 16; + res_APDU[res_APDU_size++] = used >> 8; + res_APDU[res_APDU_size++] = used; + res_APDU[res_APDU_size++] = total >> 24; + res_APDU[res_APDU_size++] = total >> 16; + res_APDU[res_APDU_size++] = total >> 8; + res_APDU[res_APDU_size++] = total; + res_APDU[res_APDU_size++] = nfiles >> 24; + res_APDU[res_APDU_size++] = nfiles >> 16; + res_APDU[res_APDU_size++] = nfiles >> 8; + res_APDU[res_APDU_size++] = nfiles; + res_APDU[res_APDU_size++] = size >> 24; + res_APDU[res_APDU_size++] = size >> 16; + res_APDU[res_APDU_size++] = size >> 8; + res_APDU[res_APDU_size++] = size; + } else { return SW_INCORRECT_P1P2(); } diff --git a/tools/pico-hsm-tool.py b/tools/pico-hsm-tool.py index 95ea01a..97af316 100644 --- a/tools/pico-hsm-tool.py +++ b/tools/pico-hsm-tool.py @@ -151,6 +151,8 @@ def parse_args(): parser_reboot = subparser.add_parser('reboot', help='Reboots the Pico HSM.') + parser_memory = subparser.add_parser('memory', help='Get memory usage.') + args = parser.parse_args() return args @@ -512,8 +514,17 @@ def otp(picohsm, args): def reboot(picohsm, args): picohsm.reboot() +def memory(picohsm, args): + mem = picohsm.memory() + print(f'Memory usage:') + print(f'\tFree: {mem["free"]/1024:.2f} kilobytes ({mem["free"]*100/mem["total"]:.2f}%)') + print(f'\tUsed: {mem["used"]/1024:.2f} kilobytes ({mem["used"]*100/mem["total"]:.2f}%)') + print(f'\tTotal: {mem["total"]/1024:.2f} kilobytes') + print(f'\tFlash size: {mem["size"]/1024:.2f} kilobytes') + print(f'\tFiles: {mem["files"]}') + def main(args): - sys.stderr.buffer.write(b'Pico HSM Tool v2.0\n') + sys.stderr.buffer.write(b'Pico HSM Tool v2.2\n') sys.stderr.buffer.write(b'Author: Pol Henarejos\n') sys.stderr.buffer.write(b'Report bugs to https://github.com/polhenarejos/pico-hsm/issues\n') sys.stderr.buffer.write(b'\n\n') @@ -544,6 +555,8 @@ def main(args): otp(picohsm, args) elif (args.command == 'reboot'): reboot(picohsm, args) + elif (args.command == 'memory'): + memory(picohsm, args) def run(): args = parse_args() From 73232b6de425941a5da3cd5f953f1a4ad44fe89a Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 23 Dec 2024 20:39:03 +0100 Subject: [PATCH 17/33] Add LE/BE functions for uint16, 32 and 64. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- src/hsm/cmd_cipher_sym.c | 5 +-- src/hsm/cmd_extras.c | 30 ++++++----------- src/hsm/cmd_initialize.c | 6 ++-- src/hsm/cmd_read_binary.c | 4 +-- src/hsm/cmd_select.c | 2 +- src/hsm/kek.c | 70 +++++++++++++++++++-------------------- src/hsm/sc_hsm.c | 6 +--- 8 files changed, 53 insertions(+), 72 deletions(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index ffaf20d..3f541f1 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit ffaf20da5d65a2dfc6c92026014f818ec9382f21 +Subproject commit 3f541f13d536aee190bd61f1603f11044535d2ff diff --git a/src/hsm/cmd_cipher_sym.c b/src/hsm/cmd_cipher_sym.c index bcd714f..61739bf 100644 --- a/src/hsm/cmd_cipher_sym.c +++ b/src/hsm/cmd_cipher_sym.c @@ -143,10 +143,7 @@ int mbedtls_ansi_x963_kdf(mbedtls_md_type_t md_type, mbedtls_md_update(&md_ctx, input, input_len); //TODO: be careful with architecture little vs. big - counter_buf[0] = (uint8_t) ((counter >> 24) & 0xff); - counter_buf[1] = (uint8_t) ((counter >> 16) & 0xff); - counter_buf[2] = (uint8_t) ((counter >> 8) & 0xff); - counter_buf[3] = (uint8_t) ((counter >> 0) & 0xff); + put_uint32_t_be(counter, counter_buf); mbedtls_md_update(&md_ctx, counter_buf, 4); diff --git a/src/hsm/cmd_extras.c b/src/hsm/cmd_extras.c index aa0de9c..bacebce 100644 --- a/src/hsm/cmd_extras.c +++ b/src/hsm/cmd_extras.c @@ -302,26 +302,16 @@ int cmd_extras() { else if (cmd == CMD_MEMORY) { res_APDU_size = 0; uint32_t free = flash_free_space(), total = flash_total_space(), used = flash_used_space(), nfiles = flash_num_files(), size = flash_size(); - res_APDU[res_APDU_size++] = free >> 24; - res_APDU[res_APDU_size++] = free >> 16; - res_APDU[res_APDU_size++] = free >> 8; - res_APDU[res_APDU_size++] = free; - res_APDU[res_APDU_size++] = used >> 24; - res_APDU[res_APDU_size++] = used >> 16; - res_APDU[res_APDU_size++] = used >> 8; - res_APDU[res_APDU_size++] = used; - res_APDU[res_APDU_size++] = total >> 24; - res_APDU[res_APDU_size++] = total >> 16; - res_APDU[res_APDU_size++] = total >> 8; - res_APDU[res_APDU_size++] = total; - res_APDU[res_APDU_size++] = nfiles >> 24; - res_APDU[res_APDU_size++] = nfiles >> 16; - res_APDU[res_APDU_size++] = nfiles >> 8; - res_APDU[res_APDU_size++] = nfiles; - res_APDU[res_APDU_size++] = size >> 24; - res_APDU[res_APDU_size++] = size >> 16; - res_APDU[res_APDU_size++] = size >> 8; - res_APDU[res_APDU_size++] = size; + put_uint32_t_be(free, res_APDU + res_APDU_size); + res_APDU_size += 4; + put_uint32_t_be(used, res_APDU + res_APDU_size); + res_APDU_size += 4; + put_uint32_t_be(total, res_APDU + res_APDU_size); + res_APDU_size += 4; + put_uint32_t_be(nfiles, res_APDU + res_APDU_size); + res_APDU_size += 4; + put_uint32_t_be(size, res_APDU + res_APDU_size); + res_APDU_size += 4; } else { return SW_INCORRECT_P1P2(); diff --git a/src/hsm/cmd_initialize.c b/src/hsm/cmd_initialize.c index 0f513fb..9a62f66 100644 --- a/src/hsm/cmd_initialize.c +++ b/src/hsm/cmd_initialize.c @@ -247,10 +247,8 @@ int cmd_initialize() { } else { //free memory bytes request int heap_left = heapLeft(); - res_APDU[0] = ((heap_left >> 24) & 0xff); - res_APDU[1] = ((heap_left >> 16) & 0xff); - res_APDU[2] = ((heap_left >> 8) & 0xff); - res_APDU[3] = ((heap_left >> 0) & 0xff); + put_uint32_t_be(heap_left, res_APDU); + res_APDU_size = 4; res_APDU[4] = 0; res_APDU[5] = HSM_VERSION_MAJOR; res_APDU[6] = HSM_VERSION_MINOR; diff --git a/src/hsm/cmd_read_binary.c b/src/hsm/cmd_read_binary.c index 513f348..3d6c887 100644 --- a/src/hsm/cmd_read_binary.c +++ b/src/hsm/cmd_read_binary.c @@ -30,7 +30,7 @@ int cmd_read_binary() { offset = p2; } else { - offset = make_uint16_t(p1, p2) & 0x7fff; + offset = make_uint16_t_be(p1, p2) & 0x7fff; ef = currentEF; } } @@ -41,7 +41,7 @@ int cmd_read_binary() { } } else { - uint16_t file_id = make_uint16_t(p1, p2); // & 0x7fff; + uint16_t file_id = make_uint16_t_be(p1, p2); // & 0x7fff; if (file_id == 0x0) { ef = currentEF; } diff --git a/src/hsm/cmd_select.c b/src/hsm/cmd_select.c index 05bd4d1..555f7b5 100644 --- a/src/hsm/cmd_select.c +++ b/src/hsm/cmd_select.c @@ -48,7 +48,7 @@ int cmd_select() { //} if (apdu.nc == 2) { - fid = get_uint16_t(apdu.data, 0); + fid = get_uint16_t_be(apdu.data, 0); } //if ((fid & 0xff00) == (KEY_PREFIX << 8)) diff --git a/src/hsm/kek.c b/src/hsm/kek.c index 2b8b1ac..2aeb62a 100644 --- a/src/hsm/kek.c +++ b/src/hsm/kek.c @@ -328,7 +328,7 @@ int dkek_encode_key(uint8_t id, void *key_ctx, int key_type, uint8_t *out, uint1 return PICOKEY_WRONG_LENGTH; } - put_uint16_t(kb_len, kb + 8); + put_uint16_t_be(kb_len, kb + 8); memcpy(kb + 10, key_ctx, kb_len); kb_len += 2; @@ -341,15 +341,15 @@ int dkek_encode_key(uint8_t id, void *key_ctx, int key_type, uint8_t *out, uint1 } mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) key_ctx; kb_len = 0; - put_uint16_t((uint16_t)mbedtls_rsa_get_len(rsa) * 8, kb + 8 + kb_len); kb_len += 2; + put_uint16_t_be((uint16_t)mbedtls_rsa_get_len(rsa) * 8, kb + 8 + kb_len); kb_len += 2; - put_uint16_t((uint16_t)mbedtls_mpi_size(&rsa->D), kb + 8 + kb_len); kb_len += 2; + put_uint16_t_be((uint16_t)mbedtls_mpi_size(&rsa->D), kb + 8 + kb_len); kb_len += 2; mbedtls_mpi_write_binary(&rsa->D, kb + 8 + kb_len, mbedtls_mpi_size(&rsa->D)); kb_len += (uint16_t)mbedtls_mpi_size(&rsa->D); - put_uint16_t((uint16_t)mbedtls_mpi_size(&rsa->N), kb + 8 + kb_len); kb_len += 2; + put_uint16_t_be((uint16_t)mbedtls_mpi_size(&rsa->N), kb + 8 + kb_len); kb_len += 2; mbedtls_mpi_write_binary(&rsa->N, kb + 8 + kb_len, mbedtls_mpi_size(&rsa->N)); kb_len += (uint16_t)mbedtls_mpi_size(&rsa->N); - put_uint16_t((uint16_t)mbedtls_mpi_size(&rsa->E), kb + 8 + kb_len); kb_len += 2; + put_uint16_t_be((uint16_t)mbedtls_mpi_size(&rsa->E), kb + 8 + kb_len); kb_len += 2; mbedtls_mpi_write_binary(&rsa->E, kb + 8 + kb_len, mbedtls_mpi_size(&rsa->E)); kb_len += (uint16_t)mbedtls_mpi_size(&rsa->E); @@ -362,31 +362,31 @@ int dkek_encode_key(uint8_t id, void *key_ctx, int key_type, uint8_t *out, uint1 } mbedtls_ecdsa_context *ecdsa = (mbedtls_ecdsa_context *) key_ctx; kb_len = 0; - put_uint16_t((uint16_t)mbedtls_mpi_size(&ecdsa->grp.P) * 8, kb + 8 + kb_len); kb_len += 2; - put_uint16_t((uint16_t)mbedtls_mpi_size(&ecdsa->grp.A), kb + 8 + kb_len); kb_len += 2; + put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.P) * 8, kb + 8 + kb_len); kb_len += 2; + put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.A), kb + 8 + kb_len); kb_len += 2; mbedtls_mpi_write_binary(&ecdsa->grp.A, kb + 8 + kb_len, mbedtls_mpi_size(&ecdsa->grp.A)); kb_len += (uint16_t)mbedtls_mpi_size(&ecdsa->grp.A); - put_uint16_t((uint16_t)mbedtls_mpi_size(&ecdsa->grp.B), kb + 8 + kb_len); kb_len += 2; + put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.B), kb + 8 + kb_len); kb_len += 2; mbedtls_mpi_write_binary(&ecdsa->grp.B, kb + 8 + kb_len, mbedtls_mpi_size(&ecdsa->grp.B)); kb_len += (uint16_t)mbedtls_mpi_size(&ecdsa->grp.B); - put_uint16_t((uint16_t)mbedtls_mpi_size(&ecdsa->grp.P), kb + 8 + kb_len); kb_len += 2; + put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.P), kb + 8 + kb_len); kb_len += 2; mbedtls_mpi_write_binary(&ecdsa->grp.P, kb + 8 + kb_len, mbedtls_mpi_size(&ecdsa->grp.P)); kb_len += (uint16_t)mbedtls_mpi_size(&ecdsa->grp.P); - put_uint16_t((uint16_t)mbedtls_mpi_size(&ecdsa->grp.N), kb + 8 + kb_len); kb_len += 2; + put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.N), kb + 8 + kb_len); kb_len += 2; mbedtls_mpi_write_binary(&ecdsa->grp.N, kb + 8 + kb_len, mbedtls_mpi_size(&ecdsa->grp.N)); kb_len += (uint16_t)mbedtls_mpi_size(&ecdsa->grp.N); size_t olen = 0; mbedtls_ecp_point_write_binary(&ecdsa->grp, &ecdsa->grp.G, MBEDTLS_ECP_PF_UNCOMPRESSED, &olen, kb + 8 + kb_len + 2, sizeof(kb) - 8 - kb_len - 2); - put_uint16_t((uint16_t)olen, kb + 8 + kb_len); + put_uint16_t_be((uint16_t)olen, kb + 8 + kb_len); kb_len += 2 + (uint16_t)olen; - put_uint16_t((uint16_t)mbedtls_mpi_size(&ecdsa->d), kb + 8 + kb_len); kb_len += 2; + put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->d), kb + 8 + kb_len); kb_len += 2; mbedtls_mpi_write_binary(&ecdsa->d, kb + 8 + kb_len, mbedtls_mpi_size(&ecdsa->d)); kb_len += (uint16_t)mbedtls_mpi_size(&ecdsa->d); mbedtls_ecp_point_write_binary(&ecdsa->grp, &ecdsa->Q, MBEDTLS_ECP_PF_UNCOMPRESSED, &olen, kb + 8 + kb_len + 2, sizeof(kb) - 8 - kb_len - 2); - put_uint16_t((uint16_t)olen, kb + 8 + kb_len); + put_uint16_t_be((uint16_t)olen, kb + 8 + kb_len); kb_len += 2 + (uint16_t)olen; algo = (uint8_t *) "\x00\x0A\x04\x00\x7F\x00\x07\x02\x02\x02\x02\x03"; @@ -418,7 +418,7 @@ int dkek_encode_key(uint8_t id, void *key_ctx, int key_type, uint8_t *out, uint1 } if (allowed && allowed_len > 0) { - put_uint16_t(allowed_len, out + *out_len); *out_len += 2; + put_uint16_t_be(allowed_len, out + *out_len); *out_len += 2; memcpy(out + *out_len, allowed, allowed_len); *out_len += allowed_len; } @@ -526,21 +526,21 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le uint16_t ofs = 9; //OID - uint16_t len = get_uint16_t(in, ofs); + uint16_t len = get_uint16_t_be(in, ofs); ofs += len + 2; //Allowed algorithms - len = get_uint16_t(in, ofs); + len = get_uint16_t_be(in, ofs); *allowed = (uint8_t *) (in + ofs + 2); *allowed_len = len; ofs += len + 2; //Access conditions - len = get_uint16_t(in, ofs); + len = get_uint16_t_be(in, ofs); ofs += len + 2; //Key OID - len = get_uint16_t(in, ofs); + len = get_uint16_t_be(in, ofs); ofs += len + 2; if ((in_len - 16 - ofs) % 16 != 0) { @@ -554,7 +554,7 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le return r; } - int key_size = get_uint16_t(kb, 8); + int key_size = get_uint16_t_be(kb, 8); if (key_size_out) { *key_size_out = key_size; } @@ -563,14 +563,14 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) key_ctx; mbedtls_rsa_init(rsa); if (key_type == 5) { - len = get_uint16_t(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb, ofs); ofs += 2; r = mbedtls_mpi_read_binary(&rsa->D, kb + ofs, len); ofs += len; if (r != 0) { mbedtls_rsa_free(rsa); return PICOKEY_WRONG_DATA; } - len = get_uint16_t(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb, ofs); ofs += 2; r = mbedtls_mpi_read_binary(&rsa->N, kb + ofs, len); ofs += len; if (r != 0) { mbedtls_rsa_free(rsa); @@ -579,12 +579,12 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le } else if (key_type == 6) { //DP-1 - len = get_uint16_t(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb, ofs); ofs += len + 2; //DQ-1 - len = get_uint16_t(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb, ofs); ofs += len + 2; - len = get_uint16_t(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb, ofs); ofs += 2; r = mbedtls_mpi_read_binary(&rsa->P, kb + ofs, len); ofs += len; if (r != 0) { mbedtls_rsa_free(rsa); @@ -592,19 +592,19 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le } //PQ - len = get_uint16_t(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb, ofs); ofs += len + 2; - len = get_uint16_t(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb, ofs); ofs += 2; r = mbedtls_mpi_read_binary(&rsa->Q, kb + ofs, len); ofs += len; if (r != 0) { mbedtls_rsa_free(rsa); return PICOKEY_WRONG_DATA; } //N - len = get_uint16_t(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb, ofs); ofs += len + 2; } - len = get_uint16_t(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb, ofs); ofs += 2; r = mbedtls_mpi_read_binary(&rsa->E, kb + ofs, len); ofs += len; if (r != 0) { mbedtls_rsa_free(rsa); @@ -642,13 +642,13 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le mbedtls_ecdsa_init(ecdsa); //A - len = get_uint16_t(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb, ofs); ofs += len + 2; //B - len = get_uint16_t(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb, ofs); ofs += len + 2; //P - len = get_uint16_t(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb, ofs); ofs += 2; mbedtls_ecp_group_id ec_id = ec_get_curve_from_prime(kb + ofs, len); if (ec_id == MBEDTLS_ECP_DP_NONE) { mbedtls_ecdsa_free(ecdsa); @@ -657,13 +657,13 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le ofs += len; //N - len = get_uint16_t(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb, ofs); ofs += len + 2; //G - len = get_uint16_t(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb, ofs); ofs += len + 2; //d - len = get_uint16_t(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb, ofs); ofs += 2; r = mbedtls_ecp_read_key(ec_id, ecdsa, kb + ofs, len); if (r != 0) { mbedtls_ecdsa_free(ecdsa); @@ -672,7 +672,7 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le ofs += len; //Q - len = get_uint16_t(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb, ofs); ofs += 2; r = mbedtls_ecp_point_read_binary(&ecdsa->grp, &ecdsa->Q, kb + ofs, len); if (r != 0) { r = mbedtls_ecp_mul(&ecdsa->grp, &ecdsa->Q, &ecdsa->d, &ecdsa->grp.G, random_gen, NULL); diff --git a/src/hsm/sc_hsm.c b/src/hsm/sc_hsm.c index b41ab83..a0bb47c 100644 --- a/src/hsm/sc_hsm.c +++ b/src/hsm/sc_hsm.c @@ -501,11 +501,7 @@ uint32_t decrement_key_counter(file_t *fkey) { uint32_t val = (tag_data[0] << 24) | (tag_data[1] << 16) | (tag_data[2] << 8) | tag_data[3]; val--; - tag_data[0] = (val >> 24) & 0xff; - tag_data[1] = (val >> 16) & 0xff; - tag_data[2] = (val >> 8) & 0xff; - tag_data[3] = val & 0xff; - + put_uint32_t_be(val, tag_data); int r = meta_add(fkey->fid, cmeta, (uint16_t)meta_size); free(cmeta); if (r != 0) { From 2a3ac550ec36a1135440b046e031fea20e3ef8f4 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 23 Dec 2024 20:40:11 +0100 Subject: [PATCH 18/33] Pack file struct. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index 3f541f1..d530ea6 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit 3f541f13d536aee190bd61f1603f11044535d2ff +Subproject commit d530ea69797a3c91063ab0411840c0be384d70d1 From 6d516b1b783bebb57d033f753209cb7a053b2f84 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 23 Dec 2024 21:01:12 +0100 Subject: [PATCH 19/33] Use BE/LE functions for packing uint16. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- src/hsm/cmd_extras.c | 8 ++++---- src/hsm/cmd_list_keys.c | 8 ++++---- src/hsm/cmd_select.c | 4 ++-- src/hsm/cvc.c | 11 +++++------ 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index d530ea6..d78e977 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit d530ea69797a3c91063ab0411840c0be384d70d1 +Subproject commit d78e97792682d2bfc73fade50fce74683680571e diff --git a/src/hsm/cmd_extras.c b/src/hsm/cmd_extras.c index bacebce..84623cd 100644 --- a/src/hsm/cmd_extras.c +++ b/src/hsm/cmd_extras.c @@ -70,8 +70,8 @@ int cmd_extras() { gettimeofday(&tv, NULL); #endif struct tm *tm = localtime(&tv.tv_sec); - res_APDU[res_APDU_size++] = (tm->tm_year + 1900) >> 8; - res_APDU[res_APDU_size++] = (tm->tm_year + 1900) & 0xff; + put_uint16_t_be(tm->tm_year + 1900, res_APDU); + res_APDU_size += 2; res_APDU[res_APDU_size++] = tm->tm_mon; res_APDU[res_APDU_size++] = tm->tm_mday; res_APDU[res_APDU_size++] = tm->tm_wday; @@ -110,8 +110,8 @@ int cmd_extras() { } uint16_t opts = get_device_options(); if (apdu.nc == 0) { - res_APDU[res_APDU_size++] = opts >> 8; - res_APDU[res_APDU_size++] = opts & 0xff; + put_uint16_t_be(opts, res_APDU); + res_APDU_size += 2; } else { uint8_t newopts[] = { apdu.data[0], (opts & 0xff) }; diff --git a/src/hsm/cmd_list_keys.c b/src/hsm/cmd_list_keys.c index 2dcca8a..6ceda5b 100644 --- a/src/hsm/cmd_list_keys.c +++ b/src/hsm/cmd_list_keys.c @@ -22,12 +22,12 @@ int cmd_list_keys() { /* First we send DEV private key */ /* Both below conditions should be always TRUE */ if (search_file(EF_PRKD_DEV)) { - res_APDU[res_APDU_size++] = EF_PRKD_DEV >> 8; - res_APDU[res_APDU_size++] = EF_PRKD_DEV & 0xff; + put_uint16_t_be(EF_PRKD_DEV, res_APDU + res_APDU_size); + res_APDU_size += 2; } if (search_file(EF_KEY_DEV)) { - res_APDU[res_APDU_size++] = EF_KEY_DEV >> 8; - res_APDU[res_APDU_size++] = EF_KEY_DEV & 0xff; + put_uint16_t_be(EF_KEY_DEV, res_APDU + res_APDU_size); + res_APDU_size += 2; } //first CC for (int i = 0; i < dynamic_files; i++) { diff --git a/src/hsm/cmd_select.c b/src/hsm/cmd_select.c index 555f7b5..46c9fb3 100644 --- a/src/hsm/cmd_select.c +++ b/src/hsm/cmd_select.c @@ -119,8 +119,8 @@ int cmd_select() { res_APDU[res_APDU_size++] = 0x85; res_APDU[res_APDU_size++] = 5; uint16_t opts = get_device_options(); - res_APDU[res_APDU_size++] = opts >> 8; - res_APDU[res_APDU_size++] = opts & 0xff; + put_uint16_t_be(opts, res_APDU + res_APDU_size); + res_APDU_size += 2; res_APDU[res_APDU_size++] = 0xFF; res_APDU[res_APDU_size++] = HSM_VERSION_MAJOR; res_APDU[res_APDU_size++] = HSM_VERSION_MINOR; diff --git a/src/hsm/cvc.c b/src/hsm/cvc.c index f91a043..448f5ed 100644 --- a/src/hsm/cvc.c +++ b/src/hsm/cvc.c @@ -421,8 +421,7 @@ uint16_t asn1_build_cert_description(const uint8_t *label, p += format_tlv_len(asn1_len_tag(0x4, sizeof(uint16_t)), p); *p++ = 0x4; p += format_tlv_len(sizeof(uint16_t), p); - *p++ = fid >> 8; - *p++ = fid & 0xff; + put_uint16_t_be(fid, p); p += sizeof(uint16_t); return (uint16_t)(p - buf); } @@ -498,8 +497,8 @@ uint16_t asn1_build_prkd_generic(const uint8_t *label, p += format_tlv_len(asn1_len_tag(0x2, 2), p); *p++ = 0x2; p += format_tlv_len(2, p); - *p++ = (keysize >> 8) & 0xff; - *p++ = keysize & 0xff; + put_uint16_t_be(keysize, p); + p += 2; } //Seq 4 @@ -518,8 +517,8 @@ uint16_t asn1_build_prkd_generic(const uint8_t *label, if (key_type & PICO_KEYS_KEY_EC || key_type & PICO_KEYS_KEY_RSA) { *p++ = 0x2; p += format_tlv_len(2, p); - *p++ = (keysize >> 8) & 0xff; - *p++ = keysize & 0xff; + put_uint16_t_be(keysize, p); + p += 2; } return (uint16_t)(p - buf); } From 991f5fc960ec4f7e5180f01309103629954fa318 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 23 Dec 2024 21:41:40 +0100 Subject: [PATCH 20/33] More uint funcs. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- src/hsm/cmd_delete_file.c | 2 +- src/hsm/cmd_extras.c | 31 +++++++---------- src/hsm/cmd_initialize.c | 3 +- src/hsm/cmd_list_keys.c | 6 ++-- src/hsm/cmd_select.c | 5 ++- src/hsm/cvc.c | 6 ++-- src/hsm/kek.c | 72 +++++++++++++++++++-------------------- src/hsm/sc_hsm.c | 7 ++-- 9 files changed, 60 insertions(+), 74 deletions(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index d78e977..f8cb36c 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit d78e97792682d2bfc73fade50fce74683680571e +Subproject commit f8cb36c2cf5de7f0e8b7cd4a497160e86de50107 diff --git a/src/hsm/cmd_delete_file.c b/src/hsm/cmd_delete_file.c index 1ecbecb..3f21715 100644 --- a/src/hsm/cmd_delete_file.c +++ b/src/hsm/cmd_delete_file.c @@ -30,7 +30,7 @@ int cmd_delete_file() { } } else { - uint16_t fid = (apdu.data[0] << 8) | apdu.data[1]; + uint16_t fid = get_uint16_t_be(apdu.data); if (!(ef = search_file(fid))) { return SW_FILE_NOT_FOUND(); } diff --git a/src/hsm/cmd_extras.c b/src/hsm/cmd_extras.c index 84623cd..d8a096f 100644 --- a/src/hsm/cmd_extras.c +++ b/src/hsm/cmd_extras.c @@ -70,8 +70,7 @@ int cmd_extras() { gettimeofday(&tv, NULL); #endif struct tm *tm = localtime(&tv.tv_sec); - put_uint16_t_be(tm->tm_year + 1900, res_APDU); - res_APDU_size += 2; + res_APDU_size += put_uint16_t_be(tm->tm_year + 1900, res_APDU); res_APDU[res_APDU_size++] = tm->tm_mon; res_APDU[res_APDU_size++] = tm->tm_mday; res_APDU[res_APDU_size++] = tm->tm_wday; @@ -84,7 +83,7 @@ int cmd_extras() { return SW_WRONG_LENGTH(); } struct tm tm; - tm.tm_year = ((apdu.data[0] << 8) | (apdu.data[1])) - 1900; + tm.tm_year = get_uint16_t_be(apdu.data) - 1900; tm.tm_mon = apdu.data[2]; tm.tm_mday = apdu.data[3]; tm.tm_wday = apdu.data[4]; @@ -110,8 +109,7 @@ int cmd_extras() { } uint16_t opts = get_device_options(); if (apdu.nc == 0) { - put_uint16_t_be(opts, res_APDU); - res_APDU_size += 2; + res_APDU_size += put_uint16_t_be(opts, res_APDU); } else { uint8_t newopts[] = { apdu.data[0], (opts & 0xff) }; @@ -216,8 +214,8 @@ int cmd_extras() { if (apdu.nc != 4) { return SW_WRONG_LENGTH(); } - phy_data.vid = (apdu.data[0] << 8) | apdu.data[1]; - phy_data.pid = (apdu.data[2] << 8) | apdu.data[3]; + phy_data.vid = get_uint16_t_be(apdu.data); + phy_data.pid = get_uint16_t_be(apdu.data + 2); phy_data.vidpid_present = true; } else if (P2(apdu) == PHY_LED_GPIO) { @@ -232,7 +230,7 @@ int cmd_extras() { if (apdu.nc != 2) { return SW_WRONG_LENGTH(); } - phy_data.opts = (apdu.data[0] << 8) | apdu.data[1]; + phy_data.opts = get_uint16_t_be(apdu.data); } else { return SW_INCORRECT_P1P2(); @@ -253,7 +251,7 @@ int cmd_extras() { if (apdu.nc < 2) { return SW_WRONG_LENGTH(); } - uint16_t row = (apdu.data[0] << 8) | apdu.data[1]; + uint16_t row = get_uint16_t_be(apdu.data); bool israw = P2(apdu) == 0x1; if (apdu.nc == 2) { if (row > 0xbf && row < 0xf48) { @@ -302,16 +300,11 @@ int cmd_extras() { else if (cmd == CMD_MEMORY) { res_APDU_size = 0; uint32_t free = flash_free_space(), total = flash_total_space(), used = flash_used_space(), nfiles = flash_num_files(), size = flash_size(); - put_uint32_t_be(free, res_APDU + res_APDU_size); - res_APDU_size += 4; - put_uint32_t_be(used, res_APDU + res_APDU_size); - res_APDU_size += 4; - put_uint32_t_be(total, res_APDU + res_APDU_size); - res_APDU_size += 4; - put_uint32_t_be(nfiles, res_APDU + res_APDU_size); - res_APDU_size += 4; - put_uint32_t_be(size, res_APDU + res_APDU_size); - res_APDU_size += 4; + res_APDU_size += put_uint32_t_be(free, res_APDU + res_APDU_size); + res_APDU_size += put_uint32_t_be(used, res_APDU + res_APDU_size); + res_APDU_size += put_uint32_t_be(total, res_APDU + res_APDU_size); + res_APDU_size += put_uint32_t_be(nfiles, res_APDU + res_APDU_size); + res_APDU_size += put_uint32_t_be(size, res_APDU + res_APDU_size); } else { return SW_INCORRECT_P1P2(); diff --git a/src/hsm/cmd_initialize.c b/src/hsm/cmd_initialize.c index 9a62f66..e630c50 100644 --- a/src/hsm/cmd_initialize.c +++ b/src/hsm/cmd_initialize.c @@ -247,8 +247,7 @@ int cmd_initialize() { } else { //free memory bytes request int heap_left = heapLeft(); - put_uint32_t_be(heap_left, res_APDU); - res_APDU_size = 4; + res_APDU_size += put_uint32_t_be(heap_left, res_APDU); res_APDU[4] = 0; res_APDU[5] = HSM_VERSION_MAJOR; res_APDU[6] = HSM_VERSION_MINOR; diff --git a/src/hsm/cmd_list_keys.c b/src/hsm/cmd_list_keys.c index 6ceda5b..bf334d9 100644 --- a/src/hsm/cmd_list_keys.c +++ b/src/hsm/cmd_list_keys.c @@ -22,12 +22,10 @@ int cmd_list_keys() { /* First we send DEV private key */ /* Both below conditions should be always TRUE */ if (search_file(EF_PRKD_DEV)) { - put_uint16_t_be(EF_PRKD_DEV, res_APDU + res_APDU_size); - res_APDU_size += 2; + res_APDU_size += put_uint16_t_be(EF_PRKD_DEV, res_APDU + res_APDU_size); } if (search_file(EF_KEY_DEV)) { - put_uint16_t_be(EF_KEY_DEV, res_APDU + res_APDU_size); - res_APDU_size += 2; + res_APDU_size += put_uint16_t_be(EF_KEY_DEV, res_APDU + res_APDU_size); } //first CC for (int i = 0; i < dynamic_files; i++) { diff --git a/src/hsm/cmd_select.c b/src/hsm/cmd_select.c index 46c9fb3..99df917 100644 --- a/src/hsm/cmd_select.c +++ b/src/hsm/cmd_select.c @@ -48,7 +48,7 @@ int cmd_select() { //} if (apdu.nc == 2) { - fid = get_uint16_t_be(apdu.data, 0); + fid = get_uint16_t_be(apdu.data); } //if ((fid & 0xff00) == (KEY_PREFIX << 8)) @@ -119,8 +119,7 @@ int cmd_select() { res_APDU[res_APDU_size++] = 0x85; res_APDU[res_APDU_size++] = 5; uint16_t opts = get_device_options(); - put_uint16_t_be(opts, res_APDU + res_APDU_size); - res_APDU_size += 2; + res_APDU_size += put_uint16_t_be(opts, res_APDU + res_APDU_size); res_APDU[res_APDU_size++] = 0xFF; res_APDU[res_APDU_size++] = HSM_VERSION_MAJOR; res_APDU[res_APDU_size++] = HSM_VERSION_MINOR; diff --git a/src/hsm/cvc.c b/src/hsm/cvc.c index 448f5ed..8b6b22e 100644 --- a/src/hsm/cvc.c +++ b/src/hsm/cvc.c @@ -497,8 +497,7 @@ uint16_t asn1_build_prkd_generic(const uint8_t *label, p += format_tlv_len(asn1_len_tag(0x2, 2), p); *p++ = 0x2; p += format_tlv_len(2, p); - put_uint16_t_be(keysize, p); - p += 2; + p += put_uint16_t_be(keysize, p); } //Seq 4 @@ -517,8 +516,7 @@ uint16_t asn1_build_prkd_generic(const uint8_t *label, if (key_type & PICO_KEYS_KEY_EC || key_type & PICO_KEYS_KEY_RSA) { *p++ = 0x2; p += format_tlv_len(2, p); - put_uint16_t_be(keysize, p); - p += 2; + p += put_uint16_t_be(keysize, p); } return (uint16_t)(p - buf); } diff --git a/src/hsm/kek.c b/src/hsm/kek.c index 2aeb62a..db02214 100644 --- a/src/hsm/kek.c +++ b/src/hsm/kek.c @@ -341,15 +341,15 @@ int dkek_encode_key(uint8_t id, void *key_ctx, int key_type, uint8_t *out, uint1 } mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) key_ctx; kb_len = 0; - put_uint16_t_be((uint16_t)mbedtls_rsa_get_len(rsa) * 8, kb + 8 + kb_len); kb_len += 2; + kb_len += put_uint16_t_be((uint16_t)mbedtls_rsa_get_len(rsa) * 8, kb + 8 + kb_len); - put_uint16_t_be((uint16_t)mbedtls_mpi_size(&rsa->D), kb + 8 + kb_len); kb_len += 2; + kb_len += put_uint16_t_be((uint16_t)mbedtls_mpi_size(&rsa->D), kb + 8 + kb_len); mbedtls_mpi_write_binary(&rsa->D, kb + 8 + kb_len, mbedtls_mpi_size(&rsa->D)); kb_len += (uint16_t)mbedtls_mpi_size(&rsa->D); - put_uint16_t_be((uint16_t)mbedtls_mpi_size(&rsa->N), kb + 8 + kb_len); kb_len += 2; + kb_len += put_uint16_t_be((uint16_t)mbedtls_mpi_size(&rsa->N), kb + 8 + kb_len); mbedtls_mpi_write_binary(&rsa->N, kb + 8 + kb_len, mbedtls_mpi_size(&rsa->N)); kb_len += (uint16_t)mbedtls_mpi_size(&rsa->N); - put_uint16_t_be((uint16_t)mbedtls_mpi_size(&rsa->E), kb + 8 + kb_len); kb_len += 2; + kb_len += put_uint16_t_be((uint16_t)mbedtls_mpi_size(&rsa->E), kb + 8 + kb_len); mbedtls_mpi_write_binary(&rsa->E, kb + 8 + kb_len, mbedtls_mpi_size(&rsa->E)); kb_len += (uint16_t)mbedtls_mpi_size(&rsa->E); @@ -362,32 +362,32 @@ int dkek_encode_key(uint8_t id, void *key_ctx, int key_type, uint8_t *out, uint1 } mbedtls_ecdsa_context *ecdsa = (mbedtls_ecdsa_context *) key_ctx; kb_len = 0; - put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.P) * 8, kb + 8 + kb_len); kb_len += 2; - put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.A), kb + 8 + kb_len); kb_len += 2; + kb_len += put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.P) * 8, kb + 8 + kb_len); + kb_len += put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.A), kb + 8 + kb_len); mbedtls_mpi_write_binary(&ecdsa->grp.A, kb + 8 + kb_len, mbedtls_mpi_size(&ecdsa->grp.A)); kb_len += (uint16_t)mbedtls_mpi_size(&ecdsa->grp.A); - put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.B), kb + 8 + kb_len); kb_len += 2; + kb_len += put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.B), kb + 8 + kb_len); mbedtls_mpi_write_binary(&ecdsa->grp.B, kb + 8 + kb_len, mbedtls_mpi_size(&ecdsa->grp.B)); kb_len += (uint16_t)mbedtls_mpi_size(&ecdsa->grp.B); - put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.P), kb + 8 + kb_len); kb_len += 2; + kb_len += put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.P), kb + 8 + kb_len); mbedtls_mpi_write_binary(&ecdsa->grp.P, kb + 8 + kb_len, mbedtls_mpi_size(&ecdsa->grp.P)); kb_len += (uint16_t)mbedtls_mpi_size(&ecdsa->grp.P); - put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.N), kb + 8 + kb_len); kb_len += 2; + kb_len += put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->grp.N), kb + 8 + kb_len); mbedtls_mpi_write_binary(&ecdsa->grp.N, kb + 8 + kb_len, mbedtls_mpi_size(&ecdsa->grp.N)); kb_len += (uint16_t)mbedtls_mpi_size(&ecdsa->grp.N); size_t olen = 0; mbedtls_ecp_point_write_binary(&ecdsa->grp, &ecdsa->grp.G, MBEDTLS_ECP_PF_UNCOMPRESSED, &olen, kb + 8 + kb_len + 2, sizeof(kb) - 8 - kb_len - 2); - put_uint16_t_be((uint16_t)olen, kb + 8 + kb_len); - kb_len += 2 + (uint16_t)olen; + kb_len += put_uint16_t_be((uint16_t)olen, kb + 8 + kb_len); + kb_len += (uint16_t)olen; - put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->d), kb + 8 + kb_len); kb_len += 2; + kb_len += put_uint16_t_be((uint16_t)mbedtls_mpi_size(&ecdsa->d), kb + 8 + kb_len); mbedtls_mpi_write_binary(&ecdsa->d, kb + 8 + kb_len, mbedtls_mpi_size(&ecdsa->d)); kb_len += (uint16_t)mbedtls_mpi_size(&ecdsa->d); mbedtls_ecp_point_write_binary(&ecdsa->grp, &ecdsa->Q, MBEDTLS_ECP_PF_UNCOMPRESSED, &olen, kb + 8 + kb_len + 2, sizeof(kb) - 8 - kb_len - 2); - put_uint16_t_be((uint16_t)olen, kb + 8 + kb_len); - kb_len += 2 + (uint16_t)olen; + kb_len += put_uint16_t_be((uint16_t)olen, kb + 8 + kb_len); + kb_len += (uint16_t)olen; algo = (uint8_t *) "\x00\x0A\x04\x00\x7F\x00\x07\x02\x02\x02\x02\x03"; algo_len = 12; @@ -418,7 +418,7 @@ int dkek_encode_key(uint8_t id, void *key_ctx, int key_type, uint8_t *out, uint1 } if (allowed && allowed_len > 0) { - put_uint16_t_be(allowed_len, out + *out_len); *out_len += 2; + *out_len += put_uint16_t_be(allowed_len, out + *out_len); memcpy(out + *out_len, allowed, allowed_len); *out_len += allowed_len; } @@ -526,21 +526,21 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le uint16_t ofs = 9; //OID - uint16_t len = get_uint16_t_be(in, ofs); + uint16_t len = get_uint16_t_be(in + ofs); ofs += len + 2; //Allowed algorithms - len = get_uint16_t_be(in, ofs); + len = get_uint16_t_be(in + ofs); *allowed = (uint8_t *) (in + ofs + 2); *allowed_len = len; ofs += len + 2; //Access conditions - len = get_uint16_t_be(in, ofs); + len = get_uint16_t_be(in + ofs); ofs += len + 2; //Key OID - len = get_uint16_t_be(in, ofs); + len = get_uint16_t_be(in + ofs); ofs += len + 2; if ((in_len - 16 - ofs) % 16 != 0) { @@ -554,7 +554,7 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le return r; } - int key_size = get_uint16_t_be(kb, 8); + int key_size = get_uint16_t_be(kb + 8); if (key_size_out) { *key_size_out = key_size; } @@ -563,14 +563,14 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) key_ctx; mbedtls_rsa_init(rsa); if (key_type == 5) { - len = get_uint16_t_be(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb + ofs); ofs += 2; r = mbedtls_mpi_read_binary(&rsa->D, kb + ofs, len); ofs += len; if (r != 0) { mbedtls_rsa_free(rsa); return PICOKEY_WRONG_DATA; } - len = get_uint16_t_be(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb + ofs); ofs += 2; r = mbedtls_mpi_read_binary(&rsa->N, kb + ofs, len); ofs += len; if (r != 0) { mbedtls_rsa_free(rsa); @@ -579,12 +579,12 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le } else if (key_type == 6) { //DP-1 - len = get_uint16_t_be(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb + ofs); ofs += len + 2; //DQ-1 - len = get_uint16_t_be(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb + ofs); ofs += len + 2; - len = get_uint16_t_be(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb + ofs); ofs += 2; r = mbedtls_mpi_read_binary(&rsa->P, kb + ofs, len); ofs += len; if (r != 0) { mbedtls_rsa_free(rsa); @@ -592,19 +592,19 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le } //PQ - len = get_uint16_t_be(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb + ofs); ofs += len + 2; - len = get_uint16_t_be(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb + ofs); ofs += 2; r = mbedtls_mpi_read_binary(&rsa->Q, kb + ofs, len); ofs += len; if (r != 0) { mbedtls_rsa_free(rsa); return PICOKEY_WRONG_DATA; } //N - len = get_uint16_t_be(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb + ofs); ofs += len + 2; } - len = get_uint16_t_be(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb + ofs); ofs += 2; r = mbedtls_mpi_read_binary(&rsa->E, kb + ofs, len); ofs += len; if (r != 0) { mbedtls_rsa_free(rsa); @@ -642,13 +642,13 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le mbedtls_ecdsa_init(ecdsa); //A - len = get_uint16_t_be(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb + ofs); ofs += len + 2; //B - len = get_uint16_t_be(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb + ofs); ofs += len + 2; //P - len = get_uint16_t_be(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb + ofs); ofs += 2; mbedtls_ecp_group_id ec_id = ec_get_curve_from_prime(kb + ofs, len); if (ec_id == MBEDTLS_ECP_DP_NONE) { mbedtls_ecdsa_free(ecdsa); @@ -657,13 +657,13 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le ofs += len; //N - len = get_uint16_t_be(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb + ofs); ofs += len + 2; //G - len = get_uint16_t_be(kb, ofs); ofs += len + 2; + len = get_uint16_t_be(kb + ofs); ofs += len + 2; //d - len = get_uint16_t_be(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb + ofs); ofs += 2; r = mbedtls_ecp_read_key(ec_id, ecdsa, kb + ofs, len); if (r != 0) { mbedtls_ecdsa_free(ecdsa); @@ -672,7 +672,7 @@ int dkek_decode_key(uint8_t id, void *key_ctx, const uint8_t *in, uint16_t in_le ofs += len; //Q - len = get_uint16_t_be(kb, ofs); ofs += 2; + len = get_uint16_t_be(kb + ofs); ofs += 2; r = mbedtls_ecp_point_read_binary(&ecdsa->grp, &ecdsa->Q, kb + ofs, len); if (r != 0) { r = mbedtls_ecp_mul(&ecdsa->grp, &ecdsa->Q, &ecdsa->d, &ecdsa->grp.G, random_gen, NULL); diff --git a/src/hsm/sc_hsm.c b/src/hsm/sc_hsm.c index a0bb47c..9ef933e 100644 --- a/src/hsm/sc_hsm.c +++ b/src/hsm/sc_hsm.c @@ -269,7 +269,7 @@ int sc_hsm_unload() { uint16_t get_device_options() { file_t *ef = search_file(EF_DEVOPS); if (file_has_data(ef)) { - return (file_read_uint8(ef) << 8) | file_read_uint8_offset(ef, 1); + return get_uint16_t_be(file_get_data(ef)); } return 0x0; } @@ -462,7 +462,7 @@ uint32_t get_key_counter(file_t *fkey) { uint16_t tag_len = 0; const uint8_t *meta_tag = get_meta_tag(fkey, 0x90, &tag_len); if (meta_tag) { - return (meta_tag[0] << 24) | (meta_tag[1] << 16) | (meta_tag[2] << 8) | meta_tag[3]; + return get_uint32_t_be(meta_tag); } return 0xffffffff; } @@ -498,8 +498,7 @@ uint32_t decrement_key_counter(file_t *fkey) { asn1_ctx_init(meta_data, meta_size, &ctxi); while (walk_tlv(&ctxi, &p, &tag, &tag_len, &tag_data)) { if (tag == 0x90) { // ofset tag - uint32_t val = - (tag_data[0] << 24) | (tag_data[1] << 16) | (tag_data[2] << 8) | tag_data[3]; + uint32_t val = get_uint32_t_be(tag_data); val--; put_uint32_t_be(val, tag_data); int r = meta_add(fkey->fid, cmeta, (uint16_t)meta_size); From c6b03e54cac113d91141098e07eecfb2930f303d Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Tue, 24 Dec 2024 02:06:15 +0100 Subject: [PATCH 21/33] Fix TX/RX buffers to align them with USB buffers and avoid overflows. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- src/hsm/cmd_cipher_sym.c | 8 +------- src/hsm/cmd_extras.c | 2 +- src/hsm/cmd_initialize.c | 6 +++--- src/hsm/cmd_key_unwrap.c | 4 ++-- src/hsm/cmd_keypair_gen.c | 6 ++---- src/hsm/sc_hsm.h | 3 +++ 7 files changed, 13 insertions(+), 18 deletions(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index f8cb36c..9e2b6ac 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit f8cb36c2cf5de7f0e8b7cd4a497160e86de50107 +Subproject commit 9e2b6ac4b6ad7f978b5c28600a007136fc6cb2ce diff --git a/src/hsm/cmd_cipher_sym.c b/src/hsm/cmd_cipher_sym.c index 61739bf..6785643 100644 --- a/src/hsm/cmd_cipher_sym.c +++ b/src/hsm/cmd_cipher_sym.c @@ -410,13 +410,7 @@ int cmd_cipher_sym() { size_t olen = 0; mbedtls_asn1_buf params = {.p = aad.data, .len = aad.len, .tag = (MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)}; - int r = mbedtls_pkcs5_pbes2_ext(¶ms, - algo == ALGO_EXT_CIPHER_ENCRYPT ? MBEDTLS_PKCS5_ENCRYPT : MBEDTLS_PKCS5_DECRYPT, - kdata, - key_size, - enc.data, - enc.len, - res_APDU, 4096, &olen); + int r = mbedtls_pkcs5_pbes2_ext(¶ms, algo == ALGO_EXT_CIPHER_ENCRYPT ? MBEDTLS_PKCS5_ENCRYPT : MBEDTLS_PKCS5_DECRYPT, kdata, key_size, enc.data, enc.len, res_APDU, MAX_APDU_DATA, &olen); mbedtls_platform_zeroize(kdata, sizeof(kdata)); if (r != 0) { return SW_WRONG_DATA(); diff --git a/src/hsm/cmd_extras.c b/src/hsm/cmd_extras.c index d8a096f..c97e2be 100644 --- a/src/hsm/cmd_extras.c +++ b/src/hsm/cmd_extras.c @@ -150,7 +150,7 @@ int cmd_extras() { return SW_EXEC_ERROR(); } - ret = mbedtls_ecp_point_write_binary(&hkey.ctx.mbed_ecdh.grp, &hkey.ctx.mbed_ecdh.Q, MBEDTLS_ECP_PF_UNCOMPRESSED, &olen, res_APDU, 4096); + ret = mbedtls_ecp_point_write_binary(&hkey.ctx.mbed_ecdh.grp, &hkey.ctx.mbed_ecdh.Q, MBEDTLS_ECP_PF_UNCOMPRESSED, &olen, res_APDU, MAX_APDU_DATA); mbedtls_ecdh_free(&hkey); if (ret != 0) { return SW_EXEC_ERROR(); diff --git a/src/hsm/cmd_initialize.c b/src/hsm/cmd_initialize.c index e630c50..23c61c1 100644 --- a/src/hsm/cmd_initialize.c +++ b/src/hsm/cmd_initialize.c @@ -210,7 +210,7 @@ int cmd_initialize() { return SW_EXEC_ERROR(); } uint16_t ee_len = 0, term_len = 0; - if ((ee_len = asn1_cvc_aut(&ecdsa, PICO_KEYS_KEY_EC, res_APDU, 4096, NULL, 0)) == 0) { + if ((ee_len = asn1_cvc_aut(&ecdsa, PICO_KEYS_KEY_EC, res_APDU, MAX_APDU_DATA, NULL, 0)) == 0) { mbedtls_ecdsa_free(&ecdsa); return SW_EXEC_ERROR(); } @@ -222,7 +222,7 @@ int cmd_initialize() { return SW_EXEC_ERROR(); } - if ((term_len = asn1_cvc_cert(&ecdsa, PICO_KEYS_KEY_EC, res_APDU + ee_len, 4096 - ee_len, NULL, 0, true)) == 0) { + if ((term_len = asn1_cvc_cert(&ecdsa, PICO_KEYS_KEY_EC, res_APDU + ee_len, MAX_APDU_DATA - ee_len, NULL, 0, true)) == 0) { mbedtls_ecdsa_free(&ecdsa); return SW_EXEC_ERROR(); } @@ -235,7 +235,7 @@ int cmd_initialize() { const uint8_t *keyid = (const uint8_t *) "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0", *label = (const uint8_t *) "ESPICOHSMTR"; - uint16_t prkd_len = asn1_build_prkd_ecc(label, (uint16_t)strlen((const char *) label), keyid, 20, 256, res_APDU, 4096); + uint16_t prkd_len = asn1_build_prkd_ecc(label, (uint16_t)strlen((const char *) label), keyid, 20, 256, res_APDU, MAX_APDU_DATA); fpk = search_file(EF_PRKD_DEV); ret = file_put_data(fpk, res_APDU, prkd_len); } diff --git a/src/hsm/cmd_key_unwrap.c b/src/hsm/cmd_key_unwrap.c index 579559c..d6ffadf 100644 --- a/src/hsm/cmd_key_unwrap.c +++ b/src/hsm/cmd_key_unwrap.c @@ -57,7 +57,7 @@ int cmd_key_unwrap() { return SW_EXEC_ERROR(); } r = store_keys(&ctx, PICO_KEYS_KEY_RSA, key_id); - if ((res_APDU_size = (uint16_t)asn1_cvc_aut(&ctx, PICO_KEYS_KEY_RSA, res_APDU, 4096, NULL, 0)) == 0) { + if ((res_APDU_size = (uint16_t)asn1_cvc_aut(&ctx, PICO_KEYS_KEY_RSA, res_APDU, MAX_APDU_DATA, NULL, 0)) == 0) { mbedtls_rsa_free(&ctx); return SW_EXEC_ERROR(); } @@ -77,7 +77,7 @@ int cmd_key_unwrap() { return SW_EXEC_ERROR(); } r = store_keys(&ctx, PICO_KEYS_KEY_EC, key_id); - if ((res_APDU_size = (uint16_t)asn1_cvc_aut(&ctx, PICO_KEYS_KEY_EC, res_APDU, 4096, NULL, 0)) == 0) { + if ((res_APDU_size = (uint16_t)asn1_cvc_aut(&ctx, PICO_KEYS_KEY_EC, res_APDU, MAX_APDU_DATA, NULL, 0)) == 0) { mbedtls_ecdsa_free(&ctx); return SW_EXEC_ERROR(); } diff --git a/src/hsm/cmd_keypair_gen.c b/src/hsm/cmd_keypair_gen.c index 8890a90..42ea90b 100644 --- a/src/hsm/cmd_keypair_gen.c +++ b/src/hsm/cmd_keypair_gen.c @@ -58,8 +58,7 @@ int cmd_keypair_gen() { mbedtls_rsa_free(&rsa); return SW_EXEC_ERROR(); } - if ((res_APDU_size = - (uint16_t)asn1_cvc_aut(&rsa, PICO_KEYS_KEY_RSA, res_APDU, 4096, NULL, 0)) == 0) { + if ((res_APDU_size = (uint16_t)asn1_cvc_aut(&rsa, PICO_KEYS_KEY_RSA, res_APDU, MAX_APDU_DATA, NULL, 0)) == 0) { return SW_EXEC_ERROR(); } ret = store_keys(&rsa, PICO_KEYS_KEY_RSA, key_id); @@ -118,8 +117,7 @@ int cmd_keypair_gen() { } } } - if ((res_APDU_size = - (uint16_t)asn1_cvc_aut(&ecdsa, PICO_KEYS_KEY_EC, res_APDU, 4096, ext.data, ext.len)) == 0) { + if ((res_APDU_size = (uint16_t)asn1_cvc_aut(&ecdsa, PICO_KEYS_KEY_EC, res_APDU, MAX_APDU_DATA, ext.data, ext.len)) == 0) { if (ext.data) { free(ext.data); } diff --git a/src/hsm/sc_hsm.h b/src/hsm/sc_hsm.h index e187d26..c025db5 100644 --- a/src/hsm/sc_hsm.h +++ b/src/hsm/sc_hsm.h @@ -32,6 +32,9 @@ #include "file.h" #include "apdu.h" #include "pico_keys.h" +#include "usb.h" + +#define MAX_APDU_DATA (USB_BUFFER_SIZE - 20) extern const uint8_t sc_hsm_aid[]; From 0c6b0d295f6dd98d454f40bc330ecfa616cd3fdb Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Fri, 27 Dec 2024 02:03:08 +0100 Subject: [PATCH 22/33] Auto generate an esp32-s3 firmware bin file. Signed-off-by: Pol Henarejos --- .github/workflows/nightly.yml | 1 + workflows/autobuild.sh | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index c9455e2..6b2ed29 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -25,6 +25,7 @@ jobs: run: | ./workflows/autobuild.sh pico ./build_pico_hsm.sh + ./workflows/autobuild.sh esp32 - name: Update nightly release uses: pyTooling/Actions/releaser@main with: diff --git a/workflows/autobuild.sh b/workflows/autobuild.sh index 66c978f..4512db7 100755 --- a/workflows/autobuild.sh +++ b/workflows/autobuild.sh @@ -23,6 +23,7 @@ mkdir build_pico cd build_pico cmake -DPICO_SDK_PATH=../pico-sdk .. make +cd .. elif [[ $1 == "esp32" ]]; then sudo apt install -y git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0 git clone --recursive https://github.com/espressif/esp-idf.git @@ -32,6 +33,10 @@ cd esp-idf cd .. idf.py set-target esp32s3 idf.py all +mkdir -p release +cd build +esptool.py --chip ESP32 merge_bin -o ../release/esp32-s3.bin @flash_args +cd .. else mkdir build cd build From ff8b343df45dbc8eea9fb48df97abda8beb6a03f Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Fri, 27 Dec 2024 02:03:08 +0100 Subject: [PATCH 23/33] Auto generate an esp32-s3 firmware bin file. Signed-off-by: Pol Henarejos --- .github/workflows/nightly.yml | 1 + workflows/autobuild.sh | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index c9455e2..6b2ed29 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -25,6 +25,7 @@ jobs: run: | ./workflows/autobuild.sh pico ./build_pico_hsm.sh + ./workflows/autobuild.sh esp32 - name: Update nightly release uses: pyTooling/Actions/releaser@main with: diff --git a/workflows/autobuild.sh b/workflows/autobuild.sh index 9b3ceae..a401872 100755 --- a/workflows/autobuild.sh +++ b/workflows/autobuild.sh @@ -23,6 +23,7 @@ mkdir build_pico cd build_pico cmake -DPICO_SDK_PATH=../pico-sdk .. make +cd .. elif [[ $1 == "esp32" ]]; then sudo apt install -y git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0 git clone --recursive https://github.com/espressif/esp-idf.git @@ -32,6 +33,10 @@ cd esp-idf cd .. idf.py set-target esp32s3 idf.py all +mkdir -p release +cd build +esptool.py --chip ESP32 merge_bin -o ../release/esp32-s3.bin @flash_args +cd .. else mkdir build cd build From 3d9e8064099836b35b844dd8ba567ec9a4b5bd4a Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Fri, 27 Dec 2024 02:09:05 +0100 Subject: [PATCH 24/33] Fix merge file. Signed-off-by: Pol Henarejos --- workflows/autobuild.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/autobuild.sh b/workflows/autobuild.sh index 4512db7..891842e 100755 --- a/workflows/autobuild.sh +++ b/workflows/autobuild.sh @@ -35,7 +35,7 @@ idf.py set-target esp32s3 idf.py all mkdir -p release cd build -esptool.py --chip ESP32 merge_bin -o ../release/esp32-s3.bin @flash_args +esptool.py --chip ESP32-S3 merge_bin -o ../release/esp32-s3.bin @flash_args cd .. else mkdir build From 34306558973ddaf52e71f218e1d52af6d8a1f0e9 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Fri, 27 Dec 2024 02:09:05 +0100 Subject: [PATCH 25/33] Fix merge file. Signed-off-by: Pol Henarejos --- workflows/autobuild.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/autobuild.sh b/workflows/autobuild.sh index a401872..2bed316 100755 --- a/workflows/autobuild.sh +++ b/workflows/autobuild.sh @@ -35,7 +35,7 @@ idf.py set-target esp32s3 idf.py all mkdir -p release cd build -esptool.py --chip ESP32 merge_bin -o ../release/esp32-s3.bin @flash_args +esptool.py --chip ESP32-S3 merge_bin -o ../release/esp32-s3.bin @flash_args cd .. else mkdir build From 6c5735fc4bdc7e0f01057eb4895e746046236983 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Fri, 27 Dec 2024 02:21:58 +0100 Subject: [PATCH 26/33] Fix bin name. Signed-off-by: Pol Henarejos --- workflows/autobuild.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/autobuild.sh b/workflows/autobuild.sh index 891842e..8daf6ea 100755 --- a/workflows/autobuild.sh +++ b/workflows/autobuild.sh @@ -35,7 +35,7 @@ idf.py set-target esp32s3 idf.py all mkdir -p release cd build -esptool.py --chip ESP32-S3 merge_bin -o ../release/esp32-s3.bin @flash_args +esptool.py --chip ESP32-S3 merge_bin -o ../release/pico_hsm_esp32-s3.bin @flash_args cd .. else mkdir build From 310bcb8092eb4a6bc094acf7590473a589d8786a Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Fri, 27 Dec 2024 02:21:58 +0100 Subject: [PATCH 27/33] Fix bin name. Signed-off-by: Pol Henarejos --- workflows/autobuild.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/autobuild.sh b/workflows/autobuild.sh index 2bed316..a5af3d6 100755 --- a/workflows/autobuild.sh +++ b/workflows/autobuild.sh @@ -35,7 +35,7 @@ idf.py set-target esp32s3 idf.py all mkdir -p release cd build -esptool.py --chip ESP32-S3 merge_bin -o ../release/esp32-s3.bin @flash_args +esptool.py --chip ESP32-S3 merge_bin -o ../release/pico_hsm_esp32-s3.bin @flash_args cd .. else mkdir build From 71636f4d660b218d308b38c0461b01e33aa50ffd Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 30 Dec 2024 21:42:33 +0100 Subject: [PATCH 28/33] Use partition bounds if available. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index 9e2b6ac..68a8168 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit 9e2b6ac4b6ad7f978b5c28600a007136fc6cb2ce +Subproject commit 68a816895efb56a917520935f2f341960dc8db2c From 2502f99affc959f2182bb5ccb6378e9b17e593de Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Wed, 8 Jan 2025 13:26:08 +0100 Subject: [PATCH 29/33] Add OTP for emulation. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index 68a8168..3d91287 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit 68a816895efb56a917520935f2f341960dc8db2c +Subproject commit 3d912878f1627719a006291eef5d60142a2f474f From f0a9d03ca8abcda18585db32a1525ff3a3daa199 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Wed, 8 Jan 2025 14:38:02 +0100 Subject: [PATCH 30/33] Fix storing MKEK in devices with OTP_1 available. Signed-off-by: Pol Henarejos --- src/hsm/kek.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hsm/kek.c b/src/hsm/kek.c index db02214..61a80fa 100644 --- a/src/hsm/kek.c +++ b/src/hsm/kek.c @@ -134,6 +134,9 @@ int store_mkek(const uint8_t *mkek) { else { memcpy(tmp_mkek, mkek, MKEK_SIZE); } + if (otp_key_1) { + mkek_masked(tmp_mkek, otp_key_1); + } *(uint32_t *) MKEK_CHECKSUM(tmp_mkek) = crc32c(MKEK_KEY(tmp_mkek), MKEK_KEY_SIZE); if (has_session_pin) { uint8_t tmp_mkek_pin[MKEK_SIZE]; From ca2e04af536ec9872f98e34affdd189dc57584cf Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Wed, 8 Jan 2025 14:47:23 +0100 Subject: [PATCH 31/33] Update initial memory for tests and KDM Signed-off-by: Pol Henarejos --- tests/memory.tar.gz | Bin 9590 -> 9826 bytes tests/pico-hsm/test_090_xkek.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/memory.tar.gz b/tests/memory.tar.gz index ac79a34fbe10cc42b46d5d6603469a1785e58ac6..e7dd242ffe5ff7abc496db851ebb43ecaeed9f50 100644 GIT binary patch delta 1754 zcmV<01||9SO5#j^ABzY8et~{x00ZpLO$vel5C%|>;t68>KaWUKkO^vwZl761i)iQW zy~TW+k6~sw4&!t`^p|!%B|C|TIwE~$Q&(F?UT#^&OPZBU(NqytQ>2kqS(Ybh>~+w$ z+q|^Xddf15-MEhHx%=5$YkmJ`&-;&00ssI20000000027i`Ea3kPBEm*tdU|tfDv$ z!1w)uNu=lEUhUWQFGr8oCcE~2EU)&=H&v!D z0001g0000000000003}bZC>8}6w9`(-2*+Hub;%8 zMuonT2l*fhO0%)t-1B_v;CaKVljesz`O*Bu;?MQNn(x=^o|jSWuu6xe&QyhSOJMND zwH*6DtEF14q0H8xtFtVeTOIF?55>z51O@Czcuh**3W);&eFQYL4Fb5C5;Z zyzW2S1O?T+H|P7NsU!ybU2D4CzIz7aqtLJ))n8RCVuEuemtO>W^d-=vi_kpk?1;mE zql)jm6c1(zd^i87SMiinS}je8x#!lt-9_4>`*R(4l>h$bJ8Rn<%bm^AQV+P_Yxy-! z&oAq^64<$0SxcqBwrko_WRJo^(?{(_8HbxepXYET5^#4C8 zksbC-q;Td7?LS5}@4l-{-4j-scsAsJI@3ox8}+n57cWX*TY2%zBF*jDDm|}f{pgKc z?#s2&)1{qNbauUB6XULWzb3{aT;6SBltuP%qr!h606K>eIidVV0!@Te{ApH*I%axf zmDS|un_uq@Et}D{Csmeh!->lEs*r{Ji@NRKr$riu(>7kC3`;R@(o+dAUarjiu zT-&Jo+IYd2g_f>2W*nO4|Jdo#KdJiJea~Ne)$q>~(>`Y$o^2R+?({Z?4Djz2mio##zr_PP!p=<%jyDiLQ5f%j=}J z+144Wp7?(2z<2Mwb;8T_lhew7>kb;PiP88H*47uVV;JD_I^=yjBO`M3!2%5}`VL@; zJ`ls)Awh1sfB4-83GMOEgrwd_AJ7x{lNu~|e6h|7rN0tStr|4@?u0$K`ucPKmV!G% zGpfZH)=gZncIze`-v$o$rbiWP*}g$CsQzE*md+zq3=1p_czL*y@{WOjG>Ztf+|A6) zuF$ZM%YegxiG_iQi4j8qlRg7OdK2S3P$CHdB@!OAL;^G$l1LiwW2O-t;2$sn=r=Jk zG&8aTW4Ur)THVh(yVry+NSb=CotvF$_Mh9j=QM6cerk*s`yoEV!|GPK+TtUru}gmc z;S=Oo@mG9{$FkNC$vN(S7y5q-T-nizZq>hC>+U>T@3Fvo|E0K|3ucavR49tjVj1dd zVDzn168bT5!W8ds&!^=aTlv`AqBvB*(wri_?DFK!iQ-eI8J9XS01f$9P`imo+fdA(?Tc^gFOL;}*~&hCPnHCd}P&-pEJkzsYhAewK>((D&402 z%KB+-omVFFyg}T5LAmyx*%Cv3-7`I38K0|{3ob1AZV9U(MgK$d-?>GMqd8`<=NOEF z?g#_J0x1I~9tHyr7DfY%auHU#dck7(j3R?ym-IRLT;;s=EU)@1ll+738eP3n%2^k$ z;2z*GS15G#5?GR$1f{tJOc_!gJ@(J-zO8=HttTO()-ZQ`fYN-RlMEPPrjCM9FbYNi0I;%gKmZ1S0QSm(g8%>k delta 1516 zcmVO!i8DABzY8?k)vn00ZpL%?g505C%{m#V3gIa@FUNND4ARZPD9jKSYaY z=kA=ve4CG9W;hJvbldgkZax+piHIhmd}Q0y&y19xnd7Cba*iscHs!XAs;(jxWo&iO zx9hxg(|XD>jr(yOm(%`dZ>{zHpFQtCJ_!H-0000000027iq;R2kPKOHXW#Bw+KS>h z0N=cz#e%(c>7WQM1+%n@o0F|YGiU;WgD-R_4uuY#T`p0P)=q+ zlZzlIF$gYh847|o^?cMF3C)4is zG?R8lll&ZJf+uOEoa9P8%%zQ`Bsbd4w6UDzYP*>>ekJ)S90(q*o_r`a>ZgU9%f-KQ zU!wQdUt0^C6Fsdz2ah+`=lkpF4HrpP;zJ#y?=suXXKTY})#LM#-@Cm#KfgEnetewR zJ=&^Ge{B?=rY`^h000000000000000a8K9G-6zcKi)tGNSrn?UIAfANRXF{yO~A3 z4<8#R*b-(&CZ=FUhImyrCT0d^2DW$=HYOGzgEijVVTSE9Th7w$qOWhPwAtLhGP$Ga z#CA5{z-7Nq?YlO4r`{dTKG*I-BW6dtZ}&JOj<^?{zI`Y~A*NdTcDMg&RWav!phsT< ze?7Vg&7;naI6SKO&P(xNmcV!Ok9rkPIi=OogqVA7?b}_XExJF~aYy;@Z@#m(&9U6s zEG_kb`@NQ5sdc~BbWPfZS-_$XBC}Yuh_)6tKP4Pu?UxUn;2!0J>0199|(ZXVMIb^E!@MWQ;>x~(Qrujd1dh}1Kes-oT@N)g+wDP)x#%p3UzJ#^)#p@UbxV#Q|-_FR0 z9DT4rLyNuxSfUTaFn36ho9-We_d!B?{4*h`_t6LR1pcH33m#vrvqI^w#8ayV&AvNf z53auc+`pyZj?j#1F@|*$7p&d7NyoQ=gT3id#oEN5kPI3I&8Q4VEEpD;e;IJ|aJmME zxCZ$G-DDumB7!Y%Gc&U*G%VyY;4lE@9H7e%z%sk`f2djK4l<@UG42H=kz!C1(FP|G zhGCv0C@r_ZNrC|ww<1@XvITdDrt7SIt8J)w?dw~qyIF$s@4PxDac;*~lgD)vI(c_2 z@IA`vaIpFLg;(~+X1%{^f3su1h24BUHesho>6K0(Lpt8oF+T}wuWoof>2pNO@*;LF zmyb)zeXJh6HdJak&N8|QC*N;gUhw$+HRiY0HX-bb{=yPQ z0xVL`C^85%HJE*2@J%x|P@G3|opeMH;S0)POdMf=$R diff --git a/tests/pico-hsm/test_090_xkek.py b/tests/pico-hsm/test_090_xkek.py index 0e6f4ef..927d0b6 100644 --- a/tests/pico-hsm/test_090_xkek.py +++ b/tests/pico-hsm/test_090_xkek.py @@ -27,7 +27,7 @@ from cvc import oid from cryptography.hazmat.primitives.asymmetric import ec from picohsm import DOPrefixes, APDUResponse, SWCodes -KDM = unhexlify(b'30820420060b2b0601040181c31f0402016181ed7f2181e97f4e81a25f290100421045535049434f48534d434130303030317f494f060a04007f0007020202020386410421ee4a21c16a10f737f12e78e5091b266612038cdabebb722b15bf6d41b877fbf64d9ab69c39b9831b1ae00bef2a4e81976f7688d45189bb232a24703d8a96a55f201045535049434f48534d445630303030317f4c12060904007f000703010202530580000000005f25060202000801085f24060203000601045f37403f75c08fffc9186b56e6147199e82bfc327ceef72495bc567961cd54d702f13e3c2766fcd1d11bd6a9d1f4a229b76b248ceb9af88d59a74d0ab149448705159b6281e97f2181e57f4e819e5f290100421045535049434f48534d445630303030317f494f060a04007f00070202020203864104c8561b41e54fea81bb80dd4a6d537e7c3904344e8ca90bc5f668111811e02c8d5d51ca93ca89558f2a8a9cbb147434e3441ec174505ff980fd7a7106286196915f201045535049434f48534d54524a444736387f4c0e060904007f0007030102025301005f25060203000300065f24060204000300055f3740983de63d0975b715ebd8a93cb38fa9638882c8b7064d51a6facabed693b92edc098e458b713203413ef6de0958c44772cbdbc264205c7b1bdb8b4fcb2516437f638201f1678201ed7f218201937f4e82014b5f290100421045535049434f48534d54524a444736387f4982011d060a04007f000702020202038120a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537782207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9832026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b68441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f0469978520a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a78641048b1f450912a2e4d428b7eefc5fa05618a9ef295e90009a61cbb0970181b333474ea94f94cde5a11aba0589e85d4225002789ff1cdcf25756f059647b49fc2a158701015f201045535049434f48534d54524a444736385f3740372407c20de7257c89dae1e6606c8a046ca65efaa010c0a22b75c402ee243de51f5f1507457193679ed9db4fbbfe8efb9d695b684492b665ad8ba98c1f84ea38421045535049434f48534d54524a444736385f374098718e2e14a44386b689b71a101530316b65ab49a91bab0dd56099c5161ecb8aadff6cf27449f94034e58b7306f01e6ffa2766a2f5bb1281e12e5f1f9174733454400cf8926ca5bec9a91bcd47bf391c15d94ef6e3243d5fd1fffeaafd586766bc3221eafd808f17f8450f238cc1fe7ab1854443db31d622f53a2b3fdb3ad750d5ce') +KDM = unhexlify(b'30820420060B2B0601040181C31F0402016181ED7F2181E97F4E81A25F290100421045535049434F48534D434130303030317F494F060A04007F0007020202020386410421EE4A21C16A10F737F12E78E5091B266612038CDABEBB722B15BF6D41B877FBF64D9AB69C39B9831B1AE00BEF2A4E81976F7688D45189BB232A24703D8A96A55F201045535049434F48534D445630303030317F4C12060904007F000703010202530580000000005F25060202000801085F24060203000601045F37403F75C08FFFC9186B56E6147199E82BFC327CEEF72495BC567961CD54D702F13E3C2766FCD1D11BD6A9D1F4A229B76B248CEB9AF88D59A74D0AB149448705159B6281E97F2181E57F4E819E5F290100421045535049434F48534D445630303030317F494F060A04007F000702020202038641043359F5234CE62E0EB80460046D8FD1AAE018CC8B9E687B40AA2C047E352409B45153D1AD888E4E7E780A3B1FA8C69CA8998BD271C8849137149142E96816A5A45F201045535049434F48534D54524A5A58314A7F4C0E060904007F0007030102025301005F25060205000100085F24060206000100085F374016F155B01CDE7FB902C8A631FCB6938458CB570EAB088DEFE1FFACD3AEFF069020256EECCF8E962461534ED682DB87BB9801E25556F87BF524385C536D19A7D1638201F1678201ED7F218201937F4E82014B5F290100421045535049434F48534D54524A5A58314A7F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A786410443F0BAB3EB271E1B762BDB81C2CC10C21CF9E8A73241B86C9552614A8842DA00A556C20BC4250C275981FE196F8D2E8766DE06C609BA07AC3E6E1468EAC451408701015F201045535049434F48534D54524A5A58314A5F37402E79A552EA5ABE1B4244841CC55515F31CACFE9B3E0A3FC3FC178DFD5ED6ADC67E03FCC65C24A8A65658768A1A522F372E9897B87058E453A647FC58E089D30D421045535049434F48534D54524A5A58314A5F37400B54434EF57C6DD55D26B44F63940E9F15C10FBC8FC013528F76ACF917D74EF41D635D630F778862ADBD3EE8574F4ABC28B9A6044DFCB9C30D83C1A4DBE6437054400964DBAED86825DBA4E5BCEFF66DAF5739A71D4B2677FB1F53ABA23B3D1D1A686A06478C3CF7FF797FE7C8A4D090D881319BD15AABE709D3EA74A48C88E4387F') def test_initialize(device): device.initialize(key_domains=1) From 45a96f87420b51b09127175f44819ad0a68a781f Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Wed, 15 Jan 2025 12:04:20 +0100 Subject: [PATCH 32/33] Add rollback version to 1. Signed-off-by: Pol Henarejos --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3861ea6..f885ccf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,7 +80,7 @@ set(USB_ITF_CCID 1) set(USB_ITF_WCID 1) include(pico-keys-sdk/pico_keys_sdk_import.cmake) -SET_VERSION(ver_major ver_minor "${CMAKE_CURRENT_LIST_DIR}/src/hsm/version.h") +SET_VERSION(ver_major ver_minor "${CMAKE_CURRENT_LIST_DIR}/src/hsm/version.h" 1) if(ESP_PLATFORM) project(pico_hsm) From 297f2e62282e816882ca7b7797bbdd071309e730 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Wed, 15 Jan 2025 12:06:00 +0100 Subject: [PATCH 33/33] Upgrade to v5.2 Signed-off-by: Pol Henarejos --- build_pico_hsm.sh | 2 +- src/hsm/version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build_pico_hsm.sh b/build_pico_hsm.sh index 86b5d1e..1d274a7 100755 --- a/build_pico_hsm.sh +++ b/build_pico_hsm.sh @@ -1,7 +1,7 @@ #!/bin/bash VERSION_MAJOR="5" -VERSION_MINOR="0" +VERSION_MINOR="2" SUFFIX="${VERSION_MAJOR}.${VERSION_MINOR}" #if ! [[ -z "${GITHUB_SHA}" ]]; then # SUFFIX="${SUFFIX}.${GITHUB_SHA}" diff --git a/src/hsm/version.h b/src/hsm/version.h index 82ef6a5..615e7ea 100644 --- a/src/hsm/version.h +++ b/src/hsm/version.h @@ -18,7 +18,7 @@ #ifndef __VERSION_H_ #define __VERSION_H_ -#define HSM_VERSION 0x0500 +#define HSM_VERSION 0x0502 #define HSM_VERSION_MAJOR ((HSM_VERSION >> 8) & 0xff) #define HSM_VERSION_MINOR (HSM_VERSION & 0xff)