Skip to content

Commit 4cb9207

Browse files
committed
bootutil: Add support for HAMC-SHA512 with ECIES-X25519
Add support for HKDF/HMAC based on SHA512 for ECIES-X25519 key exchange. The commit adds MCUBOOT_HMAC_SHA512 that enables new TLV IMAGE_TLV_ENC_X25519_SHA512. Encryption code has been altered to support the MCUBOOT_HMAC_SHA512. Signed-off-by: Dominik Ermel <[email protected]>
1 parent 27bfc78 commit 4cb9207

File tree

5 files changed

+37
-7
lines changed

5 files changed

+37
-7
lines changed

boot/bootutil/include/bootutil/enc_key_public.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,25 @@ extern "C" {
4242
#define BOOT_ENC_KEY_SIZE 16
4343
#endif
4444

45+
#ifdef MCUBOOT_HMAC_SHA512
46+
#define BOOT_HMAC_SIZE 64
47+
#else
48+
#define BOOT_HMAC_SIZE 32
49+
#endif
50+
4551
#define BOOT_ENC_KEY_ALIGN_SIZE ALIGN_UP(BOOT_ENC_KEY_SIZE, BOOT_MAX_ALIGN)
4652

4753
#define TLV_ENC_RSA_SZ 256
4854
#define TLV_ENC_KW_SZ (BOOT_ENC_KEY_SIZE + 8)
49-
#define TLV_ENC_EC256_SZ (65 + 32 + BOOT_ENC_KEY_SIZE)
50-
#define TLV_ENC_X25519_SZ (32 + 32 + BOOT_ENC_KEY_SIZE)
55+
#define TLV_ENC_EC256_SZ (65 + BOOT_HMAC_SIZE + BOOT_ENC_KEY_SIZE)
56+
#define TLV_ENC_X25519_SZ (32 + BOOT_HMAC_SIZE + BOOT_ENC_KEY_SIZE)
5157

5258
#if defined(MCUBOOT_ENCRYPT_RSA)
5359
#define BOOT_ENC_TLV_SIZE TLV_ENC_RSA_SZ
5460
#elif defined(MCUBOOT_ENCRYPT_EC256)
61+
#if MCUBOOT_HMAC_SHA512
62+
#error "ECIES-P256 does not support HMAC-SHA512"
63+
#endif
5564
#define BOOT_ENC_TLV_SIZE TLV_ENC_EC256_SZ
5665
#elif defined(MCUBOOT_ENCRYPT_X25519)
5766
#define BOOT_ENC_TLV_SIZE TLV_ENC_X25519_SZ

boot/bootutil/include/bootutil/image.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ struct flash_area;
115115
#define IMAGE_TLV_ENC_KW 0x31 /* Key encrypted with AES-KW 128 or 256*/
116116
#define IMAGE_TLV_ENC_EC256 0x32 /* Key encrypted with ECIES-EC256 */
117117
#define IMAGE_TLV_ENC_X25519 0x33 /* Key encrypted with ECIES-X25519 */
118+
#define IMAGE_TLV_ENC_X25519_SHA512 0x34 /* Key exchange using ECIES-X25519 and SHA512 for MAC
119+
* tag and HKDF in key derivation process
120+
*/
118121
#define IMAGE_TLV_DEPENDENCY 0x40 /* Image depends on other image */
119122
#define IMAGE_TLV_SEC_CNT 0x50 /* security counter */
120123
#define IMAGE_TLV_BOOT_RECORD 0x60 /* measured boot record */

boot/bootutil/src/encrypted.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,16 @@
6060
_Static_assert(EC_CIPHERKEY_INDEX + BOOT_ENC_KEY_SIZE == EXPECTED_ENC_LEN,
6161
"Please fix ECIES-P256 component indexes");
6262
#elif defined(MCUBOOT_ENCRYPT_X25519)
63+
#if !defined(MCUBOOT_HMAC_SHA512)
6364
# define EXPECTED_ENC_TLV IMAGE_TLV_ENC_X25519
65+
#elif !defined(MCUBOOT_USE_PSA_CRYPTO)
66+
#error "Non-PSA code does not support ECIES-X25519 with HMAC-SHA512 at this moment"
67+
#else
68+
# define EXPECTED_ENC_TLV IMAGE_TLV_ENC_X25519_SHA512
69+
#endif /* !defined(MCUBOOT_HMAC_SHA512) */
6470
# define EC_PUBK_INDEX (0)
6571
# define EC_TAG_INDEX (32)
66-
# define EC_CIPHERKEY_INDEX (32 + 32)
72+
# define EC_CIPHERKEY_INDEX (EC_TAG_INDEX + BOOT_HMAC_SIZE)
6773
_Static_assert(EC_CIPHERKEY_INDEX + BOOT_ENC_KEY_SIZE == EXPECTED_ENC_LEN,
6874
"Please fix ECIES-X25519 component indexes");
6975
#endif

boot/bootutil/src/encrypted_psa.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,19 @@
2727

2828
BOOT_LOG_MODULE_DECLARE(mcuboot_psa_enc);
2929

30+
#if defined(MCUBOOT_HMAC_SHA512)
31+
#define PSA_HMAC_HKDF_SHA PSA_ALG_SHA_512
32+
#else
33+
#define PSA_HMAC_HKDF_SHA PSA_ALG_SHA_256
34+
#endif
35+
36+
#define PSA_HMAC_SIZE BOOT_HMAC_SIZE
37+
3038
#define EXPECTED_ENC_LEN BOOT_ENC_TLV_SIZE
3139
#define EC_PUBK_INDEX (0)
3240
#define EC_PUBK_LEN (32)
3341
#define EC_TAG_INDEX (EC_PUBK_INDEX + EC_PUBK_LEN)
34-
#define EC_TAG_LEN (32)
42+
#define EC_TAG_LEN (BOOT_HMAC_SIZE)
3543
#define EC_CIPHERKEY_INDEX (EC_TAG_INDEX + EC_TAG_LEN)
3644
#define EC_CIPHERKEY_LEN BOOT_ENC_KEY_SIZE
3745
_Static_assert(EC_CIPHERKEY_INDEX + BOOT_ENC_KEY_SIZE == EXPECTED_ENC_LEN,
@@ -172,7 +180,7 @@ boot_decrypt_key(const uint8_t *buf, uint8_t *enckey)
172180
return -1;
173181
}
174182

175-
key_do_alg = PSA_ALG_KEY_AGREEMENT(PSA_ALG_ECDH, PSA_ALG_HKDF(PSA_ALG_SHA_256));
183+
key_do_alg = PSA_ALG_KEY_AGREEMENT(PSA_ALG_ECDH, PSA_ALG_HKDF(PSA_HMAC_HKDF_SHA));
176184

177185
psa_ret = psa_key_derivation_setup(&key_do, key_do_alg);
178186
if (psa_ret != PSA_SUCCESS) {
@@ -235,7 +243,7 @@ boot_decrypt_key(const uint8_t *buf, uint8_t *enckey)
235243
*/
236244
psa_set_key_type(&kattr, PSA_KEY_TYPE_HMAC);
237245
psa_set_key_usage_flags(&kattr, PSA_KEY_USAGE_VERIFY_MESSAGE);
238-
psa_set_key_algorithm(&kattr, PSA_ALG_HMAC(PSA_ALG_SHA_256));
246+
psa_set_key_algorithm(&kattr, PSA_ALG_HMAC(PSA_HMAC_HKDF_SHA));
239247

240248
/* Import the MAC tag key part of derived key */
241249
psa_ret = psa_import_key(&kattr,
@@ -249,7 +257,7 @@ boot_decrypt_key(const uint8_t *buf, uint8_t *enckey)
249257
}
250258

251259
/* Verify the MAC tag of the random encryption key */
252-
psa_ret = psa_mac_verify(kid, PSA_ALG_HMAC(PSA_ALG_SHA_256),
260+
psa_ret = psa_mac_verify(kid, PSA_ALG_HMAC(PSA_HMAC_HKDF_SHA),
253261
&buf[EC_CIPHERKEY_INDEX], EC_CIPHERKEY_LEN,
254262
&buf[EC_TAG_INDEX],
255263
EC_TAG_LEN);

boot/bootutil/src/image_validate.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,11 @@ static const uint16_t allowed_unprot_tlvs[] = {
463463
IMAGE_TLV_ENC_RSA2048,
464464
IMAGE_TLV_ENC_KW,
465465
IMAGE_TLV_ENC_EC256,
466+
#if !defined(MCUBOOT_HMAC_SHA512)
466467
IMAGE_TLV_ENC_X25519,
468+
#else
469+
IMAGE_TLV_ENC_X25519_SHA512,
470+
#endif
467471
/* Mark end with ANY. */
468472
IMAGE_TLV_ANY,
469473
};

0 commit comments

Comments
 (0)