mirror of https://github.com/wolfSSL/wolfBoot.git
Expanded WCS interface
- Added TRNG driver for STM32L5 - Link with correct objects in test-app - Expanded wc_callable interfacepull/275/head
parent
61ea65747b
commit
fd809c5b69
1
Makefile
1
Makefile
|
@ -38,6 +38,7 @@ else
|
||||||
endif
|
endif
|
||||||
|
|
||||||
WOLFCRYPT_OBJS:=
|
WOLFCRYPT_OBJS:=
|
||||||
|
SECURE_OBJS:=
|
||||||
PUBLIC_KEY_OBJS:=
|
PUBLIC_KEY_OBJS:=
|
||||||
ifneq ("$(NO_LOADER)","1")
|
ifneq ("$(NO_LOADER)","1")
|
||||||
OBJS+=./src/loader.o
|
OBJS+=./src/loader.o
|
||||||
|
|
6
arch.mk
6
arch.mk
|
@ -166,9 +166,9 @@ ifeq ($(ARCH),ARM)
|
||||||
ifeq ($(TZEN),1)
|
ifeq ($(TZEN),1)
|
||||||
CFLAGS+=-mcmse
|
CFLAGS+=-mcmse
|
||||||
ifeq ($(WCSM),1)
|
ifeq ($(WCSM),1)
|
||||||
OBJS+=./src/wc_callable.o
|
SECURE_OBJS+=./src/wc_callable.o
|
||||||
WOLFCRYPT_OBJS+=./lib/wolfssl/wolfcrypt/src/random.o
|
SECURE_OBJS+=./lib/wolfssl/wolfcrypt/src/random.o
|
||||||
WOLFCRYPT_OBJS+=./lib/wolfssl/wolfcrypt/src/asn.o
|
SECURE_OBJS+=./lib/wolfssl/wolfcrypt/src/asn.o
|
||||||
CFLAGS+=-DWOLFCRYPT_SECURE_MODE
|
CFLAGS+=-DWOLFCRYPT_SECURE_MODE
|
||||||
SECURE_LDFLAGS+=-Wl,--cmse-implib -Wl,--out-implib=./src/wc_secure_calls.o
|
SECURE_LDFLAGS+=-Wl,--cmse-implib -Wl,--out-implib=./src/wc_secure_calls.o
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
ARCH?=ARM
|
||||||
|
TZEN?=1
|
||||||
|
TARGET?=stm32l5
|
||||||
|
SIGN?=ECC256
|
||||||
|
HASH?=SHA256
|
||||||
|
DEBUG?=1
|
||||||
|
VTOR?=1
|
||||||
|
CORTEX_M0?=0
|
||||||
|
CORTEX_M33?=1
|
||||||
|
NO_ASM?=0
|
||||||
|
NO_MPU=1
|
||||||
|
EXT_FLASH?=0
|
||||||
|
SPI_FLASH?=0
|
||||||
|
ALLOW_DOWNGRADE?=0
|
||||||
|
NVM_FLASH_WRITEONCE?=1
|
||||||
|
WOLFBOOT_VERSION?=1
|
||||||
|
V?=0
|
||||||
|
SPMATH?=1
|
||||||
|
RAM_CODE?=0
|
||||||
|
DUALBANK_SWAP?=0
|
||||||
|
WOLFBOOT_PARTITION_SIZE?=0x1F800
|
||||||
|
WOLFBOOT_SECTOR_SIZE?=0x800
|
||||||
|
WOLFBOOT_PARTITION_BOOT_ADDRESS?=0x08040000
|
||||||
|
WOLFBOOT_PARTITION_UPDATE_ADDRESS?=0x805F800
|
||||||
|
WOLFBOOT_PARTITION_SWAP_ADDRESS?=0x0807F000
|
||||||
|
FLAGS_HOME=0
|
||||||
|
DISABLE_BACKUP=0
|
||||||
|
WCSM=1
|
|
@ -238,6 +238,7 @@
|
||||||
#define RCC_AHB2_CLOCK_ER (*(volatile uint32_t *)(RCC_BASE + 0x4C ))
|
#define RCC_AHB2_CLOCK_ER (*(volatile uint32_t *)(RCC_BASE + 0x4C ))
|
||||||
#define GPIOG_AHB2_CLOCK_ER (1 << 6)
|
#define GPIOG_AHB2_CLOCK_ER (1 << 6)
|
||||||
#define GPIOD_AHB2_CLOCK_ER (1 << 3)
|
#define GPIOD_AHB2_CLOCK_ER (1 << 3)
|
||||||
|
#define TRNG_AHB2_CLOCK_ER (1 << 18)
|
||||||
|
|
||||||
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
|
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
|
||||||
|
|
||||||
|
@ -729,4 +730,45 @@ void hal_prepare_boot(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WOLFCRYPT_SECURE_MODE
|
||||||
|
|
||||||
|
#define TRNG_BASE 0x520C0800
|
||||||
|
#define TRNG_CR *((volatile uint32_t *)(TRNG_BASE + 0x00))
|
||||||
|
#define TRNG_SR *((volatile uint32_t *)(TRNG_BASE + 0x04))
|
||||||
|
#define TRNG_DR *((volatile uint32_t *)(TRNG_BASE + 0x08))
|
||||||
|
|
||||||
|
#define TRNG_SR_DRDY (1 << 0)
|
||||||
|
#define TRNG_CR_RNGEN (1 << 2)
|
||||||
|
|
||||||
|
void hal_trng_init(void)
|
||||||
|
{
|
||||||
|
RCC_AHB2_CLOCK_ER |= TRNG_AHB2_CLOCK_ER;
|
||||||
|
TRNG_CR |= TRNG_CR_RNGEN;
|
||||||
|
while ((TRNG_SR & TRNG_SR_DRDY) == 0)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Never used (RNG keeps running when in secure-mode) */
|
||||||
|
void hal_trng_fini(void)
|
||||||
|
{
|
||||||
|
TRNG_CR &= (~TRNG_CR_RNGEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
int hal_trng_get_entropy(unsigned char *out, unsigned len)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
uint32_t rand_seed = 0;
|
||||||
|
for (i = 0; i < len; i += 4)
|
||||||
|
{
|
||||||
|
while ((TRNG_SR & TRNG_SR_DRDY) == 0)
|
||||||
|
;
|
||||||
|
rand_seed = TRNG_DR;
|
||||||
|
if ((len - i) < 4)
|
||||||
|
memcpy(out + i, &rand_seed, len - i);
|
||||||
|
else
|
||||||
|
memcpy(out + i, &rand_seed, 4);
|
||||||
|
}
|
||||||
|
return rand_seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -106,6 +106,14 @@ void hal_prepare_boot(void);
|
||||||
}
|
}
|
||||||
#endif /* !SPI_FLASH */
|
#endif /* !SPI_FLASH */
|
||||||
|
|
||||||
|
#ifdef WOLFCRYPT_SECURE_MODE
|
||||||
|
|
||||||
|
void hal_trng_init(void);
|
||||||
|
void hal_trng_fini(void);
|
||||||
|
int hal_trng_get_entropy(unsigned char *out, unsigned len);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -97,6 +97,10 @@ static inline void wolfBoot_panic(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef WOLFCRYPT_SECURE_MODE
|
||||||
|
void wcs_Init(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -105,6 +105,8 @@ extern int tolower(int c);
|
||||||
# define NO_ECC_KEY_EXPORT
|
# define NO_ECC_KEY_EXPORT
|
||||||
# define NO_ASN
|
# define NO_ASN
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
|
||||||
# define HAVE_ECC_SIGN
|
# define HAVE_ECC_SIGN
|
||||||
# define HAVE_ECC_CDH
|
# define HAVE_ECC_CDH
|
||||||
# define WOLFSSL_SP
|
# define WOLFSSL_SP
|
||||||
|
@ -113,6 +115,9 @@ extern int tolower(int c);
|
||||||
# define SP_WORD_SIZE 32
|
# define SP_WORD_SIZE 32
|
||||||
# define WOLFSSL_HAVE_SP_ECC
|
# define WOLFSSL_HAVE_SP_ECC
|
||||||
# define WOLFSSL_SP_MATH_ALL
|
# define WOLFSSL_SP_MATH_ALL
|
||||||
|
|
||||||
|
int hal_trng_get_entropy(unsigned char *out, unsigned len);
|
||||||
|
# define CUSTOM_RAND_GENERATE_SEED hal_trng_get_entropy
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Curve */
|
/* Curve */
|
||||||
|
@ -334,7 +339,6 @@ extern int tolower(int c);
|
||||||
#define WC_NO_HASHDRBG
|
#define WC_NO_HASHDRBG
|
||||||
#else
|
#else
|
||||||
#define HAVE_HASHDRBG
|
#define HAVE_HASHDRBG
|
||||||
#define WOLFSSL_GENSEED_FORTEST
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BENCH_EMBEDDED
|
#define BENCH_EMBEDDED
|
||||||
|
|
|
@ -599,6 +599,8 @@ ifeq ($(HASH),SHA3)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS+=-DIMAGE_HEADER_SIZE=$(IMAGE_HEADER_SIZE)
|
CFLAGS+=-DIMAGE_HEADER_SIZE=$(IMAGE_HEADER_SIZE)
|
||||||
|
OBJS+=$(WOLFCRYPT_OBJS)
|
||||||
|
OBJS+=$(SECURE_OBJS)
|
||||||
|
|
||||||
# check if both encryption and self update are on
|
# check if both encryption and self update are on
|
||||||
#
|
#
|
||||||
|
|
|
@ -108,7 +108,9 @@ int main(void)
|
||||||
#ifdef WOLFBOOT_TPM
|
#ifdef WOLFBOOT_TPM
|
||||||
wolfBoot_tpm2_init();
|
wolfBoot_tpm2_init();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WOLFCRYPT_SECURE_MODE
|
||||||
|
wcs_Init();
|
||||||
|
#endif
|
||||||
wolfBoot_start();
|
wolfBoot_start();
|
||||||
|
|
||||||
/* wolfBoot_start should never return. */
|
/* wolfBoot_start should never return. */
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "wolfssl/wolfcrypt/aes.h"
|
#include "wolfssl/wolfcrypt/aes.h"
|
||||||
#include "wolfssl/wolfcrypt/random.h"
|
#include "wolfssl/wolfcrypt/random.h"
|
||||||
#include "wolfboot/wolfboot.h"
|
#include "wolfboot/wolfboot.h"
|
||||||
|
#include "hal.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -306,18 +307,17 @@ int __attribute__((cmse_nonsecure_entry)) wcs_ecdh_shared(int privkey_slot_id, i
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __attribute__((cmse_nonsecure_entry)) wcs_get_random_call(byte *rand, size_t size)
|
int __attribute__((cmse_nonsecure_entry)) wcs_get_random(byte *rand, size_t size)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
ret = wc_RNG_GenerateBlock(&wcs_rng, rand, size);
|
ret = wc_RNG_GenerateBlock(&wcs_rng, rand, size);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wsc_Init(void)
|
void wcs_Init(void)
|
||||||
{
|
{
|
||||||
|
hal_trng_init();
|
||||||
wc_InitRng(&wcs_rng);
|
wc_InitRng(&wcs_rng);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -49,10 +49,10 @@ endif
|
||||||
|
|
||||||
ifeq ($(TZEN),1)
|
ifeq ($(TZEN),1)
|
||||||
APP_OBJS+=../hal/$(TARGET)_ns.o
|
APP_OBJS+=../hal/$(TARGET)_ns.o
|
||||||
ifeq ($(WCSM),1)
|
# ifeq ($(WCSM),1)
|
||||||
APP_OBJS+=../src/wc_secure_calls.o
|
APP_OBJS+=../src/wc_secure_calls.o
|
||||||
CFLAGS+=-DWOLFBOOT_SECURE_CALLS
|
CFLAGS+=-DWOLFBOOT_SECURE_CALLS
|
||||||
endif
|
# endif
|
||||||
else
|
else
|
||||||
APP_OBJS+=../hal/$(TARGET).o
|
APP_OBJS+=../hal/$(TARGET).o
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -54,6 +54,9 @@
|
||||||
#define PWR_CR2 (*(volatile uint32_t *)(PWR_BASE + 0x04))
|
#define PWR_CR2 (*(volatile uint32_t *)(PWR_BASE + 0x04))
|
||||||
#define PWR_CR2_IOSV (1 << 9)
|
#define PWR_CR2_IOSV (1 << 9)
|
||||||
|
|
||||||
|
int wcs_get_random(unsigned char *rand,
|
||||||
|
uint32_t size);
|
||||||
|
|
||||||
static void boot_led_on(void)
|
static void boot_led_on(void)
|
||||||
{
|
{
|
||||||
uint32_t reg;
|
uint32_t reg;
|
||||||
|
@ -97,14 +100,20 @@ void usr_led_off(void)
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
|
#ifdef WOLFBOOT_SECURE_CALLS
|
||||||
|
uint32_t rand;
|
||||||
|
uint32_t i;
|
||||||
|
wcs_get_random((void*)&rand, 4);
|
||||||
|
for (i = 0; i < rand; i++)
|
||||||
|
;
|
||||||
|
|
||||||
|
#endif
|
||||||
hal_init();
|
hal_init();
|
||||||
boot_led_on();
|
boot_led_on();
|
||||||
usr_led_on();
|
usr_led_on();
|
||||||
boot_led_off();
|
boot_led_off();
|
||||||
if (wolfBoot_current_firmware_version() > 1)
|
if (wolfBoot_current_firmware_version() > 1)
|
||||||
boot_led_on();
|
boot_led_on();
|
||||||
#ifdef WOLFCRYPT_SECURE_MODE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
;
|
;
|
||||||
|
|
Loading…
Reference in New Issue