Skip to content

Commit fc1f89f

Browse files
committed
Address copilot review, add bounds checks, less than 0 checks
1 parent 6711755 commit fc1f89f

2 files changed

Lines changed: 38 additions & 84 deletions

File tree

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

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

49974935
verifyDigestSigIn.context.size = (UINT16)contextSz;
@@ -5045,6 +4983,9 @@ int wolfTPM2_Encapsulate(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
50454983
}
50464984
}
50474985

4986+
/* Clear sensitive shared secret from stack */
4987+
TPM2_ForceZero(&encapsulateOut.sharedSecret, sizeof(encapsulateOut.sharedSecret));
4988+
50484989
return rc;
50494990
}
50504991

@@ -5084,6 +5025,9 @@ int wolfTPM2_Decapsulate(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
50845025
}
50855026
}
50865027

5028+
/* Clear sensitive shared secret from stack */
5029+
TPM2_ForceZero(&decapsulateOut.sharedSecret, sizeof(decapsulateOut.sharedSecret));
5030+
50875031
return rc;
50885032
}
50895033

0 commit comments

Comments
 (0)