#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum Error {
WasiError(i32),
}
impl std::error::Error for Error {}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Error::WasiError(e) => write!(f, "Wasi error {}", e),
}
}
}
pub type WasiHandle = i32;
pub type Char8 = u8;
pub type Char32 = u32;
pub type WasiPtr<T> = *const T;
pub type WasiMutPtr<T> = *mut T;
pub type WasiStringBytesPtr = WasiPtr<Char8>;
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WasiSlice<T> {
ptr: WasiPtr<T>,
len: usize,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WasiMutSlice<T> {
ptr: WasiMutPtr<T>,
len: usize,
}
impl<T> WasiSlice<T> {
pub fn as_slice(&self) -> &[T] {
unsafe { std::slice::from_raw_parts(self.ptr, self.len) }
}
pub fn from_slice(&self, slice: &[T]) -> Self {
WasiSlice {
ptr: slice.as_ptr() as _,
len: slice.len(),
}
}
}
impl<T> WasiMutSlice<T> {
pub fn as_slice(&self) -> &[T] {
unsafe { std::slice::from_raw_parts(self.ptr, self.len) }
}
pub fn as_mut_slice(&self) -> &mut [T] {
unsafe { std::slice::from_raw_parts_mut(self.ptr, self.len) }
}
pub fn from_slice(&self, slice: &[T]) -> Self {
WasiMutSlice {
ptr: slice.as_ptr() as _,
len: slice.len(),
}
}
pub fn from_mut_slice(&self, slice: &mut [T]) -> Self {
WasiMutSlice {
ptr: slice.as_mut_ptr(),
len: slice.len(),
}
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct WasiString {
ptr: WasiStringBytesPtr,
len: usize,
}
impl<T: AsRef<str>> From<T> for WasiString {
fn from(s: T) -> Self {
let s = s.as_ref();
WasiString {
ptr: s.as_ptr() as _,
len: s.len(),
}
}
}
impl WasiString {
pub fn as_str(&self) -> Result<&str, std::str::Utf8Error> {
std::str::from_utf8(unsafe { std::slice::from_raw_parts(self.ptr, self.len) })
}
pub fn as_slice(&self) -> &[u8] {
unsafe { std::slice::from_raw_parts(self.ptr, self.len) }
}
pub fn from_slice(&self, slice: &[u8]) -> Self {
WasiString {
ptr: slice.as_ptr() as _,
len: slice.len(),
}
}
}
pub type CryptoErrno = u16;
#[allow(non_snake_case)]
pub mod CRYPTO_ERRNO {
use super::CryptoErrno;
pub const SUCCESS: CryptoErrno = 0;
pub const GUEST_ERROR: CryptoErrno = 1;
pub const NOT_IMPLEMENTED: CryptoErrno = 2;
pub const UNSUPPORTED_FEATURE: CryptoErrno = 3;
pub const PROHIBITED_OPERATION: CryptoErrno = 4;
pub const UNSUPPORTED_ENCODING: CryptoErrno = 5;
pub const UNSUPPORTED_ALGORITHM: CryptoErrno = 6;
pub const UNSUPPORTED_OPTION: CryptoErrno = 7;
pub const INVALID_KEY: CryptoErrno = 8;
pub const INVALID_LENGTH: CryptoErrno = 9;
pub const VERIFICATION_FAILED: CryptoErrno = 10;
pub const RNG_ERROR: CryptoErrno = 11;
pub const ALGORITHM_FAILURE: CryptoErrno = 12;
pub const INVALID_SIGNATURE: CryptoErrno = 13;
pub const CLOSED: CryptoErrno = 14;
pub const INVALID_HANDLE: CryptoErrno = 15;
pub const OVERFLOW: CryptoErrno = 16;
pub const INTERNAL_ERROR: CryptoErrno = 17;
pub const TOO_MANY_HANDLES: CryptoErrno = 18;
pub const KEY_NOT_SUPPORTED: CryptoErrno = 19;
pub const KEY_REQUIRED: CryptoErrno = 20;
pub const INVALID_TAG: CryptoErrno = 21;
pub const INVALID_OPERATION: CryptoErrno = 22;
pub const NONCE_REQUIRED: CryptoErrno = 23;
pub const INVALID_NONCE: CryptoErrno = 24;
pub const OPTION_NOT_SET: CryptoErrno = 25;
pub const NOT_FOUND: CryptoErrno = 26;
pub const PARAMETERS_MISSING: CryptoErrno = 27;
pub const IN_PROGRESS: CryptoErrno = 28;
pub const INCOMPATIBLE_KEYS: CryptoErrno = 29;
pub const EXPIRED: CryptoErrno = 30;
}
pub type KeypairEncoding = u16;
#[allow(non_snake_case)]
pub mod KEYPAIR_ENCODING {
use super::KeypairEncoding;
pub const RAW: KeypairEncoding = 0;
pub const PKCS_8: KeypairEncoding = 1;
pub const PEM: KeypairEncoding = 2;
pub const LOCAL: KeypairEncoding = 3;
}
pub type PublickeyEncoding = u16;
#[allow(non_snake_case)]
pub mod PUBLICKEY_ENCODING {
use super::PublickeyEncoding;
pub const RAW: PublickeyEncoding = 0;
pub const PKCS_8: PublickeyEncoding = 1;
pub const PEM: PublickeyEncoding = 2;
pub const SEC: PublickeyEncoding = 3;
pub const COMPRESSED_SEC: PublickeyEncoding = 4;
pub const LOCAL: PublickeyEncoding = 5;
}
pub type SecretkeyEncoding = u16;
#[allow(non_snake_case)]
pub mod SECRETKEY_ENCODING {
use super::SecretkeyEncoding;
pub const RAW: SecretkeyEncoding = 0;
pub const PKCS_8: SecretkeyEncoding = 1;
pub const PEM: SecretkeyEncoding = 2;
pub const SEC: SecretkeyEncoding = 3;
pub const COMPRESSED_SEC: SecretkeyEncoding = 4;
pub const LOCAL: SecretkeyEncoding = 5;
}
pub type SignatureEncoding = u16;
#[allow(non_snake_case)]
pub mod SIGNATURE_ENCODING {
use super::SignatureEncoding;
pub const RAW: SignatureEncoding = 0;
pub const DER: SignatureEncoding = 1;
}
pub type AlgorithmType = u16;
#[allow(non_snake_case)]
pub mod ALGORITHM_TYPE {
use super::AlgorithmType;
pub const SIGNATURES: AlgorithmType = 0;
pub const SYMMETRIC: AlgorithmType = 1;
pub const KEY_EXCHANGE: AlgorithmType = 2;
}
pub type Version = u64;
pub type Size = usize;
pub type Timestamp = u64;
pub type U64 = u64;
pub type ArrayOutput = WasiHandle;
pub type Options = WasiHandle;
pub type SecretsManager = WasiHandle;
pub type Keypair = WasiHandle;
pub type SignatureState = WasiHandle;
pub type Signature = WasiHandle;
pub type Publickey = WasiHandle;
pub type Secretkey = WasiHandle;
pub type SignatureVerificationState = WasiHandle;
pub type SymmetricState = WasiHandle;
pub type SymmetricKey = WasiHandle;
pub type SymmetricTag = WasiHandle;
pub type OptOptionsU = u8;
#[allow(non_snake_case)]
pub mod OPT_OPTIONS_U {
use super::OptOptionsU;
pub const SOME: OptOptionsU = 0;
pub const NONE: OptOptionsU = 1;
}
#[repr(C)]
pub union OptOptionsMember {
some: Options, }
#[repr(C, packed)]
pub struct OptOptions {
pub tag: u8,
__pad8_0: u8,
__pad16_0: u16,
__pad32_0: u32,
pub member: std::mem::MaybeUninit<OptOptionsMember>,
}
impl OptOptions {
fn new(tag: u8) -> Self {
let mut tu = unsafe { std::mem::zeroed::<Self>() };
tu.tag = tag;
tu
}
pub fn new_some(val: Options) -> Self {
let mut tu = Self::new(0);
tu.member = std::mem::MaybeUninit::new(OptOptionsMember { some: val });
tu
}
pub fn into_some(self) -> Options {
assert_eq!(self.tag, 0);
unsafe { self.member.assume_init().some }
}
pub fn set_some(&mut self, val: Options) {
assert_eq!(self.tag, 0);
let uval = OptOptionsMember { some: val };
unsafe { *self.member.as_mut_ptr() = uval };
}
pub fn is_some(&self) -> bool {
self.tag == 0
}
pub fn new_none() -> Self {
Self::new(1)
}
pub fn is_none(&self) -> bool {
self.tag == 1
}
}
pub type OptSymmetricKeyU = u8;
#[allow(non_snake_case)]
pub mod OPT_SYMMETRIC_KEY_U {
use super::OptSymmetricKeyU;
pub const SOME: OptSymmetricKeyU = 0;
pub const NONE: OptSymmetricKeyU = 1;
}
#[repr(C)]
pub union OptSymmetricKeyMember {
some: SymmetricKey, }
#[repr(C, packed)]
pub struct OptSymmetricKey {
pub tag: u8,
__pad8_0: u8,
__pad16_0: u16,
__pad32_0: u32,
pub member: std::mem::MaybeUninit<OptSymmetricKeyMember>,
}
impl OptSymmetricKey {
fn new(tag: u8) -> Self {
let mut tu = unsafe { std::mem::zeroed::<Self>() };
tu.tag = tag;
tu
}
pub fn new_some(val: SymmetricKey) -> Self {
let mut tu = Self::new(0);
tu.member = std::mem::MaybeUninit::new(OptSymmetricKeyMember { some: val });
tu
}
pub fn into_some(self) -> SymmetricKey {
assert_eq!(self.tag, 0);
unsafe { self.member.assume_init().some }
}
pub fn set_some(&mut self, val: SymmetricKey) {
assert_eq!(self.tag, 0);
let uval = OptSymmetricKeyMember { some: val };
unsafe { *self.member.as_mut_ptr() = uval };
}
pub fn is_some(&self) -> bool {
self.tag == 0
}
pub fn new_none() -> Self {
Self::new(1)
}
pub fn is_none(&self) -> bool {
self.tag == 1
}
}
pub fn symmetric_key_generate(
algorithm_ptr: WasiPtr<Char8>,
algorithm_len: usize,
options: OptOptions,
) -> Result<SymmetricKey, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_key_generate(
algorithm_ptr: WasiPtr<Char8>,
algorithm_len: usize,
options: OptOptions,
result_ptr: WasiMutPtr<SymmetricKey>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_key_generate(
algorithm_ptr,
algorithm_len,
options,
result_ptr.as_mut_ptr(),
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_key_import(
algorithm_ptr: WasiPtr<Char8>,
algorithm_len: usize,
raw: WasiPtr<u8>,
raw_len: Size,
) -> Result<SymmetricKey, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_key_import(
algorithm_ptr: WasiPtr<Char8>,
algorithm_len: usize,
raw: WasiPtr<u8>,
raw_len: Size,
result_ptr: WasiMutPtr<SymmetricKey>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_key_import(
algorithm_ptr,
algorithm_len,
raw,
raw_len,
result_ptr.as_mut_ptr(),
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_key_export(symmetric_key: SymmetricKey) -> Result<ArrayOutput, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_key_export(
symmetric_key: SymmetricKey,
result_ptr: WasiMutPtr<ArrayOutput>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe { symmetric_key_export(symmetric_key, result_ptr.as_mut_ptr()) };
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_key_close(symmetric_key: SymmetricKey) -> Result<(), Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_key_close(symmetric_key: SymmetricKey) -> CryptoErrno;
}
let res = unsafe { symmetric_key_close(symmetric_key) };
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(())
}
pub fn symmetric_key_generate_managed(
secrets_manager: SecretsManager,
algorithm_ptr: WasiPtr<Char8>,
algorithm_len: usize,
options: OptOptions,
) -> Result<SymmetricKey, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_key_generate_managed(
secrets_manager: SecretsManager,
algorithm_ptr: WasiPtr<Char8>,
algorithm_len: usize,
options: OptOptions,
result_ptr: WasiMutPtr<SymmetricKey>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_key_generate_managed(
secrets_manager,
algorithm_ptr,
algorithm_len,
options,
result_ptr.as_mut_ptr(),
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_key_store_managed(
secrets_manager: SecretsManager,
symmetric_key: SymmetricKey,
symmetric_key_id: WasiMutPtr<u8>,
symmetric_key_id_max_len: Size,
) -> Result<(), Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_key_store_managed(
secrets_manager: SecretsManager,
symmetric_key: SymmetricKey,
symmetric_key_id: WasiMutPtr<u8>,
symmetric_key_id_max_len: Size,
) -> CryptoErrno;
}
let res = unsafe {
symmetric_key_store_managed(
secrets_manager,
symmetric_key,
symmetric_key_id,
symmetric_key_id_max_len,
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(())
}
pub fn symmetric_key_replace_managed(
secrets_manager: SecretsManager,
symmetric_key_old: SymmetricKey,
symmetric_key_new: SymmetricKey,
) -> Result<Version, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_key_replace_managed(
secrets_manager: SecretsManager,
symmetric_key_old: SymmetricKey,
symmetric_key_new: SymmetricKey,
result_ptr: WasiMutPtr<Version>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_key_replace_managed(
secrets_manager,
symmetric_key_old,
symmetric_key_new,
result_ptr.as_mut_ptr(),
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_key_id(
symmetric_key: SymmetricKey,
symmetric_key_id: WasiMutPtr<u8>,
symmetric_key_id_max_len: Size,
) -> Result<(Size, Version), Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_key_id(
symmetric_key: SymmetricKey,
symmetric_key_id: WasiMutPtr<u8>,
symmetric_key_id_max_len: Size,
result_0_ptr: WasiMutPtr<Size>,
result_1_ptr: WasiMutPtr<Version>,
) -> CryptoErrno;
}
let mut result_0_ptr = std::mem::MaybeUninit::uninit();
let mut result_1_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_key_id(
symmetric_key,
symmetric_key_id,
symmetric_key_id_max_len,
result_0_ptr.as_mut_ptr(),
result_1_ptr.as_mut_ptr(),
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { (result_0_ptr.assume_init(), result_1_ptr.assume_init()) })
}
pub fn symmetric_key_from_id(
secrets_manager: SecretsManager,
symmetric_key_id: WasiPtr<u8>,
symmetric_key_id_len: Size,
symmetric_key_version: Version,
) -> Result<SymmetricKey, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_key_from_id(
secrets_manager: SecretsManager,
symmetric_key_id: WasiPtr<u8>,
symmetric_key_id_len: Size,
symmetric_key_version: Version,
result_ptr: WasiMutPtr<SymmetricKey>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_key_from_id(
secrets_manager,
symmetric_key_id,
symmetric_key_id_len,
symmetric_key_version,
result_ptr.as_mut_ptr(),
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_state_open(
algorithm_ptr: WasiPtr<Char8>,
algorithm_len: usize,
key: OptSymmetricKey,
options: OptOptions,
) -> Result<SymmetricState, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_open(
algorithm_ptr: WasiPtr<Char8>,
algorithm_len: usize,
key: OptSymmetricKey,
options: OptOptions,
result_ptr: WasiMutPtr<SymmetricState>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_state_open(
algorithm_ptr,
algorithm_len,
key,
options,
result_ptr.as_mut_ptr(),
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_state_options_get(
handle: SymmetricState,
name_ptr: WasiPtr<Char8>,
name_len: usize,
value: WasiMutPtr<u8>,
value_max_len: Size,
) -> Result<Size, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_options_get(
handle: SymmetricState,
name_ptr: WasiPtr<Char8>,
name_len: usize,
value: WasiMutPtr<u8>,
value_max_len: Size,
result_ptr: WasiMutPtr<Size>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_state_options_get(
handle,
name_ptr,
name_len,
value,
value_max_len,
result_ptr.as_mut_ptr(),
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_state_options_get_u_64(
handle: SymmetricState,
name_ptr: WasiPtr<Char8>,
name_len: usize,
) -> Result<U64, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_options_get_u_64(
handle: SymmetricState,
name_ptr: WasiPtr<Char8>,
name_len: usize,
result_ptr: WasiMutPtr<U64>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_state_options_get_u_64(handle, name_ptr, name_len, result_ptr.as_mut_ptr())
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_state_close(handle: SymmetricState) -> Result<(), Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_close(handle: SymmetricState) -> CryptoErrno;
}
let res = unsafe { symmetric_state_close(handle) };
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(())
}
pub fn symmetric_state_absorb(
handle: SymmetricState,
data: WasiPtr<u8>,
data_len: Size,
) -> Result<(), Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_absorb(
handle: SymmetricState,
data: WasiPtr<u8>,
data_len: Size,
) -> CryptoErrno;
}
let res = unsafe { symmetric_state_absorb(handle, data, data_len) };
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(())
}
pub fn symmetric_state_squeeze(
handle: SymmetricState,
out: WasiMutPtr<u8>,
out_len: Size,
) -> Result<(), Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_squeeze(
handle: SymmetricState,
out: WasiMutPtr<u8>,
out_len: Size,
) -> CryptoErrno;
}
let res = unsafe { symmetric_state_squeeze(handle, out, out_len) };
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(())
}
pub fn symmetric_state_squeeze_tag(handle: SymmetricState) -> Result<SymmetricTag, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_squeeze_tag(
handle: SymmetricState,
result_ptr: WasiMutPtr<SymmetricTag>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe { symmetric_state_squeeze_tag(handle, result_ptr.as_mut_ptr()) };
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_state_squeeze_key(
handle: SymmetricState,
alg_str_ptr: WasiPtr<Char8>,
alg_str_len: usize,
) -> Result<SymmetricKey, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_squeeze_key(
handle: SymmetricState,
alg_str_ptr: WasiPtr<Char8>,
alg_str_len: usize,
result_ptr: WasiMutPtr<SymmetricKey>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_state_squeeze_key(handle, alg_str_ptr, alg_str_len, result_ptr.as_mut_ptr())
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_state_max_tag_len(handle: SymmetricState) -> Result<Size, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_max_tag_len(
handle: SymmetricState,
result_ptr: WasiMutPtr<Size>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe { symmetric_state_max_tag_len(handle, result_ptr.as_mut_ptr()) };
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_state_encrypt(
handle: SymmetricState,
out: WasiMutPtr<u8>,
out_len: Size,
data: WasiPtr<u8>,
data_len: Size,
) -> Result<Size, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_encrypt(
handle: SymmetricState,
out: WasiMutPtr<u8>,
out_len: Size,
data: WasiPtr<u8>,
data_len: Size,
result_ptr: WasiMutPtr<Size>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_state_encrypt(
handle,
out,
out_len,
data,
data_len,
result_ptr.as_mut_ptr(),
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_state_encrypt_detached(
handle: SymmetricState,
out: WasiMutPtr<u8>,
out_len: Size,
data: WasiPtr<u8>,
data_len: Size,
) -> Result<SymmetricTag, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_encrypt_detached(
handle: SymmetricState,
out: WasiMutPtr<u8>,
out_len: Size,
data: WasiPtr<u8>,
data_len: Size,
result_ptr: WasiMutPtr<SymmetricTag>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_state_encrypt_detached(
handle,
out,
out_len,
data,
data_len,
result_ptr.as_mut_ptr(),
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_state_decrypt(
handle: SymmetricState,
out: WasiMutPtr<u8>,
out_len: Size,
data: WasiPtr<u8>,
data_len: Size,
) -> Result<Size, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_decrypt(
handle: SymmetricState,
out: WasiMutPtr<u8>,
out_len: Size,
data: WasiPtr<u8>,
data_len: Size,
result_ptr: WasiMutPtr<Size>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_state_decrypt(
handle,
out,
out_len,
data,
data_len,
result_ptr.as_mut_ptr(),
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_state_decrypt_detached(
handle: SymmetricState,
out: WasiMutPtr<u8>,
out_len: Size,
data: WasiPtr<u8>,
data_len: Size,
raw_tag: WasiPtr<u8>,
raw_tag_len: Size,
) -> Result<Size, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_decrypt_detached(
handle: SymmetricState,
out: WasiMutPtr<u8>,
out_len: Size,
data: WasiPtr<u8>,
data_len: Size,
raw_tag: WasiPtr<u8>,
raw_tag_len: Size,
result_ptr: WasiMutPtr<Size>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe {
symmetric_state_decrypt_detached(
handle,
out,
out_len,
data,
data_len,
raw_tag,
raw_tag_len,
result_ptr.as_mut_ptr(),
)
};
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_state_ratchet(handle: SymmetricState) -> Result<(), Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_state_ratchet(handle: SymmetricState) -> CryptoErrno;
}
let res = unsafe { symmetric_state_ratchet(handle) };
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(())
}
pub fn symmetric_tag_len(symmetric_tag: SymmetricTag) -> Result<Size, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_tag_len(
symmetric_tag: SymmetricTag,
result_ptr: WasiMutPtr<Size>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe { symmetric_tag_len(symmetric_tag, result_ptr.as_mut_ptr()) };
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_tag_pull(
symmetric_tag: SymmetricTag,
buf: WasiMutPtr<u8>,
buf_len: Size,
) -> Result<Size, Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_tag_pull(
symmetric_tag: SymmetricTag,
buf: WasiMutPtr<u8>,
buf_len: Size,
result_ptr: WasiMutPtr<Size>,
) -> CryptoErrno;
}
let mut result_ptr = std::mem::MaybeUninit::uninit();
let res = unsafe { symmetric_tag_pull(symmetric_tag, buf, buf_len, result_ptr.as_mut_ptr()) };
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(unsafe { result_ptr.assume_init() })
}
pub fn symmetric_tag_verify(
symmetric_tag: SymmetricTag,
expected_raw_tag_ptr: WasiPtr<u8>,
expected_raw_tag_len: Size,
) -> Result<(), Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_tag_verify(
symmetric_tag: SymmetricTag,
expected_raw_tag_ptr: WasiPtr<u8>,
expected_raw_tag_len: Size,
) -> CryptoErrno;
}
let res =
unsafe { symmetric_tag_verify(symmetric_tag, expected_raw_tag_ptr, expected_raw_tag_len) };
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(())
}
pub fn symmetric_tag_close(symmetric_tag: SymmetricTag) -> Result<(), Error> {
#[link(wasm_import_module = "wasi_ephemeral_crypto_symmetric")]
extern "C" {
fn symmetric_tag_close(symmetric_tag: SymmetricTag) -> CryptoErrno;
}
let res = unsafe { symmetric_tag_close(symmetric_tag) };
if res != 0 {
return Err(Error::WasiError(res as _));
}
Ok(())
}