Skip to content

Commit 018e15f

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 018e15f

File tree

6 files changed

+165
-19
lines changed

6 files changed

+165
-19
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: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8244,7 +8244,7 @@ static int tpm2_ifx_firmware_start(WOLFTPM2_DEV* dev, TPM_ALG_ID hashAlg,
82448244
}
82458245
if (rc == TPM_RC_SUCCESS) {
82468246
/* delay to give the TPM time to switch modes */
8247-
XSLEEP_MS(300);
8247+
tpm2_firmware_sleep_ms(300);
82488248
/* it is not required to release session handle,
82498249
* since TPM reset into firmware upgrade mode */
82508250

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

83608360
if (rc == TPM_RC_SUCCESS) {
83618361
/* Give the TPM time to start the new firmware */
8362-
XSLEEP_MS(300);
8362+
tpm2_firmware_sleep_ms(300);
83638363

83648364
#if !defined(WOLFTPM_LINUX_DEV) && !defined(WOLFTPM_SWTPM) && \
83658365
!defined(WOLFTPM_WINAPI)
@@ -8415,13 +8415,6 @@ static int tpm2_st33_firmware_upgrade_hash(WOLFTPM2_DEV* dev, TPM_ALG_ID hashAlg
84158415
static int tpm2_st33_firmware_cancel(WOLFTPM2_DEV* dev);
84168416
#endif
84178417

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-
84258418
int wolfTPM2_FirmwareUpgradeHash(WOLFTPM2_DEV* dev, TPM_ALG_ID hashAlg,
84268419
uint8_t* manifest_hash, uint32_t manifest_hash_sz,
84278420
uint8_t* manifest, uint32_t manifest_sz,
@@ -8521,6 +8514,15 @@ int wolfTPM2_FirmwareUpgradeHashWithLMS(WOLFTPM2_DEV* dev, TPM_ALG_ID hashAlg,
85218514
cb, cb_ctx,
85228515
lms_signature, lms_signature_sz);
85238516
}
8517+
#else
8518+
/* Suppress unused parameter warnings when ST33 is not enabled */
8519+
(void)hashAlg;
8520+
(void)manifest_hash;
8521+
(void)manifest_hash_sz;
8522+
(void)manifest;
8523+
(void)manifest_sz;
8524+
(void)cb;
8525+
(void)cb_ctx;
85248526
#endif
85258527

85268528
/* Unsupported manufacturer or LMS not supported */
@@ -8648,6 +8650,12 @@ int wolfTPM2_FirmwareUpgradeCancel(WOLFTPM2_DEV* dev)
86488650

86498651
/* ST33 uses password auth (TPM_RS_PW) for firmware update, not policy */
86508652

8653+
/* Helper function to avoid -Wpedantic warning from XSLEEP_MS statement expression */
8654+
static void tpm2_firmware_sleep_ms(uint32_t ms)
8655+
{
8656+
XSLEEP_MS(ms);
8657+
}
8658+
86518659
/* Start firmware upgrade (non-LMS): sends manifest (blob0=177 bytes)
86528660
* via FieldUpgradeStart */
86538661
static int tpm2_st33_firmware_start(WOLFTPM2_DEV* dev,
@@ -8663,7 +8671,7 @@ static int tpm2_st33_firmware_start(WOLFTPM2_DEV* dev,
86638671

86648672
if (rc == TPM_RC_SUCCESS) {
86658673
/* delay to give the TPM time to switch modes */
8666-
XSLEEP_MS(300);
8674+
tpm2_firmware_sleep_ms(300);
86678675

86688676
#if !defined(WOLFTPM_LINUX_DEV) && !defined(WOLFTPM_SWTPM) && \
86698677
!defined(WOLFTPM_WINAPI)
@@ -8695,7 +8703,7 @@ static int tpm2_st33_firmware_start_lms(WOLFTPM2_DEV* dev,
86958703

86968704
if (rc == TPM_RC_SUCCESS) {
86978705
/* delay to give the TPM time to switch modes */
8698-
XSLEEP_MS(300);
8706+
tpm2_firmware_sleep_ms(300);
86998707

87008708
#if !defined(WOLFTPM_LINUX_DEV) && !defined(WOLFTPM_SWTPM) && \
87018709
!defined(WOLFTPM_WINAPI)
@@ -8814,7 +8822,7 @@ static int tpm2_st33_firmware_data(WOLFTPM2_DEV* dev,
88148822

88158823
if (rc == TPM_RC_SUCCESS) {
88168824
/* Give the TPM time to process */
8817-
XSLEEP_MS(300);
8825+
tpm2_firmware_sleep_ms(300);
88188826

88198827
#if !defined(WOLFTPM_LINUX_DEV) && !defined(WOLFTPM_SWTPM) && \
88208828
!defined(WOLFTPM_WINAPI)

tests/unit_tests.c

Lines changed: 77 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,8 @@ 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_manifest[10] = {0};
230+
uint8_t dummy_sig[1] = {0};
229231

230232
/* Initialize TPM */
231233
rc = wolfTPM2_Init(&dev, TPM2_IoCb, NULL);
@@ -249,30 +251,98 @@ static void test_wolfTPM2_ST33_FirmwareUpgrade(void)
249251
#endif
250252
}
251253

252-
/* Test NULL parameter handling */
254+
/* ===== Test NULL dev parameter handling ===== */
255+
256+
/* wolfTPM2_FirmwareUpgradeCancel - NULL dev */
253257
rc = wolfTPM2_FirmwareUpgradeCancel(NULL);
254258
AssertIntNE(rc, 0);
255259

256-
rc = wolfTPM2_FirmwareUpgradeHash(NULL, TPM_ALG_SHA256, NULL, 0, NULL,
260+
/* wolfTPM2_FirmwareUpgradeHash - NULL dev */
261+
rc = wolfTPM2_FirmwareUpgradeHash(NULL, TPM_ALG_SHA384, NULL, 0, NULL,
257262
0, NULL, NULL);
258263
AssertIntNE(rc, 0);
259264

260-
rc = wolfTPM2_FirmwareUpgradeWithLMS(NULL, NULL, 0, NULL, NULL, NULL, 0);
265+
/* wolfTPM2_FirmwareUpgradeHashWithLMS - NULL dev */
266+
rc = wolfTPM2_FirmwareUpgradeHashWithLMS(NULL, TPM_ALG_SHA384, NULL, 0,
267+
NULL, 0, NULL, NULL, NULL, 0);
268+
AssertIntNE(rc, 0);
269+
270+
/* wolfTPM2_FirmwareUpgradeRecover - NULL dev */
271+
rc = wolfTPM2_FirmwareUpgradeRecover(NULL, NULL, 0, NULL, NULL);
261272
AssertIntNE(rc, 0);
262273

263274
#ifndef WOLFTPM2_NO_WOLFCRYPT
275+
/* wolfTPM2_FirmwareUpgrade - NULL dev */
264276
rc = wolfTPM2_FirmwareUpgrade(NULL, NULL, 0, NULL, NULL);
265277
AssertIntNE(rc, 0);
266278

267-
rc = wolfTPM2_FirmwareUpgradeRecover(NULL, NULL, 0, NULL, NULL);
279+
/* wolfTPM2_FirmwareUpgradeWithLMS - NULL dev */
280+
rc = wolfTPM2_FirmwareUpgradeWithLMS(NULL, NULL, 0, NULL, NULL, NULL, 0);
268281
AssertIntNE(rc, 0);
269-
#endif
282+
#endif /* !WOLFTPM2_NO_WOLFCRYPT */
283+
284+
/* ===== Test NULL/invalid parameter combinations ===== */
285+
286+
/* wolfTPM2_FirmwareUpgradeHash - valid dev, NULL manifest */
287+
rc = wolfTPM2_FirmwareUpgradeHash(&dev, TPM_ALG_SHA384, NULL, 0, NULL,
288+
0, NULL, NULL);
289+
AssertIntNE(rc, 0);
290+
291+
/* wolfTPM2_FirmwareUpgradeHashWithLMS - valid dev, NULL lms_signature */
292+
rc = wolfTPM2_FirmwareUpgradeHashWithLMS(&dev, TPM_ALG_SHA384, NULL, 0,
293+
NULL, 0, NULL, NULL, NULL, 0);
294+
AssertIntNE(rc, 0);
295+
296+
/* wolfTPM2_FirmwareUpgradeHashWithLMS - valid dev, zero-length lms_signature */
297+
rc = wolfTPM2_FirmwareUpgradeHashWithLMS(&dev, TPM_ALG_SHA384, NULL, 0,
298+
NULL, 0, NULL, NULL, dummy_sig, 0);
299+
AssertIntNE(rc, 0);
300+
301+
/* wolfTPM2_FirmwareUpgradeRecover - valid dev, NULL manifest */
302+
rc = wolfTPM2_FirmwareUpgradeRecover(&dev, NULL, 0, NULL, NULL);
303+
AssertIntNE(rc, 0);
304+
305+
/* wolfTPM2_FirmwareUpgradeCancel - valid dev (may succeed or fail
306+
* depending on TPM state) */
307+
rc = wolfTPM2_FirmwareUpgradeCancel(&dev);
308+
/* Note: This may return success or error depending on TPM state -
309+
* just verify it doesn't crash */
310+
(void)rc;
270311

312+
#ifndef WOLFTPM2_NO_WOLFCRYPT
313+
/* wolfTPM2_FirmwareUpgrade - valid dev, NULL manifest */
314+
rc = wolfTPM2_FirmwareUpgrade(&dev, NULL, 0, NULL, NULL);
315+
AssertIntNE(rc, 0);
316+
317+
/* wolfTPM2_FirmwareUpgrade - valid dev, NULL callback */
318+
rc = wolfTPM2_FirmwareUpgrade(&dev, dummy_manifest, sizeof(dummy_manifest),
319+
NULL, NULL);
320+
AssertIntNE(rc, 0);
321+
322+
/* wolfTPM2_FirmwareUpgradeWithLMS - valid dev, NULL lms_signature */
323+
rc = wolfTPM2_FirmwareUpgradeWithLMS(&dev, NULL, 0, NULL, NULL, NULL, 0);
324+
AssertIntNE(rc, 0);
325+
326+
/* wolfTPM2_FirmwareUpgradeWithLMS - valid dev, zero-length lms_signature */
327+
rc = wolfTPM2_FirmwareUpgradeWithLMS(&dev, NULL, 0, NULL, NULL,
328+
dummy_sig, 0);
329+
AssertIntNE(rc, 0);
330+
331+
/* Test ST33-specific path if we have an ST33 TPM */
271332
if (caps.mfg == TPM_MFG_STM) {
272-
rc = wolfTPM2_FirmwareUpgradeWithLMS(&dev, NULL, 0, NULL, NULL,
273-
NULL, 0);
333+
/* wolfTPM2_FirmwareUpgradeWithLMS - valid dev with dummy signature
334+
* but NULL manifest */
335+
rc = wolfTPM2_FirmwareUpgradeWithLMS(&dev, NULL, 0, NULL, NULL,
336+
dummy_sig, sizeof(dummy_sig));
337+
AssertIntNE(rc, 0);
338+
339+
/* wolfTPM2_FirmwareUpgradeWithLMS - valid dev with dummy signature
340+
* but NULL callback */
341+
rc = wolfTPM2_FirmwareUpgradeWithLMS(&dev, dummy_manifest,
342+
sizeof(dummy_manifest), NULL, NULL, dummy_sig, sizeof(dummy_sig));
274343
AssertIntNE(rc, 0);
275344
}
345+
#endif /* !WOLFTPM2_NO_WOLFCRYPT */
276346

277347
rc = 0;
278348

wolftpm/tpm2_types.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,35 @@ typedef int64_t INT64;
202202
#endif
203203
#endif
204204

205+
/* Fallback pragma macros when wolfSSL is not available */
206+
#ifndef PRAGMA_GCC_DIAG_PUSH
207+
#ifdef __clang__
208+
#define PRAGMA_GCC_DIAG_PUSH _Pragma("clang diagnostic push")
209+
#elif defined(__GNUC__)
210+
#define PRAGMA_GCC_DIAG_PUSH _Pragma("GCC diagnostic push")
211+
#else
212+
#define PRAGMA_GCC_DIAG_PUSH
213+
#endif
214+
#endif
215+
#ifndef PRAGMA_GCC
216+
#ifdef __clang__
217+
#define PRAGMA_GCC(str) _Pragma(str)
218+
#elif defined(__GNUC__)
219+
#define PRAGMA_GCC(str) _Pragma(str)
220+
#else
221+
#define PRAGMA_GCC(str)
222+
#endif
223+
#endif
224+
#ifndef PRAGMA_GCC_DIAG_POP
225+
#ifdef __clang__
226+
#define PRAGMA_GCC_DIAG_POP _Pragma("clang diagnostic pop")
227+
#elif defined(__GNUC__)
228+
#define PRAGMA_GCC_DIAG_POP _Pragma("GCC diagnostic pop")
229+
#else
230+
#define PRAGMA_GCC_DIAG_POP
231+
#endif
232+
#endif
233+
205234
#if !defined(WOLFTPM_CUSTOM_STDIO) && !defined(NO_FILESYSTEM)
206235
/* stdio, default case */
207236
#define XFILE FILE*

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)