diff --git a/fizz/backend/liboqs/LibOQS.h b/fizz/backend/liboqs/LibOQS.h index 9617f619390..8553953384e 100644 --- a/fizz/backend/liboqs/LibOQS.h +++ b/fizz/backend/liboqs/LibOQS.h @@ -26,6 +26,16 @@ struct Properties { static constexpr const char* id = OQS_KEM_alg_kyber_768; }; +template <> +struct Properties { + static constexpr const char* id = OQS_KEM_alg_ml_kem_512; +}; + +template <> +struct Properties { + static constexpr const char* id = OQS_KEM_alg_ml_kem_768; +}; + template std::unique_ptr makeKeyExchange(KeyExchangeRole role) { return OQSKeyExchange::createOQSKeyExchange(role, Properties::id); diff --git a/fizz/crypto/Crypto.h b/fizz/crypto/Crypto.h index f2fe91bff2d..dcb2aca070e 100644 --- a/fizz/crypto/Crypto.h +++ b/fizz/crypto/Crypto.h @@ -131,6 +131,8 @@ struct X25519 {}; // KEMs struct Kyber512 {}; struct Kyber768 {}; +struct MLKEM512 {}; +struct MLKEM768 {}; constexpr size_t kEcMaxPublicKeyshareLength = 256; // The max possible size of a buffer storing an EC keyshare. Please diff --git a/fizz/protocol/MultiBackendFactory.cpp b/fizz/protocol/MultiBackendFactory.cpp index 422dbc980d5..a35dd075b54 100644 --- a/fizz/protocol/MultiBackendFactory.cpp +++ b/fizz/protocol/MultiBackendFactory.cpp @@ -39,6 +39,14 @@ std::unique_ptr MultiBackendFactory::makeKeyExchange( return std::make_unique( fizz::libsodium::makeKeyExchange(), fizz::liboqs::makeKeyExchange(role)); + case NamedGroup::X25519MLKEM768: + return std::make_unique( + fizz::liboqs::makeKeyExchange(role), + fizz::libsodium::makeKeyExchange()); + case NamedGroup::X25519MLKEM512_FB: + return std::make_unique( + fizz::liboqs::makeKeyExchange(role), + fizz::libsodium::makeKeyExchange()); case NamedGroup::secp256r1_kyber512: return std::make_unique( fizz::openssl::makeKeyExchange(), diff --git a/fizz/protocol/test/MultiBackendFactoryTest.cpp b/fizz/protocol/test/MultiBackendFactoryTest.cpp index b8207c09b8e..045e9efea4f 100644 --- a/fizz/protocol/test/MultiBackendFactoryTest.cpp +++ b/fizz/protocol/test/MultiBackendFactoryTest.cpp @@ -48,6 +48,8 @@ INSTANTIATE_TEST_SUITE_P( NamedGroup::x25519_kyber768_draft00, NamedGroup::x25519_kyber768_experimental, NamedGroup::x25519_kyber512_experimental, + NamedGroup::X25519MLKEM512_FB, + NamedGroup::X25519MLKEM768, NamedGroup::secp256r1_kyber768_draft00, NamedGroup::secp384r1_kyber768 #endif diff --git a/fizz/record/Types.cpp b/fizz/record/Types.cpp index 0b7d0643429..256e9cc73cd 100644 --- a/fizz/record/Types.cpp +++ b/fizz/record/Types.cpp @@ -251,6 +251,8 @@ std::string toString(NamedGroup group) { return "x25519"; case NamedGroup::SecP256r1MLKEM768: return "SecP256r1MLKEM768"; + case fizz::NamedGroup::X25519MLKEM512_FB: + return "X25519MLKEM512_FB"; case NamedGroup::X25519MLKEM768: return "X25519MLKEM768"; case NamedGroup::secp521r1_x25519: diff --git a/fizz/record/Types.h b/fizz/record/Types.h index 830b5cf71cf..d50b2448747 100644 --- a/fizz/record/Types.h +++ b/fizz/record/Types.h @@ -346,6 +346,7 @@ enum class NamedGroup : uint16_t { secp521r1 = 25, x25519 = 29, SecP256r1MLKEM768 = 4587, + X25519MLKEM512_FB = 65026, X25519MLKEM768 = 4588, /** diff --git a/fizz/util/Parse-inl.h b/fizz/util/Parse-inl.h index 3e14b62bad3..07a49cdeee8 100644 --- a/fizz/util/Parse-inl.h +++ b/fizz/util/Parse-inl.h @@ -65,6 +65,8 @@ inline NamedGroup parse(folly::StringPiece s) { NamedGroup::x25519_kyber768_experimental}, {"x25519_kyber512_experimental", NamedGroup::x25519_kyber512_experimental}, + {"X25519MLKEM512_FB", NamedGroup::X25519MLKEM512_FB}, + {"X25519MLKEM768", NamedGroup::X25519MLKEM768}, {"secp256r1_kyber768_draft00", NamedGroup::secp256r1_kyber768_draft00}, {"secp384r1_kyber768", NamedGroup::secp384r1_kyber768}};