From c6b03e54cac113d91141098e07eecfb2930f303d Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Tue, 24 Dec 2024 02:06:15 +0100 Subject: [PATCH] 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[];