Skip to content

Commit 1a7c490

Browse files
committed
Fix build for no-wolfcrypt and Infineon-only configs
- Gate wolfTPM2_FirmwareUpgrade and wolfTPM2_FirmwareUpgradeWithLMS declarations with WOLFTPM2_NO_WOLFCRYPT (they use wc_Sha384Hash) - Fix unit tests to only call wolfcrypt-dependent firmware functions when wolfcrypt is enabled - Add unused parameter suppressions in FirmwareUpgradeHashWithLMS when ST33 is not enabled (fixes -Werror for SLB9672/SLB9673 builds)
1 parent 81d9c75 commit 1a7c490

File tree

5 files changed

+180
-22
lines changed

5 files changed

+180
-22
lines changed

.github/workflows/cmake-build.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ jobs:
2222
options: "-DWOLFTPM_INTERFACE=SPI -DWOLFTPM_MODULE=st33"
2323
- name: "Module ST33 I2C"
2424
options: "-DWOLFTPM_INTERFACE=I2C -DWOLFTPM_MODULE=st33"
25+
# ST33 Firmware
26+
- name: "Module ST33 Firmware"
27+
options: "-DWOLFTPM_MODULE=st33 -DWOLFTPM_FIRMWARE=yes"
2528
# Other modules use SPI
2629
- name: "Module Microchip"
2730
options: "-DWOLFTPM_INTERFACE=SPI -DWOLFTPM_MODULE=microchip"

.github/workflows/make-test-swtpm.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ jobs:
6666
# STMicro ST33KTPM2
6767
- name: st33ktpm2
6868
wolftpm_config: --enable-st33
69+
# STMicro ST33KTPM2
70+
- name: st33ktpm2 firmware
71+
wolftpm_config: --enable-st33 --enable-firmware --enable-st
6972
# Microchip
7073
- name: microchip
7174
wolftpm_config: --enable-microchip

src/tpm2_wrap.c

Lines changed: 62 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,22 @@
3232
#include <wolftpm/tpm2_packet.h>
3333
#include <hal/tpm_io.h> /* for default IO callback */
3434

35+
/* Headers for firmware sleep function (needed for pedantic compliance) */
36+
#if (defined(WOLFTPM_SLB9672) || defined(WOLFTPM_SLB9673) || \
37+
defined(WOLFTPM_ST33) || defined(WOLFTPM_AUTODETECT))
38+
#if defined(WOLFTPM_ZEPHYR)
39+
#include <zephyr/kernel.h>
40+
#elif defined(WOLFSSL_ESPIDF)
41+
/* ESP-IDF headers included via tpm2_types.h */
42+
#elif defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L
43+
#include <time.h>
44+
#elif defined(WIN32)
45+
#include <windows.h>
46+
#elif !defined(FREERTOS)
47+
#include <unistd.h>
48+
#endif
49+
#endif
50+
3551
/* Local Functions */
3652
static int wolfTPM2_GetCapabilities_NoDev(WOLFTPM2_CAPS* cap);
3753
static void wolfTPM2_CopySymmetric(TPMT_SYM_DEF* out, const TPMT_SYM_DEF* in);
@@ -8163,14 +8179,43 @@ int wolfTPM2_SetIdentityAuth(WOLFTPM2_DEV* dev, WOLFTPM2_HANDLE* handle,
81638179
/******************************************************************************/
81648180

81658181

8166-
8167-
8168-
81698182
/******************************************************************************/
81708183
/* --- BEGIN Firmware Upgrade Support -- */
81718184
/******************************************************************************/
81728185

81738186
#ifdef WOLFTPM_FIRMWARE_UPGRADE
8187+
8188+
/* Helper function to avoid -Wpedantic warning from XSLEEP_MS statement expression.
8189+
* This function is shared by both Infineon and ST33 firmware update code.
8190+
* Uses platform-specific sleep functions directly to avoid statement expressions.
8191+
* Headers for these functions are already included via tpm2_types.h.
8192+
* Defined early so it's available to both Infineon and ST33 code. */
8193+
#if (defined(WOLFTPM_SLB9672) || defined(WOLFTPM_SLB9673) || \
8194+
defined(WOLFTPM_ST33) || defined(WOLFTPM_AUTODETECT))
8195+
static void tpm2_firmware_sleep_ms(uint32_t ms)
8196+
{
8197+
#if defined(WOLFTPM_ZEPHYR)
8198+
k_msleep(ms);
8199+
#elif defined(WOLFSSL_ESPIDF)
8200+
vTaskDelay(pdMS_TO_TICKS(ms));
8201+
#elif defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L
8202+
struct timespec ts;
8203+
ts.tv_sec = ms / 1000;
8204+
ts.tv_nsec = (ms % 1000) * 1000000;
8205+
nanosleep(&ts, NULL);
8206+
#elif defined(WIN32)
8207+
Sleep(ms);
8208+
#elif defined(FREERTOS)
8209+
vTaskDelay(ms);
8210+
#else
8211+
/* Default POSIX: use sleep/usleep (unistd.h included via tpm2_types.h) */
8212+
if (ms >= 1000)
8213+
sleep(ms / 1000);
8214+
usleep((ms % 1000) * 1000);
8215+
#endif
8216+
}
8217+
#endif /* WOLFTPM_SLB9672 || WOLFTPM_SLB9673 || WOLFTPM_ST33 || WOLFTPM_AUTODETECT */
8218+
81748219
#if defined(WOLFTPM_SLB9672) || defined(WOLFTPM_SLB9673)
81758220

81768221
/* Maximum size of firmware chunks */
@@ -8244,7 +8289,7 @@ static int tpm2_ifx_firmware_start(WOLFTPM2_DEV* dev, TPM_ALG_ID hashAlg,
82448289
}
82458290
if (rc == TPM_RC_SUCCESS) {
82468291
/* delay to give the TPM time to switch modes */
8247-
XSLEEP_MS(300);
8292+
tpm2_firmware_sleep_ms(300);
82488293
/* it is not required to release session handle,
82498294
* since TPM reset into firmware upgrade mode */
82508295

@@ -8359,7 +8404,7 @@ static int tpm2_ifx_firmware_data(WOLFTPM2_DEV* dev,
83598404

83608405
if (rc == TPM_RC_SUCCESS) {
83618406
/* Give the TPM time to start the new firmware */
8362-
XSLEEP_MS(300);
8407+
tpm2_firmware_sleep_ms(300);
83638408

83648409
#if !defined(WOLFTPM_LINUX_DEV) && !defined(WOLFTPM_SWTPM) && \
83658410
!defined(WOLFTPM_WINAPI)
@@ -8415,13 +8460,6 @@ static int tpm2_st33_firmware_upgrade_hash(WOLFTPM2_DEV* dev, TPM_ALG_ID hashAlg
84158460
static int tpm2_st33_firmware_cancel(WOLFTPM2_DEV* dev);
84168461
#endif
84178462

8418-
/* Forward declaration for LMS firmware upgrade hash function */
8419-
int wolfTPM2_FirmwareUpgradeHashWithLMS(WOLFTPM2_DEV* dev, TPM_ALG_ID hashAlg,
8420-
uint8_t* manifest_hash, uint32_t manifest_hash_sz,
8421-
uint8_t* manifest, uint32_t manifest_sz,
8422-
wolfTPM2FwDataCb cb, void* cb_ctx,
8423-
uint8_t* lms_signature, uint32_t lms_signature_sz);
8424-
84258463
int wolfTPM2_FirmwareUpgradeHash(WOLFTPM2_DEV* dev, TPM_ALG_ID hashAlg,
84268464
uint8_t* manifest_hash, uint32_t manifest_hash_sz,
84278465
uint8_t* manifest, uint32_t manifest_sz,
@@ -8521,6 +8559,15 @@ int wolfTPM2_FirmwareUpgradeHashWithLMS(WOLFTPM2_DEV* dev, TPM_ALG_ID hashAlg,
85218559
cb, cb_ctx,
85228560
lms_signature, lms_signature_sz);
85238561
}
8562+
#else
8563+
/* Suppress unused parameter warnings when ST33 is not enabled */
8564+
(void)hashAlg;
8565+
(void)manifest_hash;
8566+
(void)manifest_hash_sz;
8567+
(void)manifest;
8568+
(void)manifest_sz;
8569+
(void)cb;
8570+
(void)cb_ctx;
85248571
#endif
85258572

85268573
/* Unsupported manufacturer or LMS not supported */
@@ -8663,7 +8710,7 @@ static int tpm2_st33_firmware_start(WOLFTPM2_DEV* dev,
86638710

86648711
if (rc == TPM_RC_SUCCESS) {
86658712
/* delay to give the TPM time to switch modes */
8666-
XSLEEP_MS(300);
8713+
tpm2_firmware_sleep_ms(300);
86678714

86688715
#if !defined(WOLFTPM_LINUX_DEV) && !defined(WOLFTPM_SWTPM) && \
86698716
!defined(WOLFTPM_WINAPI)
@@ -8695,7 +8742,7 @@ static int tpm2_st33_firmware_start_lms(WOLFTPM2_DEV* dev,
86958742

86968743
if (rc == TPM_RC_SUCCESS) {
86978744
/* delay to give the TPM time to switch modes */
8698-
XSLEEP_MS(300);
8745+
tpm2_firmware_sleep_ms(300);
86998746

87008747
#if !defined(WOLFTPM_LINUX_DEV) && !defined(WOLFTPM_SWTPM) && \
87018748
!defined(WOLFTPM_WINAPI)
@@ -8814,7 +8861,7 @@ static int tpm2_st33_firmware_data(WOLFTPM2_DEV* dev,
88148861

88158862
if (rc == TPM_RC_SUCCESS) {
88168863
/* Give the TPM time to process */
8817-
XSLEEP_MS(300);
8864+
tpm2_firmware_sleep_ms(300);
88188865

88198866
#if !defined(WOLFTPM_LINUX_DEV) && !defined(WOLFTPM_SWTPM) && \
88208867
!defined(WOLFTPM_WINAPI)

tests/unit_tests.c

Lines changed: 79 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,10 @@ static void test_wolfTPM2_ST33_FirmwareUpgrade(void)
226226
WOLFTPM2_DEV dev;
227227
WOLFTPM2_CAPS caps;
228228
int lms_state = 0; /* 0=non-LMS (< 512), 1=LMS required (>= 512) */
229+
uint8_t dummy_sig[1] = {0};
230+
#ifndef WOLFTPM2_NO_WOLFCRYPT
231+
uint8_t dummy_manifest[10] = {0};
232+
#endif
229233

230234
/* Initialize TPM */
231235
rc = wolfTPM2_Init(&dev, TPM2_IoCb, NULL);
@@ -249,30 +253,98 @@ static void test_wolfTPM2_ST33_FirmwareUpgrade(void)
249253
#endif
250254
}
251255

252-
/* Test NULL parameter handling */
256+
/* ===== Test NULL dev parameter handling ===== */
257+
258+
/* wolfTPM2_FirmwareUpgradeCancel - NULL dev */
253259
rc = wolfTPM2_FirmwareUpgradeCancel(NULL);
254260
AssertIntNE(rc, 0);
255261

256-
rc = wolfTPM2_FirmwareUpgradeHash(NULL, TPM_ALG_SHA256, NULL, 0, NULL,
262+
/* wolfTPM2_FirmwareUpgradeHash - NULL dev */
263+
rc = wolfTPM2_FirmwareUpgradeHash(NULL, TPM_ALG_SHA384, NULL, 0, NULL,
257264
0, NULL, NULL);
258265
AssertIntNE(rc, 0);
259266

260-
rc = wolfTPM2_FirmwareUpgradeWithLMS(NULL, NULL, 0, NULL, NULL, NULL, 0);
267+
/* wolfTPM2_FirmwareUpgradeHashWithLMS - NULL dev */
268+
rc = wolfTPM2_FirmwareUpgradeHashWithLMS(NULL, TPM_ALG_SHA384, NULL, 0,
269+
NULL, 0, NULL, NULL, NULL, 0);
270+
AssertIntNE(rc, 0);
271+
272+
/* wolfTPM2_FirmwareUpgradeRecover - NULL dev */
273+
rc = wolfTPM2_FirmwareUpgradeRecover(NULL, NULL, 0, NULL, NULL);
261274
AssertIntNE(rc, 0);
262275

263276
#ifndef WOLFTPM2_NO_WOLFCRYPT
277+
/* wolfTPM2_FirmwareUpgrade - NULL dev */
264278
rc = wolfTPM2_FirmwareUpgrade(NULL, NULL, 0, NULL, NULL);
265279
AssertIntNE(rc, 0);
266280

267-
rc = wolfTPM2_FirmwareUpgradeRecover(NULL, NULL, 0, NULL, NULL);
281+
/* wolfTPM2_FirmwareUpgradeWithLMS - NULL dev */
282+
rc = wolfTPM2_FirmwareUpgradeWithLMS(NULL, NULL, 0, NULL, NULL, NULL, 0);
283+
AssertIntNE(rc, 0);
284+
#endif /* !WOLFTPM2_NO_WOLFCRYPT */
285+
286+
/* ===== Test NULL/invalid parameter combinations ===== */
287+
288+
/* wolfTPM2_FirmwareUpgradeHash - valid dev, NULL manifest */
289+
rc = wolfTPM2_FirmwareUpgradeHash(&dev, TPM_ALG_SHA384, NULL, 0, NULL,
290+
0, NULL, NULL);
291+
AssertIntNE(rc, 0);
292+
293+
/* wolfTPM2_FirmwareUpgradeHashWithLMS - valid dev, NULL lms_signature */
294+
rc = wolfTPM2_FirmwareUpgradeHashWithLMS(&dev, TPM_ALG_SHA384, NULL, 0,
295+
NULL, 0, NULL, NULL, NULL, 0);
268296
AssertIntNE(rc, 0);
269-
#endif
270297

298+
/* wolfTPM2_FirmwareUpgradeHashWithLMS - valid dev, zero-length lms_signature */
299+
rc = wolfTPM2_FirmwareUpgradeHashWithLMS(&dev, TPM_ALG_SHA384, NULL, 0,
300+
NULL, 0, NULL, NULL, dummy_sig, 0);
301+
AssertIntNE(rc, 0);
302+
303+
/* wolfTPM2_FirmwareUpgradeRecover - valid dev, NULL manifest */
304+
rc = wolfTPM2_FirmwareUpgradeRecover(&dev, NULL, 0, NULL, NULL);
305+
AssertIntNE(rc, 0);
306+
307+
/* wolfTPM2_FirmwareUpgradeCancel - valid dev (may succeed or fail
308+
* depending on TPM state) */
309+
rc = wolfTPM2_FirmwareUpgradeCancel(&dev);
310+
/* Note: This may return success or error depending on TPM state -
311+
* just verify it doesn't crash */
312+
(void)rc;
313+
314+
#ifndef WOLFTPM2_NO_WOLFCRYPT
315+
/* wolfTPM2_FirmwareUpgrade - valid dev, NULL manifest */
316+
rc = wolfTPM2_FirmwareUpgrade(&dev, NULL, 0, NULL, NULL);
317+
AssertIntNE(rc, 0);
318+
319+
/* wolfTPM2_FirmwareUpgrade - valid dev, NULL callback */
320+
rc = wolfTPM2_FirmwareUpgrade(&dev, dummy_manifest, sizeof(dummy_manifest),
321+
NULL, NULL);
322+
AssertIntNE(rc, 0);
323+
324+
/* wolfTPM2_FirmwareUpgradeWithLMS - valid dev, NULL lms_signature */
325+
rc = wolfTPM2_FirmwareUpgradeWithLMS(&dev, NULL, 0, NULL, NULL, NULL, 0);
326+
AssertIntNE(rc, 0);
327+
328+
/* wolfTPM2_FirmwareUpgradeWithLMS - valid dev, zero-length lms_signature */
329+
rc = wolfTPM2_FirmwareUpgradeWithLMS(&dev, NULL, 0, NULL, NULL,
330+
dummy_sig, 0);
331+
AssertIntNE(rc, 0);
332+
333+
/* Test ST33-specific path if we have an ST33 TPM */
271334
if (caps.mfg == TPM_MFG_STM) {
272-
rc = wolfTPM2_FirmwareUpgradeWithLMS(&dev, NULL, 0, NULL, NULL,
273-
NULL, 0);
335+
/* wolfTPM2_FirmwareUpgradeWithLMS - valid dev with dummy signature
336+
* but NULL manifest */
337+
rc = wolfTPM2_FirmwareUpgradeWithLMS(&dev, NULL, 0, NULL, NULL,
338+
dummy_sig, sizeof(dummy_sig));
339+
AssertIntNE(rc, 0);
340+
341+
/* wolfTPM2_FirmwareUpgradeWithLMS - valid dev with dummy signature
342+
* but NULL callback */
343+
rc = wolfTPM2_FirmwareUpgradeWithLMS(&dev, dummy_manifest,
344+
sizeof(dummy_manifest), NULL, NULL, dummy_sig, sizeof(dummy_sig));
274345
AssertIntNE(rc, 0);
275346
}
347+
#endif /* !WOLFTPM2_NO_WOLFCRYPT */
276348

277349
rc = 0;
278350

wolftpm/tpm2_wrap.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4154,6 +4154,38 @@ WOLFTPM_API int wolfTPM2_FirmwareUpgradeHash(WOLFTPM2_DEV* dev,
41544154
uint8_t* manifest, uint32_t manifest_sz,
41554155
wolfTPM2FwDataCb cb, void* cb_ctx);
41564156

4157+
/*!
4158+
\ingroup wolfTPM2_Wrappers
4159+
\brief Perform TPM firmware upgrade with pre-computed hash and LMS signature
4160+
\note For ST33KTPM devices with firmware version >= 512, LMS signature required
4161+
\note This function accepts pre-computed manifest hash (no wolfCrypt needed)
4162+
4163+
\return TPM_RC_SUCCESS: successful
4164+
\return TPM_RC_FAILURE: generic failure (check TPM IO and TPM return code)
4165+
\return BAD_FUNC_ARG: check the provided arguments
4166+
4167+
\param dev pointer to a TPM2_DEV struct
4168+
\param hashAlg hash algorithm used (TPM_ALG_SHA384 or TPM_ALG_SHA512)
4169+
\param manifest_hash pre-computed manifest hash
4170+
\param manifest_hash_sz size of manifest hash
4171+
\param manifest pointer to firmware manifest data
4172+
\param manifest_sz size of firmware manifest
4173+
\param cb callback function for firmware data access
4174+
\param cb_ctx context pointer passed to callback
4175+
\param lms_signature pointer to LMS signature data
4176+
\param lms_signature_sz size of LMS signature
4177+
4178+
\sa wolfTPM2_FirmwareUpgradeHash
4179+
\sa wolfTPM2_FirmwareUpgradeWithLMS
4180+
*/
4181+
WOLFTPM_API int wolfTPM2_FirmwareUpgradeHashWithLMS(WOLFTPM2_DEV* dev,
4182+
TPM_ALG_ID hashAlg,
4183+
uint8_t* manifest_hash, uint32_t manifest_hash_sz,
4184+
uint8_t* manifest, uint32_t manifest_sz,
4185+
wolfTPM2FwDataCb cb, void* cb_ctx,
4186+
uint8_t* lms_signature, uint32_t lms_signature_sz);
4187+
4188+
#ifndef WOLFTPM2_NO_WOLFCRYPT
41574189
/*!
41584190
\ingroup wolfTPM2_Wrappers
41594191
\brief Perform TPM firmware upgrade
@@ -4202,6 +4234,7 @@ WOLFTPM_API int wolfTPM2_FirmwareUpgradeWithLMS(WOLFTPM2_DEV* dev,
42024234
uint8_t* manifest, uint32_t manifest_sz,
42034235
wolfTPM2FwDataCb cb, void* cb_ctx,
42044236
uint8_t* lms_signature, uint32_t lms_signature_sz);
4237+
#endif /* !WOLFTPM2_NO_WOLFCRYPT */
42054238

42064239
/*!
42074240
\ingroup wolfTPM2_Wrappers

0 commit comments

Comments
 (0)