Skip to content

Commit

Permalink
[nrf fromlist] boot: Replace boot_encrypt by boot_enc_encrypt and boo…
Browse files Browse the repository at this point in the history
…t_enc_decrypt

To be able to implement encryption with API that requires different
calls for encryption and encryption, the boot_encrypt
needs to be replaced with encryption/decryption specific functions.

Upstream PR: mcu-tools#2017

Signed-off-by: Dominik Ermel <dominik.ermel@nordicsemi.no>
  • Loading branch information
de-nordic committed Sep 6, 2024
1 parent 50088ea commit 9125174
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 16 deletions.
2 changes: 1 addition & 1 deletion boot/boot_serial/src/boot_serial_encryption.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ decrypt_region_inplace(struct boot_loader_state *state,
blk_sz = tlv_off - (off + bytes_copied);
}
}
boot_encrypt(BOOT_CURR_ENC(state), slot,
boot_enc_decrypt(BOOT_CURR_ENC(state), slot,
(off + bytes_copied + idx) - hdr->ih_hdr_size, blk_sz,
blk_off, &buf[idx]);
}
Expand Down
4 changes: 3 additions & 1 deletion boot/bootutil/include/bootutil/enc_key.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,9 @@ int boot_enc_load(struct enc_key_data *enc_state, int slot,
const struct image_header *hdr, const struct flash_area *fap,
struct boot_status *bs);
bool boot_enc_valid(struct enc_key_data *enc_state, int slot);
void boot_encrypt(struct enc_key_data *enc_state, int slot,
void boot_enc_encrypt(struct enc_key_data *enc_state, int slot,
uint32_t off, uint32_t sz, uint32_t blk_off, uint8_t *buf);
void boot_enc_decrypt(struct enc_key_data *enc_state, int slot,
uint32_t off, uint32_t sz, uint32_t blk_off, uint8_t *buf);
void boot_enc_zeroize(struct enc_key_data *enc_state);

Expand Down
31 changes: 26 additions & 5 deletions boot/bootutil/src/encrypted.c
Original file line number Diff line number Diff line change
Expand Up @@ -663,14 +663,13 @@ boot_enc_valid(struct enc_key_data *enc_state, int slot)
}

void
boot_encrypt(struct enc_key_data *enc_state, int slot, uint32_t off,
boot_enc_encrypt(struct enc_key_data *enc_state, int slot, uint32_t off,
uint32_t sz, uint32_t blk_off, uint8_t *buf)
{
struct enc_key_data *enc;
struct enc_key_data *enc = &enc_state[slot];
uint8_t nonce[16];

/* boot_copy_region will call boot_encrypt with sz = 0 when skipping over
the TLVs. */
/* Nothing to do with size == 0 */
if (sz == 0) {
return;
}
Expand All @@ -682,11 +681,33 @@ boot_encrypt(struct enc_key_data *enc_state, int slot, uint32_t off,
nonce[14] = (uint8_t)(off >> 8);
nonce[15] = (uint8_t)off;

enc = &enc_state[slot];
assert(enc->valid == 1);
bootutil_aes_ctr_encrypt(&enc->aes_ctr, nonce, buf, sz, blk_off, buf);
}

void
boot_enc_decrypt(struct enc_key_data *enc_state, int slot, uint32_t off,
uint32_t sz, uint32_t blk_off, uint8_t *buf)
{
struct enc_key_data *enc = &enc_state[slot];
uint8_t nonce[16];

/* Nothing to do with size == 0 */
if (sz == 0) {
return;
}

memset(nonce, 0, 12);
off >>= 4;
nonce[12] = (uint8_t)(off >> 24);
nonce[13] = (uint8_t)(off >> 16);
nonce[14] = (uint8_t)(off >> 8);
nonce[15] = (uint8_t)off;

assert(enc->valid == 1);
bootutil_aes_ctr_decrypt(&enc->aes_ctr, nonce, buf, sz, blk_off, buf);
}

/**
* Clears encrypted state after use.
*/
Expand Down
4 changes: 2 additions & 2 deletions boot/bootutil/src/image_validate.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,8 @@ bootutil_img_hash(struct enc_key_data *enc_state, int image_index,

if (off >= hdr_size && off < tlv_off) {
blk_off = (off - hdr_size) & 0xf;
boot_encrypt(enc_state, slot, off - hdr_size,
blk_sz, blk_off, tmp_buf);
boot_enc_decrypt(enc_state, slot, off - hdr_size,
blk_sz, blk_off, tmp_buf);
}
}
#endif
Expand Down
19 changes: 12 additions & 7 deletions boot/bootutil/src/loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -1573,9 +1573,15 @@ boot_copy_region(struct boot_loader_state *state,
blk_sz = tlv_off - abs_off;
}
}
boot_encrypt(BOOT_CURR_ENC(state), source_slot,
(abs_off + idx) - hdr->ih_hdr_size, blk_sz,
blk_off, &buf[idx]);
if (source_slot == 0) {
boot_enc_encrypt(BOOT_CURR_ENC(state), source_slot,
(abs_off + idx) - hdr->ih_hdr_size, blk_sz,
blk_off, &buf[idx]);
} else {
boot_enc_decrypt(BOOT_CURR_ENC(state), source_slot,
(abs_off + idx) - hdr->ih_hdr_size, blk_sz,
blk_off, &buf[idx]);
}
}
}
#endif
Expand Down Expand Up @@ -3081,10 +3087,9 @@ boot_decrypt_and_copy_image_to_sram(struct boot_loader_state *state,
* Part of the chunk is encrypted payload */
blk_sz = tlv_off - (bytes_copied);
}
boot_encrypt(BOOT_CURR_ENC(state), slot,
(bytes_copied + idx) - hdr->ih_hdr_size, blk_sz,
blk_off, cur_dst);

boot_enc_decrypt(BOOT_CURR_ENC(state), slot,
(bytes_copied + idx) - hdr->ih_hdr_size, blk_sz,
blk_off, cur_dst);
bytes_copied += chunk_sz;
}
rc = 0;
Expand Down

0 comments on commit 9125174

Please sign in to comment.