From 2663f5abaf343083243e81bae552ef60c46abec7 Mon Sep 17 00:00:00 2001 From: Andrew Hutchings Date: Thu, 7 Apr 2022 11:07:27 +0100 Subject: [PATCH] Add IAR MSP430 example A basic MSP430 example for IAR IDE. --- IDE/IAR-MSP430/README.md | 27 +++ IDE/IAR-MSP430/main.c | 325 +++++++++++++++++++++++++++++++++ IDE/IAR-MSP430/user_settings.h | 134 ++++++++++++++ 3 files changed, 486 insertions(+) create mode 100644 IDE/IAR-MSP430/README.md create mode 100644 IDE/IAR-MSP430/main.c create mode 100644 IDE/IAR-MSP430/user_settings.h diff --git a/IDE/IAR-MSP430/README.md b/IDE/IAR-MSP430/README.md new file mode 100644 index 000000000..8dbef748c --- /dev/null +++ b/IDE/IAR-MSP430/README.md @@ -0,0 +1,27 @@ +# MSP430 Example + +This example was designed to be used with the MSP430F5359/MSP430F5659 but can be ported to any similar MSP platform. It will take ~50KB of ROM space and a 8KB of statically allocated RAM (nearly half for constants). + +The example runs at 8MHz and executes a benchmark of ECC key generations, shared secrets and 1KB ChaCha20/Poly1305 encryption. + +At 8MHz the ECC steps will take 13-15 seconds each and 1000 iterations of ChaCha20/Poly1305 will take about 45 seconds. + +## Hardware Setup + +A basic development board / ISP combination will work fine, such as the MSP-TS430PZ100 series with the MSP-FET430 series programmer. + +The example will output text via UART 1, on the MSP430 which is port 8 bits 2&3 (pins 60/61) on the MSP430F5359. The UART will run at 57600 baud. + +In addition every second port 1 bit 1 will be toggled on/off (typically an LED would be here). + +## IDE setup + +When setting up the IDE, copy the wolfSSL source code to your project's directory and add all the .c and .h files from `wolfcrypt/src` to your project. + +Use the `main.c` provided here and copy the `user_settings.h` file to the `wolfssl/wolfcrypt` subdirectory of wolfSSL. + +You will need to set at least 700 bytes of stack, no heap is required. It will need the memory model to set to "medium". You will also need to change the "Library Configuration" to "Full DLIB" so the `printf()` functions work correctly. + +Make sure to add the definition `WOLFSSL_USER_SETTINGS` to the preprocessor settings in your project to that `user_settings.h` is loaded in. You will also need to add the wolfSSL root directory to the "Additional include directories". + +From here you can set any optimizer settings you need. diff --git a/IDE/IAR-MSP430/main.c b/IDE/IAR-MSP430/main.c new file mode 100644 index 000000000..68e2f1b4d --- /dev/null +++ b/IDE/IAR-MSP430/main.c @@ -0,0 +1,325 @@ +/* MSP430 example main.c + * + * Copyright (C) 2022 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#define ECC_256_BIT_FIELD 32 /* 256-bit curve field */ +#define ECC_448_BIT_FIELD 56 /* 448-bit curve field */ + +#define WOLF_GEN_MEM (2*1024) + +static byte gWolfMem[WOLF_GEN_MEM]; +static byte generatedCiphertext[1024]; +static byte generatedPlaintext[1024]; + +#define MCLK_FREQ_MHZ 8 /* MCLK = 8MHz */ + +const byte key[] = { + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f +}; + +const byte plaintext[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras lacus odio, pretium vel sagittis ac, facilisis quis diam. Vivamus condimentum velit sed dolor consequat interdum. Etiam eleifend ornare felis, eleifend egestas odio vulputate eu. Sed nec orci nunc. Etiam quis mi augue. Donec ullamcorper suscipit lorem, vel luctus augue cursus fermentum. Etiam a porta arcu, in convallis sem. Integer efficitur elementum diam, vel scelerisque felis posuere placerat. Donec vestibulum sit amet leo sit amet tincidunt. Etiam et vehicula turpis. Phasellus quis finibus sapien. Sed et tristique turpis. Nullam vitae sagittis tortor, et aliquet lorem. Cras a leo scelerisque, convallis lacus ut, fermentum urna. Mauris quis urna diam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam aliquam vehicula orci id pulvinar. Proin mollis, libero sollicitudin tempor ultrices, massa augue tincidunt turpis, sit amet aliquam neque nibh nec dui. Fusce finibus massa quis rutrum suscipit cras amet"; + +const byte iv[] = { + 0x07, 0x00, 0x00, 0x00, 0x40, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47 +}; + +const byte aad[] = { /* additional data */ + 0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7 +}; + +volatile unsigned int seconds; + +/* Add __root here (and a few other places) otherwise this is optimized out */ +__root unsigned int msp430_time(long *x) +{ + return seconds; +} + +static void print_secret(char* who, byte* s, int sLen) +{ + int i; + printf("%ss' Secret: ", who); + for (i = 0; i < sLen; i++) { + printf("%02x", s[i]); + } + printf("\r\n"); +} + +/* This is a very crude RNG, do not use in production */ +__root unsigned int msp430_rnd(void) +{ + unsigned int result = TA0R % TA2R; + printf("Rand generated: %d\r\n", result); + return result; +} + +static void uart_init() +{ + P8SEL |= BIT3 + BIT2; + UCA1CTLW0 = UCSWRST; // Put eUSCI in reset + UCA1CTLW0 |= UCSSEL__SMCLK; // CLK = SMCLK + /* Baud Rate calculation + This was calculated to produce 115200 for a 16MHz clock, so it produces + 57600 at 8MHz + 16000000/(16*115200) = 8.6805 + Fractional portion = 0.6805 + Use Table 24-5 in Family User Guide + */ + UCA1BR0 = 8; // 16000000/16/9600 + UCA1BR1 = 0x00; + UCA1MCTL |= UCOS16 | UCBRF_11 | UCBRS_0; + UCA1CTLW0 &= ~UCSWRST; // Initialize eUSCI + UCA1IE |= UCRXIE; // Enable USCI_A0 RX interrupt +} + +__root size_t __write(int fd, const unsigned char *_ptr, size_t len) +{ + size_t i; + + for(i=0 ; i