Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
cmake_minimum_required(VERSION 3.13)

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

if(WIN32)
set(USERHOME $ENV{USERPROFILE})
else()
set(USERHOME $ENV{HOME})
endif()
set(sdkVersion 2.2.0)
set(toolchainVersion 14_2_Rel1)
set(picotoolVersion 2.2.0-a4)
set(picoVscode ${USERHOME}/.pico-sdk/cmake/pico-vscode.cmake)
if (EXISTS ${picoVscode})
include(${picoVscode})
endif()
# ====================================================================================
set(PICO_BOARD pico2 CACHE STRING "Board type")

# Handle platform configuration before SDK import
if(BUILD_PICO2_DEMOS)
if(NOT DEFINED PICO_PLATFORM)
set(PICO_PLATFORM "rp2350" CACHE STRING "Pico Platform" FORCE)
elseif(PICO_PLATFORM STREQUAL "RP2350")
set(PICO_PLATFORM "rp2350" CACHE STRING "Pico Platform" FORCE)
endif()
endif()

# Include Pico SDK import if PICO_SDK_PATH is defined
if(BUILD_PICO2_DEMOS OR DEFINED PICO_SDK_PATH OR DEFINED ENV{PICO_SDK_PATH})
include(${CMAKE_CURRENT_SOURCE_DIR}/pico_sdk_import.cmake)

# Force usage of Pico toolchain if we found the SDK and no toolchain was specified
if(DEFINED PICO_SDK_PATH AND NOT CMAKE_TOOLCHAIN_FILE)
set(CMAKE_TOOLCHAIN_FILE ${PICO_SDK_PATH}/cmake/preload/toolchains/pico_arm_gcc.cmake)
endif()
endif()

project(wolfHSM C CXX ASM)

# Initialize Pico SDK immediately after project definition
if(DEFINED PICO_SDK_PATH)
pico_sdk_init()
endif()

# Configure wolfSSL to use user_settings.h
set(WOLFSSL_USER_SETTINGS ON CACHE BOOL "Use user settings" FORCE)
set(WOLFSSL_INSTALL OFF CACHE BOOL "Disable wolfSSL install" FORCE)

# Disable wolfSSL tests and examples when building for Pico
if(BUILD_PICO2_DEMOS)
set(WOLFSSL_EXAMPLES OFF CACHE BOOL "Disable wolfSSL examples" FORCE)
set(WOLFSSL_CRYPT_TESTS OFF CACHE BOOL "Disable wolfSSL crypt tests" FORCE)
set(WOLFSSL_TEST OFF CACHE BOOL "Disable wolfSSL tests" FORCE)
endif()

# Add wolfSSL subdirectory
add_subdirectory(wolfssl)

# If building for Pico demo, point wolfSSL to the example's user_settings.h
if(BUILD_PICO2_DEMOS)
target_include_directories(wolfssl PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/examples/pico)
target_compile_definitions(wolfssl PUBLIC WOLFSSL_USER_SETTINGS)
target_link_libraries(wolfssl PUBLIC pico_stdlib)
endif()

# Create wolfHSM library
file(GLOB WOLFHSM_SOURCES "src/*.c")
add_library(wolfhsm STATIC ${WOLFHSM_SOURCES})

# Include directories for wolfHSM
target_include_directories(wolfhsm PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/wolfhsm
${CMAKE_CURRENT_SOURCE_DIR}/wolfssl
)

# Link wolfHSM against wolfSSL
target_link_libraries(wolfhsm PUBLIC wolfssl)

if(BUILD_PICO2_DEMOS)
target_link_libraries(wolfhsm PUBLIC pico_stdlib)
endif()

# Add examples subdirectory if building for Pico
if(BUILD_PICO2_DEMOS)
add_subdirectory(examples/pico)
endif()
72 changes: 72 additions & 0 deletions examples/pico/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
if (WOLFHSM_DEMO_DUAL)
add_executable(pico2_demo_dual
pico2_demo_dual.c
${CMAKE_CURRENT_SOURCE_DIR}/../../port/pico/pico2_transport_shm.c
)

target_link_libraries(pico2_demo_dual
pico_stdlib
pico_multicore
wolfhsm
)

target_compile_definitions(pico2_demo_dual PRIVATE
WOLFSSL_USER_SETTINGS
WOLFHSM_CFG_ENABLE_CLIENT
WOLFHSM_CFG_ENABLE_SERVER
)

target_include_directories(pico2_demo_dual PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/../..
${CMAKE_CURRENT_SOURCE_DIR}/../../wolfhsm
${CMAKE_CURRENT_SOURCE_DIR}/../../port/pico
${CMAKE_CURRENT_SOURCE_DIR}/../../wolfssl
)

# Enable stdio over USB only
pico_enable_stdio_usb(pico2_demo_dual 1)
pico_enable_stdio_uart(pico2_demo_dual 0)

# Generate UF2 file for Pico
pico_add_extra_outputs(pico2_demo_dual)
endif()

if (WOLFHSM_DEMO_SHA256)
# SHA256 Demo
add_executable(pico2_demo_sha256
pico2_demo_sha256.c
${CMAKE_CURRENT_SOURCE_DIR}/../../port/pico/pico2_transport_shm.c
${CMAKE_CURRENT_SOURCE_DIR}/../../wolfssl/wolfcrypt/src/port/rpi_pico/pico.c
)

target_link_libraries(pico2_demo_sha256
pico_stdlib
pico_multicore
pico_rand
wolfhsm
wolfssl
)

target_compile_definitions(pico2_demo_sha256 PRIVATE
WOLFSSL_USER_SETTINGS
WOLFHSM_CFG_ENABLE_CLIENT
WOLFHSM_CFG_ENABLE_SERVER
)

target_include_directories(pico2_demo_sha256 PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/../..
${CMAKE_CURRENT_SOURCE_DIR}/../../wolfhsm
${CMAKE_CURRENT_SOURCE_DIR}/../../port/pico
${CMAKE_CURRENT_SOURCE_DIR}/../../wolfssl
${CMAKE_CURRENT_SOURCE_DIR}/../../wolfssl/wolfssl
)

# Enable stdio over USB only
pico_enable_stdio_usb(pico2_demo_sha256 1)
pico_enable_stdio_uart(pico2_demo_sha256 0)

# Generate UF2 file for Pico
pico_add_extra_outputs(pico2_demo_sha256)
endif()
125 changes: 125 additions & 0 deletions examples/pico/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
# Pico-2 Dual-Core wolfHSM Demos

This directory contains examples demonstrating dual-core communication using wolfHSM on the Raspberry Pi Pico-2.
- **Echo Demo** (`pico2_demo_dual`): A simple client-server echo test.
- **SHA256 Demo** (`pico2_demo_sha256`): Offloading SHA256 hashing from the client (Core 1) to the server (Core 0).

## Shared Memory Transport

Both demos use a shared memory region to pass messages between cores:
- **Core 0**: Runs the wolfHSM server.
- **Core 1**: Runs the wolfHSM client.

**Memory Layout:**
```
Header (32 bytes) - Initialization flags and metadata
Request Buffer - 1KB, client to server
Response Buffer - 1KB, server to client
```

## Building

You can choose which demo to build using CMake flags.

1. **Setup environment**
```bash
cd $WOLF_HSM_DIR
mkdir -p build && cd build
```

2. **Configure (Choose one)**

*For Echo Demo:*
```bash
cmake -GNinja -DBUILD_PICO2_DEMOS=ON -DWOLFHSM_DEMO_DUAL=ON -DPICO_SDK_PATH=/path/to/pico-sdk ..
```

*For SHA256 Demo:*
```bash
cmake -GNinja -DBUILD_PICO2_DEMOS=ON -DWOLFHSM_DEMO_SHA256=ON -DPICO_SDK_PATH=/path/to/pico-sdk ..
```

3. **Build**
```bash
ninja
```

The output UF2 file will be at `examples/pico/pico2_demo_dual.uf2` or `examples/pico/pico2_demo_sha256.uf2`.

## Demo 1: Echo Server/Client

### Overview
- **Core 0** (Server): Initializes transport, listens for requests, and echoes the payload back with an "Echo: " prefix.
- **Core 1** (Client): Connects to the transport, sends test strings, and verifies the echoed response.

### Expected Output
```
Server running on Core 0, client on Core 1
Client initialized
Sent: Hello from Core 1
Received: Echo: Hello from Core 1
...
```

## Demo 2: SHA256 Offload

### Overview
- **Core 0** (Server): Runs the full wolfHSM server with a software crypto backend (using wolfCrypt).
- **Core 1** (Client): Uses the standard `wolfCrypt` API (e.g., `wc_InitSha256_ex`) with `WH_DEV_ID`. This transparently marshals the crypto operation to the server via the shared memory transport.

### Configuration
Edit `pico2_demo_sha256.c` or `user_settings.h` to adjust buffer sizes or enable/disable specific algorithms.

### Expected Output
```
=== Pico-2 Dual-Core wolfHSM SHA256 Demo (wolfCrypt API) ===
Shared memory @20001838 size 4096
Server running on Core 0, client on Core 1

=== Core 1: Client start ===
Client initializing...
Client initialized via wh_Client_Init

--- Starting SHA256 Demo ---

Input [0]: "Hello from Core 1" (17 bytes)
SHA256 Initialized Successfully
SHA256 Update Successful
SHA256 Finalizing...
SHA256 Hash: 975ddc4c55e2da9e7efdaffb72a1e221d67ade221e1767fe0e525e80d926ce02

Input [1]: "The quick brown fox" (19 bytes)
SHA256 Initialized Successfully
SHA256 Update Successful
SHA256 Finalizing...
SHA256 Hash: 5cac4f980fedc3d3f1f99b4be3472c9b30d56523e632d151237ec9309048bda9

Input [2]: "wolfHSM SHA256 Demo" (19 bytes)
SHA256 Initialized Successfully
SHA256 Update Successful
SHA256 Finalizing...
SHA256 Hash: df504e1687a32bf2389f3a07a99e845393d4b7fe40c26c88cca658e36717f73b

Input [3]: "Pico2 Dual Core" (15 bytes)
SHA256 Initialized Successfully
SHA256 Update Successful
SHA256 Finalizing...
SHA256 Hash: 520283eac4ef94cbfdeee0c9c595aebae13499d0492fde20ce86424b913d23e9

Input [4]: "SHA256 Hash Test" (16 bytes)
SHA256 Initialized Successfully
SHA256 Update Successful
SHA256 Finalizing...
SHA256 Hash: b3a9b0be905013ea129ac28877883f8d68aa3df8b1df8a205023c608568c9cd3

--- Demo Complete ---
Core 1 done
```

## Requirements

- Raspberry Pi Pico-2 board (RP2350)
- Pico SDK 2.0.0+
- wolfSSL and wolfHSM libraries
- ARM GCC toolchain

Loading