diff --git a/book/src/applet/prelude/store.rs b/book/src/applet/prelude/store.rs index e20f4708..5c918a04 100644 --- a/book/src/applet/prelude/store.rs +++ b/book/src/applet/prelude/store.rs @@ -96,7 +96,7 @@ impl<'a> Command<'a> { //} ANCHOR_END: impl_parse //{ ANCHOR: process_signature - fn process(&self) -> Result<(), store::Error> { + fn process(&self) -> Result<(), Error> { //} ANCHOR_END: process_signature //{ ANCHOR: process_insert match self { @@ -160,21 +160,21 @@ impl Key { } //{ ANCHOR: helpers -fn insert(key: &Key, value: &[u8]) -> Result<(), store::Error> { +fn insert(key: &Key, value: &[u8]) -> Result<(), Error> { match key { Key::Exact(key) => store::insert(*key, value), Key::Range(keys) => store::fragment::insert(keys.clone(), value), } } -fn find(key: &Key) -> Result>, store::Error> { +fn find(key: &Key) -> Result>, Error> { match key { Key::Exact(key) => store::find(*key), Key::Range(keys) => store::fragment::find(keys.clone()), } } -fn remove(key: &Key) -> Result<(), store::Error> { +fn remove(key: &Key) -> Result<(), Error> { match key { Key::Exact(key) => store::remove(*key), Key::Range(keys) => store::fragment::remove(keys.clone()), diff --git a/crates/api-desc/CHANGELOG.md b/crates/api-desc/CHANGELOG.md index 14e14810..79249658 100644 --- a/crates/api-desc/CHANGELOG.md +++ b/crates/api-desc/CHANGELOG.md @@ -4,6 +4,8 @@ ### Minor +- Remove isize conversion functions for enums +- Remove custom error types - Add `gpio` module - Add `platform::version()` - Add `radio::ble` module diff --git a/crates/api-desc/src/crypto.rs b/crates/api-desc/src/crypto.rs index 1c12b0f2..34004255 100644 --- a/crates/api-desc/src/crypto.rs +++ b/crates/api-desc/src/crypto.rs @@ -24,24 +24,6 @@ pub(crate) fn new() -> Item { /// Cryptographic operations. }; let name = "crypto".into(); - let items = vec![ - item! { - /// Describes errors on cryptographic operations. - enum Error { - /// A function pre-condition was broken. - InvalidArgument = 0, - - /// An operation is unsupported. - Unsupported = 1, - - /// An RNG operation failed. - RngFailure = 2, - } - }, - ccm::new(), - ec::new(), - gcm::new(), - hash::new(), - ]; + let items = vec![ccm::new(), ec::new(), gcm::new(), hash::new()]; Item::Mod(Mod { docs, name, items }) } diff --git a/crates/api-desc/src/crypto/ccm.rs b/crates/api-desc/src/crypto/ccm.rs index d1cff300..48117df2 100644 --- a/crates/api-desc/src/crypto/ccm.rs +++ b/crates/api-desc/src/crypto/ccm.rs @@ -53,8 +53,7 @@ pub(crate) fn new() -> Item { /// Its length must be `len + 4` bytes. cipher: *mut u8, } -> { - /// Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - /// otherwise. + /// Zero on success. Negative on error. res: isize, } }, @@ -83,8 +82,7 @@ pub(crate) fn new() -> Item { /// Its length must be provided in the `len` field. clear: *mut u8, } -> { - /// Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - /// otherwise. + /// Zero on success. Negative on error. res: isize, } }, diff --git a/crates/api-desc/src/crypto/ec.rs b/crates/api-desc/src/crypto/ec.rs index 6fd58c34..f08a1f81 100644 --- a/crates/api-desc/src/crypto/ec.rs +++ b/crates/api-desc/src/crypto/ec.rs @@ -82,8 +82,7 @@ pub(crate) fn new() -> Item { /// The y coordinate in SEC1 encoding. y: *mut u8, } -> { - /// Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - /// otherwise. + /// Zero on success. Negative on error. res: isize, } }, @@ -108,8 +107,7 @@ pub(crate) fn new() -> Item { /// The y coordinate of the output point in SEC1 encoding. out_y: *mut u8, } -> { - /// Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - /// otherwise. + /// Zero on success. Negative on error. res: isize, } }, @@ -131,8 +129,7 @@ pub(crate) fn new() -> Item { /// The s signature component in SEC1 encoding. s: *mut u8, } -> { - /// Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - /// otherwise. + /// Zero on success. Negative on error. res: isize, } }, @@ -157,8 +154,7 @@ pub(crate) fn new() -> Item { /// The s signature component in SEC1 encoding. s: *const u8, } -> { - /// 1 if the signature is valid, 0 if invalid, and bitwise complement of - /// [`Error`](crate::crypto::Error) otherwise. + /// One if the signature is valid. Zero if invalid. Negative on error. res: isize, } }, diff --git a/crates/api-desc/src/crypto/gcm.rs b/crates/api-desc/src/crypto/gcm.rs index 64098e8a..14dd169c 100644 --- a/crates/api-desc/src/crypto/gcm.rs +++ b/crates/api-desc/src/crypto/gcm.rs @@ -78,8 +78,7 @@ pub(crate) fn new() -> Item { /// The authentication tag (see [`super::tag_length()`]). tag: *mut u8, } -> { - /// Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - /// otherwise. + /// Zero on success. Negative on error. res: isize, } }, @@ -113,8 +112,7 @@ pub(crate) fn new() -> Item { /// The clear text. clear: *mut u8, } -> { - /// Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - /// otherwise. + /// Zero on success. Negative on error. res: isize, } }, diff --git a/crates/api-desc/src/crypto/hash.rs b/crates/api-desc/src/crypto/hash.rs index 177bb941..1558a170 100644 --- a/crates/api-desc/src/crypto/hash.rs +++ b/crates/api-desc/src/crypto/hash.rs @@ -46,8 +46,7 @@ pub(crate) fn new() -> Item { /// The hash algorithm. algorithm: usize, } -> { - /// A non-negative identifier on success, bitwise complement of - /// [`Error`](crate::crypto::Error) otherwise. + /// Negative on error. The identifier otherwise. id: isize, } }, @@ -83,8 +82,7 @@ pub(crate) fn new() -> Item { /// without computing the digest. digest: *mut u8, } -> { - /// Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - /// otherwise. + /// Zero on success. Negative on error. res: isize, } }, @@ -112,8 +110,7 @@ pub(crate) fn new() -> Item { /// If greater than 64 bytes, the key will be itself hashed. key_len: usize, } -> { - /// A non-negative identifier on success, bitwise complement of - /// [`Error`](crate::crypto::Error) otherwise. + /// Negative on error. The identifier otherwise. id: isize, } }, @@ -149,8 +146,7 @@ pub(crate) fn new() -> Item { /// without computing the hmac. hmac: *mut u8, } -> { - /// Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - /// otherwise. + /// Zero on success. Negative otherwise. res: isize, } }, @@ -197,8 +193,7 @@ pub(crate) fn new() -> Item { okm_len: usize, } -> { - /// Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - /// otherwise. + /// Zero on success. Negative on error. res: isize, } }, diff --git a/crates/api-desc/src/lib.rs b/crates/api-desc/src/lib.rs index e14599fc..5b5a67c6 100644 --- a/crates/api-desc/src/lib.rs +++ b/crates/api-desc/src/lib.rs @@ -205,9 +205,6 @@ impl Enum { impl From<#name> for crate::U32 { fn from(x: #name) -> Self { (x as u32).into() } } - impl From<#name> for crate::U32 { - fn from(x: #name) -> Self { (!(x as u32)).into() } - } } } @@ -221,12 +218,6 @@ impl Enum { (x as u32).try_into().unwrap() } } - impl #name { - pub fn to_result(x: isize) -> Result { - let y = x as usize; - if x < 0 { Err((!y).into()) } else { Ok(y) } - } - } } } @@ -241,20 +232,17 @@ impl Enum { #[repr(u32)] pub enum #name { #(#variants),* } impl TryFrom for #name { - type Error = (); + type Error = wasefire_error::Error; fn try_from(x: u32) -> Result { if x < #num_variants as u32 { // SAFETY: See `tests::enum_values_are_valid()`. Ok(unsafe { core::mem::transmute(x) }) } else { - Err(()) + Err(wasefire_error::Error::internal(0)) } } } - impl From<#name> for isize { - fn from(x: #name) -> Self { !(x as usize) as isize } - } } } diff --git a/crates/api-desc/src/radio.rs b/crates/api-desc/src/radio.rs index e51618eb..ff5e6f59 100644 --- a/crates/api-desc/src/radio.rs +++ b/crates/api-desc/src/radio.rs @@ -21,14 +21,6 @@ pub(crate) fn new() -> Item { /// Radio operations. }; let name = "radio".into(); - let items = vec![ - item! { - /// Describes errors on radio operations. - enum Error { - Unknown = 0, - } - }, - ble::new(), - ]; + let items = vec![ble::new()]; Item::Mod(Mod { docs, name, items }) } diff --git a/crates/api-desc/src/radio/ble.rs b/crates/api-desc/src/radio/ble.rs index bb0a20a1..894cb9a3 100644 --- a/crates/api-desc/src/radio/ble.rs +++ b/crates/api-desc/src/radio/ble.rs @@ -46,8 +46,8 @@ pub(crate) fn new() -> Item { /// Pointer to the [`super::Advertisement`] packet. ptr: *mut u8, } -> { - /// One if a packet was read. Zero if there was no packet to read. Otherwise - /// complement of error number. + /// One if a packet was read. Zero if there was no packet to read. Negative on + /// error. res: isize, } }, diff --git a/crates/api-desc/src/store.rs b/crates/api-desc/src/store.rs index ab3536f8..eb81cfe0 100644 --- a/crates/api-desc/src/store.rs +++ b/crates/api-desc/src/store.rs @@ -22,25 +22,6 @@ pub(crate) fn new() -> Item { }; let name = "store".into(); let items = vec![ - item! { - /// Describes errors interacting with the store. - enum Error { - /// A function pre-condition was broken. - InvalidArgument = 0, - - /// The store is full. - NoCapacity = 1, - - /// The store reached its end of life. - NoLifetime = 2, - - /// An operation to the underlying storage failed. - StorageError = 3, - - /// The underlying storage doesn't match the store invariant. - InvalidStorage = 4, - } - }, item! { /// Inserts an entry in the store. /// @@ -57,7 +38,7 @@ pub(crate) fn new() -> Item { /// Length of the value. len: usize, } -> { - /// Zero for success. Otherwise complement of error number. + /// Zero for success. Negative on error. res: isize, } }, @@ -69,7 +50,7 @@ pub(crate) fn new() -> Item { /// Key of the entry. key: usize, } -> { - /// Zero for success. Otherwise complement of error number. + /// Zero for success. Negative on error. res: isize, } }, @@ -97,11 +78,11 @@ pub(crate) fn new() -> Item { #[cfg(feature = "multivalue")] ptr: *mut u8, - /// Length of the value if non-negative. Otherwise complement of error number. + /// Negative on error. Otherwise length of the value. #[cfg(feature = "multivalue")] len: isize, - /// One if found. Zero if not found. Otherwise complement of error number. + /// One if found. Zero if not found. Negative on error. #[cfg(not(feature = "multivalue"))] res: isize, } diff --git a/crates/api-desc/src/usb.rs b/crates/api-desc/src/usb.rs index 0f22d856..231f50e8 100644 --- a/crates/api-desc/src/usb.rs +++ b/crates/api-desc/src/usb.rs @@ -21,14 +21,6 @@ pub(crate) fn new() -> Item { /// USB operations. }; let name = "usb".into(); - let items = vec![ - item! { - /// Describes errors on USB operations. - enum Error { - Unknown = 0, - } - }, - serial::new(), - ]; + let items = vec![serial::new()]; Item::Mod(Mod { docs, name, items }) } diff --git a/crates/api-desc/src/usb/serial.rs b/crates/api-desc/src/usb/serial.rs index af594928..c2f9c357 100644 --- a/crates/api-desc/src/usb/serial.rs +++ b/crates/api-desc/src/usb/serial.rs @@ -76,7 +76,7 @@ pub(crate) fn new() -> Item { item! { /// Flushs the USB serial. fn flush "usf" {} -> { - /// Zero on success, -1 on error. + /// Zero on success. Negative on error. res: isize, } }, diff --git a/crates/api/CHANGELOG.md b/crates/api/CHANGELOG.md index 1cda05dc..0ada0175 100644 --- a/crates/api/CHANGELOG.md +++ b/crates/api/CHANGELOG.md @@ -6,6 +6,10 @@ - Update `wasefire-applet-api-macro` version +### Minor + +- Implement conversion from types involving `Error` to `U32` + ### Patch - Build docs.rs for `wasm32-unknown-unknown` only @@ -68,4 +72,4 @@ ## 0.1.0 - + diff --git a/crates/api/Cargo.lock b/crates/api/Cargo.lock index cd270166..eadbd85e 100644 --- a/crates/api/Cargo.lock +++ b/crates/api/Cargo.lock @@ -104,6 +104,26 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "proc-macro2" version = "1.0.70" @@ -169,6 +189,7 @@ dependencies = [ "bytemuck", "sealed", "wasefire-applet-api-macro", + "wasefire-error", "wasefire-logger", ] @@ -193,6 +214,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-logger" version = "0.1.4-git" diff --git a/crates/api/Cargo.toml b/crates/api/Cargo.toml index ce33c6dd..b494b13d 100644 --- a/crates/api/Cargo.toml +++ b/crates/api/Cargo.toml @@ -19,6 +19,7 @@ features = ["wasm"] bytemuck = { version = "1.14.0", default-features = false, features = ["derive"] } sealed = { version = "0.5.0", default-features = false, optional = true } wasefire-applet-api-macro = { version = "0.6.0-git", path = "../api-macro" } +wasefire-error = { version = "0.1.0-git", path = "../error" } wasefire-logger = { version = "0.1.4-git", path = "../logger", optional = true } [features] diff --git a/crates/api/src/host.rs b/crates/api/src/host.rs index 108e1d4f..ccc436d2 100644 --- a/crates/api/src/host.rs +++ b/crates/api/src/host.rs @@ -17,6 +17,7 @@ use core::marker::PhantomData; use core::ops::Deref; use sealed::sealed; +use wasefire_error::Error; /// Describes an interface function at type-level. #[sealed(pub(crate))] @@ -81,6 +82,30 @@ impl From for U32 { } } +impl From for U32 { + fn from(error: Error) -> Self { + (Error::encode(Err(error)) as u32).into() + } +} + +impl From> for U32 { + fn from(result: Result<(), Error>) -> Self { + result.map(|()| 0).into() + } +} + +impl From> for U32 { + fn from(result: Result) -> Self { + result.map(|x| x as u32).into() + } +} + +impl From> for U32 { + fn from(result: Result) -> Self { + (Error::encode(result) as u32).into() + } +} + #[sealed(pub(crate))] pub trait ArrayU32: Sized + Copy { const LENGTH: usize = core::mem::size_of::() / core::mem::size_of::(); diff --git a/crates/board/CHANGELOG.md b/crates/board/CHANGELOG.md index f55b70eb..358d1ef1 100644 --- a/crates/board/CHANGELOG.md +++ b/crates/board/CHANGELOG.md @@ -4,6 +4,7 @@ ### Major +- Replace `Error` type with `wasefire-error` - Add `Api::Gpio` for low-level GPIOs - Add `platform::Api::version()` - Add `Api::Radio` for radio APIs diff --git a/crates/board/Cargo.lock b/crates/board/Cargo.lock index fc0bc665..9ca619f8 100644 --- a/crates/board/Cargo.lock +++ b/crates/board/Cargo.lock @@ -492,7 +492,16 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive 0.7.1", ] [[package]] @@ -506,6 +515,17 @@ dependencies = [ "syn 2.0.41", ] +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "opaque-debug" version = "0.3.0" @@ -780,7 +800,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e73e438f527e567fb3982f2370967821fab4f5aea84c42e218a211dd2002b6a2" dependencies = [ "heapless", - "num_enum", + "num_enum 0.6.1", "portable-atomic", ] @@ -814,6 +834,7 @@ dependencies = [ "bytemuck", "sealed", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -862,10 +883,18 @@ dependencies = [ "usb-device", "usbd-serial", "wasefire-applet-api", + "wasefire-error", "wasefire-logger", "wasefire-store", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum 0.7.1", +] + [[package]] name = "wasefire-logger" version = "0.1.4-git" diff --git a/crates/board/Cargo.toml b/crates/board/Cargo.toml index cedb2d5f..9bb3eeb7 100644 --- a/crates/board/Cargo.toml +++ b/crates/board/Cargo.toml @@ -36,6 +36,7 @@ typenum = { version = "1.17.0", default-features = false } usb-device = { version = "0.3.1", default-features = false } usbd-serial = { version = "0.2.0", default-features = false } wasefire-applet-api = { version = "0.6.0-git", path = "../api", features = ["host"] } +wasefire-error = { version = "0.1.0-git", path = "../error" } wasefire-logger = { version = "0.1.4-git", path = "../logger" } wasefire-store = { version = "0.2.3-git", path = "../store" } diff --git a/crates/board/src/crypto/aead.rs b/crates/board/src/crypto/aead.rs index cf1531cb..6683a115 100644 --- a/crates/board/src/crypto/aead.rs +++ b/crates/board/src/crypto/aead.rs @@ -121,7 +121,7 @@ mod software { cipher.copy_from_slice(clear); } tag.copy_from_slice( - &aead.encrypt_in_place_detached(iv, aad, cipher).map_err(|_| Error::World)?, + &aead.encrypt_in_place_detached(iv, aad, cipher).map_err(|_| Error::world(0))?, ); Ok(()) } @@ -134,7 +134,7 @@ mod software { if let Some(cipher) = cipher { clear.copy_from_slice(cipher); } - aead.decrypt_in_place_detached(iv, aad, clear, tag).map_err(|_| Error::World) + aead.decrypt_in_place_detached(iv, aad, clear, tag).map_err(|_| Error::world(0)) } } } diff --git a/crates/board/src/crypto/ecc.rs b/crates/board/src/crypto/ecc.rs index fc6236bd..48f1da0f 100644 --- a/crates/board/src/crypto/ecc.rs +++ b/crates/board/src/crypto/ecc.rs @@ -142,7 +142,7 @@ mod software { fn ecdsa_sign(d: &Int, m: &Int, r: &mut Int, s: &mut Int) -> Result<(), Error> { let d = Self::scalar_from_int(d)?; let (signature, _) = - d.try_sign_prehashed_rfc6979::(m, &[]).map_err(|_| Error::World)?; + d.try_sign_prehashed_rfc6979::(m, &[]).map_err(|_| Error::world(0))?; r.copy_from_slice(&Self::scalar_to_int(signature.r())); s.copy_from_slice(&Self::scalar_to_int(signature.s())); Ok(()) @@ -152,9 +152,9 @@ mod software { m: &Int, x: &Int, y: &Int, r: &Int, s: &Int, ) -> Result { let p = EncodedPoint::::from_affine_coordinates(x, y, false); - let p = VerifyingKey::::from_encoded_point(&p).map_err(|_| Error::User)?; + let p = VerifyingKey::::from_encoded_point(&p).map_err(|_| Error::user(0))?; let signature = - Signature::from_scalars(r.clone(), s.clone()).map_err(|_| Error::User)?; + Signature::from_scalars(r.clone(), s.clone()).map_err(|_| Error::user(0))?; Ok(p.verify_prehash(m, &signature).is_ok()) } } @@ -181,13 +181,13 @@ mod software { fn point_to_ints(p: &AffinePoint, x: &mut Int, y: &mut Int) -> Result<(), Error> { let p = p.to_encoded_point(false); - x.copy_from_slice(p.x().ok_or(Error::User)?); - y.copy_from_slice(p.y().ok_or(Error::User)?); + x.copy_from_slice(p.x().ok_or(Error::user(0))?); + y.copy_from_slice(p.y().ok_or(Error::user(0))?); Ok(()) } } fn convert(x: CtOption) -> Result { - Option::::from(x).ok_or(Error::User) + Option::::from(x).ok_or(Error::user(0)) } } diff --git a/crates/board/src/lib.rs b/crates/board/src/lib.rs index 5bb6ff0d..dc6c24f4 100644 --- a/crates/board/src/lib.rs +++ b/crates/board/src/lib.rs @@ -26,6 +26,7 @@ use core::marker::PhantomData; use core::ops::Deref; use derivative::Derivative; +pub use wasefire_error::Error; pub mod button; pub mod crypto; @@ -124,21 +125,6 @@ pub enum Event { Usb(usb::Event), } -/// Errors that interfaces may return. -/// -/// Because a board interfaces between the user and the world, there's 2 types of errors: those due -/// to the user and those due to the world. If the board itself errors, the error should be handled -/// internally: either by an automatic reset (in production) or by halting execution until a manual -/// reset (during testing to permit debugging). -#[derive(Debug, Copy, Clone)] -pub enum Error { - /// The user made an error. - User, - - /// The world made an error. - World, -} - pub type Button = ::Button; pub type Crypto = ::Crypto; pub type Debug = ::Debug; diff --git a/crates/board/src/platform.rs b/crates/board/src/platform.rs index c79c7345..db762c79 100644 --- a/crates/board/src/platform.rs +++ b/crates/board/src/platform.rs @@ -14,6 +14,8 @@ //! Platform interface. +use wasefire_error::Code; + use crate::{Error, Unsupported}; pub mod update; @@ -44,6 +46,6 @@ impl Api for Unsupported { } fn reboot() -> Result { - Err(Error::World) + Err(Error::internal(Code::NotImplemented)) } } diff --git a/crates/board/src/rng.rs b/crates/board/src/rng.rs index 6924bd8b..81a0929c 100644 --- a/crates/board/src/rng.rs +++ b/crates/board/src/rng.rs @@ -14,6 +14,8 @@ //! Random number generator interface. +use wasefire_error::Code; + use crate::{Error, Unsupported}; /// Random number generator interface. @@ -24,6 +26,6 @@ pub trait Api: Send { impl Api for Unsupported { fn fill_bytes(_: &mut [u8]) -> Result<(), Error> { - Err(Error::World) + Err(Error::internal(Code::NotImplemented)) } } diff --git a/crates/board/src/usb/serial.rs b/crates/board/src/usb/serial.rs index b66e0afa..7da9db12 100644 --- a/crates/board/src/usb/serial.rs +++ b/crates/board/src/usb/serial.rs @@ -138,7 +138,7 @@ impl Api for WithSerial { Err(UsbError::WouldBlock) => Ok(0), Err(e) => { log::debug!("{} = read({})", log::Debug2Format(&e), output.len()); - Err(Error::World) + Err(Error::world(0)) } } } @@ -156,7 +156,7 @@ impl Api for WithSerial { Err(UsbError::WouldBlock) => Ok(0), Err(e) => { log::debug!("{} = write({}{:?})", log::Debug2Format(&e), input.len(), input); - Err(Error::World) + Err(Error::world(0)) } } } @@ -174,7 +174,7 @@ impl Api for WithSerial { } Err(e) => { log::debug!("{} = flush()", log::Debug2Format(&e)); - break Err(Error::World); + break Err(Error::world(0)); } } } diff --git a/crates/error/CHANGELOG.md b/crates/error/CHANGELOG.md new file mode 100644 index 00000000..7bcc0814 --- /dev/null +++ b/crates/error/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 0.1.0-git + + diff --git a/crates/error/Cargo.lock b/crates/error/Cargo.lock new file mode 100644 index 00000000..0898d4ee --- /dev/null +++ b/crates/error/Cargo.lock @@ -0,0 +1,65 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "2.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] diff --git a/crates/error/Cargo.toml b/crates/error/Cargo.toml new file mode 100644 index 00000000..7e4f9d06 --- /dev/null +++ b/crates/error/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "wasefire-error" +version = "0.1.0-git" +authors = ["Julien Cretin "] +license = "Apache-2.0" +publish = true +edition = "2021" +description = "Wasefire API errors" +repository = "https://github.com/google/wasefire" +include = ["/src"] +keywords = ["embedded", "framework", "no-std"] +categories = ["embedded", "no-std"] + +[dependencies] +num_enum = { version = "0.7.1", default-features = false } diff --git a/crates/error/src/lib.rs b/crates/error/src/lib.rs new file mode 100644 index 00000000..4136890f --- /dev/null +++ b/crates/error/src/lib.rs @@ -0,0 +1,171 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Applet and board API errors. + +#![no_std] + +use num_enum::{IntoPrimitive, TryFromPrimitive, TryFromPrimitiveError}; + +/// API errors. +/// +/// Errors are equivalent to `u32` but only using the 24 least significant bits: 8 bits for the +/// error space and 16 bits for the error code. The 8 most significant bits are zero. It is possible +/// to encode a `Result` into a `i32` as long as the success value only uses the 31 +/// least significant bits. Non-negative values encode success, while negative values encode the +/// error by taking its bitwise complement (thus setting the 8 most significant bits to 1). +#[derive(Default, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)] +#[repr(transparent)] +pub struct Error(u32); + +impl Error { + /// Creates a new error. + pub fn new(space: impl SpaceParam, code: impl CodeParam) -> Self { + Error((space.into() as u32) << 16 | code.into() as u32) + } + + /// Returns the error space. + pub fn space(self) -> u8 { + (self.0 >> 16) as u8 + } + + /// Returns the error code. + pub fn code(self) -> u16 { + self.0 as u16 + } + + /// Creates a user error. + pub fn user(code: impl CodeParam) -> Self { + Error::new(Space::User, code) + } + + /// Creates an internal error. + pub fn internal(code: impl CodeParam) -> Self { + Error::new(Space::Internal, code) + } + + /// Creates a world error. + pub fn world(code: impl CodeParam) -> Self { + Error::new(Space::World, code) + } + + /// Decodes a signed integer as a result (where errors are negative values). + /// + /// # Panics + /// + /// Panics if the signed integer is smaller than -16777216 (0xff000000). + pub fn decode(result: i32) -> Result { + if result < 0 { + let error = !result as u32; + assert!(error & 0xff000000 == 0); + Err(Error(error)) + } else { + Ok(result as u32) + } + } + + /// Encodes a result (where errors are negative values) as a signed integer. + /// + /// # Panics + /// + /// Panics if the result is a success greater than 2147483647 (0x7fffffff). + pub fn encode(result: Result) -> i32 { + match result { + Ok(value) => { + let value = value as i32; + assert!(0 <= value); + value + } + Err(Error(error)) => !error as i32, + } + } +} + +pub trait SpaceParam: Into {} +impl SpaceParam for Space {} +impl SpaceParam for u8 {} + +pub trait CodeParam: Into {} +impl CodeParam for Code {} +impl CodeParam for u16 {} + +/// Common error spaces. +/// +/// Values from 0 to 127 (0x7f) are reserved for common error spaces and defined by this enum. +/// Values from 128 (0x80) to 255 (0xff) are reserved for implementation-specific error spaces. +#[derive(Debug, Copy, Clone, TryFromPrimitive, IntoPrimitive)] +#[non_exhaustive] +#[repr(u8)] +pub enum Space { + Generic = 0, + + /// The user made an error. + User = 1, + + /// The implementation failed. + Internal = 2, + + /// The world returned an error. + World = 3, +} + +/// Common error codes. +/// +/// Values from 0 to 32767 (0x7fff) are reserved for common error codes and defined by this enum. +/// Values from 32768 (0x8000) to 65535 (0xffff) are reserved for implementation-specific error +/// codes. +#[derive(Debug, Copy, Clone, TryFromPrimitive, IntoPrimitive)] +#[non_exhaustive] +#[repr(u16)] +pub enum Code { + Generic = 0, + NotImplemented = 1, + NotFound = 2, + BadSize = 3, + BadAlign = 4, + NoPermission = 5, + NotEnough = 6, + BadState = 7, +} + +impl core::fmt::Display for Error { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match Space::try_from_primitive(self.space()) { + Ok(x) => write!(f, "{x:?}")?, + Err(TryFromPrimitiveError { number: x }) => write!(f, "[{x:02x}]")?, + } + write!(f, ":")?; + match Code::try_from_primitive(self.code()) { + Ok(x) => write!(f, "{x:?}"), + Err(TryFromPrimitiveError { number: x }) => write!(f, "[{x:04x}]"), + } + } +} + +impl core::fmt::Debug for Error { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "{self}") + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn new_ok() { + assert_eq!(Error::new(Space::User, Code::BadSize), Error(0x010003)); + assert_eq!(Error::new(0xab, 0x1234u16), Error(0xab1234)); + } +} diff --git a/crates/error/test.sh b/crates/error/test.sh new file mode 100755 index 00000000..71993f35 --- /dev/null +++ b/crates/error/test.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +. "$(git rev-parse --show-toplevel)"/scripts/test-helper.sh + +test_helper + +cargo test +cargo check --target=thumbv7em-none-eabi +cargo check --target=wasm32-unknown-unknown diff --git a/crates/prelude/CHANGELOG.md b/crates/prelude/CHANGELOG.md index 58476a4c..801ba429 100644 --- a/crates/prelude/CHANGELOG.md +++ b/crates/prelude/CHANGELOG.md @@ -4,6 +4,7 @@ ### Major +- Remove custom error types and use `wasefire-error` instead - Rename `native` to `test` and use `native` for native applets ### Minor diff --git a/crates/prelude/Cargo.lock b/crates/prelude/Cargo.lock index a47a4a5f..10b1eb91 100644 --- a/crates/prelude/Cargo.lock +++ b/crates/prelude/Cargo.lock @@ -168,6 +168,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -295,6 +315,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", "zeroize", ] @@ -305,6 +326,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", "wasefire-logger", ] @@ -329,6 +351,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-logger" version = "0.1.4-git" diff --git a/crates/prelude/Cargo.toml b/crates/prelude/Cargo.toml index 47532b76..0089d254 100644 --- a/crates/prelude/Cargo.toml +++ b/crates/prelude/Cargo.toml @@ -26,6 +26,7 @@ rlsf = { version = "0.2.1", default-features = false } sealed = { version = "0.5.0", default-features = false } typenum = { version = "1.17.0", default-features = false } wasefire-applet-api = { version = "0.6.0-git", path = "../api", features = ["wasm"] } +wasefire-error = { version = "0.1.0-git", path = "../error" } wasefire-sync = { version = "0.1.0-git", path = "../sync" } zeroize = { version = "1.7.0", default-features = false, features = ["derive"], optional = true } diff --git a/crates/prelude/src/crypto.rs b/crates/prelude/src/crypto.rs index d41adcb9..de77dd1b 100644 --- a/crates/prelude/src/crypto.rs +++ b/crates/prelude/src/crypto.rs @@ -18,6 +18,3 @@ pub mod ccm; pub mod ec; pub mod gcm; pub mod hash; - -/// Errors returned by cryptographic operations. -pub use wasefire_applet_api::crypto::Error; diff --git a/crates/prelude/src/crypto/ccm.rs b/crates/prelude/src/crypto/ccm.rs index 4a6cf377..0484eb08 100644 --- a/crates/prelude/src/crypto/ccm.rs +++ b/crates/prelude/src/crypto/ccm.rs @@ -19,7 +19,7 @@ use alloc::vec::Vec; use wasefire_applet_api::crypto::ccm as api; -use super::Error; +use crate::{convert_unit, Error}; /// Whether AES-CCM is supported. pub fn is_supported() -> bool { @@ -39,13 +39,13 @@ pub fn encrypt(key: &[u8; 16], nonce: &[u8; 8], clear: &[u8]) -> Result, cipher: cipher.as_mut_ptr(), }; let api::encrypt::Results { res } = unsafe { api::encrypt(params) }; - Error::to_result(res)?; + convert_unit(res)?; Ok(cipher) } /// Returns the cleartext given a ciphertext, a key, and a nonce. pub fn decrypt(key: &[u8; 16], nonce: &[u8; 8], cipher: &[u8]) -> Result, Error> { - let len = cipher.len().checked_sub(4).ok_or(Error::InvalidArgument)?; + 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(), @@ -55,6 +55,6 @@ pub fn decrypt(key: &[u8; 16], nonce: &[u8; 8], cipher: &[u8]) -> Result clear: clear.as_mut_ptr(), }; let api::decrypt::Results { res } = unsafe { api::decrypt(params) }; - Error::to_result(res)?; + convert_unit(res)?; Ok(clear) } diff --git a/crates/prelude/src/crypto/ec.rs b/crates/prelude/src/crypto/ec.rs index 68a2d3f0..abf36805 100644 --- a/crates/prelude/src/crypto/ec.rs +++ b/crates/prelude/src/crypto/ec.rs @@ -22,7 +22,7 @@ use wasefire_applet_api::crypto::ec as api; use wasefire_applet_api::crypto::hash::Algorithm; use super::hash::hkdf; -use super::Error; +use crate::{convert_bool, convert_unit, Error}; /// ECDSA private key. pub struct EcdsaPrivate(Private); @@ -328,8 +328,7 @@ impl Curve for T { y: y.as_mut_ptr(), }; let api::base_point_mul::Results { res } = unsafe { api::base_point_mul(params) }; - Error::to_result(res)?; - Ok(()) + convert_unit(res) } fn point_mul( @@ -345,8 +344,7 @@ impl Curve for T { out_y: out_y.as_mut_ptr(), }; let api::point_mul::Results { res } = unsafe { api::point_mul(params) }; - Error::to_result(res)?; - Ok(()) + convert_unit(res) } fn ecdsa_sign( @@ -360,8 +358,7 @@ impl Curve for T { s: s.as_mut_ptr(), }; let api::ecdsa_sign::Results { res } = unsafe { api::ecdsa_sign(params) }; - Error::to_result(res)?; - Ok(()) + convert_unit(res) } fn ecdsa_verify( @@ -376,7 +373,7 @@ impl Curve for T { s: s.as_ptr(), }; let api::ecdsa_verify::Results { res } = unsafe { api::ecdsa_verify(params) }; - Ok(Error::to_result(res)? == 1) + convert_bool(res) } } @@ -395,10 +392,10 @@ impl Private { let mut scalar = Int::::default(); loop { // TODO(#163): Use a DRBG (possibly taking it as argument). - crate::rng::fill_bytes(&mut scalar).map_err(|_| Error::RngFailure)?; + crate::rng::fill_bytes(&mut scalar)?; if is_zero_scalar::(&scalar) { // The probability is very low for this to happen during normal operation. - return Err(Error::RngFailure); + return Err(Error::world(0)); } if C::is_valid_scalar(&scalar) { return Ok(Self(scalar)); @@ -409,7 +406,7 @@ impl Private { /// Creates a private key from its non-zero scalar SEC1 encoding. fn from_non_zero_scalar(n: Int) -> Result { if is_zero_scalar::(&n) || !C::is_valid_scalar(&n) { - return Err(Error::InvalidArgument); + return Err(Error::user(0)); } Ok(Self(n)) } @@ -432,7 +429,7 @@ impl Public { /// Creates a public key from its coordinates in SEC1 encoding. fn from_coordinates(x: Int, y: Int) -> Result { if !C::is_valid_point(&x, &y) { - return Err(Error::InvalidArgument); + return Err(Error::user(0)); } Ok(Self { x, y }) } diff --git a/crates/prelude/src/crypto/gcm.rs b/crates/prelude/src/crypto/gcm.rs index 07775e13..cf603a80 100644 --- a/crates/prelude/src/crypto/gcm.rs +++ b/crates/prelude/src/crypto/gcm.rs @@ -21,7 +21,7 @@ use alloc::vec::Vec; pub use rust_crypto::*; use wasefire_applet_api::crypto::gcm as api; -use super::Error; +use crate::{convert_unit, Error}; /// Describes AES-256-GCM support. pub struct Support { @@ -73,7 +73,7 @@ pub fn encrypt_mut( key: &[u8; 32], iv: &[u8; 12], aad: &[u8], clear: &[u8], cipher: &mut [u8], tag: &mut [u8], ) -> Result<(), Error> { if clear.len() != cipher.len() || tag.len() != tag_length() { - return Err(Error::InvalidArgument); + return Err(Error::user(0)); } let params = api::encrypt::Params { key: key.as_ptr(), @@ -86,8 +86,7 @@ pub fn encrypt_mut( tag: tag.as_mut_ptr(), }; let api::encrypt::Results { res } = unsafe { api::encrypt(params) }; - Error::to_result(res)?; - Ok(()) + convert_unit(res) } /// Encrypts and authenticates a buffer in place. @@ -95,7 +94,7 @@ pub fn encrypt_in_place( key: &[u8; 32], iv: &[u8; 12], aad: &[u8], buffer: &mut [u8], tag: &mut [u8], ) -> Result<(), Error> { if tag.len() != tag_length() { - return Err(Error::InvalidArgument); + return Err(Error::user(0)); } let params = api::encrypt::Params { key: key.as_ptr(), @@ -108,8 +107,7 @@ pub fn encrypt_in_place( tag: tag.as_mut_ptr(), }; let api::encrypt::Results { res } = unsafe { api::encrypt(params) }; - Error::to_result(res)?; - Ok(()) + convert_unit(res) } /// Decrypts and authenticates a ciphertext. @@ -126,7 +124,7 @@ pub fn decrypt_mut( key: &[u8; 32], iv: &[u8; 12], aad: &[u8], tag: &[u8], cipher: &[u8], clear: &mut [u8], ) -> Result<(), Error> { if cipher.len() != clear.len() || tag.len() != tag_length() { - return Err(Error::InvalidArgument); + return Err(Error::user(0)); } let params = api::decrypt::Params { key: key.as_ptr(), @@ -139,8 +137,7 @@ pub fn decrypt_mut( clear: clear.as_mut_ptr(), }; let api::decrypt::Results { res } = unsafe { api::decrypt(params) }; - Error::to_result(res)?; - Ok(()) + convert_unit(res) } /// Decrypts and authenticates a ciphertext. @@ -148,7 +145,7 @@ pub fn decrypt_in_place( key: &[u8; 32], iv: &[u8; 12], aad: &[u8], tag: &[u8], buffer: &mut [u8], ) -> Result<(), Error> { if tag.len() != tag_length() { - return Err(Error::InvalidArgument); + return Err(Error::user(0)); } let params = api::decrypt::Params { key: key.as_ptr(), @@ -161,8 +158,7 @@ pub fn decrypt_in_place( clear: buffer.as_mut_ptr(), }; let api::decrypt::Results { res } = unsafe { api::decrypt(params) }; - Error::to_result(res)?; - Ok(()) + convert_unit(res) } #[cfg(feature = "rust-crypto")] diff --git a/crates/prelude/src/crypto/hash.rs b/crates/prelude/src/crypto/hash.rs index 5903a720..061c8507 100644 --- a/crates/prelude/src/crypto/hash.rs +++ b/crates/prelude/src/crypto/hash.rs @@ -20,9 +20,10 @@ use alloc::vec; #[cfg(feature = "rust-crypto")] pub use rust_crypto::*; use wasefire_applet_api::crypto::hash as api; +use wasefire_error::Code; pub use self::api::Algorithm; -use super::Error; +use crate::{convert, convert_unit, Error}; /// Hashing context. pub struct Digest { @@ -39,11 +40,11 @@ impl Digest { /// Creates a new hashing context for the specified algorithm. pub fn new(algorithm: Algorithm) -> Result { if !is_supported(algorithm) { - return Err(Error::Unsupported); + return Err(Error::world(Code::NotImplemented)); } let params = api::initialize::Params { algorithm: algorithm as usize }; let api::initialize::Results { id } = unsafe { api::initialize(params) }; - let id = Error::to_result(id)?; + let id = convert(id)?; let len = algorithm.digest_len(); Ok(Self { id, len }) } @@ -57,12 +58,12 @@ impl Digest { /// Finalizes the hashing context and writes the associated digest. pub fn finalize(mut self, digest: &mut [u8]) -> Result<(), Error> { if digest.len() != self.len { - return Err(Error::InvalidArgument); + return Err(Error::user(0)); } let params = api::finalize::Params { id: self.id, digest: digest.as_mut_ptr() }; let api::finalize::Results { res } = unsafe { api::finalize(params) }; self.id = usize::MAX; - Error::to_result(res).map(|_| ()) + convert_unit(res) } /// Writes the hash of the data for the given algorithm in the digest. @@ -99,7 +100,7 @@ impl Hmac { /// Creates a new hmac context for the specified algorithm. pub fn new(algorithm: Algorithm, key: &[u8]) -> Result { if !is_hmac_supported(algorithm) { - return Err(Error::Unsupported); + return Err(Error::world(Code::NotImplemented)); } let params = api::hmac_initialize::Params { algorithm: algorithm as usize, @@ -107,7 +108,7 @@ impl Hmac { key_len: key.len(), }; let api::hmac_initialize::Results { id } = unsafe { api::hmac_initialize(params) }; - let id = Error::to_result(id)?; + let id = convert(id)?; let len = algorithm.digest_len(); Ok(Self { id, len }) } @@ -122,12 +123,12 @@ impl Hmac { /// Finalizes the hmac context and writes the associated hmac. pub fn finalize(mut self, hmac: &mut [u8]) -> Result<(), Error> { if hmac.len() != self.len { - return Err(Error::InvalidArgument); + return Err(Error::user(0)); } let params = api::hmac_finalize::Params { id: self.id, hmac: hmac.as_mut_ptr() }; let api::hmac_finalize::Results { res } = unsafe { api::hmac_finalize(params) }; self.id = usize::MAX; - Error::to_result(res).map(|_| ()) + convert_unit(res) } /// Writes the hmac of the data for the given algorithm. @@ -199,7 +200,7 @@ pub fn hkdf_expand( okm_len: okm.len(), }; let api::hkdf_expand::Results { res } = unsafe { api::hkdf_expand(params) }; - Error::to_result(res).map(|_| ()) + convert_unit(res) } /// Whether a hash algorithm is supported. diff --git a/crates/prelude/src/lib.rs b/crates/prelude/src/lib.rs index df48d059..123f5cfd 100644 --- a/crates/prelude/src/lib.rs +++ b/crates/prelude/src/lib.rs @@ -36,6 +36,7 @@ extern crate alloc; use wasefire_applet_api as api; +pub use wasefire_error::Error; mod allocator; pub mod button; @@ -125,3 +126,24 @@ fn handle_panic(info: &core::panic::PanicInfo) -> ! { debug!("{}", info); scheduling::abort(); } + +fn convert(res: isize) -> Result { + Error::decode(res as i32).map(|x| x as usize) +} + +fn convert_unit(res: isize) -> Result<(), Error> { + match convert(res) { + Ok(0) => Ok(()), + Ok(_) => unreachable!(), + Err(e) => Err(e), + } +} + +fn convert_bool(res: isize) -> Result { + match convert(res) { + Ok(0) => Ok(false), + Ok(1) => Ok(true), + Ok(_) => unreachable!(), + Err(e) => Err(e), + } +} diff --git a/crates/prelude/src/radio.rs b/crates/prelude/src/radio.rs index b38caa33..84ad6b71 100644 --- a/crates/prelude/src/radio.rs +++ b/crates/prelude/src/radio.rs @@ -14,11 +14,4 @@ //! Provides API for radio. -/// Errors returned by radio operations. -pub use wasefire_applet_api::radio::Error; - pub mod ble; - -fn convert(len: isize) -> Result { - Error::to_result(len) -} diff --git a/crates/prelude/src/radio/ble.rs b/crates/prelude/src/radio/ble.rs index ed814c15..934f78ed 100644 --- a/crates/prelude/src/radio/ble.rs +++ b/crates/prelude/src/radio/ble.rs @@ -15,19 +15,17 @@ use alloc::boxed::Box; use bytemuck::Zeroable; +use wasefire_applet_api::radio::ble as api; pub use wasefire_applet_api::radio::ble::{Advertisement, Event}; -use wasefire_applet_api::radio::{ble as api, Error}; + +use crate::{convert_bool, Error}; /// Reads the next advertisement packet, if any. pub fn read_advertisement() -> Result, Error> { let mut result = Advertisement::zeroed(); let params = api::read_advertisement::Params { ptr: &mut result as *mut _ as *mut u8 }; let api::read_advertisement::Results { res } = unsafe { api::read_advertisement(params) }; - Ok(match super::convert(res)? { - 0 => None, - 1 => Some(result), - _ => unreachable!(), - }) + Ok(convert_bool(res)?.then_some(result)) } /// Provides callback support for BLE events. diff --git a/crates/prelude/src/rng.rs b/crates/prelude/src/rng.rs index fa8e3327..4a214faf 100644 --- a/crates/prelude/src/rng.rs +++ b/crates/prelude/src/rng.rs @@ -16,16 +16,11 @@ use wasefire_applet_api::rng as api; -/// Error generating randomness. -#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -pub struct Error; +use crate::{convert_unit, Error}; /// Fills a slice with random bytes. pub fn fill_bytes(buf: &mut [u8]) -> Result<(), Error> { let params = api::fill_bytes::Params { ptr: buf.as_mut_ptr(), len: buf.len() }; let api::fill_bytes::Results { res } = unsafe { api::fill_bytes(params) }; - match res { - 0 => Ok(()), - _ => Err(Error), - } + convert_unit(res) } diff --git a/crates/prelude/src/serial.rs b/crates/prelude/src/serial.rs index 85c857fe..19a8c862 100644 --- a/crates/prelude/src/serial.rs +++ b/crates/prelude/src/serial.rs @@ -20,7 +20,7 @@ use core::fmt::Debug; use sealed::sealed; -use crate::scheduling; +use crate::{scheduling, Error}; /// Serial events to be notified. #[derive(Debug, Copy, Clone, PartialEq, Eq)] @@ -38,22 +38,20 @@ pub enum Event { /// provide a unique interface to the different serials. #[sealed(pub(crate))] pub trait Serial { - type Error: Clone + Debug; - /// Reads from the serial into a buffer without blocking. /// /// Returns how many bytes were read (and thus written to the buffer). This function does not /// block, so if there are no data available for read, zero is returned. - fn read(&self, buffer: &mut [u8]) -> Result; + fn read(&self, buffer: &mut [u8]) -> Result; /// Writes from a buffer to the serial. /// /// Returns how many bytes were written (and thus read from the buffer). This function does not /// block, so if the serial is not ready for write, zero is returned. - fn write(&self, buffer: &[u8]) -> Result; + fn write(&self, buffer: &[u8]) -> Result; /// Flushes the serial (in case reads or writes are buffered). - fn flush(&self) -> Result<(), Self::Error>; + fn flush(&self) -> Result<(), Error>; /// Registers a callback for an event. /// @@ -63,24 +61,24 @@ pub trait Serial { /// concurrent calls. unsafe fn register( &self, event: Event, func: extern "C" fn(*const u8), data: *const u8, - ) -> Result<(), Self::Error>; + ) -> Result<(), Error>; /// Unregisters the callback for an event. - fn unregister(&self, event: Event) -> Result<(), Self::Error>; + fn unregister(&self, event: Event) -> Result<(), Error>; } /// Reads from the serial into a buffer without blocking. /// /// Returns how many bytes were read (and thus written to the buffer). This function does not /// block, so if there are no data available for read, zero is returned. -pub fn read(serial: &T, buffer: &mut [u8]) -> Result { +pub fn read(serial: &T, buffer: &mut [u8]) -> Result { serial.read(buffer) } /// Synchronously reads at least one byte from a serial into a buffer. /// /// This function will block if necessary. -pub fn read_any(serial: &T, buffer: &mut [u8]) -> Result { +pub fn read_any(serial: &T, buffer: &mut [u8]) -> Result { let mut reader = Reader::new(serial, buffer); scheduling::wait_until(|| !reader.is_empty()); reader.result() @@ -89,7 +87,7 @@ pub fn read_any(serial: &T, buffer: &mut [u8]) -> Result(serial: &T, buffer: &mut [u8]) -> Result<(), T::Error> { +pub fn read_all(serial: &T, buffer: &mut [u8]) -> Result<(), Error> { let mut reader = Reader::new(serial, buffer); scheduling::wait_until(|| reader.is_done()); reader.result()?; @@ -97,7 +95,7 @@ pub fn read_all(serial: &T, buffer: &mut [u8]) -> Result<(), T::Error } /// Synchronously reads exactly one byte. -pub fn read_byte(serial: &T) -> Result { +pub fn read_byte(serial: &T) -> Result { let mut byte = 0; read_any(serial, core::slice::from_mut(&mut byte))?; Ok(byte) @@ -107,14 +105,14 @@ pub fn read_byte(serial: &T) -> Result { /// /// Returns how many bytes were written (and thus read from the buffer). This function does not /// block, so if the serial is not ready for write, zero is returned. -pub fn write(serial: &T, buffer: &[u8]) -> Result { +pub fn write(serial: &T, buffer: &[u8]) -> Result { serial.write(buffer) } /// Writes at least one byte from a buffer to a serial. /// /// This function will block if necessary. -pub fn write_any(serial: &T, buffer: &[u8]) -> Result { +pub fn write_any(serial: &T, buffer: &[u8]) -> Result { let mut writer = Writer::new(serial, buffer); scheduling::wait_until(|| !writer.is_empty()); writer.result() @@ -123,7 +121,7 @@ pub fn write_any(serial: &T, buffer: &[u8]) -> Result(serial: &T, buffer: &[u8]) -> Result<(), T::Error> { +pub fn write_all(serial: &T, buffer: &[u8]) -> Result<(), Error> { let mut writer = Writer::new(serial, buffer); scheduling::wait_until(|| writer.is_done()); writer.result()?; @@ -131,7 +129,7 @@ pub fn write_all(serial: &T, buffer: &[u8]) -> Result<(), T::Error> { } /// Flushes the serial (in case reads or writes are buffered). -pub fn flush(serial: &T) -> Result<(), T::Error> { +pub fn flush(serial: &T) -> Result<(), Error> { serial.flush() } @@ -156,7 +154,7 @@ impl<'a, T: Serial> Reader<'a, T> { } /// Returns how many bytes were read (or if an error occurred). - pub fn result(self) -> Result { + pub fn result(self) -> Result { self.0.result() } } @@ -182,7 +180,7 @@ impl<'a, T: Serial> Writer<'a, T> { } /// Returns how many bytes were written (or if an error occurred). - pub fn result(self) -> Result { + pub fn result(self) -> Result { self.0.result() } } @@ -192,7 +190,7 @@ struct Listener<'a, T: Serial> { // Whether the callback triggered since last operation. ready: &'static Cell, // The callback is registered as long as not done. - result: Result, + result: Result, } impl<'a, T: Serial> Listener<'a, T> { @@ -219,13 +217,13 @@ impl<'a, T: Serial> Listener<'a, T> { !self.is_registered() } - fn result(mut self) -> Result { + fn result(mut self) -> Result { self.update() } - fn update(&mut self) -> Result { + fn update(&mut self) -> Result { if !self.is_registered() || !self.ready.replace(false) { - return self.result.clone(); + return self.result; } let pos = self.result.as_mut().unwrap(); match self.kind.update(*pos) { @@ -235,7 +233,7 @@ impl<'a, T: Serial> Listener<'a, T> { if !self.is_registered() { self.unregister(); } - self.result.clone() + self.result } fn is_registered(&self) -> bool { @@ -287,7 +285,7 @@ impl<'a, T: Serial> Kind<'a, T> { } } - fn update(&mut self, pos: usize) -> Result { + fn update(&mut self, pos: usize) -> Result { match self { Kind::Reader { serial, buffer } => serial.read(&mut buffer[pos ..]), Kind::Writer { serial, buffer } => serial.write(&buffer[pos ..]), diff --git a/crates/prelude/src/store.rs b/crates/prelude/src/store.rs index 9a3c0a7b..b043dec8 100644 --- a/crates/prelude/src/store.rs +++ b/crates/prelude/src/store.rs @@ -18,10 +18,9 @@ use alloc::boxed::Box; use wasefire_applet_api::store as api; -pub mod fragment; +use crate::{convert_unit, Error}; -/// Errors returned by storage operations. -pub use wasefire_applet_api::store::Error; +pub mod fragment; /// Inserts an entry in the store. /// @@ -31,8 +30,7 @@ pub use wasefire_applet_api::store::Error; pub fn insert(key: usize, value: &[u8]) -> Result<(), Error> { let params = api::insert::Params { key, ptr: value.as_ptr(), len: value.len() }; let api::insert::Results { res } = unsafe { api::insert(params) }; - Error::to_result(res)?; - Ok(()) + convert_unit(res) } /// Removes an entry from the store. @@ -42,8 +40,7 @@ pub fn insert(key: usize, value: &[u8]) -> Result<(), Error> { pub fn remove(key: usize) -> Result<(), Error> { let params = api::remove::Params { key }; let api::remove::Results { res } = unsafe { api::remove(params) }; - Error::to_result(res)?; - Ok(()) + convert_unit(res) } /// Returns the value associated to a key, if any. @@ -65,16 +62,16 @@ fn find_impl(key: usize) -> Result>, Error> { #[cfg(not(feature = "multivalue"))] fn find_impl(key: usize) -> Result>, Error> { + use crate::convert_bool; + let mut ptr = core::ptr::null_mut(); let mut len = 0; let params = api::find::Params { key, ptr: &mut ptr, len: &mut len }; let api::find::Results { res } = unsafe { api::find(params) }; - match Error::to_result(res)? { - 0 => Ok(None), - 1 => { - let ptr = unsafe { core::slice::from_raw_parts_mut(ptr, len) }; - Ok(Some(unsafe { Box::from_raw(ptr) })) - } - _ => unreachable!(), + if convert_bool(res)? { + let ptr = unsafe { core::slice::from_raw_parts_mut(ptr, len) }; + Ok(Some(unsafe { Box::from_raw(ptr) })) + } else { + Ok(None) } } diff --git a/crates/prelude/src/store/fragment.rs b/crates/prelude/src/store/fragment.rs index 437fd824..388f27ae 100644 --- a/crates/prelude/src/store/fragment.rs +++ b/crates/prelude/src/store/fragment.rs @@ -17,7 +17,9 @@ use alloc::boxed::Box; use core::ops::Range; -use wasefire_applet_api::store::{fragment as api, Error}; +use wasefire_applet_api::store::fragment as api; + +use crate::{convert_bool, convert_unit, Error}; /// Inserts an entry in the store. /// @@ -30,8 +32,7 @@ pub fn insert(keys: Range, value: &[u8]) -> Result<(), Error> { let params = api::insert::Params { keys: encode_keys(keys)?, ptr: value.as_ptr(), len: value.len() }; let api::insert::Results { res } = unsafe { api::insert(params) }; - Error::to_result(res)?; - Ok(()) + convert_unit(res) } /// Removes an entry from the store. @@ -43,8 +44,7 @@ pub fn insert(keys: Range, value: &[u8]) -> Result<(), Error> { pub fn remove(keys: Range) -> Result<(), Error> { let params = api::remove::Params { keys: encode_keys(keys)? }; let api::remove::Results { res } = unsafe { api::remove(params) }; - Error::to_result(res)?; - Ok(()) + convert_unit(res) } /// Returns the value associated to a key, if any. @@ -59,18 +59,16 @@ fn find_impl(keys: Range) -> Result>, Error> { let mut len = 0; let params = api::find::Params { keys: encode_keys(keys)?, ptr: &mut ptr, len: &mut len }; let api::find::Results { res } = unsafe { api::find(params) }; - match Error::to_result(res)? { - 0 => Ok(None), - 1 => { - let ptr = unsafe { core::slice::from_raw_parts_mut(ptr, len) }; - Ok(Some(unsafe { Box::from_raw(ptr) })) - } - _ => unreachable!(), + if convert_bool(res)? { + let ptr = unsafe { core::slice::from_raw_parts_mut(ptr, len) }; + Ok(Some(unsafe { Box::from_raw(ptr) })) + } else { + Ok(None) } } fn encode_keys(keys: Range) -> Result { - let start = u16::try_from(keys.start).map_err(|_| Error::InvalidArgument)? as u32; - let end = u16::try_from(keys.end).map_err(|_| Error::InvalidArgument)? as u32; + let start = u16::try_from(keys.start).map_err(|_| Error::user(0))? as u32; + let end = u16::try_from(keys.end).map_err(|_| Error::user(0))? as u32; Ok(end << 16 | start) } diff --git a/crates/prelude/src/uart.rs b/crates/prelude/src/uart.rs index 094962fc..53921965 100644 --- a/crates/prelude/src/uart.rs +++ b/crates/prelude/src/uart.rs @@ -18,10 +18,7 @@ use sealed::sealed; use wasefire_applet_api::uart as api; use crate::serial::Event; - -/// UART error. -#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -pub struct Error; +use crate::{convert, Error}; /// Returns the number of available UARTs on the board. pub fn count() -> usize { @@ -34,8 +31,6 @@ pub struct Uart(pub usize); #[sealed] impl crate::serial::Serial for Uart { - type Error = Error; - fn read(&self, buffer: &mut [u8]) -> Result { let params = api::read::Params { uart: self.0, ptr: buffer.as_mut_ptr(), len: buffer.len() }; @@ -73,14 +68,6 @@ impl crate::serial::Serial for Uart { } } -fn convert(code: isize) -> Result { - if code < 0 { - Err(Error) - } else { - Ok(code as usize) - } -} - fn convert_event(event: Event) -> api::Event { match event { Event::Read => api::Event::Read, diff --git a/crates/prelude/src/usb.rs b/crates/prelude/src/usb.rs index cb90c031..4ff994b5 100644 --- a/crates/prelude/src/usb.rs +++ b/crates/prelude/src/usb.rs @@ -17,11 +17,4 @@ //! Only serial is currently supported. HID and its derivatives (e.g. CTAP) will be added in the //! future. -/// Errors returned by USB operations. -pub use wasefire_applet_api::usb::Error; - pub mod serial; - -fn convert(len: isize) -> Result { - Error::to_result(len) -} diff --git a/crates/prelude/src/usb/serial.rs b/crates/prelude/src/usb/serial.rs index f60e2517..37f5139d 100644 --- a/crates/prelude/src/usb/serial.rs +++ b/crates/prelude/src/usb/serial.rs @@ -18,15 +18,13 @@ use sealed::sealed; use wasefire_applet_api::usb::serial as api; use crate::serial::Event; -use crate::usb::{convert, Error}; +use crate::{convert, Error}; /// Implements the [`Serial`](crate::serial::Serial) interface for the USB serial. pub struct UsbSerial; #[sealed] impl crate::serial::Serial for UsbSerial { - type Error = Error; - fn read(&self, buffer: &mut [u8]) -> Result { let params = api::read::Params { ptr: buffer.as_mut_ptr(), len: buffer.len() }; let api::read::Results { len } = unsafe { api::read(params) }; @@ -39,7 +37,7 @@ impl crate::serial::Serial for UsbSerial { convert(len) } - fn flush(&self) -> Result<(), Self::Error> { + fn flush(&self) -> Result<(), Error> { let api::flush::Results { res } = unsafe { api::flush() }; convert(res).map(|_| ()) } diff --git a/crates/runner-host/Cargo.lock b/crates/runner-host/Cargo.lock index c93e43ff..d403cd4d 100644 --- a/crates/runner-host/Cargo.lock +++ b/crates/runner-host/Cargo.lock @@ -1773,6 +1773,7 @@ dependencies = [ "bytemuck", "sealed", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -1820,10 +1821,18 @@ dependencies = [ "usb-device", "usbd-serial", "wasefire-applet-api", + "wasefire-error", "wasefire-logger", "wasefire-store", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum 0.7.1", +] + [[package]] name = "wasefire-interpreter" version = "0.2.0-git" @@ -1853,6 +1862,7 @@ dependencies = [ "typenum", "wasefire-applet-api", "wasefire-board-api", + "wasefire-error", "wasefire-interpreter", "wasefire-logger", "wasefire-store", diff --git a/crates/runner-host/src/board.rs b/crates/runner-host/src/board.rs index 63f0ba71..703afb71 100644 --- a/crates/runner-host/src/board.rs +++ b/crates/runner-host/src/board.rs @@ -55,7 +55,7 @@ impl Api for Board { fn syscall(x1: u32, x2: u32, x3: u32, x4: u32) -> Option { match (x1, x2, x3, x4) { // The syscall_test example relies on this. - (1, 2, 3, 4) => Some(5), + (0, 0, 0, x) => Some(x), _ => None, } } diff --git a/crates/runner-host/src/board/timer.rs b/crates/runner-host/src/board/timer.rs index 281287ad..ee3328d2 100644 --- a/crates/runner-host/src/board/timer.rs +++ b/crates/runner-host/src/board/timer.rs @@ -34,7 +34,7 @@ impl Api for Impl { let state = state.deref_mut(); let timer = &mut state.timers.0[*id]; if timer.handle.is_some() { - return Err(Error::User); + return Err(Error::user(0)); } let duration = Duration::from_millis(command.duration_ms as u64); if command.periodic { @@ -61,7 +61,7 @@ impl Api for Impl { let timer = &mut state.timers.0[*id]; match &timer.handle { Some(handle) => handle.abort(), - None => return Err(Error::User), + None => return Err(Error::user(0)), } timer.handle = None; Ok(()) diff --git a/crates/runner-host/src/board/uart.rs b/crates/runner-host/src/board/uart.rs index 456a03c0..40cbc4c0 100644 --- a/crates/runner-host/src/board/uart.rs +++ b/crates/runner-host/src/board/uart.rs @@ -214,7 +214,7 @@ fn convert(x: Result) -> Result { match x { Ok(x) => Ok(x), Err(e) if e.kind() == ErrorKind::WouldBlock => Ok(0), - Err(_) => Err(Error::World), + Err(_) => Err(Error::world(0)), } } diff --git a/crates/runner-nordic/Cargo.lock b/crates/runner-nordic/Cargo.lock index b182b28d..0c635770 100644 --- a/crates/runner-nordic/Cargo.lock +++ b/crates/runner-nordic/Cargo.lock @@ -921,6 +921,7 @@ dependencies = [ "usbd-serial", "wasefire-applet-api", "wasefire-board-api", + "wasefire-error", "wasefire-interpreter", "wasefire-logger", "wasefire-scheduler", @@ -1160,6 +1161,7 @@ dependencies = [ "bytemuck", "sealed", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -1208,10 +1210,18 @@ dependencies = [ "usb-device", "usbd-serial", "wasefire-applet-api", + "wasefire-error", "wasefire-logger", "wasefire-store", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum 0.7.1", +] + [[package]] name = "wasefire-interpreter" version = "0.2.0-git" @@ -1242,6 +1252,7 @@ dependencies = [ "typenum", "wasefire-applet-api", "wasefire-board-api", + "wasefire-error", "wasefire-interpreter", "wasefire-logger", "wasefire-store", diff --git a/crates/runner-nordic/Cargo.toml b/crates/runner-nordic/Cargo.toml index fe8be7a2..f31b2ad4 100644 --- a/crates/runner-nordic/Cargo.toml +++ b/crates/runner-nordic/Cargo.toml @@ -29,6 +29,7 @@ usb-device = "0.3.1" usbd-serial = "0.2.0" wasefire-applet-api = { path = "../api" } wasefire-board-api = { path = "../board" } +wasefire-error = { path = "../error" } wasefire-interpreter = { path = "../interpreter", optional = true } wasefire-logger = { path = "../logger" } wasefire-scheduler = { path = "../scheduler" } diff --git a/crates/runner-nordic/src/board.rs b/crates/runner-nordic/src/board.rs index 5273fd3b..7332b94e 100644 --- a/crates/runner-nordic/src/board.rs +++ b/crates/runner-nordic/src/board.rs @@ -46,7 +46,7 @@ impl board::Api for Board { fn syscall(x1: u32, x2: u32, x3: u32, x4: u32) -> Option { match (x1, x2, x3, x4) { // The syscall_test example relies on this. - (1, 2, 3, 4) => Some(5), + (0, 0, 0, x) => Some(x), _ => None, } } diff --git a/crates/runner-nordic/src/board/crypto/ccm.rs b/crates/runner-nordic/src/board/crypto/ccm.rs index 9008541f..82422538 100644 --- a/crates/runner-nordic/src/board/crypto/ccm.rs +++ b/crates/runner-nordic/src/board/crypto/ccm.rs @@ -18,6 +18,7 @@ use nrf52840_hal::ccm::CcmData; use typenum::{U13, U16, U4}; use wasefire_board_api::crypto::aead::{AeadSupport, Api, Array}; use wasefire_board_api::{Error, Support}; +use wasefire_error::Code; use crate::with_state; @@ -35,14 +36,14 @@ impl Api for Impl { tag: &mut Array, ) -> Result<(), Error> { if aad != [0] { - return Err(Error::User); + return Err(Error::user(Code::BadSize)); } let clear = match clear { Some(x) => x, None => cipher, }; if 251 < clear.len() || cipher.len() != clear.len() { - return Err(Error::User); + return Err(Error::user(Code::BadSize)); } let len = clear.len(); let mut ccm_data = CcmData::new((*key).into(), truncate_iv(iv)); @@ -58,7 +59,7 @@ impl Api for Impl { cipher.copy_from_slice(&cipher_packet[3 ..][.. len]); tag.copy_from_slice(&cipher_packet[3 + len ..]); } - Err(_) => return Err(Error::World), + Err(_) => return Err(Error::world(0)), } Ok(()) } @@ -68,14 +69,14 @@ impl Api for Impl { clear: &mut [u8], ) -> Result<(), Error> { if aad != [0] { - return Err(Error::User); + return Err(Error::user(Code::BadSize)); } let cipher = match cipher { Some(x) => x, None => clear, }; if 251 < clear.len() || cipher.len() != clear.len() { - return Err(Error::User); + return Err(Error::user(Code::BadSize)); } let len = clear.len(); let mut ccm_data = CcmData::new((*key).into(), truncate_iv(iv)); @@ -89,7 +90,7 @@ impl Api for Impl { state.ccm.decrypt_packet(&mut ccm_data, &mut clear_packet, &cipher_packet, &mut scratch) }) { Ok(()) => clear.copy_from_slice(&clear_packet[3 ..]), - Err(_) => return Err(Error::World), + Err(_) => return Err(Error::world(0)), } Ok(()) } diff --git a/crates/runner-nordic/src/board/gpio.rs b/crates/runner-nordic/src/board/gpio.rs index b6686d28..1b8407aa 100644 --- a/crates/runner-nordic/src/board/gpio.rs +++ b/crates/runner-nordic/src/board/gpio.rs @@ -22,6 +22,7 @@ use nrf52840_hal::pac::generic::Reg; use nrf52840_hal::pac::p0::pin_cnf::PIN_CNF_SPEC; use wasefire_board_api::gpio::{Api, Config, InputConfig, OutputConfig}; use wasefire_board_api::{Error, Id, Support}; +use wasefire_error::Code; use crate::with_state; @@ -55,14 +56,14 @@ impl Api for Impl { match &state.gpios[*gpio] { Gpio::Invalid => unreachable!(), Gpio::Disconnected(_) | Gpio::OutputPushPull(_) | Gpio::OutputOpenDrain(_) => { - return Err(Error::User); + return Err(Error::user(Code::BadState)); } Gpio::InputFloating(x) => x.is_high(), Gpio::InputPullDown(x) => x.is_high(), Gpio::InputPullUp(x) => x.is_high(), Gpio::OutputOpenDrainIO(x) => x.is_high(), } - .map_err(|_| Error::World) + .map_err(|_| Error::world(0)) }) } @@ -74,12 +75,12 @@ impl Api for Impl { Gpio::Disconnected(_) | Gpio::InputFloating(_) | Gpio::InputPullDown(_) - | Gpio::InputPullUp(_) => return Err(Error::User), + | Gpio::InputPullUp(_) => return Err(Error::user(Code::BadState)), Gpio::OutputPushPull(x) => x.set_state(value), Gpio::OutputOpenDrain(x) => x.set_state(value), Gpio::OutputOpenDrainIO(x) => x.set_state(value), } - .map_err(|_| Error::World) + .map_err(|_| Error::world(0)) }) } } @@ -121,7 +122,7 @@ fn configure( (InputConfig::Disabled, OutputConfig::PushPull) => { (Gpio::OutputPushPull(pin.into_push_pull_output(initial)), Ok(())) } - (_, OutputConfig::PushPull) => (wrap(pin), Err(Error::User)), + (_, OutputConfig::PushPull) => (wrap(pin), Err(Error::user(0))), (InputConfig::Disabled, OutputConfig::OpenDrain) => ( Gpio::OutputOpenDrain( pin.into_open_drain_output(OpenDrainConfig::Standard0Disconnect1, initial), @@ -134,7 +135,7 @@ fn configure( ), Ok(()), ), - (InputConfig::PullDown, OutputConfig::OpenDrain) => (wrap(pin), Err(Error::User)), + (InputConfig::PullDown, OutputConfig::OpenDrain) => (wrap(pin), Err(Error::user(0))), (InputConfig::PullUp, OutputConfig::OpenDrain) => { let pin = pin.into_open_drain_input_output(OpenDrainConfig::Standard0Disconnect1, initial); @@ -159,7 +160,7 @@ fn configure( pin_cnf(&pin).modify(|_, w| w.pull().pulldown()); (Gpio::OutputOpenDrainIO(pin), Ok(())) } - (InputConfig::PullUp, OutputConfig::OpenSource) => (wrap(pin), Err(Error::User)), + (InputConfig::PullUp, OutputConfig::OpenSource) => (wrap(pin), Err(Error::user(0))), } } diff --git a/crates/runner-nordic/src/board/led.rs b/crates/runner-nordic/src/board/led.rs index dfcf3318..1a78e3c6 100644 --- a/crates/runner-nordic/src/board/led.rs +++ b/crates/runner-nordic/src/board/led.rs @@ -28,7 +28,7 @@ impl Api for Impl { fn get(id: Id) -> Result { with_state(|state| { let led = &mut state.leds[*id]; - led.is_set_low().map_err(|_| Error::World) + led.is_set_low().map_err(|_| Error::world(0)) }) } @@ -39,7 +39,7 @@ impl Api for Impl { false => led.set_high(), true => led.set_low(), } - .map_err(|_| Error::World) + .map_err(|_| Error::world(0)) }) } } diff --git a/crates/runner-nordic/src/board/uart.rs b/crates/runner-nordic/src/board/uart.rs index 7f66464e..d911d994 100644 --- a/crates/runner-nordic/src/board/uart.rs +++ b/crates/runner-nordic/src/board/uart.rs @@ -173,7 +173,7 @@ impl Api for Impl { return Ok(0); } if EASY_DMA_SIZE < input.len() || !in_ram(input) { - return Err(Error::User); + return Err(Error::user(0)); } with_state(|state| { let uart = state.uarts.get(uart); diff --git a/crates/scheduler/CHANGELOG.md b/crates/scheduler/CHANGELOG.md index 6d7b9635..163450ed 100644 --- a/crates/scheduler/CHANGELOG.md +++ b/crates/scheduler/CHANGELOG.md @@ -8,6 +8,7 @@ ### Minor +- Migrate to `wasefire-error` - Support `gpio` module - Support `platform::version()` - Support `radio::ble` module @@ -95,4 +96,4 @@ ## 0.1.0 - + diff --git a/crates/scheduler/Cargo.lock b/crates/scheduler/Cargo.lock index 6ae44156..81838886 100644 --- a/crates/scheduler/Cargo.lock +++ b/crates/scheduler/Cargo.lock @@ -516,6 +516,7 @@ dependencies = [ "bytemuck", "sealed", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -553,10 +554,18 @@ dependencies = [ "usb-device", "usbd-serial", "wasefire-applet-api", + "wasefire-error", "wasefire-logger", "wasefire-store", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum 0.7.1", +] + [[package]] name = "wasefire-interpreter" version = "0.2.0-git" @@ -588,6 +597,7 @@ dependencies = [ "typenum", "wasefire-applet-api", "wasefire-board-api", + "wasefire-error", "wasefire-interpreter", "wasefire-logger", "wasefire-store", diff --git a/crates/scheduler/Cargo.toml b/crates/scheduler/Cargo.toml index ac3cafd2..0a279d57 100644 --- a/crates/scheduler/Cargo.toml +++ b/crates/scheduler/Cargo.toml @@ -25,6 +25,7 @@ portable-atomic = { version = "1.6.0", default-features = false } typenum = { version = "1.17.0", default-features = false } wasefire-applet-api = { version = "0.6.0-git", path = "../api", features = ["host"] } wasefire-board-api = { version = "0.6.0-git", path = "../board" } +wasefire-error = { version = "0.1.0-git", path = "../error" } wasefire-logger = { version = "0.1.4-git", path = "../logger" } wasefire-store = { version = "0.2.3-git", path = "../store" } wasefire-sync = { version = "0.1.0-git", path = "../sync" } diff --git a/crates/scheduler/src/call/crypto/ccm.rs b/crates/scheduler/src/call/crypto/ccm.rs index 806c6df8..94a039af 100644 --- a/crates/scheduler/src/call/crypto/ccm.rs +++ b/crates/scheduler/src/call/crypto/ccm.rs @@ -46,10 +46,7 @@ fn encrypt(mut call: SchedulerCall) { let clear = Some(memory.get(*clear, *len)?); let (cipher, tag) = memory.get_mut(*cipher, *len + 4)?.split_at_mut(*len as usize); let tag = tag.into(); - let res = match board::crypto::Aes128Ccm::::encrypt(key, &iv, aad, clear, cipher, tag) { - Ok(()) => 0u32.into(), - Err(_) => u32::MAX.into(), - }; + let res = board::crypto::Aes128Ccm::::encrypt(key, &iv, aad, clear, cipher, tag).into(); api::encrypt::Results { res } }; call.reply(results); @@ -68,10 +65,7 @@ fn decrypt(mut call: SchedulerCall) { let cipher = Some(cipher); let tag = tag.into(); let clear = memory.get_mut(*clear, *len)?; - let res = match board::crypto::Aes128Ccm::::decrypt(key, &iv, aad, cipher, tag, clear) { - Ok(()) => 0u32.into(), - Err(_) => u32::MAX.into(), - }; + let res = board::crypto::Aes128Ccm::::decrypt(key, &iv, aad, cipher, tag, clear).into(); api::decrypt::Results { res } }; call.reply(results); diff --git a/crates/scheduler/src/call/crypto/ec.rs b/crates/scheduler/src/call/crypto/ec.rs index 9591b65c..af9f4171 100644 --- a/crates/scheduler/src/call/crypto/ec.rs +++ b/crates/scheduler/src/call/crypto/ec.rs @@ -92,19 +92,13 @@ fn base_point_mul(mut call: SchedulerCall let n = memory.get_array::<32>(*n)?.into(); let x = memory.get_array_mut::<32>(*x)?.into(); let y = memory.get_array_mut::<32>(*y)?.into(); - match board::crypto::P256::::base_point_mul(n, x, y) { - Ok(()) => 0u32, - Err(_) => u32::MAX, - } + board::crypto::P256::::base_point_mul(n, x, y) } Curve::P384 => { let n = memory.get_array::<48>(*n)?.into(); let x = memory.get_array_mut::<48>(*x)?.into(); let y = memory.get_array_mut::<48>(*y)?.into(); - match board::crypto::P384::::base_point_mul(n, x, y) { - Ok(()) => 0u32, - Err(_) => u32::MAX, - } + board::crypto::P384::::base_point_mul(n, x, y) } }; api::base_point_mul::Results { res: res.into() } @@ -124,10 +118,7 @@ fn point_mul(mut call: SchedulerCall) { let in_y = memory.get_array::<32>(*in_y)?.into(); let out_x = memory.get_array_mut::<32>(*out_x)?.into(); let out_y = memory.get_array_mut::<32>(*out_y)?.into(); - match board::crypto::P256::::point_mul(n, in_x, in_y, out_x, out_y) { - Ok(()) => 0u32, - Err(_) => u32::MAX, - } + board::crypto::P256::::point_mul(n, in_x, in_y, out_x, out_y) } Curve::P384 => { let n = memory.get_array::<48>(*n)?.into(); @@ -135,10 +126,7 @@ fn point_mul(mut call: SchedulerCall) { let in_y = memory.get_array::<48>(*in_y)?.into(); let out_x = memory.get_array_mut::<48>(*out_x)?.into(); let out_y = memory.get_array_mut::<48>(*out_y)?.into(); - match board::crypto::P384::::point_mul(n, in_x, in_y, out_x, out_y) { - Ok(()) => 0u32, - Err(_) => u32::MAX, - } + board::crypto::P384::::point_mul(n, in_x, in_y, out_x, out_y) } }; api::point_mul::Results { res: res.into() } @@ -157,20 +145,14 @@ fn ecdsa_sign(mut call: SchedulerCall) { let message = memory.get_array::<32>(*message)?.into(); let r = memory.get_array_mut::<32>(*r)?.into(); let s = memory.get_array_mut::<32>(*s)?.into(); - match board::crypto::P256::::ecdsa_sign(key, message, r, s) { - Ok(()) => 0u32, - Err(_) => u32::MAX, - } + board::crypto::P256::::ecdsa_sign(key, message, r, s) } Curve::P384 => { let key = memory.get_array::<48>(*key)?.into(); let message = memory.get_array::<48>(*message)?.into(); let r = memory.get_array_mut::<48>(*r)?.into(); let s = memory.get_array_mut::<48>(*s)?.into(); - match board::crypto::P384::::ecdsa_sign(key, message, r, s) { - Ok(()) => 0u32, - Err(_) => u32::MAX, - } + board::crypto::P384::::ecdsa_sign(key, message, r, s) } }; api::ecdsa_sign::Results { res: res.into() } @@ -190,11 +172,7 @@ fn ecdsa_verify(mut call: SchedulerCall) { let y = memory.get_array::<32>(*y)?.into(); let r = memory.get_array::<32>(*r)?.into(); let s = memory.get_array::<32>(*s)?.into(); - match board::crypto::P256::::ecdsa_verify(message, x, y, r, s) { - Ok(true) => 1u32, - Ok(false) => 0u32, - Err(_) => u32::MAX, - } + board::crypto::P256::::ecdsa_verify(message, x, y, r, s) } Curve::P384 => { let message = memory.get_array::<48>(*message)?.into(); @@ -202,11 +180,7 @@ fn ecdsa_verify(mut call: SchedulerCall) { let y = memory.get_array::<48>(*y)?.into(); let r = memory.get_array::<48>(*r)?.into(); let s = memory.get_array::<48>(*s)?.into(); - match board::crypto::P384::::ecdsa_verify(message, x, y, r, s) { - Ok(true) => 1u32, - Ok(false) => 0u32, - Err(_) => u32::MAX, - } + board::crypto::P384::::ecdsa_verify(message, x, y, r, s) } }; api::ecdsa_verify::Results { res: res.into() } diff --git a/crates/scheduler/src/call/crypto/gcm.rs b/crates/scheduler/src/call/crypto/gcm.rs index 82e70bfc..d45e57f1 100644 --- a/crates/scheduler/src/call/crypto/gcm.rs +++ b/crates/scheduler/src/call/crypto/gcm.rs @@ -55,10 +55,7 @@ fn encrypt(mut call: SchedulerCall) { let cipher = memory.get_mut(*cipher, *length)?; let tag_len = tag_len::() as u32; let tag = memory.get_mut(*tag, tag_len)?.into(); - let res = match board::crypto::Aes256Gcm::::encrypt(key, iv, aad, clear, cipher, tag) { - Ok(()) => 0u32.into(), - Err(_) => u32::MAX.into(), - }; + let res = board::crypto::Aes256Gcm::::encrypt(key, iv, aad, clear, cipher, tag).into(); api::encrypt::Results { res } }; call.reply(results); @@ -77,10 +74,7 @@ fn decrypt(mut call: SchedulerCall) { let tag = memory.get(*tag, tag_len)?.into(); let cipher = memory.get_opt(*cipher, *length)?; let clear = memory.get_mut(*clear, *length)?; - let res = match board::crypto::Aes256Gcm::::decrypt(key, iv, aad, cipher, tag, clear) { - Ok(()) => 0u32.into(), - Err(_) => u32::MAX.into(), - }; + let res = board::crypto::Aes256Gcm::::decrypt(key, iv, aad, cipher, tag, clear).into(); api::decrypt::Results { res } }; call.reply(results); diff --git a/crates/scheduler/src/call/crypto/hash.rs b/crates/scheduler/src/call/crypto/hash.rs index 29c7fd26..fa08cd08 100644 --- a/crates/scheduler/src/call/crypto/hash.rs +++ b/crates/scheduler/src/call/crypto/hash.rs @@ -14,9 +14,9 @@ use digest::{FixedOutput, InvalidLength, KeyInit, Output, Update}; use generic_array::GenericArray; -use wasefire_applet_api::crypto as crypto_api; use wasefire_applet_api::crypto::hash::{self as api, Algorithm, Api}; use wasefire_board_api::{self as board, Api as Board, Support}; +use wasefire_error::Error; use crate::applet::store::{MemoryApi, StoreApi}; use crate::applet::HashContext; @@ -191,7 +191,7 @@ fn hkdf_expand(mut call: SchedulerCall) { }; let res = match res { Ok(()) => 0.into(), - Err(InvalidLength) => crypto_api::Error::InvalidArgument.into(), + Err(InvalidLength) => Error::user(0).into(), }; api::hkdf_expand::Results { res } }; diff --git a/crates/scheduler/src/call/radio/ble.rs b/crates/scheduler/src/call/radio/ble.rs index f2613c57..7cb5347e 100644 --- a/crates/scheduler/src/call/radio/ble.rs +++ b/crates/scheduler/src/call/radio/ble.rs @@ -65,10 +65,7 @@ fn read_advertisement(mut call: SchedulerCall(*ptr)?; - let res = match board::radio::Ble::::read_advertisement(packet) { - Ok(read) => (read as u32).into(), - Err(_) => u32::MAX.into(), - }; + let res = board::radio::Ble::::read_advertisement(packet).map(|x| x as u32).into(); api::read_advertisement::Results { res } }; call.reply(results); diff --git a/crates/scheduler/src/call/store.rs b/crates/scheduler/src/call/store.rs index 8e9f05e7..12bebeee 100644 --- a/crates/scheduler/src/call/store.rs +++ b/crates/scheduler/src/call/store.rs @@ -14,6 +14,7 @@ use wasefire_applet_api::store::{self as api, Api}; use wasefire_board_api::Api as Board; +use wasefire_error::{Code, Error}; use wasefire_store::StoreError; use crate::applet::store::MemoryApi; @@ -91,12 +92,11 @@ fn find(mut call: SchedulerCall) { call.reply(results); } -fn convert(err: StoreError) -> api::Error { +fn convert(err: StoreError) -> Error { match err { - StoreError::InvalidArgument => api::Error::InvalidArgument, - StoreError::NoCapacity => api::Error::NoCapacity, - StoreError::NoLifetime => api::Error::NoLifetime, - StoreError::StorageError => api::Error::StorageError, - StoreError::InvalidStorage => api::Error::InvalidStorage, + StoreError::InvalidArgument => Error::user(0), + StoreError::NoCapacity | StoreError::NoLifetime => Error::user(Code::NotEnough), + StoreError::StorageError => Error::world(0), + StoreError::InvalidStorage => Error::world(Code::BadState), } } diff --git a/crates/scheduler/src/call/usb/serial.rs b/crates/scheduler/src/call/usb/serial.rs index 90e2931f..c324ddc7 100644 --- a/crates/scheduler/src/call/usb/serial.rs +++ b/crates/scheduler/src/call/usb/serial.rs @@ -37,10 +37,7 @@ fn read(mut call: SchedulerCall) { let memory = scheduler.applet.memory(); let results = try { let output = memory.get_mut(*ptr, *len)?; - let len = match board::usb::Serial::::read(output) { - Ok(len) => (len as u32).into(), - Err(_) => u32::MAX.into(), - }; + let len = board::usb::Serial::::read(output).map(|x| x as u32).into(); api::read::Results { len } }; call.reply(results); @@ -52,10 +49,7 @@ fn write(mut call: SchedulerCall) { let memory = scheduler.applet.memory(); let results = try { let input = memory.get(*ptr, *len)?; - let len = match board::usb::Serial::::write(input) { - Ok(len) => (len as u32).into(), - Err(_) => u32::MAX.into(), - }; + let len = board::usb::Serial::::write(input).map(|x| x as u32).into(); api::write::Results { len } }; call.reply(results); @@ -94,10 +88,7 @@ fn unregister(mut call: SchedulerCall) { fn flush(call: SchedulerCall) { let api::flush::Params {} = call.read(); let results = try { - let res = match board::usb::Serial::::flush() { - Ok(()) => 0.into(), - Err(_) => u32::MAX.into(), - }; + let res = board::usb::Serial::::flush().into(); api::flush::Results { res } }; call.reply(results); diff --git a/crates/scheduler/src/lib.rs b/crates/scheduler/src/lib.rs index 8a42bafc..1db27009 100644 --- a/crates/scheduler/src/lib.rs +++ b/crates/scheduler/src/lib.rs @@ -31,7 +31,7 @@ use event::Key; use wasefire_applet_api::{self as api, Api, ArrayU32, Dispatch, Id, Signature}; use wasefire_board_api::{self as board, Api as Board, Singleton, Support}; #[cfg(feature = "wasm")] -use wasefire_interpreter::{self as interpreter, Call, Error, Module, RunAnswer, Val}; +use wasefire_interpreter::{self as interpreter, Call, Module, RunAnswer, Val}; use {wasefire_logger as log, wasefire_store as store}; use crate::applet::store::{Memory, Store, StoreApi}; @@ -394,7 +394,7 @@ impl Scheduler { self.applet.done(); } Ok(RunAnswer::Host) => (), - Err(Error::Trap) => applet_trapped::(None), + Err(interpreter::Error::Trap) => applet_trapped::(None), Err(e) => log::panic!("{}", log::Debug2Format(&e)), } } @@ -417,8 +417,8 @@ fn applet_trapped(reason: Option<&'static str>) -> ! { pub struct Trap; -impl From<()> for Trap { - fn from(_: ()) -> Self { +impl From for Trap { + fn from(_: wasefire_error::Error) -> Self { Trap } } diff --git a/crates/stub/CHANGELOG.md b/crates/stub/CHANGELOG.md index 3a064e18..f36b0d50 100644 --- a/crates/stub/CHANGELOG.md +++ b/crates/stub/CHANGELOG.md @@ -4,6 +4,7 @@ ### Minor +- Migrate to `wasefire-error` - Use `wasefire-logger` for panics ### Patch diff --git a/crates/stub/Cargo.lock b/crates/stub/Cargo.lock index 5fc2ef9e..fa898cb6 100644 --- a/crates/stub/Cargo.lock +++ b/crates/stub/Cargo.lock @@ -282,6 +282,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "p256" version = "0.13.2" @@ -465,6 +485,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", "wasefire-logger", ] @@ -489,6 +510,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-logger" version = "0.1.4-git" @@ -510,6 +538,7 @@ dependencies = [ "sha2", "signature", "wasefire-applet-api", + "wasefire-error", "wasefire-logger", ] diff --git a/crates/stub/Cargo.toml b/crates/stub/Cargo.toml index 4bd530c5..1125cba4 100644 --- a/crates/stub/Cargo.toml +++ b/crates/stub/Cargo.toml @@ -25,4 +25,5 @@ rand = { version = "0.8.5", default-features = false, features = ["std", "std_rn sha2 = { version = "0.10.8", default-features = false } signature = { version = "2.2.0", default-features = false } wasefire-applet-api = { version = "0.6.0-git", path = "../api", features = ["native", "wasm"] } +wasefire-error = { version = "0.1.0-git", path = "../error" } wasefire-logger = { version = "0.1.4-git", path = "../logger" } diff --git a/crates/stub/src/crypto/hash.rs b/crates/stub/src/crypto/hash.rs index 54d4dd10..2806b89f 100644 --- a/crates/stub/src/crypto/hash.rs +++ b/crates/stub/src/crypto/hash.rs @@ -19,7 +19,8 @@ use digest::{FixedOutput, Update}; use hkdf::{Hkdf, HmacImpl}; use hmac::Hmac; use sha2::{Sha256, Sha384}; -use wasefire_applet_api::crypto::{hash as api, Error}; +use wasefire_applet_api::crypto::hash as api; +use wasefire_error::Error; use wasefire_logger as log; enum Context { @@ -113,7 +114,7 @@ unsafe extern "C" fn env_chj( }; let id = match context { Ok(context) => CONTEXTS.lock().unwrap().insert(context) as isize, - Err(_) => Error::InvalidArgument.into(), + Err(_) => Error::encode(Err(Error::user(0))) as isize, }; api::hmac_initialize::Results { id } } @@ -156,16 +157,13 @@ unsafe extern "C" fn env_che(params: api::hkdf_expand::Params) -> api::hkdf_expa api::Algorithm::Sha256 => hkdf::>(prk, info, okm), api::Algorithm::Sha384 => hkdf::>(prk, info, okm), }; - let res = match res { - Ok(()) => 0, - Err(err) => err.into(), - }; + let res = Error::encode(res.map(|()| 0)) as isize; api::hkdf_expand::Results { res } } fn hkdf>( prk: &[u8], info: &[u8], okm: &mut [u8], ) -> Result<(), Error> { - let hkdf = Hkdf::::from_prk(prk).map_err(|_| Error::InvalidArgument)?; - hkdf.expand(info, okm).map_err(|_| Error::InvalidArgument) + let hkdf = Hkdf::::from_prk(prk).map_err(|_| Error::user(0))?; + hkdf.expand(info, okm).map_err(|_| Error::user(0)) } diff --git a/examples/assemblyscript/api.ts b/examples/assemblyscript/api.ts index e36a41f2..9fcfdf5b 100644 --- a/examples/assemblyscript/api.ts +++ b/examples/assemblyscript/api.ts @@ -111,18 +111,6 @@ // START OF MODULE crypto // Cryptographic operations. - // Describes errors on cryptographic operations. - enum crypto_Error { - // A function pre-condition was broken. - InvalidArgument = 0, - - // An operation is unsupported. - Unsupported = 1, - - // An RNG operation failed. - RngFailure = 2, - } - // START OF MODULE crypto_ccm // AES-CCM according to Bluetooth. // Whether AES-CCM is supported. @@ -155,8 +143,7 @@ // // Its length must be `len + 4` bytes. cipher: usize, - // Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - // otherwise. + // Zero on success. Negative on error. ): isize // Decrypts a cipher text given a key and IV. @@ -183,8 +170,7 @@ // // Its length must be provided in the `len` field. clear: usize, - // Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - // otherwise. + // Zero on success. Negative on error. ): isize // END OF MODULE crypto_ccm @@ -245,8 +231,7 @@ // The y coordinate in SEC1 encoding. y: usize, - // Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - // otherwise. + // Zero on success. Negative on error. ): isize // Performs point multiplication. @@ -269,8 +254,7 @@ // The y coordinate of the output point in SEC1 encoding. out_y: usize, - // Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - // otherwise. + // Zero on success. Negative on error. ): isize // Signs a message with ECDSA. @@ -290,8 +274,7 @@ // The s signature component in SEC1 encoding. s: usize, - // Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - // otherwise. + // Zero on success. Negative on error. ): isize // Verifies an ECDSA signature. @@ -314,8 +297,7 @@ // The s signature component in SEC1 encoding. s: usize, - // 1 if the signature is valid, 0 if invalid, and bitwise complement of - // [`Error`](crate::crypto::Error) otherwise. + // One if the signature is valid. Zero if invalid. Negative on error. ): isize // END OF MODULE crypto_ec @@ -376,8 +358,7 @@ // The authentication tag (see [`super::tag_length()`]). tag: usize, - // Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - // otherwise. + // Zero on success. Negative on error. ): isize // Decrypts and authenticates a cipher text with associated data given a key and IV. @@ -409,8 +390,7 @@ // The clear text. clear: usize, - // Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - // otherwise. + // Zero on success. Negative on error. ): isize // END OF MODULE crypto_gcm @@ -438,8 +418,7 @@ export declare function crypto_hash_initialize( // The hash algorithm. algorithm: usize, - // A non-negative identifier on success, bitwise complement of - // [`Error`](crate::crypto::Error) otherwise. + // Negative on error. The identifier otherwise. ): isize // Updates a hash. @@ -473,8 +452,7 @@ // The pointer may be null, in which case this function deallocates the identifier // without computing the digest. digest: usize, - // Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - // otherwise. + // Zero on success. Negative on error. ): isize // Whether the algorithm is supported for hmac. @@ -498,8 +476,7 @@ // // If greater than 64 bytes, the key will be itself hashed. key_len: usize, - // A non-negative identifier on success, bitwise complement of - // [`Error`](crate::crypto::Error) otherwise. + // Negative on error. The identifier otherwise. ): isize // Updates an hmac. @@ -533,8 +510,7 @@ // The pointer may be null, in which case this function deallocates the identifier // without computing the hmac. hmac: usize, - // Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - // otherwise. + // Zero on success. Negative otherwise. ): isize // Whether the algorithm is supported for hkdf. @@ -576,8 +552,7 @@ // // Must be at most 255 times the output length of the hash algorithm. okm_len: usize, - // Zero on success, bitwise complement of [`Error`](crate::crypto::Error) - // otherwise. + // Zero on success. Negative on error. ): isize // END OF MODULE crypto_hash // END OF MODULE crypto @@ -852,11 +827,6 @@ // START OF MODULE radio // Radio operations. - // Describes errors on radio operations. - enum radio_Error { - Unknown = 0, - } - // START OF MODULE radio_ble // Bluetooth Low Energy (BLE) operations. // BLE events. @@ -889,8 +859,8 @@ export declare function radio_ble_read_advertisement( // Pointer to the [`super::Advertisement`] packet. ptr: usize, - // One if a packet was read. Zero if there was no packet to read. Otherwise - // complement of error number. + // One if a packet was read. Zero if there was no packet to read. Negative on + // error. ): isize // Register a handler for radio events. @@ -957,24 +927,6 @@ // START OF MODULE store // Persistent storage operations. - // Describes errors interacting with the store. - enum store_Error { - // A function pre-condition was broken. - InvalidArgument = 0, - - // The store is full. - NoCapacity = 1, - - // The store reached its end of life. - NoLifetime = 2, - - // An operation to the underlying storage failed. - StorageError = 3, - - // The underlying storage doesn't match the store invariant. - InvalidStorage = 4, - } - // Inserts an entry in the store. // // If an entry for that key was already present, it is overwritten. @@ -990,7 +942,7 @@ // Length of the value. len: usize, - // Zero for success. Otherwise complement of error number. + // Zero for success. Negative on error. ): isize // Removes an entry from the store. @@ -1000,7 +952,7 @@ export declare function store_remove( // Key of the entry. key: usize, - // Zero for success. Otherwise complement of error number. + // Zero for success. Negative on error. ): isize // Finds an entry in the store, if any. @@ -1017,7 +969,7 @@ // Where to write the length of the value, if found. len: usize, - // One if found. Zero if not found. Otherwise complement of error number. + // One if found. Zero if not found. Negative on error. ): isize // START OF MODULE store_fragment @@ -1154,11 +1106,6 @@ // START OF MODULE usb // USB operations. - // Describes errors on USB operations. - enum usb_Error { - Unknown = 0, - } - // START OF MODULE usb_serial // Reads from USB serial into a buffer. @external("env", "usr") @@ -1216,7 +1163,7 @@ // Flushs the USB serial. @external("env", "usf") export declare function usb_serial_flush( - // Zero on success, -1 on error. + // Zero on success. Negative on error. ): isize // END OF MODULE usb_serial // END OF MODULE usb diff --git a/examples/rust/blink/Cargo.lock b/examples/rust/blink/Cargo.lock index 94dcd99d..4220540a 100644 --- a/examples/rust/blink/Cargo.lock +++ b/examples/rust/blink/Cargo.lock @@ -145,6 +145,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/blink_periodic/Cargo.lock b/examples/rust/blink_periodic/Cargo.lock index efe3f359..f167182b 100644 --- a/examples/rust/blink_periodic/Cargo.lock +++ b/examples/rust/blink_periodic/Cargo.lock @@ -145,6 +145,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/button/Cargo.lock b/examples/rust/button/Cargo.lock index 1cd82963..4531ad4a 100644 --- a/examples/rust/button/Cargo.lock +++ b/examples/rust/button/Cargo.lock @@ -145,6 +145,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/button_abort/Cargo.lock b/examples/rust/button_abort/Cargo.lock index 2e7de364..da3c8381 100644 --- a/examples/rust/button_abort/Cargo.lock +++ b/examples/rust/button_abort/Cargo.lock @@ -145,6 +145,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/ccm/Cargo.lock b/examples/rust/ccm/Cargo.lock index 1884c15b..0179315e 100644 --- a/examples/rust/ccm/Cargo.lock +++ b/examples/rust/ccm/Cargo.lock @@ -145,6 +145,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/clock/Cargo.lock b/examples/rust/clock/Cargo.lock index b4907753..e5b48865 100644 --- a/examples/rust/clock/Cargo.lock +++ b/examples/rust/clock/Cargo.lock @@ -145,6 +145,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/ctap/Cargo.lock b/examples/rust/ctap/Cargo.lock index dc4800a2..3840a5ad 100644 --- a/examples/rust/ctap/Cargo.lock +++ b/examples/rust/ctap/Cargo.lock @@ -145,6 +145,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/ec_test/Cargo.lock b/examples/rust/ec_test/Cargo.lock index 403a72eb..993fc4fe 100644 --- a/examples/rust/ec_test/Cargo.lock +++ b/examples/rust/ec_test/Cargo.lock @@ -302,6 +302,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "p256" version = "0.13.2" @@ -539,6 +559,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -548,6 +569,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", "wasefire-logger", ] @@ -572,6 +594,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-logger" version = "0.1.4-git" @@ -593,6 +622,7 @@ dependencies = [ "sha2", "signature", "wasefire-applet-api", + "wasefire-error", "wasefire-logger", ] diff --git a/examples/rust/echo/Cargo.lock b/examples/rust/echo/Cargo.lock index 10dd3a39..c18db1a6 100644 --- a/examples/rust/echo/Cargo.lock +++ b/examples/rust/echo/Cargo.lock @@ -145,6 +145,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/client/Cargo.lock b/examples/rust/exercises/client/Cargo.lock index b8e69e13..140f52b9 100644 --- a/examples/rust/exercises/client/Cargo.lock +++ b/examples/rust/exercises/client/Cargo.lock @@ -460,6 +460,26 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "p256" version = "0.13.2" @@ -847,6 +867,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -856,6 +877,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -879,6 +901,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/interface/Cargo.lock b/examples/rust/exercises/interface/Cargo.lock index 95c3dd86..7692723c 100644 --- a/examples/rust/exercises/interface/Cargo.lock +++ b/examples/rust/exercises/interface/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -308,6 +328,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -317,6 +338,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -340,6 +362,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-1-sol/Cargo.lock b/examples/rust/exercises/part-1-sol/Cargo.lock index ed02d58f..01aff399 100644 --- a/examples/rust/exercises/part-1-sol/Cargo.lock +++ b/examples/rust/exercises/part-1-sol/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-1-sol" version = "0.1.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-1/Cargo.lock b/examples/rust/exercises/part-1/Cargo.lock index b2c67d91..cae7cfc5 100644 --- a/examples/rust/exercises/part-1/Cargo.lock +++ b/examples/rust/exercises/part-1/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-1" version = "0.1.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-2-sol/Cargo.lock b/examples/rust/exercises/part-2-sol/Cargo.lock index e22c895e..518e4379 100644 --- a/examples/rust/exercises/part-2-sol/Cargo.lock +++ b/examples/rust/exercises/part-2-sol/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-2-sol" version = "0.1.0" @@ -316,6 +336,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -325,6 +346,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -348,6 +370,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-2/Cargo.lock b/examples/rust/exercises/part-2/Cargo.lock index 7642372f..f9e96a6c 100644 --- a/examples/rust/exercises/part-2/Cargo.lock +++ b/examples/rust/exercises/part-2/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-2" version = "0.1.0" @@ -316,6 +336,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -325,6 +346,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -348,6 +370,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-3-sol/Cargo.lock b/examples/rust/exercises/part-3-sol/Cargo.lock index f1e96859..8058fd29 100644 --- a/examples/rust/exercises/part-3-sol/Cargo.lock +++ b/examples/rust/exercises/part-3-sol/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-3-sol" version = "0.1.0" @@ -316,6 +336,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -325,6 +346,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -348,6 +370,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-3/Cargo.lock b/examples/rust/exercises/part-3/Cargo.lock index 7b6aa764..390857f5 100644 --- a/examples/rust/exercises/part-3/Cargo.lock +++ b/examples/rust/exercises/part-3/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-3" version = "0.1.0" @@ -316,6 +336,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -325,6 +346,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -348,6 +370,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-4-sol/Cargo.lock b/examples/rust/exercises/part-4-sol/Cargo.lock index c2a61940..9b3a578b 100644 --- a/examples/rust/exercises/part-4-sol/Cargo.lock +++ b/examples/rust/exercises/part-4-sol/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-4-sol" version = "0.1.0" @@ -316,6 +336,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -325,6 +346,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -348,6 +370,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-4/Cargo.lock b/examples/rust/exercises/part-4/Cargo.lock index 0f36ad81..2725559b 100644 --- a/examples/rust/exercises/part-4/Cargo.lock +++ b/examples/rust/exercises/part-4/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-4" version = "0.1.0" @@ -316,6 +336,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -325,6 +346,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -348,6 +370,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-5-sol/Cargo.lock b/examples/rust/exercises/part-5-sol/Cargo.lock index 56a22bb6..574c81be 100644 --- a/examples/rust/exercises/part-5-sol/Cargo.lock +++ b/examples/rust/exercises/part-5-sol/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-5-sol" version = "0.1.0" @@ -316,6 +336,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -325,6 +346,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -348,6 +370,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-5/Cargo.lock b/examples/rust/exercises/part-5/Cargo.lock index 40e1db33..51271f49 100644 --- a/examples/rust/exercises/part-5/Cargo.lock +++ b/examples/rust/exercises/part-5/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-5" version = "0.1.0" @@ -316,6 +336,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -325,6 +346,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -348,6 +370,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-6-sol/Cargo.lock b/examples/rust/exercises/part-6-sol/Cargo.lock index df3e3b4e..6c9d4923 100644 --- a/examples/rust/exercises/part-6-sol/Cargo.lock +++ b/examples/rust/exercises/part-6-sol/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-6-sol" version = "0.1.0" @@ -316,6 +336,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -325,6 +346,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -348,6 +370,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-6/Cargo.lock b/examples/rust/exercises/part-6/Cargo.lock index 7528c219..60a47827 100644 --- a/examples/rust/exercises/part-6/Cargo.lock +++ b/examples/rust/exercises/part-6/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-6" version = "0.1.0" @@ -316,6 +336,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -325,6 +346,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -348,6 +370,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-7-sol/Cargo.lock b/examples/rust/exercises/part-7-sol/Cargo.lock index 2e3e6260..ee67eea5 100644 --- a/examples/rust/exercises/part-7-sol/Cargo.lock +++ b/examples/rust/exercises/part-7-sol/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-7-sol" version = "0.1.0" @@ -316,6 +336,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -325,6 +346,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -348,6 +370,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/exercises/part-7/Cargo.lock b/examples/rust/exercises/part-7/Cargo.lock index c0026fe8..13d4e435 100644 --- a/examples/rust/exercises/part-7/Cargo.lock +++ b/examples/rust/exercises/part-7/Cargo.lock @@ -159,6 +159,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "part-7" version = "0.1.0" @@ -316,6 +336,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -325,6 +346,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -348,6 +370,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/gcm_test/Cargo.lock b/examples/rust/gcm_test/Cargo.lock index 97fc460f..d5d70ac4 100644 --- a/examples/rust/gcm_test/Cargo.lock +++ b/examples/rust/gcm_test/Cargo.lock @@ -176,6 +176,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -303,6 +323,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", "zeroize", ] @@ -313,6 +334,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -336,6 +358,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/gpio_test/Cargo.lock b/examples/rust/gpio_test/Cargo.lock index 3c04d69b..c5941ba9 100644 --- a/examples/rust/gpio_test/Cargo.lock +++ b/examples/rust/gpio_test/Cargo.lock @@ -145,6 +145,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/hash_test/Cargo.lock b/examples/rust/hash_test/Cargo.lock index 13805e2c..18e36f08 100644 --- a/examples/rust/hash_test/Cargo.lock +++ b/examples/rust/hash_test/Cargo.lock @@ -313,6 +313,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "p256" version = "0.13.2" @@ -553,6 +573,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", "zeroize", ] @@ -563,6 +584,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", "wasefire-logger", ] @@ -587,6 +609,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-logger" version = "0.1.4-git" @@ -608,6 +637,7 @@ dependencies = [ "sha2", "signature", "wasefire-applet-api", + "wasefire-error", "wasefire-logger", ] diff --git a/examples/rust/hello/Cargo.lock b/examples/rust/hello/Cargo.lock index 94f4cd3d..86494bf9 100644 --- a/examples/rust/hello/Cargo.lock +++ b/examples/rust/hello/Cargo.lock @@ -145,6 +145,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/hsm/Cargo.lock b/examples/rust/hsm/Cargo.lock index c8bdd0f3..24096735 100644 --- a/examples/rust/hsm/Cargo.lock +++ b/examples/rust/hsm/Cargo.lock @@ -153,6 +153,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -271,6 +291,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -280,6 +301,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -303,6 +325,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/hsm/common/Cargo.lock b/examples/rust/hsm/common/Cargo.lock index 5c475acc..12d3ab7c 100644 --- a/examples/rust/hsm/common/Cargo.lock +++ b/examples/rust/hsm/common/Cargo.lock @@ -146,6 +146,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -284,6 +304,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -293,6 +314,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -316,6 +338,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/hsm/common/src/lib.rs b/examples/rust/hsm/common/src/lib.rs index 51eccc2c..2967a966 100644 --- a/examples/rust/hsm/common/src/lib.rs +++ b/examples/rust/hsm/common/src/lib.rs @@ -60,27 +60,6 @@ pub enum Error { UsbError, } -#[cfg(feature = "api")] -impl From for Error { - fn from(_: wasefire::crypto::Error) -> Self { - Error::CryptoError - } -} - -#[cfg(feature = "api")] -impl From for Error { - fn from(_: wasefire::rng::Error) -> Self { - Error::RngError - } -} - -#[cfg(feature = "api")] -impl From for Error { - fn from(_: wasefire::store::Error) -> Self { - Error::StoreError - } -} - pub trait Serializer { fn write_all(&mut self, data: &[u8]) -> Result<(), Error>; fn flush(&mut self) -> Result<(), Error>; diff --git a/examples/rust/hsm/src/lib.rs b/examples/rust/hsm/src/lib.rs index 9a180585..df73ec35 100644 --- a/examples/rust/hsm/src/lib.rs +++ b/examples/rust/hsm/src/lib.rs @@ -34,24 +34,26 @@ fn process(request: Request) -> Result { match request { Request::GenerateKey { key } => { let mut secret = [0; 16]; - rng::fill_bytes(&mut secret)?; - store::insert(key, &secret)?; + rng::fill_bytes(&mut secret).map_err(|_| Error::RngError)?; + store::insert(key, &secret).map_err(|_| Error::StoreError)?; Ok(Response::GenerateKey) } Request::DeleteKey { key } => { - store::remove(key)?; + store::remove(key).map_err(|_| Error::StoreError)?; Ok(Response::DeleteKey) } Request::Encrypt { key, nonce, data } => { - let data = crypto::ccm::encrypt(&find(key)?, &nonce, &data)?; + let data = + crypto::ccm::encrypt(&find(key)?, &nonce, &data).map_err(|_| Error::CryptoError)?; Ok(Response::Encrypt { data }) } Request::Decrypt { key, nonce, data } => { - let data = crypto::ccm::decrypt(&find(key)?, &nonce, &data)?; + let data = + crypto::ccm::decrypt(&find(key)?, &nonce, &data).map_err(|_| Error::CryptoError)?; Ok(Response::Decrypt { data }) } Request::ImportKey { key, secret } => { - store::insert(key, &secret)?; + store::insert(key, &secret).map_err(|_| Error::StoreError)?; Ok(Response::ImportKey) } Request::ExportKey { key } => Ok(Response::ExportKey { secret: find(key)? }), @@ -60,7 +62,7 @@ fn process(request: Request) -> Result { fn find(key: usize) -> Result<[u8; 16], Error> { let mut result = [0; 16]; - let key = store::find(key)?.ok_or(Error::BadHandle)?; + let key = store::find(key).map_err(|_| Error::StoreError)?.ok_or(Error::BadHandle)?; if key.len() != result.len() { return Err(Error::BadHandle); } diff --git a/examples/rust/led/Cargo.lock b/examples/rust/led/Cargo.lock index 3011705b..b8ead145 100644 --- a/examples/rust/led/Cargo.lock +++ b/examples/rust/led/Cargo.lock @@ -145,6 +145,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/memory_game/Cargo.lock b/examples/rust/memory_game/Cargo.lock index 922904f0..f8087b19 100644 --- a/examples/rust/memory_game/Cargo.lock +++ b/examples/rust/memory_game/Cargo.lock @@ -145,6 +145,26 @@ dependencies = [ "wasefire", ] +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/oom/Cargo.lock b/examples/rust/oom/Cargo.lock index 65741b77..e1d9f0c9 100644 --- a/examples/rust/oom/Cargo.lock +++ b/examples/rust/oom/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "oom" version = "0.1.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/panic/Cargo.lock b/examples/rust/panic/Cargo.lock index 08d57341..e77099d3 100644 --- a/examples/rust/panic/Cargo.lock +++ b/examples/rust/panic/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "panic" version = "0.1.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/perf/Cargo.lock b/examples/rust/perf/Cargo.lock index 645c9005..b55f5090 100644 --- a/examples/rust/perf/Cargo.lock +++ b/examples/rust/perf/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "perf" version = "0.1.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/rand/Cargo.lock b/examples/rust/rand/Cargo.lock index d84831c2..caabea88 100644 --- a/examples/rust/rand/Cargo.lock +++ b/examples/rust/rand/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/reboot/Cargo.lock b/examples/rust/reboot/Cargo.lock index 34845220..0aa501a8 100644 --- a/examples/rust/reboot/Cargo.lock +++ b/examples/rust/reboot/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/rng_test/Cargo.lock b/examples/rust/rng_test/Cargo.lock index 24e9a866..0c9d685c 100644 --- a/examples/rust/rng_test/Cargo.lock +++ b/examples/rust/rng_test/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/store/Cargo.lock b/examples/rust/store/Cargo.lock index 486821c1..be32e895 100644 --- a/examples/rust/store/Cargo.lock +++ b/examples/rust/store/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/store/src/lib.rs b/examples/rust/store/src/lib.rs index c4f55068..e9dab63f 100644 --- a/examples/rust/store/src/lib.rs +++ b/examples/rust/store/src/lib.rs @@ -80,7 +80,7 @@ impl<'a> Command<'a> { }) } - fn process(&self) -> Result<(), store::Error> { + fn process(&self) -> Result<(), Error> { match self { Command::Insert { key, value } => insert(key, value.as_bytes()), Command::Find { key } => { @@ -128,21 +128,21 @@ impl Key { } } -fn insert(key: &Key, value: &[u8]) -> Result<(), store::Error> { +fn insert(key: &Key, value: &[u8]) -> Result<(), Error> { match key { Key::Exact(key) => store::insert(*key, value), Key::Range(keys) => store::fragment::insert(keys.clone(), value), } } -fn find(key: &Key) -> Result>, store::Error> { +fn find(key: &Key) -> Result>, Error> { match key { Key::Exact(key) => store::find(*key), Key::Range(keys) => store::fragment::find(keys.clone()), } } -fn remove(key: &Key) -> Result<(), store::Error> { +fn remove(key: &Key) -> Result<(), Error> { match key { Key::Exact(key) => store::remove(*key), Key::Range(keys) => store::fragment::remove(keys.clone()), diff --git a/examples/rust/store_test/Cargo.lock b/examples/rust/store_test/Cargo.lock index 7c3c310b..8c87393e 100644 --- a/examples/rust/store_test/Cargo.lock +++ b/examples/rust/store_test/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/sync_test/Cargo.lock b/examples/rust/sync_test/Cargo.lock index 1c755ca6..8a87e671 100644 --- a/examples/rust/sync_test/Cargo.lock +++ b/examples/rust/sync_test/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/syscall_test/Cargo.lock b/examples/rust/syscall_test/Cargo.lock index d5e4c304..d08c3a72 100644 --- a/examples/rust/syscall_test/Cargo.lock +++ b/examples/rust/syscall_test/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/syscall_test/src/lib.rs b/examples/rust/syscall_test/src/lib.rs index f40c98f1..c4d6076d 100644 --- a/examples/rust/syscall_test/src/lib.rs +++ b/examples/rust/syscall_test/src/lib.rs @@ -18,6 +18,20 @@ wasefire::applet!(); fn main() { - debug::assert_eq(&syscall(1, 2, 3, 4), &5); + test_error(); debug::exit(true); } + +fn test_error() { + debug!("test_error(): Check that errors are correctly converted."); + for (x, r) in [ + (0, Ok(0)), + (0x7fffffff, Ok(0x7fffffff)), + (0xff000000, Err(Error::new(0xff, 0xffff))), + (0xfffefffd, Err(Error::user(2))), + (0xffffffff, Err(Error::default())), + ] { + debug!("- {x:08x} -> {r:?}"); + debug::assert_eq(&Error::decode(syscall(0, 0, 0, x) as i32), &r); + } +} diff --git a/examples/rust/timer_test/Cargo.lock b/examples/rust/timer_test/Cargo.lock index dc8ffa04..7804e178 100644 --- a/examples/rust/timer_test/Cargo.lock +++ b/examples/rust/timer_test/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/update/Cargo.lock b/examples/rust/update/Cargo.lock index 98a7ffe4..e051ffa2 100644 --- a/examples/rust/update/Cargo.lock +++ b/examples/rust/update/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git" diff --git a/examples/rust/version/Cargo.lock b/examples/rust/version/Cargo.lock index 86260b1a..7a0a16e7 100644 --- a/examples/rust/version/Cargo.lock +++ b/examples/rust/version/Cargo.lock @@ -138,6 +138,26 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -263,6 +283,7 @@ dependencies = [ "sealed", "typenum", "wasefire-applet-api", + "wasefire-error", "wasefire-sync", ] @@ -272,6 +293,7 @@ version = "0.6.0-git" dependencies = [ "bytemuck", "wasefire-applet-api-macro", + "wasefire-error", ] [[package]] @@ -295,6 +317,13 @@ dependencies = [ "wasefire-applet-api-desc", ] +[[package]] +name = "wasefire-error" +version = "0.1.0-git" +dependencies = [ + "num_enum", +] + [[package]] name = "wasefire-sync" version = "0.1.0-git"