use crate::error::RivideError;
use crate::sys::*;
use crate::utils::cleanse;
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct MlKem768PublicKey([u8; RIVIDE_ML_KEM_768_PK_BYTES]);
impl MlKem768PublicKey {
pub const fn from_bytes(bytes: [u8; RIVIDE_ML_KEM_768_PK_BYTES]) -> Self {
Self(bytes)
}
pub fn as_bytes(&self) -> &[u8; RIVIDE_ML_KEM_768_PK_BYTES] {
&self.0
}
}
impl AsRef<[u8]> for MlKem768PublicKey {
fn as_ref(&self) -> &[u8] {
&self.0
}
}
impl std::fmt::Debug for MlKem768PublicKey {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "MlKem768PublicKey({} bytes)", self.0.len())
}
}
#[derive(Clone, PartialEq, Eq)]
pub struct MlKem768SecretKey([u8; RIVIDE_ML_KEM_768_SK_BYTES]);
impl MlKem768SecretKey {
pub const fn from_bytes(bytes: [u8; RIVIDE_ML_KEM_768_SK_BYTES]) -> Self {
Self(bytes)
}
pub fn as_bytes(&self) -> &[u8; RIVIDE_ML_KEM_768_SK_BYTES] {
&self.0
}
}
impl AsRef<[u8]> for MlKem768SecretKey {
fn as_ref(&self) -> &[u8] {
&self.0
}
}
impl Drop for MlKem768SecretKey {
fn drop(&mut self) {
cleanse(&mut self.0);
}
}
impl std::fmt::Debug for MlKem768SecretKey {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "MlKem768SecretKey([REDACTED])")
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct MlKem768KeyPair {
pub public_key: MlKem768PublicKey,
pub secret_key: MlKem768SecretKey,
}
#[derive(Clone, PartialEq, Eq)]
pub struct MlKem768EncapsResult {
pub ciphertext: [u8; RIVIDE_ML_KEM_768_CT_BYTES],
pub shared_secret: [u8; RIVIDE_ML_KEM_768_SS_BYTES],
}
impl Drop for MlKem768EncapsResult {
fn drop(&mut self) {
cleanse(&mut self.shared_secret);
}
}
impl std::fmt::Debug for MlKem768EncapsResult {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"MlKem768EncapsResult {{ ciphertext: [{} bytes], shared_secret: [REDACTED] }}",
self.ciphertext.len()
)
}
}
pub struct MlKem768;
impl MlKem768 {
pub fn keypair() -> Result<MlKem768KeyPair, RivideError> {
let mut pk = [0u8; RIVIDE_ML_KEM_768_PK_BYTES];
let mut sk = [0u8; RIVIDE_ML_KEM_768_SK_BYTES];
let status = unsafe { rivide_ml_kem_768_keygen(pk.as_mut_ptr(), sk.as_mut_ptr()) };
RivideError::from_status(status).map(|_| MlKem768KeyPair {
public_key: MlKem768PublicKey(pk),
secret_key: MlKem768SecretKey(sk),
})
}
pub fn encapsulate(
public_key: &MlKem768PublicKey,
) -> Result<MlKem768EncapsResult, RivideError> {
let mut ct = [0u8; RIVIDE_ML_KEM_768_CT_BYTES];
let mut ss = [0u8; RIVIDE_ML_KEM_768_SS_BYTES];
let status = unsafe {
rivide_ml_kem_768_encaps(ct.as_mut_ptr(), ss.as_mut_ptr(), public_key.0.as_ptr())
};
RivideError::from_status(status).map(|_| MlKem768EncapsResult {
ciphertext: ct,
shared_secret: ss,
})
}
pub fn decapsulate(
ciphertext: &[u8; RIVIDE_ML_KEM_768_CT_BYTES],
secret_key: &MlKem768SecretKey,
) -> Result<[u8; RIVIDE_ML_KEM_768_SS_BYTES], RivideError> {
let mut ss = [0u8; RIVIDE_ML_KEM_768_SS_BYTES];
let status = unsafe {
rivide_ml_kem_768_decaps(ss.as_mut_ptr(), ciphertext.as_ptr(), secret_key.0.as_ptr())
};
RivideError::from_status(status).map(|_| ss)
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct MlKem1024PublicKey([u8; RIVIDE_ML_KEM_1024_PK_BYTES]);
impl MlKem1024PublicKey {
pub const fn from_bytes(bytes: [u8; RIVIDE_ML_KEM_1024_PK_BYTES]) -> Self {
Self(bytes)
}
pub fn as_bytes(&self) -> &[u8; RIVIDE_ML_KEM_1024_PK_BYTES] {
&self.0
}
}
impl AsRef<[u8]> for MlKem1024PublicKey {
fn as_ref(&self) -> &[u8] {
&self.0
}
}
impl std::fmt::Debug for MlKem1024PublicKey {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "MlKem1024PublicKey({} bytes)", self.0.len())
}
}
#[derive(Clone, PartialEq, Eq)]
pub struct MlKem1024SecretKey([u8; RIVIDE_ML_KEM_1024_SK_BYTES]);
impl MlKem1024SecretKey {
pub const fn from_bytes(bytes: [u8; RIVIDE_ML_KEM_1024_SK_BYTES]) -> Self {
Self(bytes)
}
pub fn as_bytes(&self) -> &[u8; RIVIDE_ML_KEM_1024_SK_BYTES] {
&self.0
}
}
impl AsRef<[u8]> for MlKem1024SecretKey {
fn as_ref(&self) -> &[u8] {
&self.0
}
}
impl Drop for MlKem1024SecretKey {
fn drop(&mut self) {
cleanse(&mut self.0);
}
}
impl std::fmt::Debug for MlKem1024SecretKey {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "MlKem1024SecretKey([REDACTED])")
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct MlKem1024KeyPair {
pub public_key: MlKem1024PublicKey,
pub secret_key: MlKem1024SecretKey,
}
#[derive(Clone, PartialEq, Eq)]
pub struct MlKem1024EncapsResult {
pub ciphertext: [u8; RIVIDE_ML_KEM_1024_CT_BYTES],
pub shared_secret: [u8; RIVIDE_ML_KEM_1024_SS_BYTES],
}
impl Drop for MlKem1024EncapsResult {
fn drop(&mut self) {
cleanse(&mut self.shared_secret);
}
}
impl std::fmt::Debug for MlKem1024EncapsResult {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"MlKem1024EncapsResult {{ ciphertext: [{} bytes], shared_secret: [REDACTED] }}",
self.ciphertext.len()
)
}
}
pub struct MlKem1024;
impl MlKem1024 {
pub fn keypair() -> Result<MlKem1024KeyPair, RivideError> {
let mut pk = [0u8; RIVIDE_ML_KEM_1024_PK_BYTES];
let mut sk = [0u8; RIVIDE_ML_KEM_1024_SK_BYTES];
let status = unsafe { rivide_ml_kem_1024_keygen(pk.as_mut_ptr(), sk.as_mut_ptr()) };
RivideError::from_status(status).map(|_| MlKem1024KeyPair {
public_key: MlKem1024PublicKey(pk),
secret_key: MlKem1024SecretKey(sk),
})
}
pub fn encapsulate(
public_key: &MlKem1024PublicKey,
) -> Result<MlKem1024EncapsResult, RivideError> {
let mut ct = [0u8; RIVIDE_ML_KEM_1024_CT_BYTES];
let mut ss = [0u8; RIVIDE_ML_KEM_1024_SS_BYTES];
let status = unsafe {
rivide_ml_kem_1024_encaps(ct.as_mut_ptr(), ss.as_mut_ptr(), public_key.0.as_ptr())
};
RivideError::from_status(status).map(|_| MlKem1024EncapsResult {
ciphertext: ct,
shared_secret: ss,
})
}
pub fn decapsulate(
ciphertext: &[u8; RIVIDE_ML_KEM_1024_CT_BYTES],
secret_key: &MlKem1024SecretKey,
) -> Result<[u8; RIVIDE_ML_KEM_1024_SS_BYTES], RivideError> {
let mut ss = [0u8; RIVIDE_ML_KEM_1024_SS_BYTES];
let status = unsafe {
rivide_ml_kem_1024_decaps(ss.as_mut_ptr(), ciphertext.as_ptr(), secret_key.0.as_ptr())
};
RivideError::from_status(status).map(|_| ss)
}
}