diff --git a/include/kyber512_kem.hpp b/include/kyber512_kem.hpp index c025587..4e1bab8 100644 --- a/include/kyber512_kem.hpp +++ b/include/kyber512_kem.hpp @@ -1,57 +1,53 @@ #pragma once -#include "kyber_kem.hpp" +#include "kem.hpp" #include "utils.hpp" // Kyber Key Encapsulation Mechanism (KEM) instantiated with Kyber512 parameters -// -// See table 1 of specification @ -// https://pq-crystals.org/kyber/data/kyber-specification-round3-20210804.pdf namespace kyber512_kem { -// Compile-time compute Kyber512 KEM public key byte length -constexpr size_t -pub_key_len() -{ - return kyber_utils::get_ccakem_public_key_len<2>(); -} +// See table 1 of specification @ +// https://pq-crystals.org/kyber/data/kyber-specification-round3-20210804.pdf -// Compile-time compute Kyber512 KEM secret key byte length -constexpr size_t -sec_key_len() -{ - return kyber_utils::get_ccakem_secret_key_len<2>(); -} +constexpr size_t k = 2; +constexpr size_t η1 = 3; +constexpr size_t η2 = 2; +constexpr size_t du = 10; +constexpr size_t dv = 4; -// Compile-time compute Kyber512 KEM cipher text byte length -constexpr size_t -cipher_text_len() -{ - return kyber_utils::get_ccakem_cipher_len<2, 10, 4>(); -} +// = 800 -bytes Kyber512 public key +constexpr size_t PKEY_LEN = kyber_utils::get_ccakem_public_key_len(); + +// = 1632 -bytes Kyber512 secret key +constexpr size_t SKEY_LEN = kyber_utils::get_ccakem_secret_key_len(); + +// = 768 -bytes Kyber512 cipher text length +constexpr size_t CIPHER_LEN = kyber_utils::get_ccakem_cipher_len(); // Computes a new Kyber512 KEM keypair s.t. public key is 800 -bytes and secret -// key is 1632 -bytes, given a pseudo random number generator. +// key is 1632 -bytes, given 32 -bytes seed d ( used in CPA-PKE ) and 32 -bytes +// seed z ( used in CCA-KEM ). inline void -keygen(prng::prng_t& prng, +keygen(const uint8_t* const __restrict d, + const uint8_t* const __restrict z, uint8_t* const __restrict pubkey, uint8_t* const __restrict seckey) { - kyber_kem::keygen<2, 3>(prng, pubkey, seckey); + kem::keygen(d, z, pubkey, seckey); } -// Given a Kyber512 KEM public key ( of 800 -bytes ) and a pseudo random number -// generator, this routine computes a SHAKE256 XOF backed KDF (key derivation -// function) and 768 -bytes of cipher text, which can only be decrypted by -// corresponding Kyber512 KEM secret key, for arriving at same SHAKE256 XOF -// backed KDF. +// Given 32 -bytes seed m ( which is used during encapsulation ) and a Kyber512 +// KEM public key ( of 800 -bytes ), this routine computes a SHAKE256 XOF backed +// KDF (key derivation function) and 768 -bytes of cipher text, which can only +// be decrypted by corresponding Kyber512 KEM secret key, for arriving at same +// SHAKE256 XOF backed KDF. // // Returned KDF can be used for deriving shared key of arbitrary bytes length. inline shake256::shake256 -encapsulate(prng::prng_t& prng, +encapsulate(const uint8_t* const __restrict m, const uint8_t* const __restrict pubkey, uint8_t* const __restrict cipher) { - return kyber_kem::encapsulate<2, 3, 2, 10, 4>(prng, pubkey, cipher); + return kem::encapsulate(m, pubkey, cipher); } // Given a Kyber512 KEM secret key ( of 1632 -bytes ) and a cipher text of 768 @@ -64,7 +60,7 @@ inline shake256::shake256 decapsulate(const uint8_t* const __restrict seckey, const uint8_t* const __restrict cipher) { - return kyber_kem::decapsulate<2, 3, 2, 10, 4>(seckey, cipher); + return kem::decapsulate(seckey, cipher); } }