Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/fwtpm/fwtpm_command.c
Original file line number Diff line number Diff line change
Expand Up @@ -18138,7 +18138,7 @@ static TPM_RC FwCmd_Encapsulate(FWTPM_CTX* ctx, TPM2_Packet* cmd, int cmdSize,
rc = FwEncapsulateMlkem(&ctx->rng, ps, &obj->pub.unique.mlkem,
&sharedSecret, ciphertext);
}
#ifdef HAVE_ECC
#ifdef FWTPM_HAVE_DHKEM
else if (obj->pub.type == TPM_ALG_ECC &&
obj->pub.parameters.eccDetail.kdf.scheme == TPM_ALG_HKDF) {
rc = FwEncapsulateEcdhDhkem(&ctx->rng, &obj->pub,
Expand Down Expand Up @@ -18258,12 +18258,16 @@ static TPM_RC FwCmd_Decapsulate(FWTPM_CTX* ctx, TPM2_Packet* cmd, int cmdSize,
rc = FwDecapsulateMlkem(ps, obj->privKey,
ciphertext->buffer, ciphertext->size, &sharedSecret);
}
#ifdef HAVE_ECC
#ifdef FWTPM_HAVE_DHKEM
else {
rc = FwDecapsulateEcdhDhkem(&ctx->rng, obj,
obj->pub.parameters.eccDetail.kdf.details.any.hashAlg,
ciphertext->buffer, ciphertext->size, &sharedSecret);
}
#else
else {
rc = TPM_RC_KEY;
}
#endif
}

Expand Down
4 changes: 2 additions & 2 deletions src/fwtpm/fwtpm_crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -1201,7 +1201,7 @@ TPM_RC FwDecapsulateMlkem(TPMI_MLKEM_PARAMETER_SET parameterSet,
return rc;
}

#ifdef HAVE_ECC
#ifdef FWTPM_HAVE_DHKEM
/* RFC 9180 Sec.7 kem_id mapping for the curve+hash pairings the TPM accepts.
* Returns 0 on a supported pairing; -1 otherwise (caller maps to TPM_RC_KDF). */
static int FwDhkemParamsLookup(int wcCurve, TPMI_ALG_HASH kdfHash,
Expand Down Expand Up @@ -1519,7 +1519,7 @@ TPM_RC FwDecapsulateEcdhDhkem(WC_RNG* rng, const FWTPM_Object* recipObj,
FWTPM_FREE_VAR(ephKey);
return rc;
}
#endif /* HAVE_ECC */
#endif /* FWTPM_HAVE_DHKEM */

#endif /* WOLFTPM_MLKEM */

Expand Down
9 changes: 9 additions & 0 deletions tests/fwtpm_unit_tests.c
Original file line number Diff line number Diff line change
Expand Up @@ -3553,6 +3553,8 @@ static void test_fwtpm_mlkem_roundtrip(void)
fwtpm_pass("MLKEM Encap/Decap Roundtrip:", 1);
}

#if defined(FWTPM_HAVE_DHKEM) && defined(WOLFTPM_MLKEM_ENCAP) && \
defined(WOLFTPM_MLKEM_DECAP)
/* ECC DHKEM Encap/Decap roundtrip per Part 2 Sec.12.2.3.5 + RFC 9180 Sec.4.1.
* An unrestricted-decryption ECC key with the matching HKDF kdf qualifies for
* Encap/Decap. Encap and Decap MUST produce identical sharedSecrets. */
Expand Down Expand Up @@ -3680,6 +3682,7 @@ static void test_fwtpm_ecc_dhkem_p521_roundtrip(void)
"Encap/Decap ECC DHKEM (P-521/HKDF-SHA512) Roundtrip:");
}
#endif
#endif /* FWTPM_HAVE_DHKEM && WOLFTPM_MLKEM_ENCAP && WOLFTPM_MLKEM_DECAP */

/* ML-KEM Labeled KEM seed roundtrip per Part 1 Sec.47.4 Eq.66:
* seed = KDFa(nameAlg, K, label, ciphertext, publicKey, bits).
Expand Down Expand Up @@ -19477,7 +19480,10 @@ int fwtpm_unit_tests(int argc, char *argv[])
test_fwtpm_create_loaded_mldsa();
test_fwtpm_create_loaded_mlkem();
test_fwtpm_mlkem_roundtrip();
#if defined(FWTPM_HAVE_DHKEM) && defined(WOLFTPM_MLKEM_ENCAP) && \
defined(WOLFTPM_MLKEM_DECAP)
test_fwtpm_ecc_dhkem_roundtrip();
#endif
test_fwtpm_encseed_decseed_mlkem_roundtrip();
#if defined(WOLFTPM_MLKEM_ENCAP) && defined(WOLFTPM_MLKEM_DECAP) && \
!defined(FWTPM_NO_CREDENTIAL)
Expand Down Expand Up @@ -19521,10 +19527,13 @@ int fwtpm_unit_tests(int argc, char *argv[])
test_fwtpm_signsequence_hmac_roundtrip();
test_fwtpm_signsequence_handle_auth_required();
test_fwtpm_verifysequence_long_message();
#if defined(FWTPM_HAVE_DHKEM) && defined(WOLFTPM_MLKEM_ENCAP) && \
defined(WOLFTPM_MLKEM_DECAP)
test_fwtpm_ecc_dhkem_p384_roundtrip();
#ifdef FWTPM_HAVE_ECC521
test_fwtpm_ecc_dhkem_p521_roundtrip();
#endif
#endif
#ifdef WOLFTPM_HASH_MLDSA
test_fwtpm_mldsa_digest_roundtrip();
#endif /* WOLFTPM_HASH_MLDSA */
Expand Down
5 changes: 5 additions & 0 deletions wolftpm/fwtpm/fwtpm.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@
#endif
#endif

/* v1.85 ECC DHKEM (RFC 9180) derives its shared secret with HKDF. */
#if defined(HAVE_ECC) && defined(HAVE_HKDF)
#define FWTPM_HAVE_DHKEM
#endif

/* Endian byte-array helpers - use shared TPM2_Packet helpers.
* Note: argument order differs (Fw: buf,val; TPM2_Packet: val,buf) */
#define FwStoreU16BE(buf, val) TPM2_Packet_U16ToByteArray((val), (buf))
Expand Down
Loading