|
1 | 1 | # wolfBoot |
2 | 2 | wolfSSL Secure Bootloader |
| 3 | + |
| 4 | +wolfBoot is a portable, OS-agnostic, secure bootloader solution for 32-bit microcontrollers, |
| 5 | +relying on wolfCrypt for firmware authentication, and a modified version of |
| 6 | +[mcuboot](https://www.mcuboot.com/)'s *bootutil* library to implement firmware upgrade mechanisms. |
| 7 | + |
| 8 | +Due to the minimalist design of the bootloader and the tiny HAL API, wolfBoot is completely independent |
| 9 | +from any OS or bare-metal application, and can be easily ported and integrated in existing embedded software |
| 10 | +projects to provide a secure firmware upgrade mechanism. |
| 11 | + |
| 12 | + |
| 13 | +## Features |
| 14 | + - Multi-slot partitioning of the flash device |
| 15 | + - Integrity verification of the firmware image(s) |
| 16 | + - Authenticity verification of the firmware image(s) using wolfCrypt's Digital Signature Algorithms (DSA) |
| 17 | + - Minimalist hardware abstraction layer (HAL) interface to facilitate portability across different vendors/MCUs |
| 18 | + - In-place chain-loading of the firmware image in the primary slot |
| 19 | + - Copy/swap images from secondary slots into the primary slots to consent firmware upgrade operations |
| 20 | + |
| 21 | +## Components |
| 22 | + |
| 23 | +This repository contains the following components: |
| 24 | + - the bootloader |
| 25 | + - Ed25519 key generator and image signing tools |
| 26 | + - Baremetal test applications |
| 27 | + |
| 28 | +### The bootloader |
| 29 | + |
| 30 | +The bootloader is a memory-safe standalone bare-metal application, designed to run on a generic 32bit MCU, |
| 31 | +with no dynamic memory allocation mechanism or linkage to any standard C library. |
| 32 | + |
| 33 | +The core application depends on the following libraries: |
| 34 | + - wolfCrypt, which is used to verify the Ed25519 signature of the images |
| 35 | + - A modified version of mcuboot's bootutil, to handle the firmware image slots and the upgrade state-machine |
| 36 | + - A minimalist Hardware Abstraction Layer, with an implementation provided for the supported target, which is in charge for IAP flash access and clock setting on the specific MCU |
| 37 | + |
| 38 | +The goal of this application is to perform image verification and/or requested firmware upgrade tasks |
| 39 | +before chain-loading the actual firmware from a specific location in flash. |
| 40 | + |
| 41 | +Only ARM Cortex-M is supported at this stage. Support for more architectures and |
| 42 | +microcontrollers will be added later. |
| 43 | + |
| 44 | +## Integrating wolfBoot in an existing project |
| 45 | + |
| 46 | +Requirements: |
| 47 | + |
| 48 | + - Provide a HAL implementation for the target platform (see [Hardware Abstraction Layer](docs/HAL.md)) |
| 49 | + - Decide a flash partition strategy and modify `include/target.h` accordingly (see [Flash partitions](docs/flash_partitions.md) |
| 50 | + |
| 51 | +The following steps are automated in the default `Makefile` target, using the baremetal test |
| 52 | +application as an example to create the factory image: |
| 53 | + |
| 54 | + - Create a Ed25519 Key-pair using the `ed25519_keygen` tool |
| 55 | + - Compile the bootloader. The public key generated in the step above is included in the build |
| 56 | + - Compile the firmware image |
| 57 | + - Re-link the firmware to change the entry-point to the start address of the primary partition |
| 58 | + - Sign the firmware image using the `ed25519_sign` tool |
| 59 | + - Create a factory image by concatenating the bootloader and the firmware image |
| 60 | + - Flash the factory image to the target |
| 61 | + |
| 62 | +For more detailed information about the firmware image format, see [Firmware image](docs/firmware_image.md) |
| 63 | + |
| 64 | +## Upgrading the firmware |
| 65 | + |
| 66 | + - Compile the new firmware image, and link it so that its entry point is at the start address of the primary partition |
| 67 | + - Sign the firmware using the `ed25519_sign` tool and the private key generated for the factory image |
| 68 | + - Transfer the image using a secure connection, and store it to the secondary firmware slot |
| 69 | + - Trigger the image swap using bootutil's `boot_set_pending()` function |
| 70 | + - Reboot to let the bootloader begin the image swap |
| 71 | + |
| 72 | +For more detailed information about firmware upgrade procedures, see [Firmware Upgrade](docs/firmware_upgrade.md) |
| 73 | + |
0 commit comments