Skip to content
Merged
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
23 changes: 0 additions & 23 deletions embedded/ti-c2000-f28p55x/Header/user_settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,28 +141,6 @@ extern "C" {
#undef WOLFSSL_SHAKE256
#define WOLFSSL_SHAKE256

/* Standalone hash examples (make SHA2=1 / SHA3=1): one hash family only, no
* RNG and no ML-DSA. */
#if defined(WOLF_SHA2_EXAMPLE) || defined(WOLF_SHA3_EXAMPLE)
#define WOLF_HASH_EXAMPLE
#undef WC_NO_RNG
#define WC_NO_RNG
#endif
#ifdef WOLF_SHA2_EXAMPLE
#undef WOLFSSL_SHA224
#define WOLFSSL_SHA224
#undef WOLFSSL_SHA3
#undef WOLFSSL_SHAKE128
#undef WOLFSSL_SHAKE256
#endif
#ifdef WOLF_SHA3_EXAMPLE
#undef NO_SHA256
#define NO_SHA256
#undef WOLFSSL_SHA512
#undef WOLFSSL_SHA384
#endif

#ifndef WOLF_HASH_EXAMPLE
/* ------------------------------------------------------------------------- */
/* ML-DSA-87 (Dilithium L5) - VERIFY ONLY */
/* ------------------------------------------------------------------------- */
Expand Down Expand Up @@ -244,7 +222,6 @@ extern "C" {
* ~10.7 KB total RAM. Left off by default because the caller must keep the
* public-key buffer valid for the key's lifetime. */
#endif
#endif /* !WOLF_HASH_EXAMPLE */

/* ------------------------------------------------------------------------- */
/* Disabled: big-integer / asymmetric (keeps TFM/ECC/integer out of build) */
Expand Down
8 changes: 6 additions & 2 deletions embedded/ti-c2000-f28p55x/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -371,21 +371,25 @@ endif
$(WOLFROOT)/wolfcrypt/src/misc.c \
$(WOLFROOT)/wolfcrypt/src/hash.c
ifeq ($(SHA2),1)
CFLAGS += --define=WOLF_SHA2_EXAMPLE
LFLAGS += --define=WOLF_SHA2_EXAMPLE
WC_SRCS += \
$(WOLFROOT)/wolfcrypt/src/sha256.c \
$(WOLFROOT)/wolfcrypt/src/sha512.c
BSP_SRCS := $(CURDIR)/Source/test_sha2.c
SHA_EXAMPLE_DIR := $(CURDIR)/ccs/sha2
else
CFLAGS += --define=WOLF_SHA3_EXAMPLE
LFLAGS += --define=WOLF_SHA3_EXAMPLE
WC_SRCS += $(WOLFROOT)/wolfcrypt/src/sha3.c
BSP_SRCS := $(CURDIR)/Source/test_sha3.c
SHA_EXAMPLE_DIR := $(CURDIR)/ccs/sha3
endif
BSP_SRCS += \
$(CURDIR)/Source/c2000_board.c \
$(DEV)/common/source/device.c
# The example's own user_settings.h (shared with its CCS project) must be
# found before the full-image one in Header/.
CFLAGS := $(subst -I$(CURDIR)/Header,-I$(SHA_EXAMPLE_DIR) \
-I$(CURDIR)/Header,$(CFLAGS))
CFLAGS += --define=NO_CRYPT_TEST --define=NO_CRYPT_BENCHMARK
HARNESS_SRCS :=
HARNESS_EXTRA :=
Expand Down
4 changes: 3 additions & 1 deletion embedded/ti-c2000-f28p55x/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ make CGT_ROOT=/path/to/ti-cgt-c2000_xx.y.z SHA3=1 # Source/test_sha3.c

Each `main()` calls `c2000_board_init()` (`Source/c2000_board.c`: clocks, SCIA console, CPU Timer 0) and runs one function per variant that shows the complete API sequence, `wc_InitXxx()` -> `wc_XxxUpdate()` -> `wc_XxxFinal()` -> `wc_XxxFree()`, on the FIPS 180-4 / FIPS 202 "abc" vector, printing the digest and `PASS`/`FAIL`. A streaming case then feeds one message through several `Update` calls, and a throughput loop hashes 64 KiB per variant through the generic `wc_HashInit()` / `wc_HashUpdate()` / `wc_HashFinal()` API. Output ends with `SHA-2 example: PASS` (or `SHA-3 ...`) and `=== done ===`.

Only that family's wolfCrypt source is built (`sha256.c` + `sha512.c`, or `sha3.c`), with no RNG, ML-DSA or test/benchmark harness. `Header/user_settings.h` selects the algorithms under `WOLF_SHA2_EXAMPLE` / `WOLF_SHA3_EXAMPLE`. Both toggles build alone: combining one with the other or with any other toggle is a build error. The output image is `out/wolfcrypt_f28p55x.out` as for every other build, flashed the same way (see Flash and run).
Only that family's wolfCrypt source is built (`sha256.c` + `sha512.c`, or `sha3.c`), with no RNG, ML-DSA or test/benchmark harness. Each uses its own small `user_settings.h` from `ccs/sha2/` or `ccs/sha3/`, the same file its CCS project uses. Both toggles build alone: combining one with the other or with any other toggle is a build error. The output image is `out/wolfcrypt_f28p55x.out` as for every other build, flashed the same way (see Flash and run).

The same two examples are also available as Code Composer Studio projects: see [ccs/README.md](ccs/README.md).

## Octet representation at the API boundary (`MLDSA=1`)

Expand Down
83 changes: 83 additions & 0 deletions embedded/ti-c2000-f28p55x/ccs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# wolfCrypt SHA-2 / SHA-3 CCS projects for the LAUNCHXL-F28P55X

Two Code Composer Studio (CCS) projects for the TI LAUNCHXL-F28P55X (TMS320F28P550SJ, C2000 C28x): one for SHA-2, one for SHA-3. Each project is one small application file plus wolfCrypt, imported from a `.projectspec` in the same way as the C2000Ware examples.

| Project | projectspec | Algorithms |
|---|---|---|
| `wolfssl_sha2` | `ccs/sha2/wolfssl_sha2.projectspec` | SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256 |
| `wolfssl_sha3` | `ccs/sha3/wolfssl_sha3.projectspec` | SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128, SHAKE256 |

## Prerequisites

- Code Composer Studio 20.x. CCS 12.x imports the same `.projectspec` format but has not been tested.
- C2000Ware 26.01 (`C2000Ware_26_01_00_00`), installed where CCS can find it (CCS discovers it under `~/ti` or `C:\ti`).
- TI C2000 code generation tools 22.6.3.LTS. 25.11.0.LTS has also been tested. To use a different installed version, change it under Project Properties > General > Compiler version.
- A clone of the wolfSSL master branch. The C28x has 16-bit bytes (`CHAR_BIT == 16`) and needs the support for that in current wolfSSL.

The projects expect wolfSSL to be cloned next to wolfssl-examples:

```
<dir>/wolfssl git clone https://github.com/wolfSSL/wolfssl.git
<dir>/wolfssl-examples git clone https://github.com/wolfSSL/wolfssl-examples.git
```

## Import and build

1. File > Import Projects, and select `ccs/sha2/wolfssl_sha2.projectspec` or `ccs/sha3/wolfssl_sha3.projectspec`.
2. The application files (`test_sha2.c` or `test_sha3.c`, `c2000_board.c`, `c2000_board.h`, `user_settings.h`, `28p55x_wolf_flash_lnk.cmd`) and the C2000Ware device files are copied into the new project, so you can edit them freely. The wolfCrypt sources in the `wolfcrypt` folder are links into the wolfSSL clone.
3. Pick a build configuration and build:
- `CPU1_LAUNCHXL_FLASH`: optimized (`-O2`).
- `CPU1_LAUNCHXL_FLASH_DEBUG`: no optimization and full symbols, for stepping through the hash calls.

If wolfSSL is somewhere else, `WOLFSSL_ROOT` must be changed in two places in each project (the projectspec records it as both a linked-resource path and a build variable):

- Project Properties > Resource > Linked Resources > Path Variables: `WOLFSSL_ROOT`
- Project Properties > Build > Variables (select "All configurations"): `WOLFSSL_ROOT`

## Flash, run and read the output

1. Use the LaunchPad target configuration copied into the project (`targetConfigs/TMS320F28P550SJ9_LaunchPad.ccxml`) and start a debug session (Run > Debug), which programs flash.
2. Open a serial terminal on the LaunchPad's XDS110 "Application/User UART" port at 115200 8N1.
3. Run. The output is printed on the UART:

```
=== wolfCrypt SHA-2 example on TI C2000 LAUNCHXL-F28P55X ===

--- Known-answer tests ---
SHA-224 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
SHA-224 KAT: PASS
SHA-256 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
SHA-256 KAT: PASS
...
--- Throughput (150 MHz) ---
SHA-256 64 KiB in 0.222 s = 288.0 KiB/s
...
SHA-2 example: PASS (0 failure(s))
=== done ===
```

The UART output stays clean only while the debugger is not halting the target, so let it run freely (or disconnect after flashing). To send `printf` to the CCS Console instead of the UART, remove `WOLF_C2000_SCI_STDOUT` under Project Properties > Build > C2000 Compiler > Predefined Symbols. The CCS Console is much slower.

## Code flow

`main()` in `test_sha2.c` / `test_sha3.c`:

1. `c2000_board_init()` (`c2000_board.c`): PLL to 150 MHz, GPIO, SCIA console redirected to `stdout`, and CPU Timer 0 as the time base for `current_time()`.
2. One function per algorithm, e.g. `sha256_example()`, showing the complete wolfCrypt call sequence on the FIPS 180-4 / FIPS 202 "abc" test vector: `wc_InitSha256()` -> `wc_Sha256Update()` -> `wc_Sha256Final()` -> `wc_Sha256Free()`. The digest is printed and compared to the expected value (`PASS` / `FAIL`).
3. A streaming example that feeds one message through several `Update` calls (`sha256_stream_example()` / `shake256_stream_example()`).
4. `hash_bench()`: hashes 64 KiB per algorithm through the generic `wc_HashInit()` / `wc_HashUpdate()` / `wc_HashFinal()` API and prints the throughput.

## Adding wolfCrypt hashing to your own CCS project

1. Clone wolfSSL master.
2. Add these files from `<wolfssl>/wolfcrypt/src/` to the project (Add Files, or link them):
- Always: `error.c`, `wc_port.c`, `memory.c`, `logging.c`, `misc.c`, `hash.c`.
- SHA-2: `sha256.c`, `sha512.c`. SHA-3: `sha3.c`.
3. Copy `ccs/sha2/user_settings.h` or `ccs/sha3/user_settings.h` into your project. The platform section must stay as is: it sets the C28x integer widths and the `CHAR_BIT == 16` handling. Then adjust the algorithm section.
4. Project Properties > Build > C2000 Compiler:
- Include Options: add your project directory (for `user_settings.h`) and the wolfSSL root directory (the one containing the `wolfssl/` folder).
- Predefined Symbols: add `WOLFSSL_USER_SETTINGS`.
5. Include `<wolfssl/wolfcrypt/settings.h>` before any other wolfCrypt header, then `<wolfssl/wolfcrypt/sha256.h>`, `sha512.h` or `sha3.h`.
6. Linker command file: these examples use `28p55x_wolf_flash_lnk.cmd`, which places a 16 KW stack in low RAM (the C28x stack must sit below 0x10000) and runs the SHA-3 core `BlockSha3` from RAM for speed. The hash examples make no heap allocations.

On the C28x a `byte` is 16 bits and holds one octet: every wolfCrypt byte buffer stores one octet per 16-bit cell, and lengths are octet counts. Data that arrives packed (two octets per cell) from flash or a peripheral must be unpacked with `wc_UnpackOctets()` before it is hashed.
150 changes: 150 additions & 0 deletions embedded/ti-c2000-f28p55x/ccs/sha2/user_settings.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
/* user_settings.h
*
* Copyright (C) 2006-2026 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 3 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
*/

/* wolfSSL user settings for the SHA-2 (SHA-224/256/384/512, SHA-512/224, SHA-512/256) example on the TI C2000 C28x
* (LAUNCHXL-F28P55X). Selected by defining WOLFSSL_USER_SETTINGS.
*
* The C28x has 16-bit bytes (CHAR_BIT == 16): every wolfCrypt byte buffer
* holds one octet per 16-bit cell. The platform settings below are required
* for that; the last section picks the hash algorithms.
*/

#ifndef WOLFSSL_USER_SETTINGS_C2000_SHA2_H
#define WOLFSSL_USER_SETTINGS_C2000_SHA2_H

#ifdef __cplusplus
extern "C" {
#endif

/* ------------------------------------------------------------------------- */
/* Platform / C28x toolchain */
/* ------------------------------------------------------------------------- */
#undef SINGLE_THREADED
#define SINGLE_THREADED

#undef WOLFCRYPT_ONLY /* crypto only, no TLS layer */
#define WOLFCRYPT_ONLY

#undef NO_FILESYSTEM
#define NO_FILESYSTEM

#undef NO_WRITEV
#define NO_WRITEV

#undef NO_MAIN_DRIVER /* main() lives in the example source */
#define NO_MAIN_DRIVER

#undef NO_DEV_RANDOM
#define NO_DEV_RANDOM

#undef WOLFSSL_IGNORE_FILE_WARN
#define WOLFSSL_IGNORE_FILE_WARN

/* C28x integer widths: char/short/int = 16-bit, long = 32-bit,
* long long = 64-bit. */
#undef SIZEOF_LONG
#define SIZEOF_LONG 4
#undef SIZEOF_LONG_LONG
#define SIZEOF_LONG_LONG 8

/* Use the toolchain's <limits.h> so CHAR_BIT is the real value (16 on C28x)
* instead of wolfSSL's 8-bit fallback. */
#undef HAVE_LIMITS_H
#define HAVE_LIMITS_H

/* 16-bit int: word16 = unsigned int, word32 = unsigned long. Without this
* wolfSSL assumes a 32-bit int and silently truncates 32-bit math. */
#undef WC_16BIT_CPU
#define WC_16BIT_CPU

/* Portable byte-by-byte paths; a byte buffer must never be cast to a wider
* word when a byte is 16 bits. */
#undef WOLFSSL_GENERAL_ALIGNMENT
#define WOLFSSL_GENERAL_ALIGNMENT 2

/* Portable C cores - no assembly. */
#undef WOLFSSL_NO_ASM
#define WOLFSSL_NO_ASM

/* Build misc.c as its own translation unit. The TI compiler emits no
* out-of-line copy of a plain `inline` definition, so the inline-misc path
* leaves helpers such as xorbuf unresolved at link. */
#undef NO_INLINE
#define NO_INLINE

/* Hashing only: no random number generator. */
#undef WC_NO_RNG
#define WC_NO_RNG

/* ------------------------------------------------------------------------- */
/* SHA-2 */
/* ------------------------------------------------------------------------- */
/* SHA-256 is on by default (NO_SHA256 not defined). */
#undef WOLFSSL_SHA224
#define WOLFSSL_SHA224
#undef WOLFSSL_SHA384
#define WOLFSSL_SHA384
#undef WOLFSSL_SHA512 /* also SHA-512/224 and SHA-512/256 */
#define WOLFSSL_SHA512

/* ------------------------------------------------------------------------- */
/* Everything else off: hashing only */
/* ------------------------------------------------------------------------- */
#undef NO_BIG_INT /* no multi-precision math */
#define NO_BIG_INT
#undef NO_RSA
#define NO_RSA
#undef NO_DH
#define NO_DH
#undef NO_DSA
#define NO_DSA
#undef NO_ASN
#define NO_ASN
#undef NO_CERTS
#define NO_CERTS
#undef NO_PWDBASED
#define NO_PWDBASED
#undef NO_PKCS7
#define NO_PKCS7
#undef NO_PKCS12
#define NO_PKCS12
#undef NO_SIG_WRAPPER
#define NO_SIG_WRAPPER
#undef NO_AES
#define NO_AES
#undef NO_DES3
#define NO_DES3
#undef NO_RC4
#define NO_RC4
#undef NO_MD4
#define NO_MD4
#undef NO_MD5
#define NO_MD5
#undef NO_SHA /* SHA-1 */
#define NO_SHA
#undef NO_HMAC
#define NO_HMAC

#ifdef __cplusplus
}
#endif

#endif /* WOLFSSL_USER_SETTINGS_C2000_SHA2_H */
54 changes: 54 additions & 0 deletions embedded/ti-c2000-f28p55x/ccs/sha2/wolfssl_sha2.projectspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<projectSpec>
<project
name="wolfssl_sha2"
device="TMS320F28P550SJ9"
cgtVersion="22.6.3.LTS"
products="C2000WARE"
outputFormat="ELF"
launchWizard="False"
linkerCommandFile=""
enableSysConfigTool="false"
>

<!-- C2000WARE_ROOT comes from the C2000Ware product registered in CCS.
WOLFSSL_ROOT defaults to a wolfssl clone next to wolfssl-examples;
see ccs/README.md to change it. -->
<pathVariable name="C2000WARE_ROOT" path="${COM_TI_C2000WARE_INSTALL_DIR}" scope="project" />
<pathVariable name="C2000WARE_DLIB_ROOT" path="${COM_TI_C2000WARE_INSTALL_DIR}/driverlib/f28p55x/driverlib/" scope="project" />
<pathVariable name="WOLFSSL_ROOT" path="../../../../../wolfssl" scope="project" />

<configuration name="CPU1_LAUNCHXL_FLASH"
compilerBuildOptions="--opt_level=2 -I${PROJECT_ROOT} -I${PROJECT_ROOT}/device -I${C2000WARE_DLIB_ROOT} -I${WOLFSSL_ROOT} -I${CG_TOOL_ROOT}/include -v28 -ml -mt --float_support=fpu32 --tmu_support=tmu1 --abi=eabi --define=CPU1 --define=_FLASH --define=_LAUNCHXL_F28P55X --define=WOLFSSL_USER_SETTINGS --define=WOLF_C2000_SCI_STDOUT --gen_func_subsections=on --diag_warning=225 --diag_wrap=off --display_error_number --diag_suppress=10063"
linkerBuildOptions="--entry_point code_start --define=WOLF_SHA2_EXAMPLE --reread_libs --warn_sections -llibc.a" />

<configuration name="CPU1_LAUNCHXL_FLASH_DEBUG"
compilerBuildOptions="--opt_level=off -g -I${PROJECT_ROOT} -I${PROJECT_ROOT}/device -I${C2000WARE_DLIB_ROOT} -I${WOLFSSL_ROOT} -I${CG_TOOL_ROOT}/include -v28 -ml -mt --float_support=fpu32 --tmu_support=tmu1 --abi=eabi --define=CPU1 --define=_FLASH --define=_LAUNCHXL_F28P55X --define=WOLFSSL_USER_SETTINGS --define=WOLF_C2000_SCI_STDOUT --gen_func_subsections=on --diag_warning=225 --diag_wrap=off --display_error_number --diag_suppress=10063"
linkerBuildOptions="--entry_point code_start --define=WOLF_SHA2_EXAMPLE --reread_libs --warn_sections -llibc.a" />

<!-- Example application -->
<file action="copy" path="../../Source/test_sha2.c" targetDirectory="" />
<file action="copy" path="../../Source/c2000_board.c" targetDirectory="" />
<file action="copy" path="../../Header/c2000_board.h" targetDirectory="" />
<file action="copy" path="user_settings.h" targetDirectory="" />
<file action="copy" path="../../28p55x_wolf_flash_lnk.cmd" targetDirectory="" />

<!-- Device support from C2000Ware -->
<file action="copy" path="${C2000WARE_ROOT}/device_support/f28p55x/common/include/driverlib.h" targetDirectory="device" />
<file action="copy" path="${C2000WARE_ROOT}/device_support/f28p55x/common/include/device.h" targetDirectory="device" />
<file action="copy" path="${C2000WARE_ROOT}/device_support/f28p55x/common/source/device.c" targetDirectory="device" />
<file action="copy" path="${C2000WARE_ROOT}/device_support/f28p55x/common/source/f28p55x_codestartbranch.asm" targetDirectory="device" />
<file action="link" path="${COM_TI_C2000WARE_INSTALL_DIR}/driverlib/f28p55x/driverlib/ccs/Release/driverlib.lib" targetDirectory="device" />
<file action="copy" path="${COM_TI_C2000WARE_INSTALL_DIR}/device_support/f28p55x/common/targetConfigs/TMS320F28P550SJ9_LaunchPad.ccxml" targetDirectory="targetConfigs" />

<!-- wolfCrypt sources, linked from WOLFSSL_ROOT -->
<file action="link" path="WOLFSSL_ROOT/wolfcrypt/src/error.c" targetDirectory="wolfcrypt" />
<file action="link" path="WOLFSSL_ROOT/wolfcrypt/src/wc_port.c" targetDirectory="wolfcrypt" />
<file action="link" path="WOLFSSL_ROOT/wolfcrypt/src/memory.c" targetDirectory="wolfcrypt" />
<file action="link" path="WOLFSSL_ROOT/wolfcrypt/src/logging.c" targetDirectory="wolfcrypt" />
<file action="link" path="WOLFSSL_ROOT/wolfcrypt/src/misc.c" targetDirectory="wolfcrypt" />
<file action="link" path="WOLFSSL_ROOT/wolfcrypt/src/hash.c" targetDirectory="wolfcrypt" />
<file action="link" path="WOLFSSL_ROOT/wolfcrypt/src/sha256.c" targetDirectory="wolfcrypt" />
<file action="link" path="WOLFSSL_ROOT/wolfcrypt/src/sha512.c" targetDirectory="wolfcrypt" />

</project>
</projectSpec>
Loading
Loading