Make mcuboot less mynewt style
Remove most of mynewt specific stuff to a separate port package. This
should make mcuboot less "mynewt'y" and slightly easier to port to.
- Mynewt specific stuff moved to boot/mynewt.
- Sample app moved from apps/boot to boot/mynewt.
- Use MYNEWT_VAL macro only on mynewt port.
- BOOTUTIL_* and MYNEWT_VAL() usage moved to MCUBOOT_ defines.
diff --git a/boot/bootutil/include/bootutil/sha256.h b/boot/bootutil/include/bootutil/sha256.h
index 9bc366c..6dd02c7 100644
--- a/boot/bootutil/include/bootutil/sha256.h
+++ b/boot/bootutil/include/bootutil/sha256.h
@@ -21,29 +21,37 @@
* This module provides a thin abstraction over some of the crypto
* primitives to make it easier to swap out the used crypto library.
*
- * At this point, there are two choices: BOOTUTIL_USE_MBED_TLS, or
- * BOOTUTIL_USE_TINYCRYPT. It is a compile error there is not exactly
+ * At this point, there are two choices: MCUBOOT_USE_MBED_TLS, or
+ * MCUBOOT_USE_TINYCRYPT. It is a compile error there is not exactly
* one of these defined.
*/
#ifndef __BOOTUTIL_CRYPTO_H_
#define __BOOTUTIL_CRYPTO_H_
-#if defined(BOOTUTIL_USE_MBED_TLS) && defined(BOOTUTIL_USE_TINYCRYPT)
+/* FIXME: The test below will only work as long as the app name is
+ * "mynewt", building for mynewt could export some __linux__, __APPLE__
+ * style macro!
+ */
+#ifdef APP_mynewt
+#include "mynewt/config.h"
+#endif
+
+#if defined(MCUBOOT_USE_MBED_TLS) && defined(MCUBOOT_USE_TINYCRYPT)
#error "Cannot define both MBED_TLS and TINYCRYPT"
#endif
-#if !defined(BOOTUTIL_USE_MBED_TLS) && !defined(BOOTUTIL_USE_TINYCRYPT)
+#if !defined(MCUBOOT_USE_MBED_TLS) && !defined(MCUBOOT_USE_TINYCRYPT)
#error "One of MBED_TLS or TINYCRYPT must be defined"
#endif
-#ifdef BOOTUTIL_USE_MBED_TLS
+#ifdef MCUBOOT_USE_MBED_TLS
#include <mbedtls/sha256.h>
-#endif /* BOOTUTIL_USE_MBED_TLS */
+#endif /* MCUBOOT_USE_MBED_TLS */
-#ifdef BOOTUTIL_USE_TINYCRYPT
+#ifdef MCUBOOT_USE_TINYCRYPT
#include <tinycrypt/sha256.h>
-#endif /* BOOTUTIL_USE_TINYCRYPT */
+#endif /* MCUBOOT_USE_TINYCRYPT */
#include <stdint.h>
@@ -51,7 +59,7 @@
extern "C" {
#endif
-#ifdef BOOTUTIL_USE_MBED_TLS
+#ifdef MCUBOOT_USE_MBED_TLS
typedef mbedtls_sha256_context bootutil_sha256_context;
static inline void bootutil_sha256_init(bootutil_sha256_context *ctx)
@@ -72,9 +80,9 @@
{
mbedtls_sha256_finish(ctx, output);
}
-#endif /* BOOTUTIL_USE_MBED_TLS */
+#endif /* MCUBOOT_USE_MBED_TLS */
-#ifdef BOOTUTIL_USE_TINYCRYPT
+#ifdef MCUBOOT_USE_TINYCRYPT
typedef struct tc_sha256_state_struct bootutil_sha256_context;
static inline void bootutil_sha256_init(bootutil_sha256_context *ctx)
{
@@ -93,7 +101,7 @@
{
tc_sha256_final(output, ctx);
}
-#endif /* BOOTUTIL_USE_TINYCRYPT */
+#endif /* MCUBOOT_USE_TINYCRYPT */
#ifdef __cplusplus
}
diff --git a/boot/bootutil/src/bootutil_misc.c b/boot/bootutil/src/bootutil_misc.c
index 153d56b..902fe77 100644
--- a/boot/bootutil/src/bootutil_misc.c
+++ b/boot/bootutil/src/bootutil_misc.c
@@ -21,7 +21,6 @@
#include <string.h>
#include <inttypes.h>
-#include "syscfg/syscfg.h"
#include "sysflash/sysflash.h"
#include "hal/hal_bsp.h"
#include "hal/hal_flash.h"
diff --git a/boot/bootutil/src/bootutil_priv.h b/boot/bootutil/src/bootutil_priv.h
index 85fa178..e8c8a8f 100644
--- a/boot/bootutil/src/bootutil_priv.h
+++ b/boot/bootutil/src/bootutil_priv.h
@@ -20,7 +20,6 @@
#ifndef H_BOOTUTIL_PRIV_
#define H_BOOTUTIL_PRIV_
-#include "syscfg/syscfg.h"
#include "bootutil/image.h"
#ifdef __cplusplus
diff --git a/boot/bootutil/src/image_ec.c b/boot/bootutil/src/image_ec.c
index de08b13..fc4c7f0 100644
--- a/boot/bootutil/src/image_ec.c
+++ b/boot/bootutil/src/image_ec.c
@@ -19,9 +19,7 @@
#include <string.h>
-#include "syscfg/syscfg.h"
-
-#if MYNEWT_VAL(BOOTUTIL_SIGN_EC)
+#ifdef MCUBOOT_SIGN_EC
#include "bootutil/sign_key.h"
#include "mbedtls/ecdsa.h"
@@ -119,4 +117,4 @@
return rc;
}
-#endif /* MYNEWT_VAL(BOOTUTIL_SIGN_EC) */
+#endif /* MCUBOOT_SIGN_EC */
diff --git a/boot/bootutil/src/image_ec256.c b/boot/bootutil/src/image_ec256.c
index 1e7354e..615fb9f 100644
--- a/boot/bootutil/src/image_ec256.c
+++ b/boot/bootutil/src/image_ec256.c
@@ -19,9 +19,7 @@
#include <string.h>
-#include "syscfg/syscfg.h"
-
-#if MYNEWT_VAL(BOOTUTIL_SIGN_EC256)
+#ifdef MCUBOOT_SIGN_EC256
#include "bootutil/sign_key.h"
#include "mbedtls/oid.h"
@@ -176,4 +174,4 @@
return -2;
}
}
-#endif /* MYNEWT_VAL(BOOTUTIL_SIGN_EC256) */
+#endif /* MCUBOOT_SIGN_EC256 */
diff --git a/boot/bootutil/src/image_rsa.c b/boot/bootutil/src/image_rsa.c
index 4890f46..3ea1a89 100644
--- a/boot/bootutil/src/image_rsa.c
+++ b/boot/bootutil/src/image_rsa.c
@@ -19,9 +19,7 @@
#include <string.h>
-#include "syscfg/syscfg.h"
-
-#if MYNEWT_VAL(BOOTUTIL_SIGN_RSA)
+#ifdef MCUBOOT_SIGN_RSA
#include "bootutil/sign_key.h"
#include "mbedtls/rsa.h"
@@ -143,4 +141,4 @@
return rc;
}
-#endif /* MYNEWT_VAL(BOOTUTIL_SIGN_RSA) */
+#endif /* MCUBOOT_SIGN_RSA */
diff --git a/boot/bootutil/src/image_validate.c b/boot/bootutil/src/image_validate.c
index 0e78407..9413d31 100644
--- a/boot/bootutil/src/image_validate.c
+++ b/boot/bootutil/src/image_validate.c
@@ -22,17 +22,16 @@
#include <inttypes.h>
#include <string.h>
-#include "syscfg/syscfg.h"
#include "hal/hal_flash.h"
#include "flash_map/flash_map.h"
#include "bootutil/image.h"
#include "bootutil/sha256.h"
#include "bootutil/sign_key.h"
-#if MYNEWT_VAL(BOOTUTIL_SIGN_RSA)
+#ifdef MCUBOOT_SIGN_RSA
#include "mbedtls/rsa.h"
#endif
-#if MYNEWT_VAL(BOOTUTIL_SIGN_EC) || MYNEWT_VAL(BOOTUTIL_SIGN_EC256)
+#if defined(MCUBOOT_SIGN_EC) || defined(MCUBOOT_SIGN_EC256)
#include "mbedtls/ecdsa.h"
#endif
#include "mbedtls/asn1.h"
@@ -96,8 +95,8 @@
uint32_t off;
uint32_t size;
uint32_t sha_off = 0;
-#if MYNEWT_VAL(BOOTUTIL_SIGN_RSA) || MYNEWT_VAL(BOOTUTIL_SIGN_EC) || \
- MYNEWT_VAL(BOOTUTIL_SIGN_EC256)
+#if defined(MCUBOOT_SIGN_RSA) || defined(MCUBOOT_SIGN_EC) || \
+ defined(MCUBOOT_SIGN_EC256)
uint32_t sig_off = 0;
uint32_t sig_len = 0;
#endif
@@ -106,17 +105,17 @@
uint8_t hash[32];
int rc;
-#if MYNEWT_VAL(BOOTUTIL_SIGN_RSA)
+#ifdef MCUBOOT_SIGN_RSA
if ((hdr->ih_flags & IMAGE_F_PKCS15_RSA2048_SHA256) == 0) {
return -1;
}
#endif
-#if MYNEWT_VAL(BOOTUTIL_SIGN_EC)
+#ifdef MCUBOOT_SIGN_EC
if ((hdr->ih_flags & IMAGE_F_ECDSA224_SHA256) == 0) {
return -1;
}
#endif
-#if MYNEWT_VAL(BOOTUTIL_SIGN_EC256)
+#ifdef MCUBOOT_SIGN_EC256
if ((hdr->ih_flags & IMAGE_F_ECDSA256_SHA256) == 0) {
return -1;
}
@@ -150,7 +149,7 @@
}
sha_off = off + sizeof(tlv);
}
-#if MYNEWT_VAL(BOOTUTIL_SIGN_RSA)
+#ifdef MCUBOOT_SIGN_RSA
if (tlv.it_type == IMAGE_TLV_RSA2048) {
if (tlv.it_len != 256) { /* 2048 bits */
return -1;
@@ -159,7 +158,7 @@
sig_len = tlv.it_len;
}
#endif
-#if MYNEWT_VAL(BOOTUTIL_SIGN_EC)
+#ifdef MCUBOOT_SIGN_EC
if (tlv.it_type == IMAGE_TLV_ECDSA224) {
if (tlv.it_len < 64) { /* oids + 2 * 28 bytes */
return -1;
@@ -168,7 +167,7 @@
sig_len = tlv.it_len;
}
#endif
-#if MYNEWT_VAL(BOOTUTIL_SIGN_EC256)
+#ifdef MCUBOOT_SIGN_EC256
if (tlv.it_type == IMAGE_TLV_ECDSA256) {
if (tlv.it_len < 72) { /* oids + 2 * 32 bytes */
return -1;
@@ -193,8 +192,8 @@
return -1;
}
}
-#if MYNEWT_VAL(BOOTUTIL_SIGN_RSA) || MYNEWT_VAL(BOOTUTIL_SIGN_EC) || \
- MYNEWT_VAL(BOOTUTIL_SIGN_EC256)
+#if defined(MCUBOOT_SIGN_RSA) || defined(MCUBOOT_SIGN_EC) || \
+ defined(MCUBOOT_SIGN_EC256)
if (!sig_off) {
/*
* Header said there should be PKCS1.v5 signature, no TLV
diff --git a/boot/bootutil/src/loader.c b/boot/bootutil/src/loader.c
index dc6d9cb..95a1572 100644
--- a/boot/bootutil/src/loader.c
+++ b/boot/bootutil/src/loader.c
@@ -1265,7 +1265,7 @@
switch (swap_type) {
case BOOT_SWAP_TYPE_NONE:
-#ifdef BOOTUTIL_VALIDATE_SLOT0
+#ifdef MCUBOOT_VALIDATE_SLOT0
rc = boot_validate_slot(0);
assert(rc == 0);
if (rc != 0) {
diff --git a/boot/mynewt/README.md b/boot/mynewt/README.md
new file mode 100644
index 0000000..ef924d5
--- /dev/null
+++ b/boot/mynewt/README.md
@@ -0,0 +1,6 @@
+# mcuboot - apps/boot
+
+This sample app implements a boot loader for the Mynewt OS (apache.mynewt.org).
+This app requires the following Mynewt repositories:
+ * @mcuboot (this one)
+ * @apache-mynewt-core
diff --git a/boot/mynewt/include/mynewt/config.h b/boot/mynewt/include/mynewt/config.h
new file mode 100644
index 0000000..9be051d
--- /dev/null
+++ b/boot/mynewt/include/mynewt/config.h
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+#ifndef __BOOT_CONFIG_H__
+#define __BOOT_CONFIG_H__
+
+#include "syscfg/syscfg.h"
+
+#if MYNEWT_VAL(BOOT_SERIAL)
+#define MCUBOOT_SERIAL 1
+#endif
+#if MYNEWT_VAL(BOOTUTIL_VALIDATE_SLOT0)
+#define MCUBOOT_VALIDATE_SLOT0 1
+#endif
+#if MYNEWT_VAL(BOOTUTIL_SIGN_EC256)
+#define MCUBOOT_SIGN_EC256 1
+#endif
+#if MYNEWT_VAL(BOOTUTIL_SIGN_RSA)
+#define MCUBOOT_SIGN_RSA 1
+#endif
+#if MYNEWT_VAL(BOOTUTIL_SIGN_EC)
+#define MCUBOOT_SIGN_EC 1
+#endif
+#if MYNEWT_VAL(BOOTUTIL_USE_MBED_TLS)
+#define MCUBOOT_USE_MBED_TLS 1
+#endif
+#if MYNEWT_VAL(BOOTUTIL_USE_TINYCRYPT)
+#define MCUBOOT_USE_TINYCRYPT 1
+#endif
+
+#endif /* __BOOT_CONFIG_H__ */
diff --git a/boot/bootutil/syscfg.yml b/boot/mynewt/pkg.yml
similarity index 64%
rename from boot/bootutil/syscfg.yml
rename to boot/mynewt/pkg.yml
index 80fca9f..c1c0cc7 100644
--- a/boot/bootutil/syscfg.yml
+++ b/boot/mynewt/pkg.yml
@@ -1,3 +1,4 @@
+#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
@@ -16,15 +17,19 @@
# under the License.
#
-# Package: boot/bootutil
+pkg.name: boot/mynewt
+pkg.type: app
+pkg.description: "Mynewt port of mcuboot"
+pkg.author: "Fabio Utzig <utzig@apache.org>"
+pkg.homepage: "http://mynewt.apache.org/"
+pkg.keywords:
+ - loader
-syscfg.defs:
- BOOTUTIL_SIGN_RSA:
- description: 'Images are signed using RSA2048.'
- value: '0'
- BOOTUTIL_SIGN_EC:
- description: 'Images are signed using ECDSA NIST P-224.'
- value: '0'
- BOOTUTIL_SIGN_EC256:
- description: 'Images are signed using ECDSA NIST P-256.'
- value: '0'
+pkg.deps:
+ - "@mcuboot/boot/bootutil"
+ - "@apache-mynewt-core/kernel/os"
+ - "@apache-mynewt-core/sys/console/stub"
+
+pkg.deps.BOOT_SERIAL.OVERWRITE:
+ - "@apache-mynewt-core/sys/console/full"
+ - "@mcuboot/boot/boot_serial"
diff --git a/boot/mynewt/src/main.c b/boot/mynewt/src/main.c
new file mode 100755
index 0000000..9cf4737
--- /dev/null
+++ b/boot/mynewt/src/main.c
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <assert.h>
+#include <stddef.h>
+#include <inttypes.h>
+#include "syscfg/syscfg.h"
+#include <flash_map/flash_map.h>
+#include <os/os.h>
+#include <bsp/bsp.h>
+#include <hal/hal_bsp.h>
+#include <hal/hal_system.h>
+#include <hal/hal_flash.h>
+#ifdef MCUBOOT_SERIAL
+#include <hal/hal_gpio.h>
+#include <boot_serial/boot_serial.h>
+#include <sysinit/sysinit.h>
+#endif
+#include <console/console.h>
+#include "bootutil/image.h"
+#include "bootutil/bootutil.h"
+
+#define BOOT_AREA_DESC_MAX (256)
+#define AREA_DESC_MAX (BOOT_AREA_DESC_MAX)
+
+#ifdef MCUBOOT_SERIAL
+#define BOOT_SER_CONS_INPUT 128
+#endif
+
+int
+main(void)
+{
+ struct boot_rsp rsp;
+ int rc;
+
+#ifdef MCUBOOT_SERIAL
+ sysinit();
+#else
+ flash_map_init();
+ hal_bsp_init();
+#endif
+
+#ifdef MCUBOOT_SERIAL
+ /*
+ * Configure a GPIO as input, and compare it against expected value.
+ * If it matches, await for download commands from serial.
+ */
+ hal_gpio_init_in(BOOT_SERIAL_DETECT_PIN, BOOT_SERIAL_DETECT_PIN_CFG);
+ if (hal_gpio_read(BOOT_SERIAL_DETECT_PIN) == BOOT_SERIAL_DETECT_PIN_VAL) {
+ boot_serial_start(BOOT_SER_CONS_INPUT);
+ assert(0);
+ }
+#endif
+ rc = boot_go(&rsp);
+ assert(rc == 0);
+
+ hal_system_start((void *)(rsp.br_image_addr + rsp.br_hdr->ih_hdr_size));
+
+ return 0;
+}
diff --git a/boot/bootutil/syscfg.yml b/boot/mynewt/syscfg.yml
similarity index 60%
copy from boot/bootutil/syscfg.yml
copy to boot/mynewt/syscfg.yml
index 80fca9f..de4f190 100644
--- a/boot/bootutil/syscfg.yml
+++ b/boot/mynewt/syscfg.yml
@@ -16,15 +16,35 @@
# under the License.
#
-# Package: boot/bootutil
+# Package: boot/mynewt
syscfg.defs:
+ BOOT_LOADER:
+ description: 'Set to indicate that this app is a bootloader.'
+ value: 1
+ BOOT_SERIAL:
+ description: 'Support image upgrade over serial within bootloader'
+ value: 0
+ BOOTUTIL_VALIDATE_SLOT0:
+ description: 'Validate image at slot 0 on each boot.'
+ value: 0
BOOTUTIL_SIGN_RSA:
description: 'Images are signed using RSA2048.'
- value: '0'
+ value: 0
BOOTUTIL_SIGN_EC:
description: 'Images are signed using ECDSA NIST P-224.'
- value: '0'
+ value: 0
BOOTUTIL_SIGN_EC256:
description: 'Images are signed using ECDSA NIST P-256.'
- value: '0'
+ value: 0
+ BOOTUTIL_USE_MBED_TLS:
+ description: 'Use mbed TLS for crypto operations.'
+ value: 0
+ BOOTUTIL_USE_TINYCRYPT:
+ description: 'Use tinycrypt for crypto operations.'
+ value: 0
+
+syscfg.vals:
+ SYSINIT_CONSTRAIN_INIT: 0
+ OS_SCHEDULING: 0
+ OS_CPUTIME_TIMER_NUM: -1
diff --git a/boot/zephyr/include/syscfg/syscfg.h b/boot/zephyr/include/syscfg/syscfg.h
deleted file mode 100644
index ad58eed..0000000
--- a/boot/zephyr/include/syscfg/syscfg.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __SYSCFG_H__
-#define __SYSCFG_H__
-
-#define MYNEWT_VAL(x) (x)
-
-#endif /* __SYSCFG_H__ */
diff --git a/boot/zephyr/keys.c b/boot/zephyr/keys.c
index 9d2f36b..56b78df 100644
--- a/boot/zephyr/keys.c
+++ b/boot/zephyr/keys.c
@@ -19,7 +19,7 @@
#include <bootutil/sign_key.h>
-#if defined(BOOTUTIL_SIGN_RSA)
+#if defined(MCUBOOT_SIGN_RSA)
const unsigned char root_pub_der[] = {
0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd1, 0x06, 0x08,
0x1a, 0x18, 0x44, 0x2c, 0x18, 0xe8, 0xfb, 0xfd, 0xf7, 0x0d, 0xa3, 0x4f,
@@ -46,7 +46,7 @@
0xc9, 0x02, 0x03, 0x01, 0x00, 0x01
};
const unsigned int root_pub_der_len = 270;
-#elif defined(BOOTUTIL_SIGN_EC256)
+#elif defined(MCUBOOT_SIGN_EC256)
const unsigned char root_pub_der[] = {
0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86,
0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,
@@ -65,6 +65,7 @@
#error "No public key available for given signing algorithm."
#endif
+#if defined(MCUBOOT_SIGN_RSA) || defined(MCUBOOT_SIGN_EC256)
const struct bootutil_key bootutil_keys[] = {
{
.key = root_pub_der,
@@ -72,3 +73,4 @@
},
};
const int bootutil_key_cnt = 1;
+#endif