1#![cfg_attr(not(feature = "std"), no_std)]
13#![allow(renamed_and_removed_lints, unknown_lints)]
14#![deny(
15 nonstandard_style,
16 dead_code,
17 improper_ctypes,
18 non_shorthand_field_patterns,
19 no_mangle_generic_items,
20 overflowing_literals,
21 path_statements,
22 patterns_in_fns_without_body,
23 private_bounds,
24 private_in_public,
25 private_interfaces,
26 renamed_and_removed_lints,
27 unconditional_recursion,
28 unnameable_types,
29 unused,
30 unused_allocation,
31 unused_comparisons,
32 unused_parens,
33 while_true,
34 missing_debug_implementations,
35 missing_docs,
36 trivial_numeric_casts,
39 unused_extern_crates,
40 unused_import_braces,
41 unused_qualifications,
42 unused_results,
43 missing_copy_implementations
44)]
45#![allow(clippy::multiple_crate_versions)]
47
48#[cfg(feature = "operations")]
49pub mod operations;
50pub mod types;
51
52pub use psa_crypto_sys as ffi;
53
54#[cfg(feature = "operations")]
55use core::sync::atomic::{AtomicBool, Ordering};
56#[cfg(feature = "operations")]
57use types::status::{Error, Result, Status};
58
59#[cfg(feature = "operations")]
60static INITIALISED: AtomicBool = AtomicBool::new(false);
61
62#[cfg(feature = "operations")]
78pub fn init() -> Result<()> {
79 Status::from(unsafe { psa_crypto_sys::psa_crypto_init() }).to_result()?;
81 INITIALISED.store(true, Ordering::Relaxed);
82
83 Ok(())
84}
85
86#[cfg(feature = "operations")]
96pub fn initialized() -> Result<()> {
97 if INITIALISED.load(Ordering::Relaxed) {
98 Ok(())
99 } else {
100 Err(Error::BadState)
101 }
102}