use alloc::vec;
use alloc::vec::Vec;
use wasefire_applet_api::crypto::ccm as api;
use crate::{Error, convert_bool, convert_unit};
pub fn is_supported() -> bool {
convert_bool(unsafe { api::is_supported() }).unwrap_or(false)
}
pub fn encrypt(key: &[u8; 16], nonce: &[u8; 8], clear: &[u8]) -> Result<Vec<u8>, Error> {
let len = clear.len();
let mut cipher = vec![0; len + 4];
let params = api::encrypt::Params {
key: key.as_ptr(),
iv: nonce.as_ptr(),
len,
clear: clear.as_ptr(),
cipher: cipher.as_mut_ptr(),
};
convert_unit(unsafe { api::encrypt(params) })?;
Ok(cipher)
}
pub fn decrypt(key: &[u8; 16], nonce: &[u8; 8], cipher: &[u8]) -> Result<Vec<u8>, Error> {
let len = cipher.len().checked_sub(4).ok_or(Error::user(0))?;
let mut clear = vec![0; len];
let params = api::decrypt::Params {
key: key.as_ptr(),
iv: nonce.as_ptr(),
len,
cipher: cipher.as_ptr(),
clear: clear.as_mut_ptr(),
};
convert_unit(unsafe { api::decrypt(params) })?;
Ok(clear)
}