@@ -138,6 +138,7 @@ struct hybrid_test_vector {
138138#define KYBER768R3_SECRET "914CB67FE5C38E73BF74181C0AC50428DEDF7750A98058F7D536708774535B29"
139139#define KYBER1024R3_SECRET "B10F7394926AD3B49C5D62D5AEB531D5757538BCC0DA9E550D438F1B61BD7419"
140140#define MLKEM768_SECRET "B408D5D115713F0A93047DBBEA832E4340787686D59A9A2D106BD662BA0AA035"
141+ #define MLKEM1024_SECRET "23f211b84a6ee20c8c29f6e5314c91b414e940513d380add17bd724ab3a13a52"
141142
142143#define X25519_KYBER512R3_HYBRID_SECRET (X25519_SHARED_SECRET KYBER512R3_SECRET)
143144#define X25519_KYBER768R3_HYBRID_SECRET (X25519_SHARED_SECRET KYBER768R3_SECRET)
@@ -147,6 +148,7 @@ struct hybrid_test_vector {
147148#define SECP521R1_KYBER1024R3_HYBRID_SECRET (SECP521R1_SHARED_SECRET KYBER1024R3_SECRET)
148149#define X25519_MLKEM768_HYBRID_SECRET (MLKEM768_SECRET X25519_SHARED_SECRET)
149150#define SECP256R1_MLKEM768_HYBRID_SECRET (SECP256R1_SHARED_SECRET MLKEM768_SECRET)
151+ #define SECP384R1_MLKEM1024_HYBRID_SECRET (SECP384R1_SHARED_SECRET MLKEM1024_SECRET)
150152
151153/* The expected traffic secrets were calculated from an independent Python implementation located in the KAT directory,
152154 * using the ECDHE & PQ secrets defined above. */
@@ -190,6 +192,11 @@ struct hybrid_test_vector {
190192#define AES_256_X25519_MLKEM768_CLIENT_TRAFFIC_SECRET "44eb9e15ef082936fe7a2c169be644ff16b47fb2a91f7223069cbd8d9b063a034f0936234e60a733a30db6d7226d984d"
191193#define AES_256_X25519_MLKEM768_SERVER_TRAFFIC_SECRET "852b46f0e3cdc222badc0b85f4cfb4f332c2d8ea8c9695d6024e129b5056d2c534191ee76bff50148f19a88f81897112"
192194
195+ #define AES_128_SECP384R1_MLKEM1024_CLIENT_TRAFFIC_SECRET "367b160926dc977e255fa5fdd15c51a3942f98a492db05d74777ed4498882179"
196+ #define AES_128_SECP384R1_MLKEM1024_SERVER_TRAFFIC_SECRET "93c1dcb54fa694957f8decde496944533d64a6e11884bfb8c928cd3b9e954836"
197+ #define AES_256_SECP384R1_MLKEM1024_CLIENT_TRAFFIC_SECRET "900c6409a1f1d748006759b8276a2ae7b74dca44d9c4e52083952e7cf1c868cba34c270b802dea59a7a8a00b919ff061"
198+ #define AES_256_SECP384R1_MLKEM1024_SERVER_TRAFFIC_SECRET "ccabea1600385fdd3587429d701aae0efcf6acac0bab0f194d571d78fa8755a0d0a58364c07c14fbe288a67843b68530"
199+
193200/* A fake transcript string to hash when deriving handshake secrets */
194201#define FAKE_TRANSCRIPT "client_hello || server_hello"
195202
@@ -431,6 +438,39 @@ int main(int argc, char **argv)
431438 .expected_server_traffic_secret = & aes_256_secp256r1_mlkem768_server_secret ,
432439 };
433440
441+ S2N_BLOB_FROM_HEX (mlkem1024_secret , MLKEM1024_SECRET );
442+ S2N_BLOB_FROM_HEX (secp384r1_mlkem1024_hybrid_secret , SECP384R1_MLKEM1024_HYBRID_SECRET );
443+
444+ S2N_BLOB_FROM_HEX (aes_128_secp384r1_mlkem1024_client_secret , AES_128_SECP384R1_MLKEM1024_CLIENT_TRAFFIC_SECRET );
445+ S2N_BLOB_FROM_HEX (aes_128_secp384r1_mlkem1024_server_secret , AES_128_SECP384R1_MLKEM1024_SERVER_TRAFFIC_SECRET );
446+
447+ const struct hybrid_test_vector aes_128_sha_256_secp384r1_mlkem1024_vector = {
448+ .cipher_suite = & s2n_tls13_aes_128_gcm_sha256 ,
449+ .transcript = FAKE_TRANSCRIPT ,
450+ .kem_group = & s2n_secp384r1_mlkem_1024 ,
451+ .client_ecc_key = CLIENT_SECP384R1_PRIV_KEY ,
452+ .server_ecc_key = SERVER_SECP384R1_PRIV_KEY ,
453+ .pq_secret = & mlkem1024_secret ,
454+ .expected_hybrid_secret = & secp384r1_mlkem1024_hybrid_secret ,
455+ .expected_client_traffic_secret = & aes_128_secp384r1_mlkem1024_client_secret ,
456+ .expected_server_traffic_secret = & aes_128_secp384r1_mlkem1024_server_secret ,
457+ };
458+
459+ S2N_BLOB_FROM_HEX (aes_256_secp384r1_mlkem1024_client_secret , AES_256_SECP384R1_MLKEM1024_CLIENT_TRAFFIC_SECRET );
460+ S2N_BLOB_FROM_HEX (aes_256_secp384r1_mlkem1024_server_secret , AES_256_SECP384R1_MLKEM1024_SERVER_TRAFFIC_SECRET );
461+
462+ const struct hybrid_test_vector aes_256_sha_384_secp384r1_mlkem1024_vector = {
463+ .cipher_suite = & s2n_tls13_aes_256_gcm_sha384 ,
464+ .transcript = FAKE_TRANSCRIPT ,
465+ .kem_group = & s2n_secp384r1_mlkem_1024 ,
466+ .client_ecc_key = CLIENT_SECP384R1_PRIV_KEY ,
467+ .server_ecc_key = SERVER_SECP384R1_PRIV_KEY ,
468+ .pq_secret = & mlkem1024_secret ,
469+ .expected_hybrid_secret = & secp384r1_mlkem1024_hybrid_secret ,
470+ .expected_client_traffic_secret = & aes_256_secp384r1_mlkem1024_client_secret ,
471+ .expected_server_traffic_secret = & aes_256_secp384r1_mlkem1024_server_secret ,
472+ };
473+
434474 S2N_BLOB_FROM_HEX (aes_128_x25519_mlkem768_client_secret , AES_128_X25519_MLKEM768_CLIENT_TRAFFIC_SECRET );
435475 S2N_BLOB_FROM_HEX (aes_128_x25519_mlkem768_server_secret , AES_128_X25519_MLKEM768_SERVER_TRAFFIC_SECRET );
436476
@@ -476,6 +516,8 @@ int main(int argc, char **argv)
476516 & aes_256_sha_384_x25519_kyber768r3_vector ,
477517 & aes_128_sha_256_secp256r1_mlkem768_vector ,
478518 & aes_256_sha_384_secp256r1_mlkem768_vector ,
519+ & aes_128_sha_256_secp384r1_mlkem1024_vector ,
520+ & aes_256_sha_384_secp384r1_mlkem1024_vector ,
479521 & aes_128_sha_256_x25519_mlkem768_vector ,
480522 & aes_256_sha_384_x25519_mlkem768_vector ,
481523 };
0 commit comments