Improved encryption constants between the bootloader and the signing tool. Allows the sign tool to properly use the correct block size for each encryption algorithm (64 for ChaCha, 16 for AES).

pull/660/head
David Garske 2025-12-31 11:25:09 -08:00
parent 0462e0a198
commit 601e46e480
2 changed files with 42 additions and 26 deletions

View File

@ -499,21 +499,33 @@ int wolfBoot_dualboot_candidate_addr(void**);
int wolfBoot_get_partition_state(uint8_t part, uint8_t *st); int wolfBoot_get_partition_state(uint8_t part, uint8_t *st);
/* Encryption algorithm constants - always available for tools */
#define ENCRYPT_BLOCK_SIZE_CHACHA 64
#define ENCRYPT_BLOCK_SIZE_AES 16
#define ENCRYPT_KEY_SIZE_CHACHA 32 /* ChaCha20 - 256bit */
#define ENCRYPT_KEY_SIZE_AES128 16 /* AES128 */
#define ENCRYPT_KEY_SIZE_AES256 32 /* AES256 */
#define ENCRYPT_NONCE_SIZE_CHACHA 12 /* 96 bit */
#define ENCRYPT_NONCE_SIZE_AES 16 /* AES IV size */
#ifdef EXT_ENCRYPTED #ifdef EXT_ENCRYPTED
/* Encryption support */ /* Encryption support - compile-time algorithm selection */
#if defined(ENCRYPT_WITH_CHACHA) #if defined(ENCRYPT_WITH_CHACHA)
#define ENCRYPT_BLOCK_SIZE 64 #define ENCRYPT_BLOCK_SIZE ENCRYPT_BLOCK_SIZE_CHACHA
#define ENCRYPT_KEY_SIZE 32 /* Chacha20 - 256bit */ #define ENCRYPT_KEY_SIZE ENCRYPT_KEY_SIZE_CHACHA
#define ENCRYPT_NONCE_SIZE 12 /* 96 bit*/ #define ENCRYPT_NONCE_SIZE ENCRYPT_NONCE_SIZE_CHACHA
#elif defined(ENCRYPT_WITH_AES128) #elif defined(ENCRYPT_WITH_AES128)
#define ENCRYPT_BLOCK_SIZE 16 #define ENCRYPT_BLOCK_SIZE ENCRYPT_BLOCK_SIZE_AES
#define ENCRYPT_KEY_SIZE 16 /* AES128 */ #define ENCRYPT_KEY_SIZE ENCRYPT_KEY_SIZE_AES128
#define ENCRYPT_NONCE_SIZE 16 /* AES IV size */ #define ENCRYPT_NONCE_SIZE ENCRYPT_NONCE_SIZE_AES
#elif defined(ENCRYPT_WITH_AES256) #elif defined(ENCRYPT_WITH_AES256)
#define ENCRYPT_BLOCK_SIZE 16 #define ENCRYPT_BLOCK_SIZE ENCRYPT_BLOCK_SIZE_AES
#define ENCRYPT_KEY_SIZE 32 /* AES256 */ #define ENCRYPT_KEY_SIZE ENCRYPT_KEY_SIZE_AES256
#define ENCRYPT_NONCE_SIZE 16 /* AES IV size */ #define ENCRYPT_NONCE_SIZE ENCRYPT_NONCE_SIZE_AES
#elif defined(ENCRYPT_PKCS11) #elif defined(ENCRYPT_PKCS11)
#define ENCRYPT_BLOCK_SIZE ENCRYPT_PKCS11_BLOCK_SIZE #define ENCRYPT_BLOCK_SIZE ENCRYPT_PKCS11_BLOCK_SIZE
/* In this case, the key ID is stored in flash rather than the key itself */ /* In this case, the key ID is stored in flash rather than the key itself */

View File

@ -206,9 +206,10 @@ static inline int fp_truncate(FILE *f, size_t len)
#define ENC_AES128 2 #define ENC_AES128 2
#define ENC_AES256 3 #define ENC_AES256 3
#define ENC_BLOCK_SIZE 16 /* Use algorithm-specific constants from wolfboot.h */
#define ENC_MAX_KEY_SZ 32 #define ENC_MAX_BLOCK_SZ ENCRYPT_BLOCK_SIZE_CHACHA /* 64 - largest block size */
#define ENC_MAX_IV_SZ 16 #define ENC_MAX_KEY_SZ ENCRYPT_KEY_SIZE_AES256 /* 32 */
#define ENC_MAX_IV_SZ ENCRYPT_NONCE_SIZE_AES /* 16 */
static void header_append_u32(uint8_t* header, uint32_t* idx, uint32_t tmp32) static void header_append_u32(uint8_t* header, uint32_t* idx, uint32_t tmp32)
{ {
@ -1761,21 +1762,24 @@ static int make_header_ex(int is_diff, uint8_t *pubkey, uint32_t pubkey_sz,
if ((CMD.encrypt != ENC_OFF) && CMD.encrypt_key_file) { if ((CMD.encrypt != ENC_OFF) && CMD.encrypt_key_file) {
uint8_t key[ENC_MAX_KEY_SZ], iv[ENC_MAX_IV_SZ]; uint8_t key[ENC_MAX_KEY_SZ], iv[ENC_MAX_IV_SZ];
uint8_t enc_buf[ENC_BLOCK_SIZE]; uint8_t enc_buf[ENC_MAX_BLOCK_SZ];
int ivSz, keySz; int ivSz, keySz, encBlockSz;
uint32_t fsize = 0; uint32_t fsize = 0;
switch (CMD.encrypt) { switch (CMD.encrypt) {
case ENC_CHACHA: case ENC_CHACHA:
ivSz = CHACHA_IV_BYTES; ivSz = ENCRYPT_NONCE_SIZE_CHACHA;
keySz = CHACHA_MAX_KEY_SZ; keySz = ENCRYPT_KEY_SIZE_CHACHA;
encBlockSz = ENCRYPT_BLOCK_SIZE_CHACHA;
break; break;
case ENC_AES128: case ENC_AES128:
ivSz = 16; ivSz = ENCRYPT_NONCE_SIZE_AES;
keySz = 16; keySz = ENCRYPT_KEY_SIZE_AES128;
encBlockSz = ENCRYPT_BLOCK_SIZE_AES;
break; break;
case ENC_AES256: case ENC_AES256:
ivSz = 16; ivSz = ENCRYPT_NONCE_SIZE_AES;
keySz = 32; keySz = ENCRYPT_KEY_SIZE_AES256;
encBlockSz = ENCRYPT_BLOCK_SIZE_AES;
break; break;
default: default:
printf("No valid encryption mode selected\n"); printf("No valid encryption mode selected\n");
@ -1817,9 +1821,9 @@ static int make_header_ex(int is_diff, uint8_t *pubkey, uint32_t pubkey_sz,
#endif #endif
wc_Chacha_SetKey(&cha, key, sizeof(key)); wc_Chacha_SetKey(&cha, key, sizeof(key));
wc_Chacha_SetIV(&cha, iv, 0); wc_Chacha_SetIV(&cha, iv, 0);
for (pos = 0; pos < fsize; pos += ENC_BLOCK_SIZE) { for (pos = 0; pos < fsize; pos += encBlockSz) {
int fread_retval; int fread_retval;
fread_retval = (int)fread(buf, 1, ENC_BLOCK_SIZE, f); fread_retval = (int)fread(buf, 1, encBlockSz, f);
if ((fread_retval == 0) && feof(f)) { if ((fread_retval == 0) && feof(f)) {
break; break;
} }
@ -1830,14 +1834,14 @@ static int make_header_ex(int is_diff, uint8_t *pubkey, uint32_t pubkey_sz,
Aes aes_e; Aes aes_e;
wc_AesInit(&aes_e, NULL, 0); wc_AesInit(&aes_e, NULL, 0);
wc_AesSetKeyDirect(&aes_e, key, keySz, iv, AES_ENCRYPTION); wc_AesSetKeyDirect(&aes_e, key, keySz, iv, AES_ENCRYPTION);
for (pos = 0; pos < fsize; pos += ENC_BLOCK_SIZE) { for (pos = 0; pos < fsize; pos += encBlockSz) {
int fread_retval; int fread_retval;
fread_retval = (int)fread(buf, 1, ENC_BLOCK_SIZE, f); fread_retval = (int)fread(buf, 1, encBlockSz, f);
if ((fread_retval == 0) && feof(f)) { if ((fread_retval == 0) && feof(f)) {
break; break;
} }
/* Pad with FF if input is too short */ /* Pad with FF if input is too short */
while((fread_retval % ENC_BLOCK_SIZE) != 0) { while((fread_retval % encBlockSz) != 0) {
buf[fread_retval++] = 0xFF; buf[fread_retval++] = 0xFF;
} }
wc_AesCtrEncrypt(&aes_e, enc_buf, buf, fread_retval); wc_AesCtrEncrypt(&aes_e, enc_buf, buf, fread_retval);