From 05efd4a4eee38c0dbffbb10bcd53c6b6e7ad25f9 Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Fri, 11 Nov 2022 16:00:51 -0700 Subject: [PATCH] Add NXP SE050 EdgeLock examples for use on Raspberry Pi --- README.md | 10 + SE050/README.md | 111 ++++ .../se05x_middleware_cmake_openssl_scp03.png | Bin 0 -> 194422 bytes SE050/wolfssl/CMakeLists.txt | 4 + .../wolfcrypt_benchmark/CMakeLists.txt | 34 ++ SE050/wolfssl/wolfcrypt_benchmark/README.md | 145 +++++ SE050/wolfssl/wolfcrypt_benchmark/benchmark.c | 23 + SE050/wolfssl/wolfcrypt_benchmark/benchmark.h | 23 + .../wolfcrypt_benchmark/wolfcrypt_benchmark.c | 73 +++ .../wolfcrypt_generate_csr/CMakeLists.txt | 34 ++ .../wolfssl/wolfcrypt_generate_csr/README.md | 74 +++ .../wolfcrypt_generate_csr.c | 201 +++++++ .../wolfcrypt_key_cert_insert/CMakeLists.txt | 34 ++ .../wolfcrypt_key_cert_insert/README.md | 106 ++++ .../wolfcrypt_key_cert_insert.c | 532 ++++++++++++++++++ SE050/wolfssl/wolfcrypt_test/CMakeLists.txt | 34 ++ SE050/wolfssl/wolfcrypt_test/README.md | 219 +++++++ SE050/wolfssl/wolfcrypt_test/test.c | 23 + SE050/wolfssl/wolfcrypt_test/test.h | 23 + SE050/wolfssl/wolfcrypt_test/wolfcrypt_test.c | 73 +++ 20 files changed, 1776 insertions(+) create mode 100644 SE050/README.md create mode 100644 SE050/images/se05x_middleware_cmake_openssl_scp03.png create mode 100644 SE050/wolfssl/CMakeLists.txt create mode 100644 SE050/wolfssl/wolfcrypt_benchmark/CMakeLists.txt create mode 100644 SE050/wolfssl/wolfcrypt_benchmark/README.md create mode 100644 SE050/wolfssl/wolfcrypt_benchmark/benchmark.c create mode 100644 SE050/wolfssl/wolfcrypt_benchmark/benchmark.h create mode 100644 SE050/wolfssl/wolfcrypt_benchmark/wolfcrypt_benchmark.c create mode 100644 SE050/wolfssl/wolfcrypt_generate_csr/CMakeLists.txt create mode 100644 SE050/wolfssl/wolfcrypt_generate_csr/README.md create mode 100644 SE050/wolfssl/wolfcrypt_generate_csr/wolfcrypt_generate_csr.c create mode 100644 SE050/wolfssl/wolfcrypt_key_cert_insert/CMakeLists.txt create mode 100644 SE050/wolfssl/wolfcrypt_key_cert_insert/README.md create mode 100644 SE050/wolfssl/wolfcrypt_key_cert_insert/wolfcrypt_key_cert_insert.c create mode 100644 SE050/wolfssl/wolfcrypt_test/CMakeLists.txt create mode 100644 SE050/wolfssl/wolfcrypt_test/README.md create mode 100644 SE050/wolfssl/wolfcrypt_test/test.c create mode 100644 SE050/wolfssl/wolfcrypt_test/test.h create mode 100644 SE050/wolfssl/wolfcrypt_test/wolfcrypt_test.c diff --git a/README.md b/README.md index 22115321..85d495a1 100644 --- a/README.md +++ b/README.md @@ -283,6 +283,16 @@ This directory contains a wolfCrypt benchmark test application for i.MX RT1060-E Please see the [RT1060/README.md](RT1060/README.md) for further usage and details. +
+ +#### NXP SE050 + +This directory contains example applications for NXP's SE050. The examples +have been tested on a Raspberry Pi with SE050 EdgeLock. + +Please see the [SE050/README.md](SE050/README.md) for further details. + +
#### SGX_Linux (Linux Enclave) diff --git a/SE050/README.md b/SE050/README.md new file mode 100644 index 00000000..08bd0c3a --- /dev/null +++ b/SE050/README.md @@ -0,0 +1,111 @@ +# wolfSSL NXP SE050 Examples + +wolfSSL includes support for the NXP SE050 Plug & Trust Secure Element. For +details about the NXP SE050, see [NXP's SE050 page](https://www.nxp.com/products/security-and-authentication/authentication/edgelock-se050-plug-trust-secure-element-family-enhanced-iot-security-with-maximum-flexibility:SE050). + +This directory contains wolfSSL examples for NXP SE050. The examples have been +written for and tested on a Raspberry Pi with NXP SE050 EdgeLock development +kit. + +For complete details on wolfSSL's support for NXP SE050, see +[README_SE050.md](https://www.github.com/wolfssl/wolfssl/wolfcrypt/src/port/nxp/README_SE050.md). +That document also describes how to download, build, and compile the SE05x +Middleware. It should be followed first before moving on to installing and +running these examples. + +## Installing Example Applications + +These instructions assume that the SE050 middleware has already been installed +in Raspbian and is located at `/home/pi/se_mw/simw-top`. + +Before building these demo, the "wolfssl" folder which contains these demos +should be copied into the SE05x middleware source tree at: + +``` +/home/pi/se_mw/simw-top/demos/wolfssl +``` + +This will mean the wolfSSL demo applications will be at: + +``` +/home/pi/se_mw/simw-top/demos/wolfssl/wolfcrypt_benchmark +/home/pi/se_mw/simw-top/demos/wolfssl/wolfcrypt_generate_csr +/home/pi/se_mw/simw-top/demos/wolfssl/wolfcrypt_key_cert_insert +/home/pi/se_mw/simw-top/demos/wolfssl/wolfcrypt_test +``` + +The 'wolfssl' demo directory needs to be tied into the CMake build system. Open +the following file: + +``` +/home/pi/se_mw/simw-top/demos/CMakeLists.txt +``` + +Add the following at the bottom of this file: + +``` +ADD_SUBDIRECTORY(wolfssl) +``` + +If the SE05x middleware has not yet been set up for compilation: + +``` +$ cd /home/pi/se_mw/simw-top/scripts +$ ./create_cmake_projects.py rpi +$ cd /home/pi/se_mw/simw-top_build/raspbian_native_se050_t1oi2c +$ ccmake . +< adjust options to match SE050 dev kit > +< 'c', to configure > +< 'g', to generate > +$ cmake --build . +``` + +This will build the SE05x middleware along with demos, including the wolfCrypt +test application. + +**IMPORTANT:** Note that the wolfCrypt test and benchmark application examples +included here need benchmark.c, benchmark.h, test.c, and test.h copied over +from a valid wolfSSL source tree. See notes in those example README.md files +for more information. + +## NXP SE050 EdgeLock Configuration + +wolfSSL most recently tested these examples on a Raspberry Pi with NXP +EdgeLock development kit. The following CMake options were used. This uses +OpenSSL as the HostCrypto Provider and enables SCP03 authentication. + +![CMake Configuration](images/se05x_middleware_cmake_openssl_scp03.png) + +## Example Applications + +### wolfCrypt Test Application + +This application will run the wolfCrypt test application, running cryptography +test vectors through all algorithms enabled in wolfSSL. For details, see +[README.md](./wolfssl/wolfcrypt_test/README.md). + +### wolfCrypt Benchmark Application + +This application will run the wolfCrypt benchmark application, benchmarking +all enabled algorithms in wolfSSL. For details, see +[README.md](./wolfssl/wolfcrypt_benchmark/README.md). + +### wolfCrypt SE050 Key and Certificate Insertion and Use Example + +This example inserts and uses certificates and keys into the SE050. It does an +ECDSA verify operation of an ASCII-encoded {R,S} signature, reads back out the +RSA and ECC certificates imported and verifies they match the original ones, +then erases keys and certificates that were imported into the SE050. For +details, see [README.md](./wolfssl/wolfcrypt_key_cert_insert/README.md). + +### wolfCrypt CSR Generation Example + +This example generates a Certificate Signing Request (CSR) using a key +generated and stored in the SE050. This examples requires that wolfSSL be +compiled with `--enable-certgen --enable-certreq`. For details, see +[README.md](./wolfssl/wolfcrypt_generate_csr/README.md). + +## Support + +For support questions and issues, please email wolfSSL at support@wolfssl.com. + diff --git a/SE050/images/se05x_middleware_cmake_openssl_scp03.png b/SE050/images/se05x_middleware_cmake_openssl_scp03.png new file mode 100644 index 0000000000000000000000000000000000000000..7b4acdc235bbc0c12e0c6aafa0b40d3e278a80d1 GIT binary patch literal 194422 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
@3p0$j5^5_S%4d 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%0D9|Fvr(r!zt@vO)3OJWqM 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 q1BaTVYR5m$@caM&$8V~q7or +#include +#include +#include +#include "benchmark.h" + +#include +#include +#include + +#ifdef __cplusplus +} +#endif + +#if defined(SIMW_DEMO_ENABLE__DEMO_WOLFCRYPTBENCHMARK) + +static ex_sss_boot_ctx_t gex_sss_boot_ctx; + +#define EX_SSS_BOOT_PCONTEXT (&gex_sss_boot_ctx) +#define EX_SSS_BOOT_DO_ERASE 1 +#define EX_SSS_BOOT_EXPOSE_ARGC_ARGV 0 + +#include + +sss_status_t ex_sss_entry(ex_sss_boot_ctx_t *pCtx) +{ + int ret = 0; + sss_status_t status = kStatus_SSS_Success; + sss_session_t *pSession = (sss_session_t*)&pCtx->session; + sss_key_store_t *pKeyStore = (sss_key_store_t*)&pCtx->ks; + + LOG_I("running setconfig"); + ret = wc_se050_set_config(pSession, NULL, pKeyStore); + if (ret != 0) { + LOG_E("wc_se050_set_config failed"); + return kStatus_SSS_Fail; + } + LOG_I("Ran setconfig successfully"); + + wolfSSL_Init(); + benchmark_test(NULL); + wolfSSL_Cleanup(); + + LOG_I("Finished wolfCrypt Benchmark"); + return status; +} + +#endif /* SIMW_DEMO_ENABLE__DEMO_WOLFCRYPTBENCHMARK */ diff --git a/SE050/wolfssl/wolfcrypt_generate_csr/CMakeLists.txt b/SE050/wolfssl/wolfcrypt_generate_csr/CMakeLists.txt new file mode 100644 index 00000000..99d3085d --- /dev/null +++ b/SE050/wolfssl/wolfcrypt_generate_csr/CMakeLists.txt @@ -0,0 +1,34 @@ +PROJECT(wolfcrypt_generate_csr) +FILE( + GLOB + files + wolfcrypt_generate_csr.c +) + +ADD_EXECUTABLE( + ${PROJECT_NAME} + ${KSDK_STARTUP_FILE} ${files} +) + +TARGET_COMPILE_DEFINITIONS( + ${PROJECT_NAME} + PRIVATE SIMW_DEMO_ENABLE__DEMO_WOLFCRYPT_GENERATE_CSR +) + +TARGET_INCLUDE_DIRECTORIES( + ${PROJECT_NAME} + PRIVATE ${SIMW_TOP_DIR}/sss/ex/inc +) + +TARGET_LINK_LIBRARIES( + ${PROJECT_NAME} + SSS_APIs + ex_common + wolfssl +) + +CREATE_BINARY(${PROJECT_NAME}) + +IF(SSS_HAVE_HOST_LINUX_LIKE) + INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) +ENDIF() diff --git a/SE050/wolfssl/wolfcrypt_generate_csr/README.md b/SE050/wolfssl/wolfcrypt_generate_csr/README.md new file mode 100644 index 00000000..2ad58ca8 --- /dev/null +++ b/SE050/wolfssl/wolfcrypt_generate_csr/README.md @@ -0,0 +1,74 @@ +# wolfCrypt SE050 Certificate Signing Request (CSR) Example + +This example uses wolfSSL to generate a Certificate Signing Request (CSR) using +a key that is generated and stored in the SE050: + +1. Generates a 256 bit ECC key pair in SE050. + +2. Generates a certificate request with wolfCrypt and signs it with the + ECC private key from step 1. + +3. Converts the CSR from DER to PEM format and prints that to the console. + +4. Deletes the generated key in SE050 (for example cleanup), and cleans up + wolfSSL library resources. + +## Building the Demo + +Before building this demo, follow initial setup instructions in the parent +[README.md](../../README.md). + +Once this example directory has been copied into the SE05x middleware directory +tree in the correct location, compiling the middleware will also compile this +demo application: + +``` +$ cd /home/pi/se_mw/simw-top_build/raspbian_native_se050_t1oi2c +$ cmake --build . +``` + +## Running the Demo + +To run the demo: + +``` +$ cd /home/pi/se_mw/simw-top_build/raspbian_native_se050_t1oi2c/bin +$ ./wolfcrypt_generate_csr +``` + +On successful run, output similar to the following will print out: + +``` +App :INFO :PlugAndTrust_v04.02.00_20220524 +App :INFO :Running ./wolfcrypt_generate_csr +App :INFO :If you want to over-ride the selection, use ENV=EX_SSS_BOOT_SSS_PORT or pass in command line arguments. +App :INFO :Using default PlatfSCP03 keys. You can use keys from file using ENV=EX_SSS_BOOT_SCP03_PATH +sss :INFO :atr (Len=35) + 00 A0 00 00 03 96 04 03 E8 00 FE 02 0B 03 E8 08 + 01 00 00 00 00 64 00 00 0A 4A 43 4F 50 34 20 41 + 54 50 4F +App :INFO :Running wc_se050_set_config() +App :INFO :SE050 config successfully set in wolfSSL +App :INFO :wolfCrypt example of CSR generation + +App :INFO :Initializing RNG + +App :INFO :Generating ECC key in SE050 + +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id FFFF +App :INFO :Generated ECC key in SE050 ID: 0x0000ffff + +App :INFO :Generated CSR (530 bytes) + +App :INFO :-----BEGIN CERTIFICATE REQUEST----- +MIIBTjCB8wIBAjCBkDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1UMRAwDgYDVQQH +DAdCb3plbWFuMREwDwYDVQQKDAhUZXN0IE9yZzEUMBIGA1UECwwLRGV2ZWxvcG1l +bnQxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5m +b0BleGFtcGxlLmNvbTBZMBM +App :INFO :Erasing ECC key stored in SE050 slot: 0x0000ffff + +App :INFO :Done with sample app +App :INFO :ex_sss Finished +``` + diff --git a/SE050/wolfssl/wolfcrypt_generate_csr/wolfcrypt_generate_csr.c b/SE050/wolfssl/wolfcrypt_generate_csr/wolfcrypt_generate_csr.c new file mode 100644 index 00000000..b29c502b --- /dev/null +++ b/SE050/wolfssl/wolfcrypt_generate_csr/wolfcrypt_generate_csr.c @@ -0,0 +1,201 @@ +/* wolfcrypt_generate_csr.c + * + * Copyright (C) 2006-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 + */ + +/* wolfCrypt example that generates a CSR using key generated in SE050. */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef __cplusplus +} +#endif + +#if defined(SIMW_DEMO_ENABLE__DEMO_WOLFCRYPT_GENERATE_CSR) + +static ex_sss_boot_ctx_t gex_sss_boot_ctx; + +#define EX_SSS_BOOT_PCONTEXT (&gex_sss_boot_ctx) +#define EX_SSS_BOOT_DO_ERASE 1 +#define EX_SSS_BOOT_EXPOSE_ARGC_ARGV 0 + +#include + +sss_status_t ex_sss_entry(ex_sss_boot_ctx_t *pCtx) +{ +#if defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ) + int ret = 0; + sss_status_t status = kStatus_SSS_Success; + sss_session_t *pSession = (sss_session_t*)&pCtx->session; + sss_key_store_t *pKeyStore = (sss_key_store_t*)&pCtx->ks; + + word32 keyId = 0; + WC_RNG rng; + ecc_key ecc; + Cert req; + byte der[1024]; + byte pem[1024]; + int derSz; + int pemSz; + + LOG_I("Running wc_se050_set_config()"); + ret = wc_se050_set_config(pSession, NULL, pKeyStore); + if (ret != 0) { + LOG_E("wc_se050_set_config failed"); + return kStatus_SSS_Fail; + } + LOG_I("SE050 config successfully set in wolfSSL"); + + /* Initialize wolfSSL library */ + wolfSSL_Init(); + + LOG_I("wolfCrypt example of CSR generation\n"); + + XMEMSET(der, 0, sizeof(der)); + XMEMSET(pem, 0, sizeof(pem)); + + LOG_I("Initializing RNG\n"); + ret = wc_InitRng(&rng); + if (ret != 0) { + LOG_I("wc_RngInit() error, ret = %d\n", ret); + } + + /* Generate ECC key, stored in SE050 */ + if (ret == 0) { + LOG_I("Generating ECC key in SE050\n"); + ret = wc_ecc_init(&ecc); + if (ret != 0) { + LOG_I("wc_ecc_init error, ret = %d\n", ret); + } + } + + if (ret == 0) { + ret = wc_ecc_make_key(&rng, 32, &ecc); + if (ret != 0) { + LOG_I("wc_ecc_make_key error, ret = %d\n", ret); + } else { + ret = wc_ecc_get_key_id(&ecc, &keyId); + if (ret != 0) { + LOG_I("wc_ecc_get_key_id error, ret = %d\n", ret); + } else { + LOG_I("Generated ECC key in SE050 ID: 0x%08x\n", keyId); + } + } + } + + if (ret == 0) { + ret = wc_InitCert(&req); + if (ret != 0) { + LOG_I("wc_InitCert error, ret = %d\n", ret); + } + } + + if (ret == 0) { + strncpy(req.subject.country, "US", CTC_NAME_SIZE); + strncpy(req.subject.state, "MT", CTC_NAME_SIZE); + strncpy(req.subject.locality, "Bozeman", CTC_NAME_SIZE); + strncpy(req.subject.org, "Test Org", CTC_NAME_SIZE); + strncpy(req.subject.unit, "Development", CTC_NAME_SIZE); + strncpy(req.subject.commonName, "www.example.com", CTC_NAME_SIZE); + strncpy(req.subject.email, "info@example.com", CTC_NAME_SIZE); + + ret = wc_MakeCertReq_ex(&req, der, sizeof(der), ECC_TYPE, + (void*)&ecc); + if (ret <= 0) { + LOG_I("wc_MakeCertReq_ex error, ret = %d\n", ret); + } else { + derSz = ret; + ret = 0; + } + } + + if (ret == 0) { + ret = wc_SignCert_ex(req.bodySz, req.sigType, der, sizeof(der), + ECC_TYPE, (void*)&ecc, &rng); + if (ret <= 0) { + LOG_I("wc_SignCert_ex error, ret = %d\n", ret); + } else { + derSz = ret; + ret = 0; + } + } + + if (ret == 0) { + XMEMSET(pem, 0, sizeof(pem)); + ret = wc_DerToPem(der, derSz, pem, sizeof(pem), CERTREQ_TYPE); + if (ret <= 0) { + LOG_I("wc_DerToPem error, ret = %d\n", ret); + } else { + pemSz = ret; + LOG_I("Generated CSR (%d bytes)\n", pemSz); + ret = 0; + LOG_I("%s", pem); + } + } + + + /* Delete generated key in SE050 */ + if (ret == 0) { + LOG_I("Erasing ECC key stored in SE050 slot: 0x%08x\n", keyId); + ret = wc_se050_erase_object(keyId); + if (ret != 0) { + LOG_I("Failed to erase ECC key in SE050\n"); + } + } + + /* Free ECC key and RNG */ + if (ret == 0) { + ret = wc_ecc_free(&ecc); + if (ret != 0) { + LOG_I("wc_ecc_free error, ret = %d\n", ret); + } + } + if (ret == 0) { + ret = wc_FreeRng(&rng); + if (ret != 0) { + LOG_I("wc_FreeRng error, ret = %d\n", ret); + } + } + + /* Cleanup wolfSSL library resources */ + wolfSSL_Cleanup(); + + LOG_I("Done with sample app"); + return status; +#else + LOG_E("Examples requires wolfSSL be compiled with WOLFSSL_CERT_GEN " + "and WOLFSSL_CERT_REQ"); + return kStatus_SSS_Fail; +#endif /* WOLFSSL_CERT_GEN && WOLFSSL_CERT_REQ */ +} + +#endif /* SIMW_DEMO_ENABLE__DEMO_WOLFCRYPT_GENERATE_CSR */ diff --git a/SE050/wolfssl/wolfcrypt_key_cert_insert/CMakeLists.txt b/SE050/wolfssl/wolfcrypt_key_cert_insert/CMakeLists.txt new file mode 100644 index 00000000..efa5efac --- /dev/null +++ b/SE050/wolfssl/wolfcrypt_key_cert_insert/CMakeLists.txt @@ -0,0 +1,34 @@ +PROJECT(wolfcrypt_key_cert_insert) +FILE( + GLOB + files + *.c +) + +ADD_EXECUTABLE( + ${PROJECT_NAME} + ${KSDK_STARTUP_FILE} ${files} +) + +TARGET_COMPILE_DEFINITIONS( + ${PROJECT_NAME} + PRIVATE SIMW_DEMO_ENABLE__DEMO_WOLFCRYPT_KEY_CERT_INSERT USE_CERT_BUFFERS_2048 USE_CERT_BUFFERS_256 +) + +TARGET_INCLUDE_DIRECTORIES( + ${PROJECT_NAME} + PRIVATE ${SIMW_TOP_DIR}/sss/ex/inc +) + +TARGET_LINK_LIBRARIES( + ${PROJECT_NAME} + SSS_APIs + ex_common + wolfssl +) + +CREATE_BINARY(${PROJECT_NAME}) + +IF(SSS_HAVE_HOST_LINUX_LIKE) + INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) +ENDIF() diff --git a/SE050/wolfssl/wolfcrypt_key_cert_insert/README.md b/SE050/wolfssl/wolfcrypt_key_cert_insert/README.md new file mode 100644 index 00000000..571e1657 --- /dev/null +++ b/SE050/wolfssl/wolfcrypt_key_cert_insert/README.md @@ -0,0 +1,106 @@ +# wolfCrypt SE050 Key and Certificate Insertion and Use Example + +This example inserts and uses keys and certificates into SE050, including: + +1. Inserts sample RSA and ECC certs and keys into SE050 key IDs. Sample keys +and certs used are from wolfSSL's `` header and are demo +certs/keys that ship with wolfSSL: + + ``` + server_key_der_2048 RSA private key (2048-bit) + server_cert_der_2048 RSA cert (2048-bit), matches above key + public key from above RSA public key extracted from above cert + ecc_key_der_256 ECC private key (NIST P-256) + serv_ecc_der_256 ECC cert (NIST P-256), matches above key + public key from above ECC public key extracted from above cert + ``` + +2. Does an ECDSA verify using one of the ECC public keys and a ECDSA signature +in the form of ASCII R and S components. + +3. Reads back out the RSA and ECC certificate inserted, verifies they match the +original inserted. + +4. Erases the keys and certs from the SE050. + +## Building the Demo + +Before building this demo, follow initial setup instructions in the parent +[README.md](../../README.md). + +Once this example directory has been copied into the SE05x middleware directory +tree in the correct location, compiling the middleware will also compile this +demo application: + +``` +$ cd /home/pi/se_mw/simw-top_build/raspbian_native_se050_t1oi2c +$ cmake --build . +``` + +## Running the Demo + +To run the demo: + +``` +$ cd /home/pi/se_mw/simw-top_build/raspbian_native_se050_t1oi2c/bin +$ ./wolfcrypt_key_cert_insert +``` + +On successful run, output similar to the following will print out: + +``` +App :INFO :PlugAndTrust_v04.02.00_20220524 +App :INFO :Running ./wolfcrypt_key_cert_insert +App :INFO :If you want to over-ride the selection, use ENV=EX_SSS_BOOT_SSS_PORT or pass in command line arguments. +sss :INFO :atr (Len=35) + 00 A0 00 00 03 96 04 03 E8 00 FE 02 0B 03 E8 08 + 01 00 00 00 00 64 00 00 0A 4A 43 4F 50 34 20 41 + 54 50 4F +sss :WARN :Communication channel is Plain. +sss :WARN :!!!Not recommended for production use.!!! +App :INFO :Running wc_se050_set_config() +App :INFO :SE050 config successfully set in wolfSSL +App :INFO :Inserted RSA private key into SE050 key ID: 0x00005002 + +App :INFO :Inserted RSA certificate into SE050 key ID: 0x00005003 + +App :INFO :RSA key written to DER, 294 bytes + +App :INFO :Inserted RSA public key into SE050 key ID: 0x00005004 + +App :INFO :Inserted ECC private key into SE050 key ID: 0x00005005 + +App :INFO :Inserted ECC certificate into SE050 key ID: 0x00005006 + +App :INFO :Inserted ECC public key into SE050 key ID: 0x00005007 + +App :INFO :Setting ecc_key to use ID from SE050 + +App :INFO :Verifying ECDSA signature with SE050 key ID: 0x00005007 + +App :INFO :ECDSA verify success! + +App :INFO :Read RSA certificate (1260 bytes) + +App :INFO :RSA cert matches original loaded + +App :INFO :Read ECC certificate (677 bytes) + +App :INFO :ECC cert matches original loaded + +App :INFO :Erased RSA private key, key ID: 0x00005002 + +App :INFO :Erased RSA certificate, key ID: 0x00005003 + +App :INFO :Erased RSA public key, key ID: 0x00005004 + +App :INFO :Erased ECC private key, key ID: 0x00005005 + +App :INFO :Erased ECC certificate, key ID: 0x00005006 + +App :INFO :Erased ECC public key, key ID: 0x00005007 + +App :INFO :Done with sample app +App :INFO :ex_sss Finished +``` + diff --git a/SE050/wolfssl/wolfcrypt_key_cert_insert/wolfcrypt_key_cert_insert.c b/SE050/wolfssl/wolfcrypt_key_cert_insert/wolfcrypt_key_cert_insert.c new file mode 100644 index 00000000..4d9ec9cb --- /dev/null +++ b/SE050/wolfssl/wolfcrypt_key_cert_insert/wolfcrypt_key_cert_insert.c @@ -0,0 +1,532 @@ +/* wolfcrypt_key_cert_insert.c + * + * Copyright (C) 2006-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 + */ + +/* + * Example app inserts and uses keys and certificates into SE050. + * + * 1. Inserts sample RSA and ECC certs and keys into SE050 key IDs. + * Sample keys and certs used are from wolfSSL's + * header and are demo certs/keys that ship with wolfSSL: + * server_key_der_2048 RSA private key (2048-bit) + * server_cert_der_2048 RSA cert (2048-bit), matches above key + * public key from above RSA public key extracted from above cert + * ecc_key_der_256 ECC private key (NIST P-256) + * serv_ecc_der_256 ECC cert (NIST P-256), matches above key + * public key from above ECC public key extracted from above cert + * 2. Does an ECDSA verify using one of the ECC public keys and a + * ECDSA signature in the form of ASCII R and S components. + * 3. Reads back out the RSA and ECC certificate inserted, verifies + * they match the original inserted. + * 4. Erases the keys and certs from the SE050. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef __cplusplus +} +#endif + +#if defined(SIMW_DEMO_ENABLE__DEMO_WOLFCRYPT_KEY_CERT_INSERT) + +static ex_sss_boot_ctx_t gex_sss_boot_ctx; + +#define EX_SSS_BOOT_PCONTEXT (&gex_sss_boot_ctx) +#define EX_SSS_BOOT_DO_ERASE 1 +#define EX_SSS_BOOT_EXPOSE_ARGC_ARGV 0 + +#define KEYID_RSA_PRIVATE 0x00005002 /* stores server_key_der_2048 */ +#define KEYID_RSA_CERT 0x00005003 /* stores server_cert_der_2048 */ +#define KEYID_RSA_PUBLIC 0x00005004 /* stores server_cert_der_2048 pub key */ +#define KEYID_ECC_PRIVATE 0x00005005 /* stores ecc_key_der_256 */ +#define KEYID_ECC_CERT 0x00005006 /* stores serv_ecc_der_256 */ +#define KEYID_ECC_PUBLIC 0x00005007 /* stores serv_ecc_der_256 public key */ + +#include + +static int se050_verify_ecc_sig_rs(const char* sigR, const char* sigS, + byte* digest, word32 digestSz, word32 keyId) +{ + int ret = 0; + int res = 0; + byte eccSig[ECC_MAX_SIG_SIZE]; + word32 eccSigSz; + ecc_key eccKey; + + if (sigR == NULL || sigS == NULL || digest == NULL || digestSz == 0) { + return -1; + } + + eccSigSz = sizeof(eccSig); + memset(eccSig, 0, eccSigSz); + + ret = wc_ecc_rs_to_sig(sigR, sigS, eccSig, &eccSigSz); + if (ret != 0) { + LOG_I("wc_ecc_rs_to_sig() failed, ret = %d\n", ret); + } + + /* Create ecc_key struct with SE050 key ID */ + if (ret == 0) { + ret = wc_ecc_init(&eccKey); + if (ret != 0) { + LOG_I("wc_ecc_init error, ret = %d\n", ret); + } + } + + if (ret == 0) { + LOG_I("Setting ecc_key to use ID from SE050\n"); + ret = wc_ecc_use_key_id(&eccKey, keyId, 0); + if (ret != 0) { + LOG_I("wc_ecc_use_key_id error, ret = %d\n", ret); + } + } + + if (ret == 0) { + LOG_I("Verifying ECDSA signature with SE050 key ID: 0x%08x\n", keyId); + ret = wc_ecc_verify_hash(eccSig, eccSigSz, digest, digestSz, &res, + &eccKey); + if (ret != 0 || res != 1) { + LOG_I("wc_ecc_verify_hash failed, ret = %d\n", ret); + } + } + + if (ret == 0) { + if (res != 1) { + LOG_I("ECDSA verify failed!\n"); + } else { + LOG_I("ECDSA verify success!\n"); + } + } + + /* Free ECC key and RNG */ + if (ret == 0) { + ret = wc_ecc_free(&eccKey); + if (ret != 0) { + LOG_I("wc_ecc_free error, ret = %d\n", ret); + } + } + + return ret; +} + +/** + * Insert sample certs/keys into SE050 key IDs: + * + * Key ID Credential + * ------ -------------------------------- + * KEYID_RSA_PRIVATE RSA private key + * KEYID_RSA_CERT RSA certificate + * KEYID_ECC_PRIVATE ECC private key + * KEYID_ECC_CERT ECC certificate + * KEYID_ECC_PUBLIC ECC public key (from cert above) + * + * Return 0 on success, negative on error. + */ +static int write_certs_keys_to_se050(void) +{ + int ret = 0; + + DecodedCert cert; + byte derKey[1024]; + word32 derKeySz = 0; + word32 idx = 0; + RsaKey rsaKey; + + /* Insert RSA private key */ + ret = wc_se050_rsa_insert_private_key(KEYID_RSA_PRIVATE, + server_key_der_2048, + sizeof_server_key_der_2048); + if (ret != 0) { + LOG_I("Error in se050_rsa_insert_private_key, ret = %d\n", ret); + } else { + LOG_I("Inserted RSA private key into SE050 key ID: 0x%08x\n", + KEYID_RSA_PRIVATE); + } + + /* Insert RSA certificate */ + ret = wc_se050_insert_binary_object(KEYID_RSA_CERT, + server_cert_der_2048, + sizeof_server_cert_der_2048); + if (ret != 0) { + LOG_I("Error in wc_se050_insert_binary_object, ret = %d\n", ret); + } else { + LOG_I("Inserted RSA certificate into SE050 key ID: 0x%08x\n", + KEYID_RSA_CERT); + } + + /* Extract RSA public key from cert DER */ + if (ret == 0) { + wc_InitDecodedCert(&cert, server_cert_der_2048, + sizeof_server_cert_der_2048, NULL); + + ret = wc_ParseCert(&cert, CERT_TYPE, NO_VERIFY, NULL); + if (ret != 0) { + LOG_I("wc_ParseCert failed, ret = %d\n", ret); + } + else { + derKeySz = sizeof(derKey); + ret = wc_GetPubKeyDerFromCert(&cert, derKey, &derKeySz); + if (ret != 0) { + LOG_I("wc_GetPubKeyDerFromCert failed, ret = %d\n", ret); + } + } + wc_FreeDecodedCert(&cert); + } + + /* Convert RSA public key DER to format for SE050, needs header added */ + if (ret == 0) { + ret = wc_InitRsaKey(&rsaKey, NULL); + if (ret != 0) { + LOG_I("wc_InitRsaKey failed, ret = %d\n", ret); + } + else { + idx = 0; + ret = wc_RsaPublicKeyDecode(derKey, &idx, &rsaKey, derKeySz); + if (ret != 0) { + LOG_I("wc_RsaPublicKeyDecode failed, ret = %d\n", ret); + } + else { + derKeySz = sizeof(derKey); + ret = wc_RsaKeyToPublicDer_ex(&rsaKey, derKey, derKeySz, 1); + if (ret <= 0) { + LOG_I("wc_RsaKeyToDer failed, ret = %d\n", ret); + } else { + LOG_I("RSA key written to DER, %d bytes\n", ret); + derKeySz = ret; + ret = 0; + } + } + } + wc_FreeRsaKey(&rsaKey); + } + + /* Insert RSA public key from cert into SE050 */ + if (ret == 0) { + ret = wc_se050_rsa_insert_public_key(KEYID_RSA_PUBLIC, derKey, derKeySz); + if (ret != 0) { + LOG_I("Error in se050_rsa_insert_public_key, ret = %d\n", ret); + } else { + LOG_I("Inserted RSA public key into SE050 key ID: 0x%08x\n", + KEYID_RSA_PUBLIC); + } + } + + /* Insert ECC private key */ + ret = wc_se050_ecc_insert_private_key(KEYID_ECC_PRIVATE, ecc_key_der_256, + sizeof_ecc_key_der_256); + if (ret != 0) { + LOG_I("Error in se050_ecc_insert_private_key, ret = %d\n", ret); + } else { + LOG_I("Inserted ECC private key into SE050 key ID: 0x%08x\n", + KEYID_ECC_PRIVATE); + } + + /* Insert ECC certificate */ + ret = wc_se050_insert_binary_object(KEYID_ECC_CERT, serv_ecc_der_256, + sizeof_serv_ecc_der_256); + if (ret != 0) { + LOG_I("Error in wc_se050_insert_binary_object, ret = %d\n", ret); + } else { + LOG_I("Inserted ECC certificate into SE050 key ID: 0x%08x\n", + KEYID_ECC_CERT); + } + + /* Extract ECC public key from cert DER */ + if (ret == 0) { + wc_InitDecodedCert(&cert, serv_ecc_der_256, + sizeof_serv_ecc_der_256, NULL); + + ret = wc_ParseCert(&cert, CERT_TYPE, NO_VERIFY, NULL); + if (ret != 0) { + LOG_I("wc_ParseCert failed, ret = %d\n", ret); + } + else { + derKeySz = sizeof(derKey); + ret = wc_GetPubKeyDerFromCert(&cert, derKey, &derKeySz); + if (ret != 0) { + LOG_I("wc_GetPubKeyDerFromCert failed, ret = %d\n", ret); + } + } + wc_FreeDecodedCert(&cert); + } + + /* Insert ECC public key from cert into SE050 */ + if (ret == 0) { + ret = wc_se050_ecc_insert_public_key(KEYID_ECC_PUBLIC, derKey, + derKeySz); + if (ret != 0) { + LOG_I("Error in se050_ecc_insert_public_key, ret = %d\n", ret); + } else { + LOG_I("Inserted ECC public key into SE050 key ID: 0x%08x\n", + KEYID_ECC_PUBLIC); + } + } + + return ret; +} + +/** + * Test reading certificates back out of SE050. + * + * Read sample certificates stored into the following key IDs: + * - KEYID_RSA_CERT + * - KEYID_ECC_CERT + * + * Return 0 on success, negative on error. + */ +static int read_certs_from_se050(void) +{ + int err = 0; + int ret = -1; + + byte* tmp = NULL; + word32 tmpSz = 0; + + /* get object size, to allocate memory */ + ret = wc_se050_get_binary_object(KEYID_RSA_CERT, tmp, &tmpSz); + if (ret != LENGTH_ONLY_E) { + LOG_I("wc_se050_get_binary_object did not return length only " + "like expected\n"); + err = 1; + } + + if (err == 0) { + /* allocate memory to read RSA cert */ + tmp = (byte*)XMALLOC(tmpSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (tmp == NULL) { + LOG_I("Failed to allocate memory to read RSA cert\n"); + err = 1; + } + } + + if (err == 0) { + /* read RSA cert into tmp buffer */ + XMEMSET(tmp, 0, tmpSz); + ret = wc_se050_get_binary_object(KEYID_RSA_CERT, tmp, &tmpSz); + if (ret != 0) { + LOG_I("wc_se050_get_binary_object failed, ret = %d\n", ret); + err = 1; + } else { + LOG_I("Read RSA certificate (%d bytes)\n", tmpSz); + } + } + + if (err == 0) { + /* make sure RSA cert is same as one we originally wrote */ + if ((tmpSz != sizeof_server_cert_der_2048) || + (memcmp(tmp, server_cert_der_2048, tmpSz) != 0)) { + LOG_I("Error: RSA cert differs from original!\n"); + err = 1; + } else { + LOG_I("RSA cert matches original loaded\n"); + } + } + + if (err == 0) { + XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER); + tmp = NULL; + tmpSz = 0; + + ret = wc_se050_get_binary_object(KEYID_ECC_CERT, tmp, &tmpSz); + if (ret != LENGTH_ONLY_E) { + LOG_I("wc_se050_get_binary_object did not return length only " + "like expected\n"); + err = 1; + } + } + + if (err == 0) { + /* allocate memory to read ECC cert */ + tmp = (byte*)XMALLOC(tmpSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (tmp == NULL) { + LOG_I("Failed to allocate memory to read ECC cert\n"); + err = 1; + } + } + + if (err == 0) { + /* read ECC cert into tmp buffer */ + XMEMSET(tmp, 0, tmpSz); + ret = wc_se050_get_binary_object(KEYID_ECC_CERT, tmp, &tmpSz); + if (ret != 0) { + LOG_I("wc_se050_get_binary_object failed, ret = %d\n", ret); + err = 1; + } else { + LOG_I("Read ECC certificate (%d bytes)\n", tmpSz); + } + } + + if (err == 0) { + /* make sure ECC cert is same as one we originally wrote */ + if ((tmpSz != sizeof_serv_ecc_der_256) || + (memcmp(tmp, serv_ecc_der_256, tmpSz) != 0)) { + LOG_I("Error: ECC cert differs from original!\n"); + err = 1; + } else { + LOG_I("ECC cert matches original loaded\n"); + } + } + + if (tmp != NULL) { + XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + + if (err == 0) { + ret = 0; + } + + return ret; +} + +/** + * Erase sample certs/keys from SE050 + * + * Returns 0 on success, negative on error. + */ +static int erase_certs_keys_from_se050(void) +{ + int ret = 0; + + ret = wc_se050_erase_object(KEYID_RSA_PRIVATE); + if (ret != 0) { + LOG_I("Failed to erase RSA private key, ret = %d\n", ret); + } else { + LOG_I("Erased RSA private key, key ID: 0x%08x\n", KEYID_RSA_PRIVATE); + } + ret = wc_se050_erase_object(KEYID_RSA_CERT); + if (ret != 0) { + LOG_I("Failed to erase RSA certificate, ret = %d\n", ret); + } else { + LOG_I("Erased RSA certificate, key ID: 0x%08x\n", KEYID_RSA_CERT); + } + ret = wc_se050_erase_object(KEYID_RSA_PUBLIC); + if (ret != 0) { + LOG_I("Failed to erase RSA public key, ret = %d\n", ret); + } else { + LOG_I("Erased RSA public key, key ID: 0x%08x\n", KEYID_RSA_PUBLIC); + } + ret = wc_se050_erase_object(KEYID_ECC_PRIVATE); + if (ret != 0) { + LOG_I("Failed to erase ECC private key, ret = %d\n", ret); + } else { + LOG_I("Erased ECC private key, key ID: 0x%08x\n", KEYID_ECC_PRIVATE); + } + ret = wc_se050_erase_object(KEYID_ECC_CERT); + if (ret != 0) { + LOG_I("Failed to erase ECC certificate, ret = %d\n", ret); + } else { + LOG_I("Erased ECC certificate, key ID: 0x%08x\n", KEYID_ECC_CERT); + } + ret = wc_se050_erase_object(KEYID_ECC_PUBLIC); + if (ret != 0) { + LOG_I("Failed to erase ECC public key, ret = %d\n", ret); + } else { + LOG_I("Erased ECC public key, key ID: 0x%08x\n", KEYID_ECC_PUBLIC); + } + + return ret; +} + +sss_status_t ex_sss_entry(ex_sss_boot_ctx_t *pCtx) +{ + int ret = 0; + sss_status_t status = kStatus_SSS_Success; + sss_session_t *pSession = (sss_session_t*)&pCtx->session; + sss_key_store_t *pKeyStore = (sss_key_store_t*)&pCtx->ks; + + const char* sigR = + "ccfaa12a0aa1b9aa9f1fd107865c8ab5b21f36ce6ca8fe5b2c8154280009f74e"; + const char* sigS = + "c09defd7a7c67a61ce1099dceaf840054351e199bf1a405675bf3ccb1939b024"; + + /* Test "hash" value, used to pre-generate the above R,S signature */ + const byte hashData[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 + }; + + LOG_I("Running wc_se050_set_config()"); + ret = wc_se050_set_config(pSession, NULL, pKeyStore); + if (ret != 0) { + LOG_E("wc_se050_set_config failed"); + return kStatus_SSS_Fail; + } + LOG_I("SE050 config successfully set in wolfSSL"); + + /* Initialize wolfSSL library */ + wolfSSL_Init(); + + /* Write sample keys/certs to SE050 */ + ret = write_certs_keys_to_se050(); + if (ret != 0) { + LOG_E("Failed to write sample keys/certs to SE050\n"); + } + + /* Test verifying ECDSA {r,s} signature with KEYID_ECC_PUBLIC. + * NOTE: The R and S values here were pre-generated using wolfSSL + * and the private ECC key named "ecc_key_der_256" in the + * header. The certificate which wraps the + * public key for "ecc_key_der_256" is "serv_ecc_der_256". The public + * key from that certificate has been extracted and stored into key ID + * KEYID_ECC_PUBLIC. */ + if (ret == 0) { + ret = se050_verify_ecc_sig_rs(sigR, sigS, (byte*)hashData, + sizeof(hashData), KEYID_ECC_PUBLIC); + } + + /* Test reading back certs from SE050 */ + if (ret == 0) { + ret = read_certs_from_se050(); + } + + /* Erase sample keys/certs from SE050 */ + ret = erase_certs_keys_from_se050(); + if (ret != 0) { + LOG_E("Failed to erase sample certs/keys from SE050\n"); + } + + /* Cleanup wolfSSL library resources */ + wolfSSL_Cleanup(); + + LOG_I("Done with sample app"); + return status; +} + +#endif /* SIMW_DEMO_ENABLE__DEMO_WOLFCRYPT_KEY_CERT_INSERT */ diff --git a/SE050/wolfssl/wolfcrypt_test/CMakeLists.txt b/SE050/wolfssl/wolfcrypt_test/CMakeLists.txt new file mode 100644 index 00000000..373b3803 --- /dev/null +++ b/SE050/wolfssl/wolfcrypt_test/CMakeLists.txt @@ -0,0 +1,34 @@ +PROJECT(wolfcrypt_test) +FILE( + GLOB + files + *.c +) + +ADD_EXECUTABLE( + ${PROJECT_NAME} + ${KSDK_STARTUP_FILE} ${files} +) + +TARGET_COMPILE_DEFINITIONS( + ${PROJECT_NAME} + PRIVATE SIMW_DEMO_ENABLE__DEMO_WOLFCRYPTTEST NO_MAIN_DRIVER BENCH_EMBEDDED USE_CERT_BUFFERS_2048 USE_CERT_BUFFERS_256 +) + +TARGET_INCLUDE_DIRECTORIES( + ${PROJECT_NAME} + PRIVATE ${SIMW_TOP_DIR}/sss/ex/inc /home/pi/se_mw/wolfssl +) + +TARGET_LINK_LIBRARIES( + ${PROJECT_NAME} + SSS_APIs + ex_common + wolfssl +) + +CREATE_BINARY(${PROJECT_NAME}) + +IF(SSS_HAVE_HOST_LINUX_LIKE) + INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) +ENDIF() diff --git a/SE050/wolfssl/wolfcrypt_test/README.md b/SE050/wolfssl/wolfcrypt_test/README.md new file mode 100644 index 00000000..721426f5 --- /dev/null +++ b/SE050/wolfssl/wolfcrypt_test/README.md @@ -0,0 +1,219 @@ +# wolfCrypt Test Demo Application + +This demo application runs the wolfCrypt test app. It tests all +algorithms enabled in wolfCrypt. It has been tested using a Raspberry Pi +and SE050 EdgeLock development kit. + +## Building the Demo + +Before building this demo, follow initial setup instructions in the parent +[README.md](../../README.md). + +**IMPORTANT:** This example requires the test.c and test.h files from a +wolfSSL source package be copied into this directory before compiling and +running the example. There are stub files included in this example directory +that should be overwritten: + +``` +$ cp wolfssl-X.X.X/wolfcrypt/test/test.c ./ +$ cp wolfssl-X.X.X/wolfcrypt/test/test.h ./ +``` + +Once this example directory has been copied into the SE05x middleware directory +tree in the correct location, compiling the middleware will also compile this +demo application: + +``` +$ cd /home/pi/se_mw/simw-top_build/raspbian_native_se050_t1oi2c +$ cmake --build . +``` + +## Running the Demo + +To run the demo: + +``` +$ cd /home/pi/se_mw/simw-top_build/raspbian_native_se050_t1oi2c/bin +$ ./wolfcrypt_test +``` + +On successful run, output similar to the following will print out: + +``` +App :INFO :PlugAndTrust_v04.02.00_20220524 +App :INFO :Running ./wolfcrypt_test +App :INFO :If you want to over-ride the selection, use ENV=EX_SSS_BOOT_SSS_PORT or pass in command line arguments. +sss :INFO :atr (Len=35) + 00 A0 00 00 03 96 04 03 E8 00 FE 02 0B 03 E8 08 + 01 00 00 00 00 64 00 00 0A 4A 43 4F 50 34 20 41 + 54 50 4F +sss :WARN :Communication channel is Plain. +sss :WARN :!!!Not recommended for production use.!!! +App :INFO :running setconfig +App :INFO :Ran setconfig successfully +------------------------------------------------------------------------------ + wolfSSL version 5.5.1 +------------------------------------------------------------------------------ +error test passed! +MEMORY test passed! +base64 test passed! +asn test passed! +RANDOM test passed! +MD5 test passed! +SHA test passed! +SHA-256 test passed! +SHA-384 test passed! +SHA-512 test passed! +Hash test passed! +HMAC-MD5 test passed! +HMAC-SHA test passed! +HMAC-SHA256 test passed! +HMAC-SHA384 test passed! +HMAC-SHA512 test passed! +HMAC-KDF test passed! +TLSv1.3 KDF test passed! +GMAC test passed! +Chacha test passed! +POLY1305 test passed! +ChaCha20-Poly1305 AEAD test passed! +AES test passed! +AES192 test passed! +AES256 test passed! +AES-GCM test passed! +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id FFFF +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10000 +RSA test passed! +DH test passed! +PWDBASED test passed! +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10001 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10002 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10003 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10004 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10005 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10006 +CHRIS: before ecc_sign_hash call, ret = 0 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10007 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10008 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10009 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1000A +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1000B +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1000C +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1000D +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1000E +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1000F +CHRIS: before ecc_sign_hash call, ret = 0 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10010 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10011 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10012 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10013 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10014 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10015 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10016 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10017 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10018 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10019 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1001A +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1001B +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1001C +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1001D +CHRIS: before ecc_sign_hash call, ret = 0 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1001E +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1001F +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10020 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10021 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10022 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10023 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10024 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10025 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10026 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10027 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10028 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10029 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1002A +CHRIS: before ecc_sign_hash call, ret = 0 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1002B +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1002C +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1002D +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1002E +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 1002F +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10030 +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10031 +ECC test passed! +sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn +sss :WARN :Could not delete Key id 10032 +ECC buffer test passed! +logging test passed! +time test passed! +mutex test passed! +memcb test passed! +Test complete +App :INFO :Ran wolfCrypt test +App :INFO :ex_sss Finished +``` + +## Demo Notes + +The `test.c` and `test.h` file in this directory have been copied +directly from the wolfSSL download directory, at: + +``` +wolfssl-X.X.X/wolfcrypt/test/test.c +wolfssl-X.X.X/wolfcrypt/test/test.h +``` + +It is expected to see warning messages in the console log about failures to +delete key ids. wolfCrypt internally tries to delete temporary/test keys, +and if those keys have not been stored in the SE050 the debug logs will show +these messages. + diff --git a/SE050/wolfssl/wolfcrypt_test/test.c b/SE050/wolfssl/wolfcrypt_test/test.c new file mode 100644 index 00000000..92d250b6 --- /dev/null +++ b/SE050/wolfssl/wolfcrypt_test/test.c @@ -0,0 +1,23 @@ +/* test.c + * + * Copyright (C) 2006-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 + */ + +#error "Overwrite this file with wolfcrypt/test/test.c from wolfSSL" + diff --git a/SE050/wolfssl/wolfcrypt_test/test.h b/SE050/wolfssl/wolfcrypt_test/test.h new file mode 100644 index 00000000..26668318 --- /dev/null +++ b/SE050/wolfssl/wolfcrypt_test/test.h @@ -0,0 +1,23 @@ +/* test.h + * + * Copyright (C) 2006-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 + */ + +#error "Overwrite this file with wolfcrypt/test/test.h from wolfSSL" + diff --git a/SE050/wolfssl/wolfcrypt_test/wolfcrypt_test.c b/SE050/wolfssl/wolfcrypt_test/wolfcrypt_test.c new file mode 100644 index 00000000..bdd4f8ec --- /dev/null +++ b/SE050/wolfssl/wolfcrypt_test/wolfcrypt_test.c @@ -0,0 +1,73 @@ +/* wolfcrypt_test.c + * + * Copyright (C) 2006-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 + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include "test.h" + +#include +#include +#include + +#ifdef __cplusplus +} +#endif + +#if defined(SIMW_DEMO_ENABLE__DEMO_WOLFCRYPTTEST) + +static ex_sss_boot_ctx_t gex_sss_boot_ctx; + +#define EX_SSS_BOOT_PCONTEXT (&gex_sss_boot_ctx) +#define EX_SSS_BOOT_DO_ERASE 1 +#define EX_SSS_BOOT_EXPOSE_ARGC_ARGV 0 + +#include + +sss_status_t ex_sss_entry(ex_sss_boot_ctx_t *pCtx) +{ + int ret = 0; + sss_status_t status = kStatus_SSS_Success; + sss_session_t *pSession = (sss_session_t*)&pCtx->session; + sss_key_store_t *pKeyStore = (sss_key_store_t*)&pCtx->ks; + + LOG_I("running setconfig"); + ret = wc_se050_set_config(pSession, NULL, pKeyStore); + if (ret != 0) { + LOG_E("wc_se050_set_config failed"); + return kStatus_SSS_Fail; + } + LOG_I("Ran setconfig successfully"); + + wolfSSL_Init(); + wolfcrypt_test(NULL); + wolfSSL_Cleanup(); + + LOG_I("Ran wolfCrypt test"); + return status; +} + +#endif /* SIMW_DEMO_ENABLE__DEMO_WOLFCRYPTTEST */