Skip to content

Commit f326166

Browse files
committed
Add correct command codes for v185 spec
1 parent 5e7ae4e commit f326166

File tree

4 files changed

+51
-71
lines changed

4 files changed

+51
-71
lines changed

src/tpm2.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6538,18 +6538,12 @@ const char* TPM2_GetAlgName(TPM_ALG_ID alg)
65386538
return "AES-CFB";
65396539
case TPM_ALG_ECB:
65406540
return "AES-ECB";
6541-
case TPM_ALG_ML_DSA_44:
6542-
return "ML-DSA-44";
6543-
case TPM_ALG_ML_DSA_65:
6544-
return "ML-DSA-65";
6545-
case TPM_ALG_ML_DSA_87:
6546-
return "ML-DSA-87";
6547-
case TPM_ALG_ML_KEM_512:
6548-
return "ML-KEM-512";
6549-
case TPM_ALG_ML_KEM_768:
6550-
return "ML-KEM-768";
6551-
case TPM_ALG_ML_KEM_1024:
6552-
return "ML-KEM-1024";
6541+
case TPM_ALG_MLKEM:
6542+
return "ML-KEM";
6543+
case TPM_ALG_MLDSA:
6544+
return "ML-DSA";
6545+
case TPM_ALG_HASH_MLDSA:
6546+
return "HashML-DSA";
65536547
default:
65546548
break;
65556549
}

src/tpm2_packet.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -812,9 +812,8 @@ void TPM2_Packet_AppendSignature(TPM2_Packet* packet, TPMT_SIGNATURE* sig)
812812
TPM2_Packet_AppendBytes(packet, sig->signature.hmac.digest.H, digestSz);
813813
break;
814814
#ifdef WOLFTPM_V185
815-
case TPM_ALG_ML_DSA_44:
816-
case TPM_ALG_ML_DSA_65:
817-
case TPM_ALG_ML_DSA_87:
815+
case TPM_ALG_MLDSA:
816+
case TPM_ALG_HASH_MLDSA:
818817
TPM2_Packet_AppendU16(packet, sig->signature.mldsa.hash);
819818
TPM2_Packet_AppendU16(packet, sig->signature.mldsa.signature.size);
820819
TPM2_Packet_AppendBytes(packet, sig->signature.mldsa.signature.buffer,
@@ -858,9 +857,8 @@ void TPM2_Packet_ParseSignature(TPM2_Packet* packet, TPMT_SIGNATURE* sig)
858857
TPM2_Packet_ParseBytes(packet, sig->signature.hmac.digest.H, digestSz);
859858
break;
860859
#ifdef WOLFTPM_V185
861-
case TPM_ALG_ML_DSA_44:
862-
case TPM_ALG_ML_DSA_65:
863-
case TPM_ALG_ML_DSA_87:
860+
case TPM_ALG_MLDSA:
861+
case TPM_ALG_HASH_MLDSA:
864862
TPM2_Packet_ParseU16(packet, &sig->signature.mldsa.hash);
865863
TPM2_Packet_ParseU16(packet, &sig->signature.mldsa.signature.size);
866864
TPM2_Packet_ParseBytes(packet, sig->signature.mldsa.signature.buffer,

src/tpm2_wrap.c

Lines changed: 14 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4423,9 +4423,8 @@ int wolfTPM2_SignSequenceComplete(WOLFTPM2_DEV* dev,
44234423
}
44244424
}
44254425
#ifdef WOLFTPM_V185
4426-
else if (signSeqCompleteOut.signature.sigAlg == TPM_ALG_ML_DSA_44 ||
4427-
signSeqCompleteOut.signature.sigAlg == TPM_ALG_ML_DSA_65 ||
4428-
signSeqCompleteOut.signature.sigAlg == TPM_ALG_ML_DSA_87) {
4426+
else if (signSeqCompleteOut.signature.sigAlg == TPM_ALG_MLDSA ||
4427+
signSeqCompleteOut.signature.sigAlg == TPM_ALG_HASH_MLDSA) {
44294428
/* ML-DSA signature is a variable-length buffer */
44304429
int sigOutSz = signSeqCompleteOut.signature.signature.mldsa.signature.size;
44314430
if (*sigSz >= sigOutSz) {
@@ -4565,17 +4564,16 @@ int wolfTPM2_VerifySequenceComplete(WOLFTPM2_DEV* dev,
45654564
else {
45664565
/* For ML-DSA try to detect from signature */
45674566
TPMI_ALG_SIG_SCHEME scheme = TPM_ALG_NULL;
4568-
4567+
45694568
/* Try to get scheme from key if available */
45704569
if (key->pub.publicArea.type == TPM_ALG_KEYEDHASH) {
45714570
/* KEYEDHASH keys may have ML-DSA scheme */
45724571
/* The scheme is in keyedHashDetail.scheme.scheme */
45734572
scheme = key->pub.publicArea.parameters.keyedHashDetail.scheme.scheme;
45744573
}
4575-
4574+
45764575
/* Check if it's an ML-DSA algorithm from key scheme */
4577-
if (scheme == TPM_ALG_ML_DSA_44 || scheme == TPM_ALG_ML_DSA_65 ||
4578-
scheme == TPM_ALG_ML_DSA_87) {
4576+
if (scheme == TPM_ALG_MLDSA || scheme == TPM_ALG_HASH_MLDSA) {
45794577
signature.sigAlg = scheme;
45804578
/* ML-DSA signatures use SHA3-256, SHA3-384, or SHA3-512 typically */
45814579
/* Default to SHA3-256 if not specified */
@@ -4588,18 +4586,9 @@ int wolfTPM2_VerifySequenceComplete(WOLFTPM2_DEV* dev,
45884586
}
45894587
/* Fallback: detect ML-DSA from signature size if scheme not available */
45904588
else if (sigSz >= 2000 && sigSz <= 5000) {
4591-
/* Likely ML-DSA signature - determine variant from size */
4589+
/* Likely ML-DSA signature based on size */
45924590
/* ML-DSA-44: ~2420 bytes, ML-DSA-65: ~3309 bytes, ML-DSA-87: ~4627 bytes */
4593-
if (sigSz <= 3000) {
4594-
scheme = TPM_ALG_ML_DSA_44;
4595-
}
4596-
else if (sigSz <= 4000) {
4597-
scheme = TPM_ALG_ML_DSA_65;
4598-
}
4599-
else {
4600-
scheme = TPM_ALG_ML_DSA_87;
4601-
}
4602-
signature.sigAlg = scheme;
4591+
signature.sigAlg = TPM_ALG_MLDSA;
46034592
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
46044593
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
46054594
return BUFFER_E;
@@ -4690,9 +4679,8 @@ int wolfTPM2_SignDigest(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
46904679
}
46914680
}
46924681
#ifdef WOLFTPM_V185
4693-
else if (signDigestOut.signature.sigAlg == TPM_ALG_ML_DSA_44 ||
4694-
signDigestOut.signature.sigAlg == TPM_ALG_ML_DSA_65 ||
4695-
signDigestOut.signature.sigAlg == TPM_ALG_ML_DSA_87) {
4682+
else if (signDigestOut.signature.sigAlg == TPM_ALG_MLDSA ||
4683+
signDigestOut.signature.sigAlg == TPM_ALG_HASH_MLDSA) {
46964684
/* ML-DSA signature is a variable-length buffer */
46974685
int sigOutSz = signDigestOut.signature.signature.mldsa.signature.size;
46984686
if (*sigSz >= sigOutSz) {
@@ -4780,17 +4768,16 @@ int wolfTPM2_VerifyDigestSignature(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
47804768
/* ML-DSA signatures are large: ML-DSA-44: ~2420 bytes, ML-DSA-65: ~3309 bytes, ML-DSA-87: ~4627 bytes */
47814769
/* First, check if key has a scheme that indicates ML-DSA */
47824770
TPMI_ALG_SIG_SCHEME scheme = TPM_ALG_NULL;
4783-
4771+
47844772
/* Try to get scheme from key if available */
47854773
if (key->pub.publicArea.type == TPM_ALG_KEYEDHASH) {
47864774
/* KEYEDHASH keys may have ML-DSA scheme */
47874775
/* The scheme is in keyedHashDetail.scheme.scheme */
47884776
scheme = key->pub.publicArea.parameters.keyedHashDetail.scheme.scheme;
47894777
}
4790-
4778+
47914779
/* Check if it's an ML-DSA algorithm from key scheme */
4792-
if (scheme == TPM_ALG_ML_DSA_44 || scheme == TPM_ALG_ML_DSA_65 ||
4793-
scheme == TPM_ALG_ML_DSA_87) {
4780+
if (scheme == TPM_ALG_MLDSA || scheme == TPM_ALG_HASH_MLDSA) {
47944781
signature.sigAlg = scheme;
47954782
/* ML-DSA signatures use SHA3-256, SHA3-384, or SHA3-512 typically */
47964783
/* Default to SHA3-256 if not specified */
@@ -4803,18 +4790,9 @@ int wolfTPM2_VerifyDigestSignature(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
48034790
}
48044791
/* Fallback: detect ML-DSA from signature size if scheme not available */
48054792
else if (sigSz >= 2000 && sigSz <= 5000) {
4806-
/* Likely ML-DSA signature - determine variant from size */
4793+
/* Likely ML-DSA signature based on size */
48074794
/* ML-DSA-44: ~2420 bytes, ML-DSA-65: ~3309 bytes, ML-DSA-87: ~4627 bytes */
4808-
if (sigSz <= 3000) {
4809-
scheme = TPM_ALG_ML_DSA_44;
4810-
}
4811-
else if (sigSz <= 4000) {
4812-
scheme = TPM_ALG_ML_DSA_65;
4813-
}
4814-
else {
4815-
scheme = TPM_ALG_ML_DSA_87;
4816-
}
4817-
signature.sigAlg = scheme;
4795+
signature.sigAlg = TPM_ALG_MLDSA;
48184796
signature.signature.mldsa.hash = TPM_ALG_SHA3_256;
48194797
if (sigSz > (int)sizeof(signature.signature.mldsa.signature.buffer)) {
48204798
return BUFFER_E;

wolftpm/tpm2.h

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,10 @@ typedef enum {
117117
TPM_ALG_CBC = 0x0042,
118118
TPM_ALG_CFB = 0x0043,
119119
TPM_ALG_ECB = 0x0044,
120-
TPM_ALG_ML_DSA_44 = 0x0045,
121-
TPM_ALG_ML_DSA_65 = 0x0046,
122-
TPM_ALG_ML_DSA_87 = 0x0047,
123-
TPM_ALG_ML_KEM_512 = 0x0048,
124-
TPM_ALG_ML_KEM_768 = 0x0049,
125-
TPM_ALG_ML_KEM_1024 = 0x004A,
126-
TPM_ALG_ML_DSA = TPM_ALG_ML_DSA_65,
127-
TPM_ALG_ML_KEM = TPM_ALG_ML_KEM_768,
120+
/* Post-Quantum Algorithms - TPM 2.0 Library v185 */
121+
TPM_ALG_MLKEM = 0x00A0,
122+
TPM_ALG_MLDSA = 0x00A1,
123+
TPM_ALG_HASH_MLDSA = 0x00A2,
128124
} TPM_ALG_ID_T;
129125
typedef UINT16 TPM_ALG_ID;
130126

@@ -141,6 +137,20 @@ typedef enum {
141137
} TPM_ECC_CURVE_T;
142138
typedef UINT16 TPM_ECC_CURVE;
143139

140+
/* ML-KEM Parameter Sets (TCG Algorithm Registry v2.0) */
141+
typedef UINT16 TPMI_MLKEM_PARAMETER_SET;
142+
#define TPM_MLKEM_NONE 0x0000
143+
#define TPM_MLKEM_512 0x0001
144+
#define TPM_MLKEM_768 0x0002
145+
#define TPM_MLKEM_1024 0x0003
146+
147+
/* ML-DSA Parameter Sets (TCG Algorithm Registry v2.0) */
148+
typedef UINT16 TPMI_MLDSA_PARAMETER_SET;
149+
#define TPM_MLDSA_NONE 0x0000
150+
#define TPM_MLDSA_44 0x0001
151+
#define TPM_MLDSA_65 0x0002
152+
#define TPM_MLDSA_87 0x0003
153+
144154
/* Command Codes */
145155
typedef enum {
146156
TPM_CC_FIRST = 0x0000011F,
@@ -256,15 +266,15 @@ typedef enum {
256266
TPM_CC_CreateLoaded = 0x00000191,
257267
TPM_CC_PolicyAuthorizeNV = 0x00000192,
258268
TPM_CC_EncryptDecrypt2 = 0x00000193,
259-
TPM_CC_SignSequenceStart = 0x00000194,
260-
TPM_CC_VerifySequenceStart = 0x00000195,
261-
TPM_CC_SignSequenceComplete = 0x00000196,
262-
TPM_CC_VerifySequenceComplete = 0x00000197,
263-
TPM_CC_SignDigest = 0x00000198,
264-
TPM_CC_VerifyDigestSignature = 0x00000199,
265-
TPM_CC_Encapsulate = 0x0000019A,
266-
TPM_CC_Decapsulate = 0x0000019B,
267-
TPM_CC_LAST = TPM_CC_Decapsulate,
269+
TPM_CC_VerifySequenceComplete = 0x000001A3,
270+
TPM_CC_SignSequenceComplete = 0x000001A4,
271+
TPM_CC_VerifyDigestSignature = 0x000001A5,
272+
TPM_CC_SignDigest = 0x000001A6,
273+
TPM_CC_Encapsulate = 0x000001A7,
274+
TPM_CC_Decapsulate = 0x000001A8,
275+
TPM_CC_VerifySequenceStart = 0x000001A9,
276+
TPM_CC_SignSequenceStart = 0x000001AA,
277+
TPM_CC_LAST = TPM_CC_SignSequenceStart,
268278

269279
CC_VEND = 0x20000000,
270280
TPM_CC_Vendor_TCG_Test = CC_VEND + 0x0000,

0 commit comments

Comments
 (0)