diff --git a/IDE/ROWLEY-CROSSWORKS-ARM/hw.h b/IDE/ROWLEY-CROSSWORKS-ARM/hw.h index 134193ca8..5a7a7b359 100644 --- a/IDE/ROWLEY-CROSSWORKS-ARM/hw.h +++ b/IDE/ROWLEY-CROSSWORKS-ARM/hw.h @@ -15,6 +15,9 @@ void hw_uart_printchar(int c); void hw_watchdog_disable(void); uint32_t hw_rand(void); +// Delay functions +void delay_us(uint32_t microseconds); + #endif /* WOLFSSL_ROWLEY_HW_H */ diff --git a/IDE/ROWLEY-CROSSWORKS-ARM/kinetis_hw.c b/IDE/ROWLEY-CROSSWORKS-ARM/kinetis_hw.c index 338ebcbe2..961e181d8 100644 --- a/IDE/ROWLEY-CROSSWORKS-ARM/kinetis_hw.c +++ b/IDE/ROWLEY-CROSSWORKS-ARM/kinetis_hw.c @@ -45,17 +45,29 @@ #define FLASH_CLK_DIV 4 /* Flash clock divisor */ // UART TX Port, Pin, Mux and Baud -#define UART_PORT UART5 /* UART Port */ +#define UART_PORT UART4 /* UART Port */ #define UART_TX_PORT PORTE /* UART TX Port */ -#define UART_TX_PIN 8 /* UART TX Pin */ +#define UART_TX_PIN 24 /* UART TX Pin */ #define UART_TX_MUX 0x3 /* Kinetis UART pin mux */ #define UART_BAUD 115200 /* UART Baud Rate */ /* Note: You will also need to update the UART clock gate in hw_uart_init (SIM_SCGC1_UART5_MASK) */ /* Note: TWR-K60 is UART3, PTC17 */ +/* Note: FRDM-K64 is UART4, PTE24 */ +/* Note: TWR-K64 is UART5, PTE8 */ /***********************************************/ // Private functions +static uint32_t mDelayCyclesPerUs = 0; +#define NOP_FOR_LOOP_INSTRUCTION_COUNT 6 +static void delay_nop(uint32_t count) +{ + int i; + for(i=0; iSCGC1 |= SIM_SCGC1_UART5_MASK; + SIM->SCGC1 |= SIM_SCGC1_UART4_MASK; /* Configure UART TX pin */ UART_TX_PORT->PCR[UART_TX_PIN] = PORT_PCR_MUX(UART_TX_MUX); @@ -117,9 +129,37 @@ static void hw_uart_init(void) static void hw_rtc_init(void) { + /* Init nop delay */ + mDelayCyclesPerUs = (SYS_CLK_KHZ / 1000 / NOP_FOR_LOOP_INSTRUCTION_COUNT); + /* Enable RTC clock and oscillator */ SIM->SCGC6 |= SIM_SCGC6_RTC_MASK; - RTC->CR |= RTC_CR_OSCE_MASK; + + if (RTC->SR & RTC_SR_TIF_MASK) { + /* Resets the RTC registers except for the SWR bit */ + RTC->CR |= RTC_CR_SWR_MASK; + RTC->CR &= ~RTC_CR_SWR_MASK; + + /* Set TSR register to 0x1 to avoid the TIF bit being set in the SR register */ + RTC->TSR = 1; + } + + /* Disable RTC Interrupts */ + RTC_IER = 0; + + /* Enable OSC */ + if ((RTC->CR & RTC_CR_OSCE_MASK) == 0) { + int i; + + /* Turn on */ + RTC->CR |= RTC_CR_OSCE_MASK; + + /* Wait RTC startup delay 1000 us */ + delay_us(1000); + } + + /* Enable counter */ + RTC->SR |= RTC_SR_TCE_MASK; } static void hw_rand_init(void) @@ -174,6 +214,12 @@ uint32_t hw_rand(void) return RNG->OR; /* Return next value in FIFO output register */ } +void delay_us(uint32_t microseconds) +{ + delay_nop(mDelayCyclesPerUs * microseconds); +} + + // Watchdog void hw_watchdog_disable(void) { diff --git a/IDE/ROWLEY-CROSSWORKS-ARM/retarget.c b/IDE/ROWLEY-CROSSWORKS-ARM/retarget.c index 11dd05092..6a4dac38f 100644 --- a/IDE/ROWLEY-CROSSWORKS-ARM/retarget.c +++ b/IDE/ROWLEY-CROSSWORKS-ARM/retarget.c @@ -21,20 +21,45 @@ #include "hw.h" +#include "user_settings.h" double current_time(int reset) { double time; + (void)reset; time = hw_get_time_sec(); time += (double)hw_get_time_msec() / 1000; return time; } -uint32_t custom_rand_generate(void) +unsigned int custom_rand_generate(void) { return hw_rand(); } +int custom_rand_generate_block(unsigned char* output, unsigned int sz) +{ + uint32_t i = 0; + + while (i < sz) + { + /* If not aligned or there is odd/remainder */ + if( (i + sizeof(CUSTOM_RAND_TYPE)) > sz || + ((uint32_t)&output[i] % sizeof(CUSTOM_RAND_TYPE)) != 0 + ) { + /* Single byte at a time */ + output[i++] = (unsigned char)custom_rand_generate(); + } + else { + /* Use native 8, 16, 32 or 64 copy instruction */ + *((CUSTOM_RAND_TYPE*)&output[i]) = custom_rand_generate(); + i += sizeof(CUSTOM_RAND_TYPE); + } + } + + return 0; +} + // Debug print handler int __putchar(int c, __printf_tag_ptr ctx) { diff --git a/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h b/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h index 0f648c1a3..7947ef34e 100644 --- a/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h +++ b/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h @@ -1,29 +1,368 @@ -/* Configuration */ -#define SINGLE_THREADED -#define WOLFSSL_SMALL_STACK -#define WOLFSSL_GENERAL_ALIGNMENT 4 -#define NO_MAIN_DRIVER -#define NO_FILESYSTEM -#define NO_WRITEV -#define NO_DEV_RANDOM -#define NO_WOLFSSL_MEMORY +/* Example custom user settings for wolfSSL */ +#ifndef WOLFSSL_USER_SETTINGS_H +#define WOLFSSL_USER_SETTINGS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------- */ +/* Platform */ +/* ------------------------------------------------------------------------- */ +#undef WOLFSSL_GENERAL_ALIGNMENT +#define WOLFSSL_GENERAL_ALIGNMENT 4 + +#undef SINGLE_THREADED +#define SINGLE_THREADED + +#undef WOLFSSL_SMALL_STACK +#define WOLFSSL_SMALL_STACK + + +/* ------------------------------------------------------------------------- */ +/* Math Configuration */ +/* ------------------------------------------------------------------------- */ +#undef USE_FAST_MATH +#define USE_FAST_MATH + +#ifdef USE_FAST_MATH + #undef TFM_TIMING_RESISTANT + #define TFM_TIMING_RESISTANT + + /* Optimizations (TFM_ARM, TFM_ASM or none) */ + #define TFM_ARM + //#define TFM_ASM +#endif + +/* Math debugging (adds support for mp_dump) */ +#undef WOLFSSL_DEBUG_MATH +//#define WOLFSSL_DEBUG_MATH + + +/* ------------------------------------------------------------------------- */ +/* Crypto */ +/* ------------------------------------------------------------------------- */ +/* ECC */ +#if 1 + #undef HAVE_ECC + #define HAVE_ECC + + /* Manually define enabled curves */ + #undef ECC_USER_CURVES + #define ECC_USER_CURVES + + #define HAVE_ECC192 + #define HAVE_ECC224 + #undef NO_ECC256 + #define HAVE_ECC384 + #define HAVE_ECC521 + + /* Fixed point cache (speeds repeated operations against same private key) */ + #undef FP_ECC + //#define FP_ECC + #ifdef FP_ECC + /* Bits / Entries */ + #undef FP_ENTRIES + #define FP_ENTRIES 2 + #undef FP_LUT + #define FP_LUT 4 + #endif + + /* Optional ECC calculation method */ + /* Note: doubles heap usage, but slightly faster */ + #undef ECC_SHAMIR + #define ECC_SHAMIR + + /* Reduces heap usage, but slower */ + #undef ECC_TIMING_RESISTANT + #define ECC_TIMING_RESISTANT + + #ifdef USE_FAST_MATH + /* Max ECC bits (curve size * 8). ECC256 is (32*8) = 256 */ + /* Note: ECC521 requires (curve size * 16): (66*16) = 1056 */ + #undef ALT_ECC_SIZE + #define ALT_ECC_SIZE + #undef FP_MAX_BITS_ECC + #define FP_MAX_BITS_ECC 1056 + + /* Enable TFM optimizations for ECC */ + #define TFM_ECC192 + #define TFM_ECC224 + #define TFM_ECC256 + #define TFM_ECC384 + #define TFM_ECC521 + #endif +#endif + +/* RSA */ +#undef NO_RSA +#if 1 + #ifdef USE_FAST_MATH + /* Maximum math bits (Max RSA key bits * 2) */ + #undef FP_MAX_BITS + #define FP_MAX_BITS 4096 + #endif + + /* half as much memory but twice as slow */ + #undef RSA_LOW_MEM + //#define RSA_LOW_MEM +#else + #define NO_RSA +#endif + +/* AES */ +#undef NO_AES +#if 1 + #undef HAVE_AESGCM + #define HAVE_AESGCM + + /* GCM Method: GCM_SMALL, GCM_WORD32 or GCM_TABLE */ + #undef GCM_SMALL + #define GCM_SMALL +#else + #define NO_AES +#endif + +/* ChaCha20 / Poly1305 */ +#undef HAVE_CHACHA +#undef HAVE_POLY1305 +#if 1 + #define HAVE_CHACHA + #define HAVE_POLY1305 + + /* Needed for Poly1305 */ + #undef HAVE_ONE_TIME_AUTH + #define HAVE_ONE_TIME_AUTH +#endif + +/* Ed25519 / Curve25519 */ +#undef HAVE_CURVE25519 +#undef HAVE_ED25519 +#if 0 + #define HAVE_CURVE25519 + #define HAVE_ED25519 + + /* Optionally use small math (less flash usage, but much slower) */ + #if 0 + #define CURVED25519_SMALL + #endif +#endif + + +/* ------------------------------------------------------------------------- */ +/* Hashing */ +/* ------------------------------------------------------------------------- */ +/* Sha */ +#undef NO_SHA +#if 1 + /* 1k smaller, but 25% slower */ + //#define USE_SLOW_SHA +#else + #define NO_SHA +#endif + +/* Sha256 */ +#undef NO_SHA256 +#if 1 +#else + #define NO_SHA256 +#endif + +/* Sha512 */ +#undef WOLFSSL_SHA512 +#if 1 + #define WOLFSSL_SHA512 + + /* Sha384 */ + #undef WOLFSSL_SHA384 + #if 1 + #define WOLFSSL_SHA384 + #endif + + /* over twice as small, but 50% slower */ + //#define USE_SLOW_SHA2 +#endif + +/* MD5 */ +#undef NO_MD5 +#if 1 + #define NO_MD5 +#endif + + +/* ------------------------------------------------------------------------- */ /* HW Crypto Acceleration */ +/* ------------------------------------------------------------------------- */ // See README.md for instructions //#define FREESCALE_MMCAU 1 -/* Benchmark */ + +/* ------------------------------------------------------------------------- */ +/* Benchmark / Test */ +/* ------------------------------------------------------------------------- */ +/* Use reduced benchmark / test sizes */ +#undef BENCH_EMBEDDED #define BENCH_EMBEDDED + +#undef USE_CERT_BUFFERS_2048 #define USE_CERT_BUFFERS_2048 -/* Custom functions */ -extern int custom_rand_generate(void); -#define CUSTOM_RAND_GENERATE custom_rand_generate -#define CUSTOM_RAND_TYPE word32 + +/* ------------------------------------------------------------------------- */ +/* Debugging */ +/* ------------------------------------------------------------------------- */ +#undef WOLFSSL_DEBUG +//#define WOLFSSL_DEBUG + +#ifdef WOLFSSL_DEBUG + #define fprintf(file, format, ...) printf(format, ##__VA_ARGS__) + + /* Use this to measure / print heap usage */ + #if 0 + #undef USE_WOLFSSL_MEMORY + #define USE_WOLFSSL_MEMORY + + #undef WOLFSSL_TRACK_MEMORY + #define WOLFSSL_TRACK_MEMORY + #endif +#else + #undef NO_WOLFSSL_MEMORY + #define NO_WOLFSSL_MEMORY + + #undef NO_ERROR_STRINGS + #define NO_ERROR_STRINGS +#endif + + +/* ------------------------------------------------------------------------- */ +/* Port */ +/* ------------------------------------------------------------------------- */ + +/* Override Current Time */ +/* Allows custom "custom_time()" function to be used for benchmark */ #define WOLFSSL_USER_CURRTIME -/* Debugging - Optional */ -#if 0 -#define fprintf(file, format, ...) printf(format, ##__VA_ARGS__) -#define DEBUG_WOLFSSL + +/* ------------------------------------------------------------------------- */ +/* RNG */ +/* ------------------------------------------------------------------------- */ +/* Size of returned HW RNG value */ +#define CUSTOM_RAND_TYPE unsigned int + +/* Choose RNG method */ +#if 1 + /* Use built-in P-RNG (SHA256 based) with HW RNG */ + /* P-RNG + HW RNG (P-RNG is ~8K) */ + #undef HAVE_HASHDRBG + #define HAVE_HASHDRBG + + extern unsigned int custom_rand_generate(void); + #undef CUSTOM_RAND_GENERATE + #define CUSTOM_RAND_GENERATE custom_rand_generate +#else + /* Bypass P-RNG and use only HW RNG */ + extern int custom_rand_generate_block(unsigned char* output, unsigned int sz); + #undef CUSTOM_RAND_GENERATE_BLOCK + #define CUSTOM_RAND_GENERATE_BLOCK custom_rand_generate_block #endif + + +/* ------------------------------------------------------------------------- */ +/* Enable Features */ +/* ------------------------------------------------------------------------- */ +#undef KEEP_PEER_CERT +//#define KEEP_PEER_CERT + +#undef HAVE_COMP_KEY +//#define HAVE_COMP_KEY + +#undef HAVE_TLS_EXTENSIONS +//#define HAVE_TLS_EXTENSIONS + +#undef HAVE_SUPPORTED_CURVES +//#define HAVE_SUPPORTED_CURVES + +#undef WOLFSSL_BASE64_ENCODE +//#define WOLFSSL_BASE64_ENCODE + +/* TLS Session Cache */ +#if 0 + #define SMALL_SESSION_CACHE +#else + #define NO_SESSION_CACHE +#endif + + +/* ------------------------------------------------------------------------- */ +/* Disable Features */ +/* ------------------------------------------------------------------------- */ +#undef NO_WOLFSSL_SERVER +//#define NO_WOLFSSL_SERVER + +#undef NO_WOLFSSL_CLIENT +//#define NO_WOLFSSL_CLIENT + +#undef NO_CRYPT_TEST +//#define NO_CRYPT_TEST + +#undef NO_CRYPT_BENCHMARK +//#define NO_CRYPT_BENCHMARK + +/* In-lining of misc.c functions */ +/* If defined, must include wolfcrypt/src/misc.c in build */ +/* Slower, but about 1k smaller */ +#undef NO_INLINE +//#define NO_INLINE + +#undef NO_FILESYSTEM +#define NO_FILESYSTEM + +#undef NO_WRITEV +#define NO_WRITEV + +#undef NO_MAIN_DRIVER +#define NO_MAIN_DRIVER + +#undef NO_DEV_RANDOM +#define NO_DEV_RANDOM + +#undef NO_DSA +#define NO_DSA + +#undef NO_DH +#define NO_DH + +#undef NO_DES3 +#define NO_DES3 + +#undef NO_RC4 +#define NO_RC4 + +#undef NO_OLD_TLS +#define NO_OLD_TLS + +#undef NO_HC128 +#define NO_HC128 + +#undef NO_RABBIT +#define NO_RABBIT + +#undef NO_PSK +#define NO_PSK + +#undef NO_MD4 +#define NO_MD4 + +#undef NO_PWDBASED +#define NO_PWDBASED + +#undef NO_CODING +#define NO_CODING + + +#ifdef __cplusplus +} +#endif + +#endif /* WOLFSSL_USER_SETTINGS_H */ diff --git a/IDE/ROWLEY-CROSSWORKS-ARM/wolfssl.hzp b/IDE/ROWLEY-CROSSWORKS-ARM/wolfssl.hzp index 7468f7e55..74a4eeaff 100644 --- a/IDE/ROWLEY-CROSSWORKS-ARM/wolfssl.hzp +++ b/IDE/ROWLEY-CROSSWORKS-ARM/wolfssl.hzp @@ -11,14 +11,100 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -45,9 +131,9 @@ Placement="Flash" Target="MK64FN1M0xxx12" arm_linker_fiq_stack_size="0" - arm_linker_heap_size="102800" + arm_linker_heap_size="91136" arm_linker_irq_stack_size="0" - arm_linker_stack_size="4096" + arm_linker_stack_size="30720" arm_simulator_memory_simulation_filename="$(TargetsDir)/Kinetis/KinetisSimulatorMemory.dll" arm_simulator_memory_simulation_parameter="MK64FN1M0xxx12;0x100000;0x0;0x0;0x40000" arm_target_loader_applicable_loaders="Flash" @@ -84,9 +170,9 @@ Placement="Flash" Target="MK64FN1M0xxx12" arm_linker_fiq_stack_size="0" - arm_linker_heap_size="102800" + arm_linker_heap_size="91136" arm_linker_irq_stack_size="0" - arm_linker_stack_size="4096" + arm_linker_stack_size="30720" arm_simulator_memory_simulation_filename="$(TargetsDir)/Kinetis/KinetisSimulatorMemory.dll" arm_simulator_memory_simulation_parameter="MK64FN1M0xxx12;0x100000;0x0;0x0;0x40000" arm_target_loader_applicable_loaders="Flash"