mirror of
https://github.com/itzmeanjan/ml-kem.git
synced 2026-01-09 15:47:55 -05:00
refactor kyber1024 KEM API
Signed-off-by: Anjan Roy <hello@itzmeanjan.in>
This commit is contained in:
@@ -1,58 +1,54 @@
|
||||
#pragma once
|
||||
#include "kyber_kem.hpp"
|
||||
#include "kem.hpp"
|
||||
#include "utils.hpp"
|
||||
|
||||
// Kyber Key Encapsulation Mechanism (KEM) instantiated with Kyber1024
|
||||
// parameters
|
||||
//
|
||||
// See table 1 of specification @
|
||||
// https://pq-crystals.org/kyber/data/kyber-specification-round3-20210804.pdf
|
||||
namespace kyber1024_kem {
|
||||
|
||||
// Compile-time compute Kyber1024 KEM public key byte length
|
||||
constexpr size_t
|
||||
pub_key_len()
|
||||
{
|
||||
return kyber_utils::get_ccakem_public_key_len<4>();
|
||||
}
|
||||
// See row 3 of table 1 of specification @
|
||||
// https://pq-crystals.org/kyber/data/kyber-specification-round3-20210804.pdf
|
||||
|
||||
// Compile-time compute Kyber1024 KEM secret key byte length
|
||||
constexpr size_t
|
||||
sec_key_len()
|
||||
{
|
||||
return kyber_utils::get_ccakem_secret_key_len<4>();
|
||||
}
|
||||
constexpr size_t k = 4;
|
||||
constexpr size_t η1 = 2;
|
||||
constexpr size_t η2 = 2;
|
||||
constexpr size_t du = 11;
|
||||
constexpr size_t dv = 5;
|
||||
|
||||
// Compile-time compute Kyber1024 KEM cipher text byte length
|
||||
constexpr size_t
|
||||
cipher_text_len()
|
||||
{
|
||||
return kyber_utils::get_ccakem_cipher_len<4, 11, 5>();
|
||||
}
|
||||
// = 1568 -bytes Kyber1024 public key
|
||||
constexpr size_t PKEY_LEN = kyber_utils::get_ccakem_public_key_len<k>();
|
||||
|
||||
// = 3168 -bytes Kyber1024 secret key
|
||||
constexpr size_t SKEY_LEN = kyber_utils::get_ccakem_secret_key_len<k>();
|
||||
|
||||
// = 1568 -bytes Kyber1024 cipher text length
|
||||
constexpr size_t CIPHER_LEN = kyber_utils::get_ccakem_cipher_len<k, du, dv>();
|
||||
|
||||
// Computes a new Kyber1024 KEM keypair s.t. public key is 1568 -bytes and
|
||||
// secret key is 3168 -bytes, given a pseudo random number generator.
|
||||
// secret key is 3168 -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<4, 2>(prng, pubkey, seckey);
|
||||
kem::keygen<k, η1>(d, z, pubkey, seckey);
|
||||
}
|
||||
|
||||
// Given a Kyber1024 KEM public key ( of 1568 -bytes ) and a pseudo random
|
||||
// number generator, this routine computes a SHAKE256 XOF backed KDF (key
|
||||
// derivation function) and 1568 -bytes of cipher text, which can only be
|
||||
// decrypted by corresponding Kyber1024 KEM secret key, for arriving at same
|
||||
// SHAKE256 XOF backed KDF.
|
||||
// Given 32 -bytes seed m ( which is used during encapsulation ) and a Kyber1024
|
||||
// KEM public key ( of 1568 -bytes ), this routine computes a SHAKE256 XOF
|
||||
// backed KDF (key derivation function) and 1568 -bytes of cipher text, which
|
||||
// can only be decrypted by corresponding Kyber1024 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<4, 2, 2, 11, 5>(prng, pubkey, cipher);
|
||||
return kem::encapsulate<k, η1, η2, du, dv>(m, pubkey, cipher);
|
||||
}
|
||||
|
||||
// Given a Kyber1024 KEM secret key ( of 3168 -bytes ) and a cipher text of 1568
|
||||
@@ -65,7 +61,7 @@ inline shake256::shake256<false>
|
||||
decapsulate(const uint8_t* const __restrict seckey,
|
||||
const uint8_t* const __restrict cipher)
|
||||
{
|
||||
return kyber_kem::decapsulate<4, 2, 2, 11, 5>(seckey, cipher);
|
||||
return kem::decapsulate<k, η1, η2, du, dv>(seckey, cipher);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user