Skip to content

Commit 599217e

Browse files
committed
Address copilot review, add bounds checks, less than 0 checks
1 parent 6290a01 commit 599217e

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
@@ -3411,6 +3411,11 @@ TPM_RC TPM2_VerifySequenceComplete(VerifySequenceComplete_In* in,
34113411
TPM2_Packet_ParseU16(&packet, &out->validation.tag);
34123412
TPM2_Packet_ParseU32(&packet, &out->validation.hierarchy);
34133413
TPM2_Packet_ParseU16(&packet, &out->validation.digest.size);
3414+
if (out->validation.digest.size >
3415+
sizeof(out->validation.digest.buffer)) {
3416+
out->validation.digest.size =
3417+
(UINT16)sizeof(out->validation.digest.buffer);
3418+
}
34143419
TPM2_Packet_ParseBytes(&packet,
34153420
out->validation.digest.buffer,
34163421
out->validation.digest.size);
@@ -3509,6 +3514,11 @@ TPM_RC TPM2_VerifyDigestSignature(VerifyDigestSignature_In* in,
35093514
TPM2_Packet_ParseU16(&packet, &out->validation.tag);
35103515
TPM2_Packet_ParseU32(&packet, &out->validation.hierarchy);
35113516
TPM2_Packet_ParseU16(&packet, &out->validation.digest.size);
3517+
if (out->validation.digest.size >
3518+
sizeof(out->validation.digest.buffer)) {
3519+
out->validation.digest.size =
3520+
(UINT16)sizeof(out->validation.digest.buffer);
3521+
}
35123522
TPM2_Packet_ParseBytes(&packet,
35133523
out->validation.digest.buffer,
35143524
out->validation.digest.size);

src/tpm2_wrap.c

Lines changed: 28 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -4738,52 +4738,22 @@ int wolfTPM2_VerifySequenceComplete(WOLFTPM2_DEV* dev,
47384738
XMEMCPY(signature.signature.rsassa.sig.buffer, sig, sigSz);
47394739
}
47404740
#ifdef WOLFTPM_V185
4741-
else {
4742-
/* For ML-DSA try to detect from signature */
4743-
TPMI_ALG_SIG_SCHEME scheme = TPM_ALG_NULL;
4744-
4745-
/* Try to get scheme from key if available */
4746-
if (key->pub.publicArea.type == TPM_ALG_KEYEDHASH) {
4747-
/* KEYEDHASH keys may have ML-DSA scheme */
4748-
/* The scheme is in keyedHashDetail.scheme.scheme */
4749-
scheme = key->pub.publicArea.parameters.keyedHashDetail.scheme.scheme;
4750-
}
4751-
4752-
/* Check if it's an ML-DSA algorithm from key scheme */
4753-
if (scheme == TPM_ALG_MLDSA || scheme == TPM_ALG_HASH_MLDSA) {
4754-
signature.sigAlg = scheme;
4755-
/* ML-DSA signatures use SHA3-256, SHA3-384, or SHA3-512 typically */
4756-
/* Default to SHA3-256 if not specified */
4757-
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
4758-
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
4759-
return BUFFER_E;
4760-
}
4761-
signature.signature.mldsa.signature.size = (UINT16)sigSz;
4762-
XMEMCPY(signature.signature.mldsa.signature.buffer, sig, sigSz);
4763-
}
4764-
/* Fallback: detect ML-DSA from signature size if scheme not available */
4765-
else if (sigSz >= 2000 && sigSz <= 5000) {
4766-
/* Likely ML-DSA signature based on size */
4767-
/* ML-DSA-44: ~2420 bytes, ML-DSA-65: ~3309 bytes, ML-DSA-87: ~4627 bytes */
4768-
signature.sigAlg = TPM_ALG_MLDSA;
4769-
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
4770-
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
4771-
return BUFFER_E;
4772-
}
4773-
signature.signature.mldsa.signature.size = (UINT16)sigSz;
4774-
XMEMCPY(signature.signature.mldsa.signature.buffer, sig, sigSz);
4775-
}
4776-
else {
4777-
/* Unknown key type and signature doesn't match known formats */
4778-
return BAD_FUNC_ARG;
4741+
else if (key->pub.publicArea.type == TPM_ALG_MLDSA ||
4742+
key->pub.publicArea.type == TPM_ALG_HASH_MLDSA) {
4743+
/* ML-DSA signature - key type directly indicates algorithm */
4744+
signature.sigAlg = key->pub.publicArea.type;
4745+
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
4746+
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
4747+
return BUFFER_E;
47794748
}
4749+
signature.signature.mldsa.signature.size = (UINT16)sigSz;
4750+
XMEMCPY(signature.signature.mldsa.signature.buffer, sig, sigSz);
47804751
}
4781-
#else
4752+
#endif /* WOLFTPM_V185 */
47824753
else {
4783-
/* For PQ algorithms or unknown types, return error */
4754+
/* Unknown key type */
47844755
return BAD_FUNC_ARG;
47854756
}
4786-
#endif /* WOLFTPM_V185 */
47874757
verifySeqCompleteIn.signature = signature;
47884758

47894759
XMEMSET(&verifySeqCompleteOut, 0, sizeof(verifySeqCompleteOut));
@@ -4946,54 +4916,22 @@ int wolfTPM2_VerifyDigestSignature(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
49464916
XMEMCPY(signature.signature.rsassa.sig.buffer, sig, sigSz);
49474917
}
49484918
#ifdef WOLFTPM_V185
4949-
else {
4950-
/* For ML-DSA and other PQ algorithms, try to detect from signature */
4951-
/* ML-DSA signatures are large: ML-DSA-44: ~2420 bytes, ML-DSA-65: ~3309 bytes, ML-DSA-87: ~4627 bytes */
4952-
/* First, check if key has a scheme that indicates ML-DSA */
4953-
TPMI_ALG_SIG_SCHEME scheme = TPM_ALG_NULL;
4954-
4955-
/* Try to get scheme from key if available */
4956-
if (key->pub.publicArea.type == TPM_ALG_KEYEDHASH) {
4957-
/* KEYEDHASH keys may have ML-DSA scheme */
4958-
/* The scheme is in keyedHashDetail.scheme.scheme */
4959-
scheme = key->pub.publicArea.parameters.keyedHashDetail.scheme.scheme;
4960-
}
4961-
4962-
/* Check if it's an ML-DSA algorithm from key scheme */
4963-
if (scheme == TPM_ALG_MLDSA || scheme == TPM_ALG_HASH_MLDSA) {
4964-
signature.sigAlg = scheme;
4965-
/* ML-DSA signatures use SHA3-256, SHA3-384, or SHA3-512 typically */
4966-
/* Default to SHA3-256 if not specified */
4967-
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
4968-
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
4969-
return BUFFER_E;
4970-
}
4971-
signature.signature.mldsa.signature.size = (UINT16)sigSz;
4972-
XMEMCPY(signature.signature.mldsa.signature.buffer, sig, sigSz);
4973-
}
4974-
/* Fallback: detect ML-DSA from signature size if scheme not available */
4975-
else if (sigSz >= 2000 && sigSz <= 5000) {
4976-
/* Likely ML-DSA signature based on size */
4977-
/* ML-DSA-44: ~2420 bytes, ML-DSA-65: ~3309 bytes, ML-DSA-87: ~4627 bytes */
4978-
signature.sigAlg = TPM_ALG_MLDSA;
4979-
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
4980-
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
4981-
return BUFFER_E;
4982-
}
4983-
signature.signature.mldsa.signature.size = (UINT16)sigSz;
4984-
XMEMCPY(signature.signature.mldsa.signature.buffer, sig, sigSz);
4985-
}
4986-
else {
4987-
/* Unknown key type and signature doesn't match known formats */
4988-
return BAD_FUNC_ARG;
4919+
else if (key->pub.publicArea.type == TPM_ALG_MLDSA ||
4920+
key->pub.publicArea.type == TPM_ALG_HASH_MLDSA) {
4921+
/* ML-DSA signature - key type directly indicates algorithm */
4922+
signature.sigAlg = key->pub.publicArea.type;
4923+
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
4924+
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
4925+
return BUFFER_E;
49894926
}
4927+
signature.signature.mldsa.signature.size = (UINT16)sigSz;
4928+
XMEMCPY(signature.signature.mldsa.signature.buffer, sig, sigSz);
49904929
}
4991-
#else
4930+
#endif /* WOLFTPM_V185 */
49924931
else {
4993-
/* For PQ algorithms or unknown types, return error */
4932+
/* Unknown key type */
49944933
return BAD_FUNC_ARG;
49954934
}
4996-
#endif /* WOLFTPM_V185 */
49974935
verifyDigestSigIn.signature = signature;
49984936

49994937
verifyDigestSigIn.context.size = (UINT16)contextSz;
@@ -5047,6 +4985,9 @@ int wolfTPM2_Encapsulate(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
50474985
}
50484986
}
50494987

4988+
/* Clear sensitive shared secret from stack */
4989+
TPM2_ForceZero(&encapsulateOut.sharedSecret, sizeof(encapsulateOut.sharedSecret));
4990+
50504991
return rc;
50514992
}
50524993

@@ -5086,6 +5027,9 @@ int wolfTPM2_Decapsulate(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
50865027
}
50875028
}
50885029

5030+
/* Clear sensitive shared secret from stack */
5031+
TPM2_ForceZero(&decapsulateOut.sharedSecret, sizeof(decapsulateOut.sharedSecret));
5032+
50895033
return rc;
50905034
}
50915035

0 commit comments

Comments
 (0)