Skip to content

Commit 56264db

Browse files
committed
Address copilot review, add bounds checks, less than 0 checks
1 parent 36c376a commit 56264db

File tree

2 files changed

+38
-84
lines changed

2 files changed

+38
-84
lines changed

src/tpm2.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3408,6 +3408,11 @@ TPM_RC TPM2_VerifySequenceComplete(VerifySequenceComplete_In* in,
34083408
TPM2_Packet_ParseU16(&packet, &out->validation.tag);
34093409
TPM2_Packet_ParseU32(&packet, &out->validation.hierarchy);
34103410
TPM2_Packet_ParseU16(&packet, &out->validation.digest.size);
3411+
if (out->validation.digest.size >
3412+
sizeof(out->validation.digest.buffer)) {
3413+
out->validation.digest.size =
3414+
(UINT16)sizeof(out->validation.digest.buffer);
3415+
}
34113416
TPM2_Packet_ParseBytes(&packet,
34123417
out->validation.digest.buffer,
34133418
out->validation.digest.size);
@@ -3506,6 +3511,11 @@ TPM_RC TPM2_VerifyDigestSignature(VerifyDigestSignature_In* in,
35063511
TPM2_Packet_ParseU16(&packet, &out->validation.tag);
35073512
TPM2_Packet_ParseU32(&packet, &out->validation.hierarchy);
35083513
TPM2_Packet_ParseU16(&packet, &out->validation.digest.size);
3514+
if (out->validation.digest.size >
3515+
sizeof(out->validation.digest.buffer)) {
3516+
out->validation.digest.size =
3517+
(UINT16)sizeof(out->validation.digest.buffer);
3518+
}
35093519
TPM2_Packet_ParseBytes(&packet,
35103520
out->validation.digest.buffer,
35113521
out->validation.digest.size);

src/tpm2_wrap.c

Lines changed: 28 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -4697,52 +4697,22 @@ int wolfTPM2_VerifySequenceComplete(WOLFTPM2_DEV* dev,
46974697
XMEMCPY(signature.signature.rsassa.sig.buffer, sig, sigSz);
46984698
}
46994699
#ifdef WOLFTPM_V185
4700-
else {
4701-
/* For ML-DSA try to detect from signature */
4702-
TPMI_ALG_SIG_SCHEME scheme = TPM_ALG_NULL;
4703-
4704-
/* Try to get scheme from key if available */
4705-
if (key->pub.publicArea.type == TPM_ALG_KEYEDHASH) {
4706-
/* KEYEDHASH keys may have ML-DSA scheme */
4707-
/* The scheme is in keyedHashDetail.scheme.scheme */
4708-
scheme = key->pub.publicArea.parameters.keyedHashDetail.scheme.scheme;
4709-
}
4710-
4711-
/* Check if it's an ML-DSA algorithm from key scheme */
4712-
if (scheme == TPM_ALG_MLDSA || scheme == TPM_ALG_HASH_MLDSA) {
4713-
signature.sigAlg = scheme;
4714-
/* ML-DSA signatures use SHA3-256, SHA3-384, or SHA3-512 typically */
4715-
/* Default to SHA3-256 if not specified */
4716-
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
4717-
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
4718-
return BUFFER_E;
4719-
}
4720-
signature.signature.mldsa.signature.size = (UINT16)sigSz;
4721-
XMEMCPY(signature.signature.mldsa.signature.buffer, sig, sigSz);
4722-
}
4723-
/* Fallback: detect ML-DSA from signature size if scheme not available */
4724-
else if (sigSz >= 2000 && sigSz <= 5000) {
4725-
/* Likely ML-DSA signature based on size */
4726-
/* ML-DSA-44: ~2420 bytes, ML-DSA-65: ~3309 bytes, ML-DSA-87: ~4627 bytes */
4727-
signature.sigAlg = TPM_ALG_MLDSA;
4728-
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
4729-
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
4730-
return BUFFER_E;
4731-
}
4732-
signature.signature.mldsa.signature.size = (UINT16)sigSz;
4733-
XMEMCPY(signature.signature.mldsa.signature.buffer, sig, sigSz);
4734-
}
4735-
else {
4736-
/* Unknown key type and signature doesn't match known formats */
4737-
return BAD_FUNC_ARG;
4700+
else if (key->pub.publicArea.type == TPM_ALG_MLDSA ||
4701+
key->pub.publicArea.type == TPM_ALG_HASH_MLDSA) {
4702+
/* ML-DSA signature - key type directly indicates algorithm */
4703+
signature.sigAlg = key->pub.publicArea.type;
4704+
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
4705+
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
4706+
return BUFFER_E;
47384707
}
4708+
signature.signature.mldsa.signature.size = (UINT16)sigSz;
4709+
XMEMCPY(signature.signature.mldsa.signature.buffer, sig, sigSz);
47394710
}
4740-
#else
4711+
#endif /* WOLFTPM_V185 */
47414712
else {
4742-
/* For PQ algorithms or unknown types, return error */
4713+
/* Unknown key type */
47434714
return BAD_FUNC_ARG;
47444715
}
4745-
#endif /* WOLFTPM_V185 */
47464716
verifySeqCompleteIn.signature = signature;
47474717

47484718
XMEMSET(&verifySeqCompleteOut, 0, sizeof(verifySeqCompleteOut));
@@ -4905,54 +4875,22 @@ int wolfTPM2_VerifyDigestSignature(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
49054875
XMEMCPY(signature.signature.rsassa.sig.buffer, sig, sigSz);
49064876
}
49074877
#ifdef WOLFTPM_V185
4908-
else {
4909-
/* For ML-DSA and other PQ algorithms, try to detect from signature */
4910-
/* ML-DSA signatures are large: ML-DSA-44: ~2420 bytes, ML-DSA-65: ~3309 bytes, ML-DSA-87: ~4627 bytes */
4911-
/* First, check if key has a scheme that indicates ML-DSA */
4912-
TPMI_ALG_SIG_SCHEME scheme = TPM_ALG_NULL;
4913-
4914-
/* Try to get scheme from key if available */
4915-
if (key->pub.publicArea.type == TPM_ALG_KEYEDHASH) {
4916-
/* KEYEDHASH keys may have ML-DSA scheme */
4917-
/* The scheme is in keyedHashDetail.scheme.scheme */
4918-
scheme = key->pub.publicArea.parameters.keyedHashDetail.scheme.scheme;
4919-
}
4920-
4921-
/* Check if it's an ML-DSA algorithm from key scheme */
4922-
if (scheme == TPM_ALG_MLDSA || scheme == TPM_ALG_HASH_MLDSA) {
4923-
signature.sigAlg = scheme;
4924-
/* ML-DSA signatures use SHA3-256, SHA3-384, or SHA3-512 typically */
4925-
/* Default to SHA3-256 if not specified */
4926-
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
4927-
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
4928-
return BUFFER_E;
4929-
}
4930-
signature.signature.mldsa.signature.size = (UINT16)sigSz;
4931-
XMEMCPY(signature.signature.mldsa.signature.buffer, sig, sigSz);
4932-
}
4933-
/* Fallback: detect ML-DSA from signature size if scheme not available */
4934-
else if (sigSz >= 2000 && sigSz <= 5000) {
4935-
/* Likely ML-DSA signature based on size */
4936-
/* ML-DSA-44: ~2420 bytes, ML-DSA-65: ~3309 bytes, ML-DSA-87: ~4627 bytes */
4937-
signature.sigAlg = TPM_ALG_MLDSA;
4938-
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
4939-
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
4940-
return BUFFER_E;
4941-
}
4942-
signature.signature.mldsa.signature.size = (UINT16)sigSz;
4943-
XMEMCPY(signature.signature.mldsa.signature.buffer, sig, sigSz);
4944-
}
4945-
else {
4946-
/* Unknown key type and signature doesn't match known formats */
4947-
return BAD_FUNC_ARG;
4878+
else if (key->pub.publicArea.type == TPM_ALG_MLDSA ||
4879+
key->pub.publicArea.type == TPM_ALG_HASH_MLDSA) {
4880+
/* ML-DSA signature - key type directly indicates algorithm */
4881+
signature.sigAlg = key->pub.publicArea.type;
4882+
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
4883+
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
4884+
return BUFFER_E;
49484885
}
4886+
signature.signature.mldsa.signature.size = (UINT16)sigSz;
4887+
XMEMCPY(signature.signature.mldsa.signature.buffer, sig, sigSz);
49494888
}
4950-
#else
4889+
#endif /* WOLFTPM_V185 */
49514890
else {
4952-
/* For PQ algorithms or unknown types, return error */
4891+
/* Unknown key type */
49534892
return BAD_FUNC_ARG;
49544893
}
4955-
#endif /* WOLFTPM_V185 */
49564894
verifyDigestSigIn.signature = signature;
49574895

49584896
verifyDigestSigIn.context.size = (UINT16)contextSz;
@@ -5006,6 +4944,9 @@ int wolfTPM2_Encapsulate(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
50064944
}
50074945
}
50084946

4947+
/* Clear sensitive shared secret from stack */
4948+
TPM2_ForceZero(&encapsulateOut.sharedSecret, sizeof(encapsulateOut.sharedSecret));
4949+
50094950
return rc;
50104951
}
50114952

@@ -5045,6 +4986,9 @@ int wolfTPM2_Decapsulate(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
50454986
}
50464987
}
50474988

4989+
/* Clear sensitive shared secret from stack */
4990+
TPM2_ForceZero(&decapsulateOut.sharedSecret, sizeof(decapsulateOut.sharedSecret));
4991+
50484992
return rc;
50494993
}
50504994

0 commit comments

Comments
 (0)