wasi_crypto/
lib.rs

1#![allow(
2    clippy::unit_arg,
3    clippy::useless_conversion,
4    clippy::new_without_default,
5    clippy::new_ret_no_self,
6    clippy::unnecessary_wraps,
7    clippy::too_many_arguments
8)]
9#![allow(unused_imports, dead_code)]
10#[macro_use]
11extern crate derivative;
12
13mod array_output;
14mod asymmetric_common;
15mod error;
16mod handles;
17mod key_exchange;
18mod options;
19mod rand;
20mod secrets_manager;
21mod signatures;
22mod symmetric;
23mod version;
24
25use std::collections::HashMap;
26use std::rc::Rc;
27
28use array_output::*;
29use asymmetric_common::*;
30pub use asymmetric_common::{KeyPairEncoding, PublicKeyEncoding, SecretKeyEncoding};
31pub use error::CryptoError;
32pub use handles::Handle;
33use handles::*;
34use key_exchange::*;
35use options::*;
36use secrets_manager::*;
37pub use signatures::SignatureEncoding;
38use signatures::*;
39use symmetric::*;
40pub use version::Version;
41
42pub(crate) struct HandleManagers {
43    pub array_output: HandlesManager<ArrayOutput>,
44    pub options: HandlesManager<Options>,
45    pub keypair: HandlesManager<KeyPair>,
46    pub publickey: HandlesManager<PublicKey>,
47    pub secretkey: HandlesManager<SecretKey>,
48    pub signature_state: HandlesManager<SignatureState>,
49    pub signature: HandlesManager<Signature>,
50    pub signature_verification_state: HandlesManager<SignatureVerificationState>,
51    pub symmetric_state: HandlesManager<SymmetricState>,
52    pub symmetric_key: HandlesManager<SymmetricKey>,
53    pub symmetric_tag: HandlesManager<SymmetricTag>,
54    pub secrets_manager: HandlesManager<SecretsManager>,
55}
56
57#[derive(Copy, Clone, Debug, PartialEq, Eq)]
58pub enum AlgorithmType {
59    Signatures,
60    Symmetric,
61    KeyExchange,
62}
63
64#[derive(Clone, Debug, PartialEq, Eq, Default)]
65pub struct Limits(HashMap<&'static str, usize>);
66
67impl Limits {
68    pub fn new() -> Self {
69        Self::default()
70    }
71
72    pub fn set(&mut self, algorithm: &'static str, limit: usize) {
73        self.0.insert(algorithm, limit);
74    }
75
76    pub fn get(&self, algorithm: &'static str) -> Option<usize> {
77        self.0.get(algorithm).copied()
78    }
79}
80
81pub struct CryptoCtx {
82    pub(crate) handles: HandleManagers,
83    pub(crate) limits: Limits,
84}
85
86impl CryptoCtx {
87    pub fn new() -> Self {
88        CryptoCtx {
89            handles: HandleManagers {
90                array_output: HandlesManager::new(0x00),
91                options: HandlesManager::new(0x01),
92                keypair: HandlesManager::new(0x02),
93                publickey: HandlesManager::new(0x03),
94                secretkey: HandlesManager::new(0x04),
95                signature_state: HandlesManager::new(0x05),
96                signature: HandlesManager::new(0x06),
97                signature_verification_state: HandlesManager::new(0x07),
98                symmetric_state: HandlesManager::new(0x08),
99                symmetric_key: HandlesManager::new(0x09),
100                symmetric_tag: HandlesManager::new(0x0a),
101                secrets_manager: HandlesManager::new(0x0b),
102            },
103            limits: Limits::default(),
104        }
105    }
106
107    pub fn set_limits(&mut self, limits: Limits) {
108        self.limits = limits;
109    }
110
111    pub fn new_with_limits(limits: Limits) -> Self {
112        let mut ctx = Self::new();
113        ctx.set_limits(limits);
114        ctx
115    }
116}