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