diff --git a/test/bench/kyber.cc b/test/bench/kyber.cc index 1663677f..86ff6a17 100644 --- a/test/bench/kyber.cc +++ b/test/bench/kyber.cc @@ -5,6 +5,10 @@ #include #include #include + +#include +#include + #include "kem/kyber/kyber512/avx2/polyvec.h" extern "C" { @@ -117,6 +121,32 @@ static void BenchKyberNttAVX(benchmark::State &st) { cpucycle(st, total); } +static void BenchFrodoDecaps(benchmark::State &st) { + const pqc_ctx_t *p = pqc_kem_alg_by_id(PQC_ALG_KEM_FRODOKEM640SHAKE); + std::vector ct(pqc_ciphertext_bsz(p)); + std::vector ss1(pqc_shared_secret_bsz(p)); + std::vector ss2(pqc_shared_secret_bsz(p)); + std::vector sk(pqc_private_key_bsz(p)); + std::vector pk(pqc_public_key_bsz(p)); + + // Generate keys & perform encapsulation + pqc_keygen(p, pk.data(), sk.data()); + pqc_kem_encapsulate(p, ct.data(), ss1.data(), pk.data()); + + // Poison & Decapsulate + ct_poison(sk.data(), 16); + ct_poison((unsigned char*)sk.data()+16+9616, 2*640*8 /*CRYPTO_SECRETBYTES*/); + ct_expect_uum(); + for (auto _ : st) { + pqc_kem_decapsulate(p, ss2.data(), ct.data(), sk.data()); + } + ct_require_uum(); + benchmark::DoNotOptimize(ss2); + benchmark::DoNotOptimize(ct); + benchmark::DoNotOptimize(sk); +} + + BENCHMARK(BenchKyberMatK2); BENCHMARK(BenchKyberRejSampling); BENCHMARK(BenchKyberKeygen); @@ -126,3 +156,4 @@ BENCHMARK(BenchKyberNttAVX); // TODO: not sure why but memcheck fails in INDCPA encryption BENCHMARK(BenchKyberEncaps); BENCHMARK(BenchKyberDecaps); +BENCHMARK(BenchFrodoDecaps); \ No newline at end of file