Skip to content

Commit

Permalink
boot: Replace boot_encrypt by boot_enc_encrypt and boot_enc_decrypt
Browse files Browse the repository at this point in the history
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.

Signed-off-by: Dominik Ermel <dominik.ermel@nordicsemi.no>
  • Loading branch information
de-nordic committed Jul 24, 2024
1 parent c0534bb commit 6bab39d
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 17 deletions.
15 changes: 12 additions & 3 deletions boot/boot_serial/src/boot_serial_encryption.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,9 +171,18 @@ decrypt_region_inplace(struct boot_loader_state *state,
blk_sz = tlv_off - (off + bytes_copied);
}
}
boot_encrypt(BOOT_CURR_ENC(state), slot,
(off + bytes_copied + idx) - hdr->ih_hdr_size, blk_sz,
blk_off, &buf[idx]);
/* slot determines direction: running on secondary slot (1) means
* decryption, running on primary slot (0) means encryption.
*/
if (slot == 0) {
boot_enc_encrypt(BOOT_CURR_ENC(state), slot,
(off + bytes_copied + idx) - hdr->ih_hdr_size, blk_sz,
blk_off, &buf[idx]);
} else {
boot_enc_decrypt(BOOT_CURR_ENC(state), slot,
(off + bytes_copied + idx) - hdr->ih_hdr_size, blk_sz,
blk_off, &buf[idx]);
}
}
rc = flash_area_erase(fap, off + bytes_copied, chunk_sz);
if (rc != 0) {
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 @@ -60,7 +60,9 @@ int boot_enc_load(struct enc_key_data *enc_state, int slot,
struct boot_status *bs);
bool boot_enc_valid(struct enc_key_data *enc_state, int image_index,
const struct flash_area *fap);
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
29 changes: 27 additions & 2 deletions boot/bootutil/src/encrypted.c
Original file line number Diff line number Diff line change
Expand Up @@ -673,10 +673,10 @@ boot_enc_valid(struct enc_key_data *enc_state, int image_index,
}

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
Expand All @@ -697,6 +697,31 @@ boot_encrypt(struct enc_key_data *enc_state, int slot, uint32_t off,
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];

/* boot_copy_region will call boot_encrypt with sz = 0 when skipping over
the TLVs. */
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;

enc = &enc_state[slot];
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 @@ -150,8 +150,8 @@ bootutil_img_hash(struct enc_key_data *enc_state, int image_index,
/* Only payload is encrypted (area between header and TLVs) */
if (off >= hdr_size && off < tlv_off) {
blk_off = (off - hdr_size) & 0xf;
boot_encrypt(enc_state, 1, off - hdr_size,
blk_sz, blk_off, tmp_buf);
boot_enc_decrypt(enc_state, 1, off - hdr_size,
blk_sz, blk_off, tmp_buf);
}
}
#endif
Expand Down
25 changes: 16 additions & 9 deletions boot/bootutil/src/loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -1299,6 +1299,15 @@ boot_copy_region(struct boot_loader_state *state,
(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 @@ -2772,18 +2781,16 @@ boot_decrypt_and_copy_image_to_sram(struct boot_loader_state *state,
cur_dst = ram_dst + bytes_copied;
blk_sz = chunk_sz;
idx = 0;
blk_off = ((bytes_copied) - hdr->ih_hdr_size) & 0xf;
if (bytes_copied + chunk_sz > tlv_off) {
/* Going over TLV section
* Part of the chunk is encrypted payload */
blk_off = ((bytes_copied) - hdr->ih_hdr_size) & 0xf;
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);
}
if (slot == 0) {
boot_enc_encrypt(BOOT_CURR_ENC(state), slot,
(bytes_copied + idx) - hdr->ih_hdr_size, blk_sz,
blk_off, cur_dst);
} else {
/* Image encrypted payload section */
blk_off = ((bytes_copied) - hdr->ih_hdr_size) & 0xf;
boot_encrypt(BOOT_CURR_ENC(state), slot,
boot_enc_decrypt(BOOT_CURR_ENC(state), slot,
(bytes_copied + idx) - hdr->ih_hdr_size, blk_sz,
blk_off, cur_dst);
}
Expand Down

0 comments on commit 6bab39d

Please sign in to comment.