wolfTPM SPDM support (Nuvoton NPCT75x and NSING NS350)#458
wolfTPM SPDM support (Nuvoton NPCT75x and NSING NS350)#458aidangarske wants to merge 10 commits intowolfSSL:masterfrom
Conversation
b684e06 to
e56719c
Compare
- 18/18 emulator tests PASS (6 tests x 3 versions: 1.2, 1.3, 1.4) 1. Removed OpaqueDataLength(2) from CHALLENGE request for SPDM 1.3+ — spec says only RequesterContext(8), no OpaqueDataLength in request 2. Removed OpaqueDataLength(2) from signed GET_MEASUREMENTS request for SPDM 1.3+ — same issue - spdm/README.md: Added supported versions table (spdm-emu: 1.2/1.3/1.4, Nuvoton: 1.3), updated protocol flow diagram, added --ver flag to demo options, added wolfSPDM_SetMaxVersion() to API table, updated emulator section to mention 18-test multi-version coverage - Addressed PR review feedback
… lines)
Security fixes:
- Mandatory responder signature verification in KEY_EXCHANGE_RSP (was conditional skip)
- Sensitive stack buffer zeroing (wc_ForceZero) in BuildFinish, ParseKeyExchangeRsp,
wolfSPDM_Finish for keys, HMAC, and signature data
- TCG integer underflow guard in ParseTcgClearMessage (msgSize < header check)
- BuildIV: removed dead code duplicate branches, collapsed to single 8-byte XOR path
Code quality:
- Cascade error handling (rc == WOLFSPDM_SUCCESS pattern) across spdm_msg.c,
spdm_session.c, spdm_secured.c for single-cleanup-path safety
- wolfSPDM_BuildVendorDefined: added spdmVersion parameter (was hardcoded 0x13)
- spdm_error.h: added spdm_types.h include for standalone WOLFSPDM_API definition
- spdm.h: added stack usage documentation (~22KB context, ~20KB call chain)
Codebase reduction (-4,301 net lines):
- Condensed spdm_demo.c (382->256 lines), spdm_test.sh (143->70 lines)
- Removed verbose banner comments and redundant section headers across all files
- Consolidated unit tests with shared helpers, removed duplicate test patterns
- Removed spdm-emu-test.yml CI workflow (moved to standalone wolfSPDM repo)
- Streamlined README documentation
Test results:
- 26/26 unit tests PASS
- 6/6 Nuvoton hardware tests PASS (spdm_test.sh)
- Nations NS350 PSK mode: PSK_SET, PSK_CLEAR, PSK_EXCHANGE, PSK_FINISH,
GET_STATUS, SPDM_ONLY with 32-byte ClearAuth per TCG PC Client spec
- Salt_0 = 0xFF for PSK mode HKDF-Extract (vs 0x00 for identity key mode)
- NATIONS_PSK mode checks in spdm_secured.c encrypt/decrypt paths
- GET_STATUS response parsing fix (PSKSet byte was not being read)
- Demo cleanup order: TPM2_Shutdown before SPDM disconnect
- 32-byte ClearAuth enforcement on PSK_SET and PSK_CLEAR
- spdm_test.sh nations-psk: 12-step PSK lifecycle test with NSING reference data
- spdm/README.md: TCG commands section, Nations PSK docs, validation status
- Removed unused inline PSK_SET, SetPskSetPayload, ConnectNationsPskProvision
- SPDM 1.3+ OpaqueDataLength fix for CHALLENGE and GET_MEASUREMENTS requests
Tested: 10/10 Nations PSK tests PASS, 6/6 Nuvoton tests PASS
- Ct hash changed from SHA-384(X||Y) to SHA-384(TPMT_PUBLIC) for both
responder (KEY_EXCHANGE) and requester (FINISH mutual auth), matching
Vision's updated firmware and Nuvoton's implementation
- wolfSSL requires --enable-ecccustcurves=all for Nations (HAVE_ECC_CDH)
- spdm_test.sh: use run_test_no_reset for Nations (GPIO 4 not wired to
TPM_RST on NS350 daughter board, requires full power cycle)
- spdm_test.sh nations: full lifecycle (unset, set, connect, status, caps)
- spdm/README.md: separate wolfSSL build sections for Nuvoton vs Nations,
removed status columns from command tables, updated troubleshooting for
NS350 power cycle requirement
- CLAUDE.md: updated build instructions with correct minimal flags
Tested: 5/5 Nations identity key tests PASS, 12/12 Nations PSK tests PAS
a938208 to
30065f1
Compare
- Create spdm_tcg.c/spdm_tcg.h for shared TCG binding code (Nuvoton + Nations) - Consolidate duplicate VendorCmdClear/VendorCmdSecured helpers - Extract shared GetCapabilities/NegotiateAlgorithms functions - Rename Nuvoton_GetPubKey/GivePubKey to TCG_ prefix (with compat aliases) - Unify vendor constants (GET_STS_, SPDMONLY, lock/unlock) - Add overridable buffer size macros (WOLFSPDM_KEY_EX_TX_SZ, etc.) - Use ECC_MAX_SIG_SIZE from wolfCrypt for DER signature buffers - Add SPDM_VERSION_10 macro for GET_VERSION - Add HAVE_ECC/WOLFSSL_SHA384 compile-time checks - Add WOLFTPM_SPDM_PSK generic build option (replaces WOLFSPDM_NATIONS for PSK protocol code) - Fix spdm_test.sh caps exit code check (caps returns handle count, not 0) - Slim spdm_nuvoton.c to Nuvoton-only (112 lines), spdm_nations.c to Nations-only (294 lines) - 6/6 Nuvoton hardware tests pass
wolfSSL-Fenrir-bot
left a comment
There was a problem hiding this comment.
Fenrir Automated Review — PR #458
Scan targets checked: wolftpm-bugs, wolftpm-src
No new issues found in the changed files. ✅
The shared TCG SPDM source and header files were referenced by include.am/Makefile.in but not committed, causing CI build failures.
- Create spdm_psk.c with shared SPDM PSK protocol code (vendor-independent)
- wolfSPDM_SetPSK() moved from spdm_context.c
- wolfSPDM_BuildPskExchange/ParsePskExchangeRsp moved from spdm_msg.c
- wolfSPDM_BuildPskFinish/ParsePskFinishRsp moved from spdm_msg.c
- wolfSPDM_DeriveHandshakeKeysPsk() moved from spdm_kdf.c
- wolfSPDM_ConnectPsk() moved from spdm_nations.c (renamed from ConnectNationsPsk)
- Create spdm_psk.h with shared PSK declarations and backward-compat alias
- Make wolfSPDM_DeriveFromHandshakeSecret() non-static for cross-file use
- Vendor files now contain only vendor-specific commands:
- spdm_nations.c: GetStatus, SetOnlyMode, PskSet, PskClear, PskClearWithVCA
- spdm_nuvoton.c: GetStatus, SetOnlyMode
- 12/12 Nations PSK hardware tests pass
- Enables future Infineon PSK support without touching vendor-specific code
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 45 out of 46 changed files in this pull request and generated 1 comment.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| /* Initialize device */ | ||
| rc = wolfTPM2_Init(&dev, TPM2_IoCb, NULL); | ||
| if (rc != 0) { | ||
| printf("Failed (Init failed: 0x%x)\n", rc); | ||
| return; | ||
| } |
There was a problem hiding this comment.
This unit test returns early if wolfTPM2_Init() fails, which can silently skip the SPDM wrapper assertions and still print "Passed" later in the suite. Other unit tests in this file use Assert*() so failures are reported consistently. Consider converting this to AssertIntEQ(rc, 0) (or an explicit skip mechanism that increments the fail count) rather than returning.
wolfSSL-Fenrir-bot
left a comment
There was a problem hiding this comment.
Fenrir Automated Review — PR #458
Scan targets checked: wolftpm-bugs, wolftpm-src
No new issues found in the changed files. ✅
Description
Migrates the standalone wolfSPDM library into wolfTPM as an in-tree spdm/
subdirectory and adds full SPDM support for both Nuvoton NPCT75x and
Nations NS350 TPMs. Eliminates the external dependency a single
--enable-spdm configure flag builds everything.
wolfSPDM Library (spdm/)
GET_STS_, TPM2_CMD, PSK_SET_, PSK_CLR_)
GET_PUBK, KEY_EXCHANGE, GIVE_PUB, FINISH
PSK_EXCHANGE, PSK_FINISH
Nuvoton NPCT75x Support
Nations NS350 Support
PSK Mode
Identity Key Mode
wolfTPM Integration
automatically encrypted when SPDM session is active
SPDM Demo (examples/spdm/)
TCG SPDM Vendor Commands
Test Plan