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