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}