diff --git a/README.md b/README.md index 193d7e3..c42ff0d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,15 @@ -# UTAT Firmware Development Environment +# UTAT Firmware Development MCUBoot POC -My firmware development environment for the University of Toronto Aerospace Team +Documentation of the steps taken to implement MCUBoot. -https://docs.zephyrproject.org/latest/develop/getting_started/index.html +## Environnment config +Use the environment written in flake.nix by running `nix develop` + + +## Set up Zephyr +Zephyr is the RTOS that runs on the Nucleo G431RB development board I'm using. + +[Getting started with Zephyr](https://docs.zephyrproject.org/latest/develop/getting_started/index.html) ```sh west init zephyrproject @@ -13,25 +20,85 @@ west zephyr-export cd zepyhr west sdk install +``` +## MCUBoot POC Implementation + +MCUBoot is a bootloader for Zephyr, which allows multiple firmwares to exist on a board. MCUBoot can dynamically switch which firmware is active. This is useful in the event of one firmware failing. + +[Abstract MCUBoot Guide](https://docs.mcuboot.com/readme-zephyr.html) + +```sh west build -p always -b nucleo_g431rb samples/basic/blinky west flash --runner pyocd # had to su root first to run this (after running nix develop) +``` -# MCUBoot -cd ~/utat-dev/zephyrproject -# Configure the DTS for partition sizes: https://docs.zephyrproject.org/latest/build/dts/intro-scope-purpose.html -# https://docs.zephyrproject.org/latest/build/dts/api/bindings/mtd/fixed-partitions.html -nvim "zephyr/boards/st/nucleo_g431rb/nucleo_g431rb.dts" +## Configure partition sizes + +The devicetree specification file declares the hardware configuration. The flash storage needs three partitions, one for boot, and two for the two firmwares it will hold. + +[DeviceTree Specification documentation](https://docs.zephyrproject.org/latest/build/dts/intro-scope-purpose.html) + +[Partitioning examples](https://docs.zephyrproject.org/latest/build/dts/api/bindings/mtd/fixed-partitions.html) + +The board I'm using has its DeviceTree Specification in `zephyr/boards/st/nucleo_g431rb/nucleo_g431rb.dts` + +I created a partition for MCUBoot, two firmware slots, and additional storage in the flash storage. + +```c +&flash0 { + partitions { + #address-cells = <1>; + #size-cells = <1>; + ranges; + + boot_partition: partition@0 { + compatible = "zephyr,mapped-partition"; + label = "mcuboot"; + reg = <0x00000000 0x00008000>; + }; + + slot0_partition: partition@8000 { + compatible = "zephyr,mapped-partition"; + label = "image-0"; + reg = <0x00008000 0x00010000>; + }; + + slot1_partition: partition@10000 { + compatible = "zephyr,mapped-partition"; + label = "image-1"; + reg = <0x00010000 0x0018000>; + }; + + storage_partition: partition@18000 { + compatible = "zephyr,mapped-partition"; + label = "storage"; + reg = <0x00018000 0x00020000>; + }; + }; +}; + +``` + +## Try to build MCUBoot +```sh +west build -p always -b nucleo_g431rb bootloader/mcuboot/boot/zephyr +``` + + + +old below +``` # Create a private key: https://docs.mcuboot.com/readme-zephyr.html -./scripts/imgtool.py keygen -k mykey.pem -t rsa-2048 +python ./bootloader/mcuboot/scripts/imgtool.py keygen -k private.pem -t rsa-2048 # Create its public key -openssl rsa -in mykey.pem -pubout > pubkey.pem +openssl rsa -in private.pem -pubout > public.pem # Set up signing: https://docs.mcuboot.com/readme-zephyr.html # ./bootloader/mcuboot/samples/zephyr/Makefile -python scripts/imgtool.py sign \ +python bootloader/mcuboot/scripts/imgtool.py sign \ --key mykey.pem \ --header-size 0x200 \ --align 8 \ @@ -44,7 +111,7 @@ python scripts/imgtool.py sign \ echo " # Set the key file -CONFIG_BOOT_SIGNATURE_KEY_FILE=pubkey.pem" >> "./zephyr/boards/st/nucleo_g431rb/nucleo_g431rb_defconfig" +CONFIG_BOOT_SIGNATURE_KEY_FILE=public.pem" >> "./zephyr/boards/st/nucleo_g431rb/nucleo_g431rb_defconfig" diff --git a/flake.nix b/flake.nix index e147a27..594fdf4 100644 --- a/flake.nix +++ b/flake.nix @@ -34,6 +34,7 @@ pkgs.python3Packages.click pkgs.pyocd pkgs.mcuboot-imgtool + pkgs.openssl ]; }; diff --git a/zephyrproject/mykey.pem b/zephyrproject/mykey.pem deleted file mode 100644 index 51f3b78..0000000 --- a/zephyrproject/mykey.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDfwKJjEhk0GRa8 -GzfzgqXt6S54wK37jpwS3mQDReII49cnXogOCxyVWh25nOisvSEp0Ke7syt7YF6j -hfKaNlTLpZQ0hJ4G7DrPTkA3BIUqsmu5EY7/Uq880QUr327PrN4xbIQti0ZvR7gk -Nb6q43xuP86WSAHseWzaz4Dlw8d+E89T0gSfOj7yCWPah9NuJOCQFWbdwi3T8B+e -X6csT4O8nsF1YPmU2VBG8L6vsdcIMtZ3puoD2t7pmMHOqnEjN7lfgpOIfyU/rxiH -jxp3s6ejrvFs6jI0ibHlhyb+owXnXtM9eoZym27RKV2F+oP6t00fK+rfNynh0a75 -j9JkvDWDAgMBAAECggEAGR8JnFHl3oGKmef8aiya8JEjlI8deYbTYxLw66Um8ZST -DWqBoAIDXYlWmQZS4UICvS0eB+bf1ORG+9kIGeRLtOmMMDFLhL91At1oPEUXpmmN -yqN8CJKB9jQJfpmBWXOxJp9mX66pY8kLlZUrKQiNadtkGF9RR/mCDTcK48ENXswo -v5tqJ9KTme/BaTj0/j6SurSqISpedOdXPafFY2vZhPA4Odue4ahZuDxkzorzF/a1 -TZRHlsqAalUz11clpOGKIxOA9iQvtPri7VKb+siONMF9pp8jP4OCHZfsnP0t4MzF -87jsa6U7CcszpDsdGIAnnw/sqh1W1uvJsBJG42Mb4QKBgQD9rsOGZNj2RYNiAXLN -N05tDCf7Toj/hUkwsT5dWKu6aNfhrmrrNoceExHkASlwVMojwTWdVsIoByjMVRh5 -ORQKq7seP4SdT5o2Qx9bP6dWFkly61UFD/OI415p8n2oEmKhaA97VjBjppxg6jNp -WqvF/rBBVSkHdC3jzM5cII8maQKBgQDhy+D+ShSfSc5T7FgYiukQ3sF7x0pzbfjU -K9wV4B8yKcHS1PPxYIFBsxD89EO7+quGPQhlRY1dcJxqxltPhSGy2xtOQr7nFpxM -PJbydDhC5N/PFKf39T44ABH6Lhw4iR2jcoI1vwxiqtsCnMuUsGxie7lA8/ZNs1de -fUQJug03CwKBgDH/4Q+7DrwzZTrK2Eq0TOPXUoYIq53ZMlzDgmw5jtdV1L7pdq9X -dvgpgAw1Ymp+e7ziVuPk9q2XA6aKWyGBa37S7DWBBW1QBDAPuL1uZVflWqKo2X/+ -7dwcHD67iaK3xPLVJMAFc9IgQ5AiePGZ6mNC2JB37XdHocfVVRL5Y92JAoGAbMMY -DWUBqfiTOjmN9cRzn3ytFkJYymEeipTV3nOmkzMp+bQ6DPq/SDZI6I+AUPvdwzuC -38Uw4uFrdsM1GIi4Qr7n2DquWgG6J77HtuHkd9RnOghpIDcxUSg3gJrVXSYu8Jwn -vFvaS2yhMhD0vxp8GrQd9/uLmMHaQ9ly/HxyASECgYEA8VO/rA7KMDo/RU1w2hAS -UUAYz+bZSHqvlP1IhmfKEhJOj1pBFZz0SHiT8xrSrXIOj0oO3gxbM3hlVVP5+1TS -toob+H2LI9LjFN9dA8R9OYFLII+eSKUXRMtFdk4r8Vbsca1cIxjBLvKOvEP3rDaZ -mQXQa0mysxjGQSyDFV/w37Q= ------END PRIVATE KEY----- diff --git a/zephyrproject/private.pem b/zephyrproject/private.pem new file mode 100644 index 0000000..d924ca0 --- /dev/null +++ b/zephyrproject/private.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCvcSzTn4slqBf+ +U6lZV6VsW1j6W+dfOWf04bZnSviD/naVWoSoVwfZM1KB+UZMsQAKqqxVhrMrwgi2 +rZLOTIbumqjmO00oBH5jqqI8JrRX27Qg8u5XbgYnzbvgHmyVEj68/l6Kiv8Epnrh +hh/6JqReDdJdfUmL1MO5LmU8Yu9IeBRq0yDx3JfNn8QaNIxh6/xr50QWzNeqJgB/ +oVwZ3/9M4I1HGgeA8hTrTCtEDtpK50bSvwKk6X8mWQ/ZLVNXbamyi+UK6Uqnr7rJ +7IrYMys7diAGp+xIIy0CdidwlFFu/uigzjEqSX/ciC9sBVOKPoT0vm4OMVDTYvOY +Phmj1C9BAgMBAAECggEACocUji87xtQOn2KH9OreItiAI7nYzdHy1M5e2XoRAFD2 +E2r9wU7V7s12P16JdXfzlnlqYz8rf2BZkRQkDSU7dG+Gtzql5R5ZoKgnGV4463ma +8bnJApcTg+mD59IN1mdSO3Tsa9YAsWoaCEu55sn103Yp3cy8WW4T0gf7555jWQW+ +McOIby/zQQPFxsJ+67BqKCByfZ/r7YeYR8AOBPwPoltQPQUstCpaTFfZinomzRFT +N3aDfAbcm7vapZB1BP7vrVlHdTe99gg2c2MpTeU2SvHhjqABYswXuGxR/w+xIsSl +CWphOntash0JeOWK4Wojfgly/ZlGfTIHQtr2CTCVJwKBgQDU+D311EJZytU4qYk6 +elnJGg1kAm7QShZR0g7KlrQtxNjuo7mUy/j/wrs30PjHfi6hPNf5czwYg+3LNeWS +YPFr0PjEREHze0t/tAgeRahZnk0HRwJ147m89ao36z95gYSraMeGdHxtLbW4QimY +PDOMJ6VMxaPdp1M116sTBpF5qwKBgQDS49XRu8oA3okZdGFtvpELHZFDHmN1/tMf +aoP/SQQ1gq+c3kCqo7zHLwnODvSt+YXBclJdRI0h32qkvmGltF1Lu5R60EGciLzc +QKJzW3qodoFd8Nh+FO97x7x500pZo5bKtyVMleAULEQSQmv/0RSIevD5InHVh5l6 +boi15P+GwwKBgQCUc7IlEN9rXfMBO1RX+f9qKgnZg8Sg1nP2dtkuqJxSJxwcRO5Q +5VndVm1QfA9eZ/uzEwltbcEfSZ9RfnFXdtHymMk/bmEWiwRWsTTTfTTbu3fwMbRq +XuIS8J/FuOsXFIxZO4GRnNM6+5jnJt99qcE42k3kVQRjtoZPStWKPpLbXwKBgAJY +iHNZzGhwEURYOBE5cnGWNZxyhRa16/FIhQlc7ZAO0RdEnaGISrxIeKpzHiOlR+ib +9fCVp6A91PjaKUnnlLYX8xHeqSwtlTQ5/9SaquWe09eQq0fTwco1sZIFWKlgmXfN +y7trW1++Ek/Fr1/cGodeHroWuP9wD7P98MVdM75zAoGBAKEWZE+9Ppn3qDXU99J4 +Ul32zTLYt+DtYdrryDpc68dPNn+bXb4zuvGgr+O0p4jR7fRh0xNfUKUSibvszR0w +aNk3cx2CRgRw2mMfX/Rh/sJ+QXzJhJhV0xFLXi9cEaTzzRNeK1xweZwlbxF8Vk20 +rywQ9K9WgOEZpeUziuuTqw91 +-----END PRIVATE KEY----- diff --git a/zephyrproject/pubkey.pem b/zephyrproject/pubkey.pem deleted file mode 100644 index 8867081..0000000 --- a/zephyrproject/pubkey.pem +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA38CiYxIZNBkWvBs384Kl -7ekueMCt+46cEt5kA0XiCOPXJ16IDgsclVoduZzorL0hKdCnu7Mre2Beo4XymjZU -y6WUNISeBuw6z05ANwSFKrJruRGO/1KvPNEFK99uz6zeMWyELYtGb0e4JDW+quN8 -bj/OlkgB7Hls2s+A5cPHfhPPU9IEnzo+8glj2ofTbiTgkBVm3cIt0/Afnl+nLE+D -vJ7BdWD5lNlQRvC+r7HXCDLWd6bqA9re6ZjBzqpxIze5X4KTiH8lP68Yh48ad7On -o67xbOoyNImx5Ycm/qMF517TPXqGcptu0SldhfqD+rdNHyvq3zcp4dGu+Y/SZLw1 -gwIDAQAB ------END PUBLIC KEY----- diff --git a/zephyrproject/public.pem b/zephyrproject/public.pem new file mode 100644 index 0000000..3ca296c --- /dev/null +++ b/zephyrproject/public.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3Es05+LJagX/lOpWVel +bFtY+lvnXzln9OG2Z0r4g/52lVqEqFcH2TNSgflGTLEACqqsVYazK8IItq2SzkyG +7pqo5jtNKAR+Y6qiPCa0V9u0IPLuV24GJ8274B5slRI+vP5eior/BKZ64YYf+iak +Xg3SXX1Ji9TDuS5lPGLvSHgUatMg8dyXzZ/EGjSMYev8a+dEFszXqiYAf6FcGd// +TOCNRxoHgPIU60wrRA7aSudG0r8CpOl/JlkP2S1TV22psovlCulKp6+6yeyK2DMr +O3YgBqfsSCMtAnYncJRRbv7ooM4xKkl/3IgvbAVTij6E9L5uDjFQ02LzmD4Zo9Qv +QQIDAQAB +-----END PUBLIC KEY-----