Add utility functions for computing (preferably at compile-time) byte length of K-PKE keys and cipher text

Signed-off-by: Anjan Roy <hello@itzmeanjan.in>
This commit is contained in:
Anjan Roy
2024-09-01 20:48:21 +04:00
parent c9087f37ff
commit 05e92a0d45
2 changed files with 32 additions and 10 deletions

View File

@@ -13,7 +13,9 @@ namespace k_pke {
// See algorithm 12 of K-PKE specification https://doi.org/10.6028/NIST.FIPS.203.ipd.
template<size_t k, size_t eta1>
static inline constexpr void
keygen(std::span<const uint8_t, 32> d, std::span<uint8_t, k * 12 * 32 + 32> pubkey, std::span<uint8_t, k * 12 * 32> seckey)
keygen(std::span<const uint8_t, 32> d,
std::span<uint8_t, ml_kem_utils::get_pke_public_key_len(k)> pubkey,
std::span<uint8_t, ml_kem_utils::get_pke_secret_key_len(k)> seckey)
requires(ml_kem_params::check_keygen_params(k, eta1))
{
std::array<uint8_t, 64> g_out{};
@@ -71,10 +73,10 @@ keygen(std::span<const uint8_t, 32> d, std::span<uint8_t, k * 12 * 32 + 32> pubk
// See algorithm 13 of K-PKE specification https://doi.org/10.6028/NIST.FIPS.203.ipd.
template<size_t k, size_t eta1, size_t eta2, size_t du, size_t dv>
[[nodiscard("Use result of modulus check on public key")]] static inline constexpr bool
encrypt(std::span<const uint8_t, k * 12 * 32 + 32> pubkey,
encrypt(std::span<const uint8_t, ml_kem_utils::get_pke_public_key_len(k)> pubkey,
std::span<const uint8_t, 32> msg,
std::span<const uint8_t, 32> rcoin,
std::span<uint8_t, k * du * 32 + dv * 32> enc)
std::span<uint8_t, ml_kem_utils::get_pke_cipher_text_len(k, du, dv)> enc)
requires(ml_kem_params::check_encrypt_params(k, eta1, eta2, du, dv))
{
constexpr size_t pkoff = k * 12 * 32;
@@ -148,7 +150,9 @@ encrypt(std::span<const uint8_t, k * 12 * 32 + 32> pubkey,
// See algorithm 14 defined in K-PKE specification https://doi.org/10.6028/NIST.FIPS.203.ipd.
template<size_t k, size_t du, size_t dv>
static inline constexpr void
decrypt(std::span<const uint8_t, k * 12 * 32> seckey, std::span<const uint8_t, k * du * 32 + dv * 32> enc, std::span<uint8_t, 32> dec)
decrypt(std::span<const uint8_t, ml_kem_utils::get_pke_secret_key_len(k)> seckey,
std::span<const uint8_t, ml_kem_utils::get_pke_cipher_text_len(k, du, dv)> enc,
std::span<uint8_t, 32> dec)
requires(ml_kem_params::check_decrypt_params(k, du, dv))
{
constexpr size_t encoff = k * du * 32;

View File

@@ -32,28 +32,46 @@ ct_cond_memcpy(const uint32_t cond, std::span<uint8_t, n> sink, std::span<const
}
}
// Returns compile-time computable K-PKE public key byte length.
static inline constexpr size_t
get_pke_public_key_len(const size_t k)
{
return k * 12 * 32 + 32;
}
// Returns compile-time computable K-PKE secret key byte length.
static inline constexpr size_t
get_pke_secret_key_len(const size_t k)
{
return k * 12 * 32;
}
// Returns compile-time computable K-PKE cipher text byte length.
static inline constexpr size_t
get_pke_cipher_text_len(size_t k, size_t du, size_t dv)
{
return 32 * (k * du + dv);
}
// Returns compile-time computable ML-KEM public key byte length.
static inline constexpr size_t
get_kem_public_key_len(const size_t k)
{
return k * 12 * 32 + 32;
return get_pke_public_key_len(k);
}
// Returns compile-time computable ML-KEM secret key byte length.
static inline constexpr size_t
get_kem_secret_key_len(const size_t k)
{
const size_t t0 = k * 12 * 32;
const size_t t1 = get_kem_public_key_len(k);
return t0 + t1 + 32 + 32;
return get_pke_secret_key_len(k) + get_pke_public_key_len(k) + 32 + 32;
}
// Returns compile-time computable ML-KEM cipher text byte length.
static inline constexpr size_t
get_kem_cipher_text_len(size_t k, size_t du, size_t dv)
{
return k * du * 32 + dv * 32;
return get_pke_cipher_text_len(k, du, dv);
}
}