Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
8 changes: 4 additions & 4 deletions docs/ja/post-quantum.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ fwTPM サーバーの PQC 内部 (8 つの v1.85 コマンド、プライマリ
| `--flush` | 操作の合間に、ロード済みのすべてのトランジェントオブジェクトをフラッシュ |
| `--clear` | `TPM2_Clear`。新しい Storage プライマリシードをインストールし、Storage オブジェクトと Endorsement オブジェクトおよび非プラットフォームの NV を削除し、オーナー、エンドースメント、ロックアウトの auth をリセットします |
| `--mldsa[=44/65/87]` | Pure ML-DSA の署名/検証 (デフォルトは 65) |
| `--hash-mldsa[=44/65/87]` | HashML-DSA (SHA-256 プリハッシュ) の署名/検証 |
| `--hash-mldsa[=44/65/87]` | HashML-DSA の署名/検証 (44/65/87 で SHA-256/384/512 プリハッシュ) |
| `--mlkem[=512/768/1024]` | ML-KEM のカプセル化/デカプセル化 |
| `--all` | caps + algs + selftest + getrandom + pcrread + すべての PQC セット |

Expand All @@ -155,7 +155,7 @@ PQC_CTRL_CLEAR=1 ./examples/pqc/pqc_ctrl.sh # also extend PCR 16 and run TPM2_
mssim ソケット経由のエンドツーエンドのクライアントテストです。次の 4 つのチェックを順に実行します。

1. ML-KEM-768 の `CreatePrimary`、`Encapsulate`、`Decapsulate`。暗号文が 1088 バイトであること、および 2 つの共有秘密がバイト単位で一致することを検証します。
2. HashML-DSA-65 (SHA-256) の `CreatePrimary`、`SignDigest`、`VerifyDigestSignature`。署名が 3309 バイトであること、および検証チケットのタグが `TPM_ST_DIGEST_VERIFIED` であることを検証します。
2. HashML-DSA-44 (SHA-256) の `CreatePrimary`、`SignDigest`、`VerifyDigestSignature`。署名が 2420 バイトであること、および検証チケットのタグが `TPM_ST_DIGEST_VERIFIED` であることを検証します。
3. ML-KEM の `MakeCredential` と `ActivateCredential` のラウンドトリップ。
4. ML-DSA の `Quote`。

Expand Down Expand Up @@ -189,14 +189,14 @@ Pure ML-DSA の署名と検証のラウンドトリップです。ML-DSA のプ

```sh
./examples/keygen/keygen keyblob.bin -mldsa=65 # Pure ML-DSA
./examples/keygen/keygen keyblob.bin -hash_mldsa=65 # SHA-256 pre-hash
./examples/keygen/keygen keyblob.bin -hash_mldsa=65 # SHA-384 pre-hash
./examples/keygen/keygen keyblob.bin -mlkem=768 # ML-KEM
```

パラメータセット:

- `-mldsa=44|65|87` (デフォルトは 65)
- `-hash_mldsa=44|65|87` (デフォルトは 65、SHA-256 プリハッシュ)
- `-hash_mldsa=44|65|87` (デフォルトは 65、44/65/87 で SHA-256/384/512 プリハッシュ)
- `-mlkem=512|768|1024` (デフォルトは 768)

生成されたブロブが `TPM2_Create` と `TPM2_Load` を経由してラウンドトリップできることは、読み込み直すことで確認できます。
Expand Down
8 changes: 4 additions & 4 deletions docs/post-quantum.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ For the fwTPM server's PQC internals (the eight v1.85 commands, primary-key deri
| `--flush` | Flush all loaded transient objects between operations |
| `--clear` | `TPM2_Clear`: installs a new Storage primary seed, deletes Storage and Endorsement objects and non-platform NV, and resets owner, endorsement, and lockout auth |
| `--mldsa[=44/65/87]` | Pure ML-DSA sign/verify (default 65) |
| `--hash-mldsa[=44/65/87]` | HashML-DSA (SHA-256 pre-hash) sign/verify |
| `--hash-mldsa[=44/65/87]` | HashML-DSA sign/verify (SHA-256/384/512 pre-hash for 44/65/87) |
| `--mlkem[=512/768/1024]` | ML-KEM encapsulate/decapsulate |
| `--all` | caps + algs + selftest + getrandom + pcrread + every PQC set |

Expand All @@ -155,7 +155,7 @@ PQC_CTRL_CLEAR=1 ./examples/pqc/pqc_ctrl.sh # also extend PCR 16 and run TPM2_
End-to-end client test over the mssim socket. It runs four checks in sequence:

1. ML-KEM-768 `CreatePrimary`, `Encapsulate`, and `Decapsulate`. It asserts the ciphertext is 1088 bytes and the two shared secrets are byte-identical.
2. HashML-DSA-65 (SHA-256) `CreatePrimary`, `SignDigest`, and `VerifyDigestSignature`. It asserts the signature is 3309 bytes and the validation ticket tag is `TPM_ST_DIGEST_VERIFIED`.
2. HashML-DSA-44 (SHA-256) `CreatePrimary`, `SignDigest`, and `VerifyDigestSignature`. It asserts the signature is 2420 bytes and the validation ticket tag is `TPM_ST_DIGEST_VERIFIED`.
3. An ML-KEM `MakeCredential` and `ActivateCredential` round-trip.
4. An ML-DSA `Quote`.

Expand Down Expand Up @@ -189,14 +189,14 @@ Pure ML-DSA sign and verify round-trip. It creates a primary ML-DSA key and sign

```sh
./examples/keygen/keygen keyblob.bin -mldsa=65 # Pure ML-DSA
./examples/keygen/keygen keyblob.bin -hash_mldsa=65 # SHA-256 pre-hash
./examples/keygen/keygen keyblob.bin -hash_mldsa=65 # SHA-384 pre-hash
./examples/keygen/keygen keyblob.bin -mlkem=768 # ML-KEM
```

Parameter sets:

- `-mldsa=44|65|87` (default 65)
- `-hash_mldsa=44|65|87` (default 65, SHA-256 pre-hash)
- `-hash_mldsa=44|65|87` (default 65; SHA-256/384/512 pre-hash for 44/65/87)
- `-mlkem=512|768|1024` (default 768)

Verify that the produced blob round-trips through `TPM2_Create` and `TPM2_Load` by loading it back:
Expand Down
30 changes: 25 additions & 5 deletions examples/keygen/keygen.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@
#ifndef WOLFTPM2_NO_WRAPPER

#include <examples/keygen/keygen.h>

/* autoconf SKIP status: the TPM lacks the required Hash-ML-DSA pre-hash */
#define KEYGEN_RC_SKIP 77
#include <hal/tpm_io.h>
#include <examples/tpm_test.h>
#include <examples/tpm_test_keys.h>
Expand Down Expand Up @@ -80,7 +83,7 @@ static void usage(void)
#endif
#ifdef WOLFTPM_HASH_MLDSA
printf("* -hash_mldsa[=44|65|87]: Use Hash-ML-DSA for signing "
"(v1.85, default 65 with SHA-256 pre-hash)\n");
"(v1.85, default 65; SHA-256/384/512 pre-hash for 44/65/87)\n");
#endif
#ifdef WOLFTPM_MLKEM
printf("* -mlkem[=512|768|1024]: Use ML-KEM for key encapsulation "
Expand Down Expand Up @@ -119,7 +122,7 @@ static void usage(void)
printf("\t\t keygen -mldsa\n");
#endif
#ifdef WOLFTPM_HASH_MLDSA
printf("\t* Hash-ML-DSA-87 with SHA-256 pre-hash\n");
printf("\t* Hash-ML-DSA-87 with SHA-512 pre-hash\n");
printf("\t\t keygen -hash_mldsa=87\n");
#endif
#ifdef WOLFTPM_MLKEM
Expand Down Expand Up @@ -202,6 +205,9 @@ int TPM2_Keygen_Example(void* userCtx, int argc, char *argv[])
#ifdef WOLFTPM_MLDSA
TPMI_MLDSA_PARAMETER_SET mldsaPs = TPM_MLDSA_65; /* default */
#endif
#ifdef WOLFTPM_HASH_MLDSA
TPMI_ALG_HASH mldsaPreHash = TPM_ALG_SHA256;
#endif
#ifdef WOLFTPM_MLKEM
TPMI_MLKEM_PARAMETER_SET mlkemPs = TPM_MLKEM_768; /* default */
#endif
Expand Down Expand Up @@ -534,13 +540,18 @@ int TPM2_Keygen_Example(void* userCtx, int argc, char *argv[])
#endif /* WOLFTPM_MLDSA */
#ifdef WOLFTPM_HASH_MLDSA
else if (alg == TPM_ALG_HASH_MLDSA) {
/* FIPS 204 Sec.5.4: pre-hash must match the set's strength */
if (mldsaPs == TPM_MLDSA_87)
mldsaPreHash = TPM_ALG_SHA512;
else if (mldsaPs == TPM_MLDSA_65)
mldsaPreHash = TPM_ALG_SHA384;
printf("Hash-ML-DSA template (parameter set %u, pre-hash %s)\n",
(unsigned)mldsaPs, TPM2_GetAlgName(TPM_ALG_SHA256));
(unsigned)mldsaPs, TPM2_GetAlgName(mldsaPreHash));
rc = wolfTPM2_GetKeyTemplate_HASH_MLDSA(&publicTemplate,
TPMA_OBJECT_sign | TPMA_OBJECT_fixedTPM |
TPMA_OBJECT_fixedParent | TPMA_OBJECT_sensitiveDataOrigin |
TPMA_OBJECT_userWithAuth | TPMA_OBJECT_noDA,
mldsaPs, TPM_ALG_SHA256);
mldsaPs, mldsaPreHash);
}
#endif /* WOLFTPM_HASH_MLDSA */
#ifdef WOLFTPM_MLKEM
Expand Down Expand Up @@ -582,6 +593,15 @@ int TPM2_Keygen_Example(void* userCtx, int argc, char *argv[])

rc = wolfTPM2_CreateKey(&dev, &newKeyBlob, &primary->handle,
&publicTemplate, auth.buffer, auth.size);
#ifdef WOLFTPM_HASH_MLDSA
if (alg == TPM_ALG_HASH_MLDSA && rc > 0 &&
(rc & (RC_FMT1 | 0x3F)) == TPM_RC_HASH) {
printf("Skipping: %s pre-hash not supported by this TPM\n",
TPM2_GetAlgName(mldsaPreHash));
rc = KEYGEN_RC_SKIP;
goto exit;
}
#endif
if (rc != TPM_RC_SUCCESS) {
printf("wolfTPM2_CreateKey failed\n");
goto exit;
Expand Down Expand Up @@ -673,7 +693,7 @@ int TPM2_Keygen_Example(void* userCtx, int argc, char *argv[])

exit:

if (rc != 0) {
if (rc != 0 && rc != KEYGEN_RC_SKIP) {
printf("\nFailure 0x%x: %s\n\n", rc, wolfTPM2_GetRCString(rc));
}

Expand Down
10 changes: 5 additions & 5 deletions examples/pqc/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ hit `TPM_RC_OBJECT_MEMORY` when commands are chained.
| `--flush` | Flush transient objects (board reset between ops) |
| `--clear` | `TPM2_Clear` — wipes the owner hierarchy |
| `--mldsa[=44/65/87]` | Pure ML-DSA sign/verify (default 65) |
| `--hash-mldsa[=44/65/87]` | Hash-ML-DSA (SHA-256 pre-hash) sign/verify |
| `--hash-mldsa[=44/65/87]` | Hash-ML-DSA sign/verify (SHA-256/384/512 pre-hash for 44/65/87) |
| `--mlkem[=512/768/1024]` | ML-KEM encapsulate/decapsulate |
| `--all` | caps + algs + selftest + getrandom + pcrread + every PQC set |

Expand Down Expand Up @@ -167,8 +167,8 @@ End-to-end client test over the mssim socket. Two round-trips:

1. MLKEM-768 `CreatePrimary` + `Encapsulate` + `Decapsulate`. Asserts
ciphertext is 1088 bytes and the two shared secrets are byte-identical.
2. HashMLDSA-65 (SHA-256) `CreatePrimary` + `SignDigest` +
`VerifyDigestSignature`. Asserts the signature is 3309 bytes and the
2. HashMLDSA-44 (SHA-256) `CreatePrimary` + `SignDigest` +
`VerifyDigestSignature`. Asserts the signature is 2420 bytes and the
validation ticket tag is `TPM_ST_DIGEST_VERIFIED`.

```
Expand Down Expand Up @@ -210,13 +210,13 @@ on verify sequences). Asserts the returned validation ticket tag is

```
./examples/keygen/keygen keyblob.bin -mldsa=65 # Pure ML-DSA
./examples/keygen/keygen keyblob.bin -hash_mldsa=65 # SHA-256 pre-hash
./examples/keygen/keygen keyblob.bin -hash_mldsa=65 # SHA-384 pre-hash
./examples/keygen/keygen keyblob.bin -mlkem=768 # ML-KEM
```

Parameter sets:
- `-mldsa=44|65|87` (default 65)
- `-hash_mldsa=44|65|87` (default 65, SHA-256 pre-hash)
- `-hash_mldsa=44|65|87` (default 65; SHA-256/384/512 pre-hash for 44/65/87)
- `-mlkem=512|768|1024` (default 768)

Verify the produced blob round-trips through `TPM2_Create` + `TPM2_Load`
Expand Down
24 changes: 19 additions & 5 deletions examples/pqc/pqc_ctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ static void usage(void)
printf("* --flush Flush transient objects (board reset)\n");
printf("* --clear TPM2_Clear (wipes owner hierarchy!)\n");
printf("* --mldsa[=44|65|87] Pure ML-DSA sign/verify (default 65)\n");
printf("* --hash-mldsa[=44|65|87] Hash-ML-DSA (SHA-256) sign/verify\n");
printf("* --hash-mldsa[=44|65|87] Hash-ML-DSA sign/verify\n");
printf("* --mlkem[=512|768|1024] ML-KEM encapsulate/decapsulate\n");
printf("* --all caps + every parameter set of each op\n");
}
Expand Down Expand Up @@ -475,7 +475,9 @@ static int do_hash_mldsa(WOLFTPM2_DEV* dev, TPMI_MLDSA_PARAMETER_SET ps)
WOLFTPM2_KEY key;
TPMT_PUBLIC tpl;
TPMT_TK_VERIFIED validation;
byte digest[TPM_SHA256_DIGEST_SIZE];
byte digest[TPM_SHA512_DIGEST_SIZE];
int digestSz;
TPMI_ALG_HASH preHash = TPM_ALG_SHA256;
byte* sig = NULL;
int sigSz = MAX_MLDSA_SIG_SIZE;

Expand All @@ -484,6 +486,13 @@ static int do_hash_mldsa(WOLFTPM2_DEV* dev, TPMI_MLDSA_PARAMETER_SET ps)
XMEMSET(&validation, 0, sizeof(validation));
XMEMSET(digest, 0xAA, sizeof(digest));

/* FIPS 204 Sec.5.4: pre-hash must match the set's strength */
if (ps == TPM_MLDSA_87)
preHash = TPM_ALG_SHA512;
else if (ps == TPM_MLDSA_65)
preHash = TPM_ALG_SHA384;
digestSz = TPM2_GetHashDigestSize(preHash);

(void)pqc_flush_transient(dev);

sig = (byte*)XMALLOC(MAX_MLDSA_SIG_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER);
Expand All @@ -493,17 +502,22 @@ static int do_hash_mldsa(WOLFTPM2_DEV* dev, TPMI_MLDSA_PARAMETER_SET ps)
rc = wolfTPM2_GetKeyTemplate_HASH_MLDSA(&tpl,
TPMA_OBJECT_sign | TPMA_OBJECT_fixedTPM | TPMA_OBJECT_fixedParent |
TPMA_OBJECT_sensitiveDataOrigin | TPMA_OBJECT_userWithAuth |
TPMA_OBJECT_noDA, ps, TPM_ALG_SHA256);
TPMA_OBJECT_noDA, ps, preHash);
if (rc != TPM_RC_SUCCESS) goto exit;

rc = wolfTPM2_CreatePrimaryKey(dev, &key, TPM_RH_OWNER, &tpl, NULL, 0);
if (rc > 0 && (rc & (RC_FMT1 | 0x3F)) == TPM_RC_HASH) {
printf("FAIL HashML-DSA-%-3s %s pre-hash not supported by this "
"TPM\n", mldsaName(ps), TPM2_GetAlgName(preHash));
goto exit_quiet;
}
if (rc != TPM_RC_SUCCESS) goto exit;

rc = wolfTPM2_SignDigest(dev, &key, digest, (int)sizeof(digest),
rc = wolfTPM2_SignDigest(dev, &key, digest, digestSz,
NULL, 0, sig, &sigSz);
if (rc != TPM_RC_SUCCESS) goto exit;

rc = wolfTPM2_VerifyDigestSignature(dev, &key, digest, (int)sizeof(digest),
rc = wolfTPM2_VerifyDigestSignature(dev, &key, digest, digestSz,
sig, sigSz, NULL, 0, &validation);
if (rc == BUFFER_E) {
/* Too large for this TPM to accept back for on-TPM verification.
Expand Down
2 changes: 1 addition & 1 deletion examples/pqc/pqc_ctrl.sh
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ for PS in 44 65 87; do
run_test "ML-DSA-$PS sign/verify" "ML-DSA-$PS" "$PQC_CTRL" --mldsa=$PS
done

# Hash-ML-DSA (SHA-256 pre-hash) — every parameter set
# Hash-ML-DSA (SHA-256/384/512 pre-hash for 44/65/87) — every parameter set
for PS in 44 65 87; do
run_test "Hash-ML-DSA-$PS sign/verify" "HashML-DSA-$PS" \
"$PQC_CTRL" --hash-mldsa=$PS
Expand Down
18 changes: 9 additions & 9 deletions examples/pqc/pqc_mssim_e2e.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
* Two round-trips in one binary:
* 1. CreatePrimary MLKEM-768 + Encapsulate + Decapsulate.
* Asserts ciphertext is 1088 bytes and the two shared secrets match.
* 2. CreatePrimary HashMLDSA-65 (SHA-256) + SignDigest + VerifyDigestSignature.
* Asserts the signature is 3309 bytes and the validation ticket
* 2. CreatePrimary HashMLDSA-44 (SHA-256) + SignDigest + VerifyDigestSignature.
* Asserts the signature is 2420 bytes and the validation ticket
* returns TPM_ST_DIGEST_VERIFIED.
*
* Proves client marshaling + mssim framing + fwtpm_server unmarshaling +
Expand Down Expand Up @@ -140,7 +140,7 @@ static int test_hash_mldsa_digest_roundtrip(WOLFTPM2_DEV* dev)
WOLFTPM2_KEY mldsa;
TPMT_PUBLIC tpl;
int rc;
byte digest[32];
byte digest[TPM_SHA256_DIGEST_SIZE];
/* MLDSA-87 sig = 4627 bytes — heap-alloc to keep stack small. */
byte* sig = NULL;
int sigBufSz = MAX_MLDSA_SIG_SIZE;
Expand All @@ -158,7 +158,7 @@ static int test_hash_mldsa_digest_roundtrip(WOLFTPM2_DEV* dev)
rc = wolfTPM2_GetKeyTemplate_HASH_MLDSA(&tpl,
TPMA_OBJECT_sign | TPMA_OBJECT_fixedTPM | TPMA_OBJECT_fixedParent |
TPMA_OBJECT_sensitiveDataOrigin | TPMA_OBJECT_userWithAuth,
TPM_MLDSA_65, TPM_ALG_SHA256);
TPM_MLDSA_44, TPM_ALG_SHA256);
if (rc != 0) {
printf("GetKeyTemplate_HASH_MLDSA rc=%d\n", rc);
XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
Expand All @@ -167,15 +167,15 @@ static int test_hash_mldsa_digest_roundtrip(WOLFTPM2_DEV* dev)

rc = wolfTPM2_CreatePrimaryKey(dev, &mldsa, TPM_RH_OWNER, &tpl, NULL, 0);
if (rc != 0) {
printf("CreatePrimary(HashMLDSA-65) rc=%d\n", rc);
printf("CreatePrimary(HashMLDSA-44) rc=%d\n", rc);
XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
return rc;
}

/* HashMLDSA shares the mldsa arm of TPMU_PUBLIC_ID. */
rc = check_pub_populated("mldsa.unique",
mldsa.pub.publicArea.unique.mldsa.buffer,
mldsa.pub.publicArea.unique.mldsa.size, 1952);
mldsa.pub.publicArea.unique.mldsa.size, 1312);
if (rc != 0) goto cleanup;

rc = wolfTPM2_SignDigest(dev, &mldsa,
Expand All @@ -186,8 +186,8 @@ static int test_hash_mldsa_digest_roundtrip(WOLFTPM2_DEV* dev)
printf("SignDigest rc=%d\n", rc);
goto cleanup;
}
if (sigSz != 3309) {
printf("HashMLDSA-65 sig size=%d (expected 3309)\n", sigSz);
if (sigSz != 2420) {
printf("HashMLDSA-44 sig size=%d (expected 2420)\n", sigSz);
rc = -1;
goto cleanup;
}
Expand All @@ -209,7 +209,7 @@ static int test_hash_mldsa_digest_roundtrip(WOLFTPM2_DEV* dev)
goto cleanup;
}

printf("[E2E] HashMLDSA-65 SignDigest/Verify over mssim: "
printf("[E2E] HashMLDSA-44 SignDigest/Verify over mssim: "
"sig=%d bytes, ticket=DIGEST_VERIFIED\n", sigSz);

cleanup:
Expand Down
2 changes: 2 additions & 0 deletions examples/run_examples.sh
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,8 @@ if [ $ENABLE_V185 -eq 1 ]; then

./examples/keygen/keygen pqcblob.bin -hash_mldsa=$PS >> $TPMPWD/run.out 2>&1
RESULT=$?
# 77: the TPM lacks the pre-hash this parameter set needs
[ $RESULT -eq 77 ] && echo -e "keygen hash_mldsa=$PS skipped" && continue
[ $RESULT -ne 0 ] && echo -e "keygen hash_mldsa=$PS failed! $RESULT" && exit 1
run_keyload pqcblob.bin >> $TPMPWD/run.out 2>&1
RESULT=$?
Expand Down
15 changes: 11 additions & 4 deletions src/fwtpm/fwtpm_command.c
Original file line number Diff line number Diff line change
Expand Up @@ -1647,6 +1647,9 @@ static TPM_RC FwCmd_GetCapability(FWTPM_CTX* ctx, TPM2_Packet* cmd,
{ TPM_ALG_SHA256, TPMA_ALGORITHM_hash },
#ifdef WOLFSSL_SHA384
{ TPM_ALG_SHA384, TPMA_ALGORITHM_hash },
#endif
#ifdef WOLFSSL_SHA512
{ TPM_ALG_SHA512, TPMA_ALGORITHM_hash },
#endif
{ TPM_ALG_HMAC, TPMA_ALGORITHM_hash |
TPMA_ALGORITHM_signing },
Expand Down Expand Up @@ -1837,7 +1840,9 @@ static TPM_RC FwCmd_GetCapability(FWTPM_CTX* ctx, TPM2_Packet* cmd,
{ TPM_PT_PCR_COUNT, IMPLEMENTATION_PCR },
{ TPM_PT_MAX_COMMAND_SIZE, FWTPM_MAX_COMMAND_SIZE },
{ TPM_PT_MAX_RESPONSE_SIZE, FWTPM_MAX_COMMAND_SIZE },
#ifdef WOLFSSL_SHA384
#if defined(WOLFSSL_SHA512)
{ TPM_PT_MAX_DIGEST, TPM_SHA512_DIGEST_SIZE },
#elif defined(WOLFSSL_SHA384)
{ TPM_PT_MAX_DIGEST, TPM_SHA384_DIGEST_SIZE },
#else
{ TPM_PT_MAX_DIGEST, TPM_SHA256_DIGEST_SIZE },
Expand Down Expand Up @@ -2389,6 +2394,7 @@ static int FwMldsaPubKeySize(TPMI_MLDSA_PARAMETER_SET ps)
default: return -1;
}
}

#endif /* WOLFTPM_MLDSA */

#ifdef WOLFTPM_MLKEM
Expand Down Expand Up @@ -2451,8 +2457,9 @@ static TPM_RC FwValidateMlTemplate(const TPMT_PUBLIC* pub, int checkPubSize)
if (sz < 0) {
rc = TPM_RC_PARMS;
}
else if (TPM2_GetHashDigestSize(
pub->parameters.hash_mldsaDetail.hashAlg) <= 0) {
else if (!FwMldsaPreHashStrong(
pub->parameters.hash_mldsaDetail.parameterSet,
pub->parameters.hash_mldsaDetail.hashAlg)) {
rc = TPM_RC_HASH;
}
else if (checkPubSize &&
Expand Down Expand Up @@ -2608,7 +2615,7 @@ static TPM_RC FwCmd_TestParms(FWTPM_CTX* ctx, TPM2_Packet* cmd, int cmdSize,
* is a TPMI_ALG_HASH and TPM_ALG_NULL is forbidden. Validate
* the selector against the hash algorithms wolfTPM
* understands. */
else if (TPM2_GetHashDigestSize(hashAlg) <= 0) {
else if (!FwMldsaPreHashStrong(ps, hashAlg)) {
rc = TPM_RC_HASH;
}
break;
Expand Down
Loading
Loading