@@ -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