Skip to content

Commit 962ea44

Browse files
committed
fwTPM v185: Fix autodetect
1 parent aa8c072 commit 962ea44

3 files changed

Lines changed: 57 additions & 31 deletions

File tree

configure.ac

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -713,14 +713,24 @@ else
713713
if test "x$ENABLED_FWTPM" = "xyes" && \
714714
test "x$ENABLED_WOLFCRYPT" = "xyes"
715715
then
716-
AC_CHECK_HEADER([wolfssl/wolfcrypt/dilithium.h],
717-
[WOLFTPM_HAVE_DILITHIUM_H=yes],
718-
[WOLFTPM_HAVE_DILITHIUM_H=no])
719-
AC_CHECK_HEADER([wolfssl/wolfcrypt/mlkem.h],
720-
[WOLFTPM_HAVE_MLKEM_H=yes],
721-
[WOLFTPM_HAVE_MLKEM_H=no])
722-
if test "x$WOLFTPM_HAVE_DILITHIUM_H" = "xyes" && \
723-
test "x$WOLFTPM_HAVE_MLKEM_H" = "xyes"
716+
# Probe the actual symbols, not just the headers. wolfSSL ships
717+
# dilithium.h / mlkem.h even without the implementation compiled
718+
# (function decls are gated behind HAVE_DILITHIUM / HAVE_MLKEM
719+
# which only get defined via wolfssl/options.h after the right
720+
# --enable-* flags). Include options.h first so the gate is set
721+
# before the header decls are parsed.
722+
AC_CHECK_DECL([wc_dilithium_init],
723+
[WOLFTPM_HAVE_DILITHIUM_FN=yes],
724+
[WOLFTPM_HAVE_DILITHIUM_FN=no],
725+
[[#include <wolfssl/options.h>
726+
#include <wolfssl/wolfcrypt/dilithium.h>]])
727+
AC_CHECK_DECL([wc_MlKemKey_Init],
728+
[WOLFTPM_HAVE_MLKEM_FN=yes],
729+
[WOLFTPM_HAVE_MLKEM_FN=no],
730+
[[#include <wolfssl/options.h>
731+
#include <wolfssl/wolfcrypt/mlkem.h>]])
732+
if test "x$WOLFTPM_HAVE_DILITHIUM_FN" = "xyes" && \
733+
test "x$WOLFTPM_HAVE_MLKEM_FN" = "xyes"
724734
then
725735
AC_MSG_NOTICE([wolfCrypt ML-DSA + ML-KEM detected; auto-enabling --enable-v185 (use --disable-v185 or --disable-pqc to opt out)])
726736
ENABLED_V185=yes
@@ -734,13 +744,19 @@ fi
734744

735745
if test "x$ENABLED_V185" = "xyes"
736746
then
737-
# When the user opted in explicitly we have not probed yet; verify the
738-
# wolfSSL PQC headers are present so the build fails at configure time
739-
# rather than deep inside the compile with a cryptic error.
740-
AC_CHECK_HEADER([wolfssl/wolfcrypt/dilithium.h], [],
741-
[AC_MSG_ERROR([--enable-v185/--enable-pqc requires wolfSSL built with --enable-dilithium --enable-experimental])])
742-
AC_CHECK_HEADER([wolfssl/wolfcrypt/mlkem.h], [],
743-
[AC_MSG_ERROR([--enable-v185/--enable-pqc requires wolfSSL built with --enable-mlkem --enable-experimental])])
747+
# Explicit opt-in: re-probe so we fail at configure time (with a
748+
# clear hint about wolfSSL flags) rather than deep inside the compile
749+
# with a cryptic error. Header existence alone is not enough -- the
750+
# actual functions must be declared (gated by HAVE_DILITHIUM /
751+
# HAVE_MLKEM in wolfssl/options.h).
752+
AC_CHECK_DECL([wc_dilithium_init], [],
753+
[AC_MSG_ERROR([--enable-v185/--enable-pqc requires wolfSSL built with --enable-dilithium --enable-experimental])],
754+
[[#include <wolfssl/options.h>
755+
#include <wolfssl/wolfcrypt/dilithium.h>]])
756+
AC_CHECK_DECL([wc_MlKemKey_Init], [],
757+
[AC_MSG_ERROR([--enable-v185/--enable-pqc requires wolfSSL built with --enable-mlkem --enable-experimental])],
758+
[[#include <wolfssl/options.h>
759+
#include <wolfssl/wolfcrypt/mlkem.h>]])
744760
AM_CFLAGS="$AM_CFLAGS -DWOLFTPM_V185"
745761
fi
746762
AM_CONDITIONAL([BUILD_V185], [test "x$ENABLED_V185" = "xyes"])

tests/check_doc_constants.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,17 @@ fi
2222
# Pull every #define FWTPM_<UPPER>_<UPPER>... NUMERIC_LITERAL line.
2323
# Constants ending in MAX/SIZE/EST/SEED are the ones we care about; pure
2424
# enum-style symbols (FWTPM_NO_*, FWTPM_*_DECLARE_VAR) don't appear in docs.
25+
#
26+
# Exclude internal helpers that aren't user-tunable knobs:
27+
# FWTPM_MLDSA_<N>_* / FWTPM_MLKEM_<N>_* -- FIPS-spec-immutable
28+
# per-parameter-set sizes used as inputs to auto-shrink resolution.
29+
# *_RAW -- intermediate computation
30+
# steps for auto-shrink (FWTPM_MAX_PUB_BUF_RAW etc.).
2531
mapfile -t CONSTS < <(
2632
grep -E '^\s*#\s*define\s+FWTPM_[A-Z0-9_]*(MAX|SIZE|EST|SEED|BYTES|DIGEST)[A-Z0-9_]*\s' "$HEADER" \
2733
| awk '{print $2}' \
34+
| grep -vE '^FWTPM_(MLDSA|MLKEM)_[0-9]+_' \
35+
| grep -vE '_RAW$' \
2836
| sort -u
2937
)
3038

wolftpm/fwtpm/fwtpm.h

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -163,33 +163,35 @@
163163
* All macros remain ifndef-guarded for per-board overrides. See
164164
* docs/FWTPM.md "v1.85 Embedded RAM Impact" for resolved values per build.
165165
*/
166-
/* ML-KEM ciphertext / public-key sizes per FIPS 203 Sec.6.4 / Sec.7.4. wolfCrypt's
167-
* WC_ML_KEM_xxx_SIZE macros expand to non-preprocessor-evaluable expressions
168-
* (MLKEM_POLY_VEC_SZ() etc.), so we redefine the spec constants here for use
169-
* in compile-time #if comparisons below. Spec-immutable. */
166+
/* PQC per-parameter-set sizes (FIPS 203 / FIPS 204, spec-immutable). Defined
167+
* locally so size-resolution below works without including wolfCrypt PQC
168+
* headers (which may be absent on subset builds). */
169+
#define FWTPM_MLDSA_44_PUB_SIZE 1312
170+
#define FWTPM_MLDSA_44_SIG_SIZE 2420
171+
#define FWTPM_MLDSA_65_PUB_SIZE 1952
172+
#define FWTPM_MLDSA_65_SIG_SIZE 3309
173+
#define FWTPM_MLDSA_87_PUB_SIZE 2592
174+
#define FWTPM_MLDSA_87_SIG_SIZE 4627
170175
#define FWTPM_MLKEM_512_CT_SIZE 768
171176
#define FWTPM_MLKEM_512_PUB_SIZE 800
172177
#define FWTPM_MLKEM_768_CT_SIZE 1088
173178
#define FWTPM_MLKEM_768_PUB_SIZE 1184
174179
#define FWTPM_MLKEM_1024_CT_SIZE 1568
175180
#define FWTPM_MLKEM_1024_PUB_SIZE 1568
176181

177-
/* Resolve the largest ML-DSA / ML-KEM parameter set actually enabled in
178-
* wolfCrypt, so PQC buffer defaults auto-shrink for deployments that only
179-
* enable smaller params. Per-param-set sizes use wolfCrypt's own
180-
* DILITHIUM_LEVEL{2,3,5}_*_SIZE macros (plain integer constants) and
181-
* the FWTPM_MLKEM_*_SIZE constants above. */
182+
/* Resolve the largest enabled parameter set for buffer sizing. Driven by
183+
* wolfCrypt's WOLFSSL_NO_ML_DSA_44/65/87 and WOLFSSL_NO_KYBER512/768/1024
184+
* gates so subset builds (e.g. MLDSA-44 only) don't pay for MLDSA-87. */
182185
#if defined(WOLFTPM_V185) && !defined(WOLFTPM2_NO_WOLFCRYPT)
183-
#include <wolfssl/wolfcrypt/dilithium.h>
184186
#if !defined(WOLFSSL_NO_ML_DSA_87)
185-
#define FWTPM_MAX_MLDSA_SIG_SIZE DILITHIUM_LEVEL5_SIG_SIZE
186-
#define FWTPM_MAX_MLDSA_PUB_SIZE DILITHIUM_LEVEL5_PUB_KEY_SIZE
187+
#define FWTPM_MAX_MLDSA_SIG_SIZE FWTPM_MLDSA_87_SIG_SIZE
188+
#define FWTPM_MAX_MLDSA_PUB_SIZE FWTPM_MLDSA_87_PUB_SIZE
187189
#elif !defined(WOLFSSL_NO_ML_DSA_65)
188-
#define FWTPM_MAX_MLDSA_SIG_SIZE DILITHIUM_LEVEL3_SIG_SIZE
189-
#define FWTPM_MAX_MLDSA_PUB_SIZE DILITHIUM_LEVEL3_PUB_KEY_SIZE
190+
#define FWTPM_MAX_MLDSA_SIG_SIZE FWTPM_MLDSA_65_SIG_SIZE
191+
#define FWTPM_MAX_MLDSA_PUB_SIZE FWTPM_MLDSA_65_PUB_SIZE
190192
#elif !defined(WOLFSSL_NO_ML_DSA_44)
191-
#define FWTPM_MAX_MLDSA_SIG_SIZE DILITHIUM_LEVEL2_SIG_SIZE
192-
#define FWTPM_MAX_MLDSA_PUB_SIZE DILITHIUM_LEVEL2_PUB_KEY_SIZE
193+
#define FWTPM_MAX_MLDSA_SIG_SIZE FWTPM_MLDSA_44_SIG_SIZE
194+
#define FWTPM_MAX_MLDSA_PUB_SIZE FWTPM_MLDSA_44_PUB_SIZE
193195
#else
194196
#define FWTPM_MAX_MLDSA_SIG_SIZE 0
195197
#define FWTPM_MAX_MLDSA_PUB_SIZE 0

0 commit comments

Comments
 (0)