use crate::{
asymmetric::{
asymmetric::{qrc_asymmetric_secrand_generate, AsymmetricRandState},
cipher::kyberbody::kyberbase::{
qrc_kyber_ref_decapsulate, qrc_kyber_ref_encapsulate, qrc_kyber_ref_generate_keypair,
QRC_KYBER_INDCPA_BYTES, QRC_KYBER_INDCPA_PUBLICKEY_BYTES, QRC_KYBER_INDCPA_SECRETKEY_BYTES, QRC_KYBER_SYMBYTES
}
},
prng::secrand::{qrc_secrand_destroy, qrc_secrand_initialize}
};
pub const QRC_KYBER_CIPHERTEXT_SIZE: usize = QRC_KYBER_INDCPA_BYTES;
pub const QRC_KYBER_PRIVATEKEY_SIZE: usize = QRC_KYBER_INDCPA_SECRETKEY_BYTES + QRC_KYBER_INDCPA_PUBLICKEY_BYTES + (2 * QRC_KYBER_SYMBYTES);
pub const QRC_KYBER_PUBLICKEY_SIZE: usize = QRC_KYBER_INDCPA_PUBLICKEY_BYTES;
pub const QRC_KYBER_SEED_SIZE: usize = 32;
pub const QRC_KYBER_SHAREDSECRET_SIZE: usize = 32;
pub const QRC_KYBER_ALGNAME: &str = "KYBER";
pub fn qrc_kyber_decapsulate(secret: &mut [u8], ciphertext: &[u8], privatekey: &[u8]) -> bool {
return qrc_kyber_ref_decapsulate(secret, ciphertext, privatekey);
}
pub fn qrc_kyber_decrypt(secret: &mut [u8; QRC_KYBER_SHAREDSECRET_SIZE], ciphertext: &[u8; QRC_KYBER_CIPHERTEXT_SIZE], privatekey: &[u8; QRC_KYBER_PRIVATEKEY_SIZE]) -> bool {
return qrc_kyber_decapsulate(secret, ciphertext, privatekey);
}
pub fn qrc_kyber_encapsulate(asymmetric_state: &mut AsymmetricRandState, secret: &mut [u8], ciphertext: &mut [u8], publickey: &[u8], rng_generate: fn(&mut AsymmetricRandState, &mut [u8], usize) -> bool) {
qrc_kyber_ref_encapsulate(asymmetric_state, ciphertext, secret, publickey, rng_generate);
}
pub fn qrc_kyber_encrypt(secret: &mut [u8; QRC_KYBER_SHAREDSECRET_SIZE], ciphertext: &mut [u8; QRC_KYBER_CIPHERTEXT_SIZE], publickey: &[u8; QRC_KYBER_PUBLICKEY_SIZE], seed: [u8; QRC_KYBER_SEED_SIZE]) {
let asymmetric_state = &mut AsymmetricRandState::default();
qrc_secrand_initialize(&mut asymmetric_state.secrand_state, &seed, QRC_KYBER_SEED_SIZE, &[], 0);
qrc_kyber_encapsulate(asymmetric_state, secret, ciphertext, publickey, qrc_asymmetric_secrand_generate);
qrc_secrand_destroy(&mut asymmetric_state.secrand_state);
}
pub fn qrc_kyber_generate_keypair(publickey: &mut [u8; QRC_KYBER_PUBLICKEY_SIZE], privatekey: &mut [u8; QRC_KYBER_PRIVATEKEY_SIZE], seed: [u8; QRC_KYBER_SEED_SIZE]) {
let asymmetric_state = &mut AsymmetricRandState::default();
qrc_secrand_initialize(&mut asymmetric_state.secrand_state, &seed, QRC_KYBER_SEED_SIZE, &[], 0);
qrc_kyber_gen_keypair(asymmetric_state, publickey, privatekey, qrc_asymmetric_secrand_generate);
qrc_secrand_destroy(&mut asymmetric_state.secrand_state);
}
pub fn qrc_kyber_gen_keypair(asymmetric_state: &mut AsymmetricRandState, publickey: &mut [u8], privatekey: &mut [u8], rng_generate: fn(&mut AsymmetricRandState, &mut [u8], usize) -> bool) {
qrc_kyber_ref_generate_keypair(asymmetric_state, publickey, privatekey, rng_generate);
}