forked from wolfSSL/wolfssl
Merge pull request #8153 from LinuxJedi/Pi-pico
Add support for Raspberry Pi Pico
This commit is contained in:
@@ -14498,7 +14498,15 @@ void bench_sphincsKeySign(byte level, byte optim)
|
|||||||
|
|
||||||
return (double) ticks/TICKS_PER_SECOND;
|
return (double) ticks/TICKS_PER_SECOND;
|
||||||
}
|
}
|
||||||
|
#elif defined(WOLFSSL_RPIPICO)
|
||||||
|
#include "pico/stdlib.h"
|
||||||
|
|
||||||
|
double current_time(int reset)
|
||||||
|
{
|
||||||
|
(void)reset;
|
||||||
|
|
||||||
|
return (double) time_us_64() / 1000000;
|
||||||
|
}
|
||||||
#elif defined(THREADX)
|
#elif defined(THREADX)
|
||||||
#include "tx_api.h"
|
#include "tx_api.h"
|
||||||
double current_time(int reset)
|
double current_time(int reset)
|
||||||
|
@@ -147,7 +147,9 @@ EXTRA_DIST += wolfcrypt/src/port/ti/ti-aes.c \
|
|||||||
wolfcrypt/src/port/cypress/psoc6_crypto.c \
|
wolfcrypt/src/port/cypress/psoc6_crypto.c \
|
||||||
wolfcrypt/src/port/liboqs/liboqs.c \
|
wolfcrypt/src/port/liboqs/liboqs.c \
|
||||||
wolfcrypt/src/port/maxim/max3266x.c \
|
wolfcrypt/src/port/maxim/max3266x.c \
|
||||||
wolfcrypt/src/ASN_TEMPLATE.md
|
wolfcrypt/src/ASN_TEMPLATE.md \
|
||||||
|
wolfcrypt/src/port/rpi_pico/pico.c \
|
||||||
|
wolfcrypt/src/port/rpi_pico/README.md
|
||||||
|
|
||||||
$(ASYNC_FILES):
|
$(ASYNC_FILES):
|
||||||
$(AM_V_at)touch $(srcdir)/$@
|
$(AM_V_at)touch $(srcdir)/$@
|
||||||
|
72
wolfcrypt/src/port/rpi_pico/README.md
Normal file
72
wolfcrypt/src/port/rpi_pico/README.md
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
# wolfSSL Raspberry Pi Pico Acceleration
|
||||||
|
|
||||||
|
wolfSSL supports RNG acceleration on the Raspberry Pi RP2040 and RP2350
|
||||||
|
microcontrollers. Everything here assumes you are using the standard [Raspberry
|
||||||
|
Pi Pico SDK](https://github.com/raspberrypi/pico-sdk).
|
||||||
|
|
||||||
|
It has only been tested with the ARM cores of the RP2350, not the RISC-V cores.
|
||||||
|
|
||||||
|
## RNG Acceleration
|
||||||
|
|
||||||
|
The Pico SDK has RNG functions for both the RP2040 and RP2350. In the RP2040
|
||||||
|
this is an optimised PRNG method, in the RP2350 it uses a built-in TRNG. The
|
||||||
|
same API is used for both.
|
||||||
|
|
||||||
|
## Compiling wolfSSL
|
||||||
|
|
||||||
|
In your `user_settings.h`, you should set the following to add support in
|
||||||
|
wolfSSL:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define WOLFSSL_RPIPICO
|
||||||
|
```
|
||||||
|
|
||||||
|
Then for an RP2040, enable the ARM Thumb instructions:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define WOLFSSL_SP_ARM_THUMB_ASM
|
||||||
|
```
|
||||||
|
|
||||||
|
or for an RP2350, the Cortex-M instructions should be used:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define WOLFSSL_SP_ARM_CORTEX_M_ASM
|
||||||
|
```
|
||||||
|
|
||||||
|
To enable the RNG acceleration add the following:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define WC_NO_HASHDRBG
|
||||||
|
#define CUSTOM_RAND_GENERATE_BLOCK wc_pico_rng_gen_block
|
||||||
|
```
|
||||||
|
|
||||||
|
In CMake you should add the following linking to both wolfSSL and the end
|
||||||
|
application:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
target_link_libraries(wolfssl
|
||||||
|
pico_stdlib
|
||||||
|
pico_rand
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
A full example can be found in the
|
||||||
|
[`RPi-Pico`](https://github.com/wolfSSL/wolfssl-examples/tree/master/RPi-Pico)
|
||||||
|
directory of the
|
||||||
|
[`wolfssl-examples`](https://github.com/wolfSSL/wolfssl-examples) GitHub
|
||||||
|
repository.
|
||||||
|
|
||||||
|
## Note on RP2350 SHA256
|
||||||
|
|
||||||
|
Although RP2350 has SHA256 acceleration, we cannot use this. It is because
|
||||||
|
we need to get an intermediate result using `wc_Sha256GetHash()`. The hardware
|
||||||
|
will only deal with 64byte packets of data, so to get a result we need to do
|
||||||
|
SHA padding. Once the SHA padding is done, it is not in a state to add more
|
||||||
|
data.
|
||||||
|
The only real workaround would be to cache everything being sent into the
|
||||||
|
hardware and replay it as a new instance when trying to get an intermediate
|
||||||
|
result. This would not very efficient for an embedded device.
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For questions please email support@wolfssl.com
|
59
wolfcrypt/src/port/rpi_pico/pico.c
Normal file
59
wolfcrypt/src/port/rpi_pico/pico.c
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/* pico.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2024 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 <inttypes.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <wolfssl/wolfcrypt/settings.h>
|
||||||
|
#include <wolfssl/wolfcrypt/types.h>
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_RPIPICO)
|
||||||
|
#include "pico/rand.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* On RP2040 this uses an optimized PRNG, on RP2350 this uses a hardware TRNG.
|
||||||
|
* There is a 128bit function, but internally this is just 2x 64bit calls.
|
||||||
|
* Likewise the 32bit call is just a truncated 64bit call, so just stick with
|
||||||
|
* the 64bit calls.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int wc_pico_rng_gen_block(unsigned char *output, unsigned int sz)
|
||||||
|
{
|
||||||
|
uint32_t i = 0;
|
||||||
|
|
||||||
|
while (i < sz)
|
||||||
|
{
|
||||||
|
uint64_t rnd = get_rand_64();
|
||||||
|
if (i + 8 < sz)
|
||||||
|
{
|
||||||
|
XMEMCPY(output + i, &rnd, 8);
|
||||||
|
i += 8;
|
||||||
|
} else {
|
||||||
|
XMEMCPY(output + i, &rnd, sz - i);
|
||||||
|
i = sz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
@@ -111,6 +111,8 @@ This library contains implementation for the random number generator.
|
|||||||
#include <random.h>
|
#include <random.h>
|
||||||
#elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
|
#elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
|
||||||
#include "wolfssl/wolfcrypt/port/xilinx/xil-versal-trng.h"
|
#include "wolfssl/wolfcrypt/port/xilinx/xil-versal-trng.h"
|
||||||
|
#elif defined(WOLFSSL_RPIPICO)
|
||||||
|
#include "wolfssl/wolfcrypt/port/rpi_pico/pico.h"
|
||||||
#elif defined(NO_DEV_RANDOM)
|
#elif defined(NO_DEV_RANDOM)
|
||||||
#elif defined(CUSTOM_RAND_GENERATE)
|
#elif defined(CUSTOM_RAND_GENERATE)
|
||||||
#elif defined(CUSTOM_RAND_GENERATE_BLOCK)
|
#elif defined(CUSTOM_RAND_GENERATE_BLOCK)
|
||||||
@@ -2968,7 +2970,6 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
|
|||||||
}
|
}
|
||||||
return RAN_BLOCK_E;
|
return RAN_BLOCK_E;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif !defined(WOLFSSL_CAAM) && \
|
#elif !defined(WOLFSSL_CAAM) && \
|
||||||
(defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX) || \
|
(defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX) || \
|
||||||
defined(FREESCALE_KSDK_BM) || defined(FREESCALE_FREE_RTOS))
|
defined(FREESCALE_KSDK_BM) || defined(FREESCALE_FREE_RTOS))
|
||||||
|
@@ -119,7 +119,8 @@ noinst_HEADERS+= \
|
|||||||
wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h \
|
wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h \
|
||||||
wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h \
|
wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h \
|
||||||
wolfssl/wolfcrypt/port/maxim/max3266x.h \
|
wolfssl/wolfcrypt/port/maxim/max3266x.h \
|
||||||
wolfssl/wolfcrypt/port/maxim/max3266x-cryptocb.h
|
wolfssl/wolfcrypt/port/maxim/max3266x-cryptocb.h \
|
||||||
|
wolfssl/wolfcrypt/port/rpi_pico/pico.h
|
||||||
|
|
||||||
if BUILD_CRYPTOAUTHLIB
|
if BUILD_CRYPTOAUTHLIB
|
||||||
nobase_include_HEADERS+= wolfssl/wolfcrypt/port/atmel/atmel.h
|
nobase_include_HEADERS+= wolfssl/wolfcrypt/port/atmel/atmel.h
|
||||||
|
29
wolfssl/wolfcrypt/port/rpi_pico/pico.h
Normal file
29
wolfssl/wolfcrypt/port/rpi_pico/pico.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/* pico.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2024 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _WOLFPORT_RPIPICO_H_
|
||||||
|
#define _WOLFPORT_RPIPICO_H_
|
||||||
|
#if defined(WOLFSSL_RPIPICO)
|
||||||
|
|
||||||
|
WOLFSSL_LOCAL int wc_pico_rng_gen_block(unsigned char* output, unsigned int sz);
|
||||||
|
|
||||||
|
#endif /* WOLFSSL_RPPICO */
|
||||||
|
#endif /* _WOLFPORT_RPIPICO_H_ */
|
@@ -264,6 +264,9 @@
|
|||||||
/* Uncomment next line if using MAXQ108x */
|
/* Uncomment next line if using MAXQ108x */
|
||||||
/* #define WOLFSSL_MAXQ108X */
|
/* #define WOLFSSL_MAXQ108X */
|
||||||
|
|
||||||
|
/* Uncomment next line if using Raspberry Pi RP2040 or RP2350 */
|
||||||
|
/* #define WOLFSSL_RPIPICO */
|
||||||
|
|
||||||
/* Check PLATFORMIO first, as it may define other known environments. */
|
/* Check PLATFORMIO first, as it may define other known environments. */
|
||||||
#ifdef PLATFORMIO
|
#ifdef PLATFORMIO
|
||||||
#ifdef ESP_PLATFORM
|
#ifdef ESP_PLATFORM
|
||||||
|
Reference in New Issue
Block a user