updated kyber512 KEM API

Signed-off-by: Anjan Roy <hello@itzmeanjan.in>
This commit is contained in:
Anjan Roy
2023-06-02 17:10:43 +04:00
parent 672307da40
commit a12f409cbb

View File

@@ -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<k>();
// = 1632 -bytes Kyber512 secret key
constexpr size_t SKEY_LEN = kyber_utils::get_ccakem_secret_key_len<k>();
// = 768 -bytes Kyber512 cipher text length
constexpr size_t CIPHER_LEN = kyber_utils::get_ccakem_cipher_len<k, du, dv>();
// 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<k, η1>(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<false>
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<k, η1, η2, du, dv>(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<false>
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<k, η1, η2, du, dv>(seckey, cipher);
}
}