crypto/fipsmodule/ml_kem/mlkem/indcpa.h (55 lines of code) (raw):
/*
* Copyright (c) 2024-2025 The mlkem-native project authors
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef MLK_INDCPA_H
#define MLK_INDCPA_H
#include <stdint.h>
#include "cbmc.h"
#include "common.h"
#include "poly_k.h"
#define mlk_gen_matrix MLK_NAMESPACE_K(gen_matrix)
/*************************************************
* Name: mlk_gen_matrix
*
* Description: Deterministically generate matrix A (or the transpose of A)
* from a seed. Entries of the matrix are polynomials that look
* uniformly random. Performs rejection sampling on output of
* a XOF
*
* Arguments: - mlk_polymat a: pointer to output matrix A
* - const uint8_t *seed: pointer to input seed
* - int transposed: boolean deciding whether A or A^T is generated
*
* Specification: Implements [FIPS 203, Algorithm 13 (K-PKE.KeyGen), L3-7]
* and [FIPS 203, Algorithm 14 (K-PKE.Encrypt), L4-8].
* The `transposed` parameter only affects internal presentation.
*
**************************************************/
MLK_INTERNAL_API
void mlk_gen_matrix(mlk_polymat a, const uint8_t seed[MLKEM_SYMBYTES],
int transposed)
__contract__(
requires(memory_no_alias(a, sizeof(mlk_polymat)))
requires(memory_no_alias(seed, MLKEM_SYMBYTES))
requires(transposed == 0 || transposed == 1)
assigns(object_whole(a))
ensures(forall(x, 0, MLKEM_K * MLKEM_K,
array_bound(a[x].coeffs, 0, MLKEM_N, 0, MLKEM_Q)))
);
#define mlk_indcpa_keypair_derand MLK_NAMESPACE_K(indcpa_keypair_derand)
/*************************************************
* Name: mlk_indcpa_keypair_derand
*
* Description: Generates public and private key for the CPA-secure
* public-key encryption scheme underlying ML-KEM
*
* Arguments: - uint8_t *pk: pointer to output public key
* (of length MLKEM_INDCPA_PUBLICKEYBYTES bytes)
* - uint8_t *sk: pointer to output private key
* (of length MLKEM_INDCPA_SECRETKEYBYTES bytes)
* - const uint8_t *coins: pointer to input randomness
* (of length MLKEM_SYMBYTES bytes)
*
* Specification: Implements [FIPS 203, Algorithm 13 (K-PKE.KeyGen)].
*
**************************************************/
MLK_INTERNAL_API
void mlk_indcpa_keypair_derand(uint8_t pk[MLKEM_INDCPA_PUBLICKEYBYTES],
uint8_t sk[MLKEM_INDCPA_SECRETKEYBYTES],
const uint8_t coins[MLKEM_SYMBYTES])
__contract__(
requires(memory_no_alias(pk, MLKEM_INDCPA_PUBLICKEYBYTES))
requires(memory_no_alias(sk, MLKEM_INDCPA_SECRETKEYBYTES))
requires(memory_no_alias(coins, MLKEM_SYMBYTES))
assigns(object_whole(pk))
assigns(object_whole(sk))
);
#define mlk_indcpa_enc MLK_NAMESPACE_K(indcpa_enc)
/*************************************************
* Name: mlk_indcpa_enc
*
* Description: Encryption function of the CPA-secure
* public-key encryption scheme underlying Kyber.
*
* Arguments: - uint8_t *c: pointer to output ciphertext
* (of length MLKEM_INDCPA_BYTES bytes)
* - const uint8_t *m: pointer to input message
* (of length MLKEM_INDCPA_MSGBYTES bytes)
* - const uint8_t *pk: pointer to input public key
* (of length MLKEM_INDCPA_PUBLICKEYBYTES)
* - const uint8_t *coins: pointer to input random coins used as
* seed (of length MLKEM_SYMBYTES) to deterministically generate
* all randomness
*
* Specification: Implements [FIPS 203, Algorithm 14 (K-PKE.Encrypt)].
*
**************************************************/
MLK_INTERNAL_API
void mlk_indcpa_enc(uint8_t c[MLKEM_INDCPA_BYTES],
const uint8_t m[MLKEM_INDCPA_MSGBYTES],
const uint8_t pk[MLKEM_INDCPA_PUBLICKEYBYTES],
const uint8_t coins[MLKEM_SYMBYTES])
__contract__(
requires(memory_no_alias(c, MLKEM_INDCPA_BYTES))
requires(memory_no_alias(m, MLKEM_INDCPA_MSGBYTES))
requires(memory_no_alias(pk, MLKEM_INDCPA_PUBLICKEYBYTES))
requires(memory_no_alias(coins, MLKEM_SYMBYTES))
assigns(object_whole(c))
);
#define mlk_indcpa_dec MLK_NAMESPACE_K(indcpa_dec)
/*************************************************
* Name: mlk_indcpa_dec
*
* Description: Decryption function of the CPA-secure
* public-key encryption scheme underlying Kyber.
*
* Arguments: - uint8_t *m: pointer to output decrypted message
* (of length MLKEM_INDCPA_MSGBYTES)
* - const uint8_t *c: pointer to input ciphertext
* (of length MLKEM_INDCPA_BYTES)
* - const uint8_t *sk: pointer to input secret key
* (of length MLKEM_INDCPA_SECRETKEYBYTES)
*
* Specification: Implements [FIPS 203, Algorithm 15 (K-PKE.Decrypt)].
*
**************************************************/
MLK_INTERNAL_API
void mlk_indcpa_dec(uint8_t m[MLKEM_INDCPA_MSGBYTES],
const uint8_t c[MLKEM_INDCPA_BYTES],
const uint8_t sk[MLKEM_INDCPA_SECRETKEYBYTES])
__contract__(
requires(memory_no_alias(c, MLKEM_INDCPA_BYTES))
requires(memory_no_alias(m, MLKEM_INDCPA_MSGBYTES))
requires(memory_no_alias(sk, MLKEM_INDCPA_SECRETKEYBYTES))
assigns(object_whole(m))
);
#endif /* !MLK_INDCPA_H */