@@ -11908,8 +11908,9 @@ static TPM_RC FwCmd_ZGen_2Phase(FWTPM_CTX* ctx, TPM2_Packet* cmd,
1190811908 FWTPM_DECLARE_VAR (privKeyA , ecc_key );
1190911909 FWTPM_DECLARE_VAR (privEph , ecc_key );
1191011910 FWTPM_DECLARE_VAR (peerPub , ecc_key );
11911- byte z1Buf [66 ], z2Buf [66 ]; /* shared secret x-coordinates */
11912- word32 z1Sz , z2Sz ;
11911+ byte z1xBuf [66 ], z1yBuf [66 ]; /* shared point coordinates (outZ1) */
11912+ byte z2xBuf [66 ], z2yBuf [66 ]; /* shared point coordinates (outZ2) */
11913+ word32 z1xSz , z1ySz , z2xSz , z2ySz ;
1191311914 int wcCurve ;
1191411915 int markPos ;
1191511916 int paramSzPos , paramStart ;
@@ -12029,8 +12030,8 @@ static TPM_RC FwCmd_ZGen_2Phase(FWTPM_CTX* ctx, TPM2_Packet* cmd,
1202912030 if (rc != 0 ) rc = TPM_RC_ECC_POINT ;
1203012031 }
1203112032 if (rc == 0 ) {
12032- z1Sz = ( word32 ) sizeof ( z1Buf );
12033- rc = wc_ecc_shared_secret ( privKeyA , peerPub , z1Buf , & z1Sz );
12033+ rc = FwEccSharedPoint ( privKeyA , peerPub ,
12034+ z1xBuf , & z1xSz , z1yBuf , & z1ySz );
1203412035 if (rc != 0 ) rc = TPM_RC_FAILURE ;
1203512036 }
1203612037
@@ -12065,35 +12066,41 @@ static TPM_RC FwCmd_ZGen_2Phase(FWTPM_CTX* ctx, TPM2_Packet* cmd,
1206512066 if (rc != 0 ) rc = TPM_RC_ECC_POINT ;
1206612067 }
1206712068 if (rc == 0 ) {
12068- z2Sz = ( word32 ) sizeof ( z2Buf );
12069- rc = wc_ecc_shared_secret ( privEph , peerPub , z2Buf , & z2Sz );
12069+ rc = FwEccSharedPoint ( privEph , peerPub ,
12070+ z2xBuf , & z2xSz , z2yBuf , & z2ySz );
1207012071 if (rc != 0 ) rc = TPM_RC_FAILURE ;
1207112072 }
1207212073
12073- /* Build response: outZ1 + outZ2 as TPM2B_ECC_POINT (x-only) */
12074+ /* Build response: outZ1 + outZ2 as TPM2B_ECC_POINT with full (x,y).
12075+ * TPM 2.0 Part 3 §14.7: Z value is the x-coordinate; y is populated
12076+ * for spec-strictness and TPM_ALG_ECMQV compatibility. */
1207412077 if (rc == 0 ) {
1207512078 paramStart = FwRspParamsBegin (rsp , cmdTag , & paramSzPos );
1207612079
1207712080 /* outZ1 */
1207812081 TPM2_Packet_MarkU16 (rsp , & markPos );
12079- TPM2_Packet_AppendU16 (rsp , (UINT16 )z1Sz );
12080- TPM2_Packet_AppendBytes (rsp , z1Buf , z1Sz );
12081- TPM2_Packet_AppendU16 (rsp , 0 ); /* y = empty */
12082+ TPM2_Packet_AppendU16 (rsp , (UINT16 )z1xSz );
12083+ TPM2_Packet_AppendBytes (rsp , z1xBuf , z1xSz );
12084+ TPM2_Packet_AppendU16 (rsp , (UINT16 )z1ySz );
12085+ TPM2_Packet_AppendBytes (rsp , z1yBuf , z1ySz );
1208212086 TPM2_Packet_PlaceU16 (rsp , markPos );
1208312087
1208412088 /* outZ2 */
1208512089 TPM2_Packet_MarkU16 (rsp , & markPos );
12086- TPM2_Packet_AppendU16 (rsp , (UINT16 )z2Sz );
12087- TPM2_Packet_AppendBytes (rsp , z2Buf , z2Sz );
12088- TPM2_Packet_AppendU16 (rsp , 0 ); /* y = empty */
12090+ TPM2_Packet_AppendU16 (rsp , (UINT16 )z2xSz );
12091+ TPM2_Packet_AppendBytes (rsp , z2xBuf , z2xSz );
12092+ TPM2_Packet_AppendU16 (rsp , (UINT16 )z2ySz );
12093+ TPM2_Packet_AppendBytes (rsp , z2yBuf , z2ySz );
1208912094 TPM2_Packet_PlaceU16 (rsp , markPos );
1209012095
1209112096 FwRspParamsEnd (rsp , cmdTag , paramSzPos , paramStart );
1209212097 }
1209312098
1209412099 /* Cleanup */
12095- TPM2_ForceZero (z1Buf , sizeof (z1Buf ));
12096- TPM2_ForceZero (z2Buf , sizeof (z2Buf ));
12100+ TPM2_ForceZero (z1xBuf , sizeof (z1xBuf ));
12101+ TPM2_ForceZero (z1yBuf , sizeof (z1yBuf ));
12102+ TPM2_ForceZero (z2xBuf , sizeof (z2xBuf ));
12103+ TPM2_ForceZero (z2yBuf , sizeof (z2yBuf ));
1209712104 /* Zero ephemeral key — it was consumed and must not be reused */
1209812105 TPM2_ForceZero (ctx -> ecEphemeralKey , sizeof (ctx -> ecEphemeralKey ));
1209912106 ctx -> ecEphemeralKeySz = 0 ;
0 commit comments