Skip to content

Commit 69d95fb

Browse files
authored
Merge pull request #165 from ionut-arm/split-providers
Split provider code into separate modules
2 parents 0eafbb0 + 4290cd8 commit 69d95fb

File tree

11 files changed

+1788
-1547
lines changed

11 files changed

+1788
-1547
lines changed
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
// Copyright 2020 Contributors to the Parsec project.
2+
// SPDX-License-Identifier: Apache-2.0
3+
use super::constants::PSA_SUCCESS;
4+
use super::utils::{self, KeyHandle};
5+
use super::{key_management, psa_crypto_binding, MbedProvider};
6+
use crate::authenticators::ApplicationName;
7+
use crate::key_info_managers::KeyTriple;
8+
use log::{error, info};
9+
use parsec_interface::operations::{psa_sign_hash, psa_verify_hash};
10+
use parsec_interface::requests::{ProviderID, Result};
11+
12+
impl MbedProvider {
13+
pub(super) fn psa_sign_hash_internal(
14+
&self,
15+
app_name: ApplicationName,
16+
op: psa_sign_hash::Operation,
17+
) -> Result<psa_sign_hash::Result> {
18+
info!("Mbed Provider - Asym Sign");
19+
let _semaphore_guard = self.key_slot_semaphore.access();
20+
let key_name = op.key_name;
21+
let hash = op.hash;
22+
let alg = op.alg;
23+
let key_triple = KeyTriple::new(app_name, ProviderID::MbedCrypto, key_name);
24+
let store_handle = self.key_info_store.read().expect("Key store lock poisoned");
25+
let key_id = key_management::get_key_id(&key_triple, &*store_handle)?;
26+
27+
let _guard = self
28+
.key_handle_mutex
29+
.lock()
30+
.expect("Grabbing key handle mutex failed");
31+
32+
let mut key_handle;
33+
let mut key_attrs;
34+
// Safety:
35+
// * at this point the provider has been instantiated so Mbed Crypto has been initialized
36+
// * self.key_handle_mutex prevents concurrent accesses
37+
// * self.key_slot_semaphore prevents overflowing key slots
38+
unsafe {
39+
key_handle = KeyHandle::open(key_id)?;
40+
key_attrs = key_handle.attributes()?;
41+
}
42+
43+
let buffer_size = utils::psa_asymmetric_sign_output_size(key_attrs.as_ref())?;
44+
let mut signature = vec![0u8; buffer_size];
45+
let mut signature_size: usize = 0;
46+
47+
let sign_status;
48+
// Safety: same conditions than above.
49+
unsafe {
50+
sign_status = psa_crypto_binding::psa_asymmetric_sign(
51+
key_handle.raw(),
52+
utils::convert_algorithm(&alg.into())?,
53+
hash.as_ptr(),
54+
hash.len(),
55+
signature.as_mut_ptr(),
56+
buffer_size,
57+
&mut signature_size,
58+
);
59+
key_attrs.reset();
60+
key_handle.close()?;
61+
};
62+
63+
if sign_status == PSA_SUCCESS {
64+
let mut res = psa_sign_hash::Result {
65+
signature: Vec::new(),
66+
};
67+
res.signature.resize(signature_size, 0);
68+
res.signature.copy_from_slice(&signature[0..signature_size]);
69+
70+
Ok(res)
71+
} else {
72+
error!("Sign status: {}", sign_status);
73+
Err(utils::convert_status(sign_status))
74+
}
75+
}
76+
77+
pub(super) fn psa_verify_hash_internal(
78+
&self,
79+
app_name: ApplicationName,
80+
op: psa_verify_hash::Operation,
81+
) -> Result<psa_verify_hash::Result> {
82+
info!("Mbed Provider - Asym Verify");
83+
let _semaphore_guard = self.key_slot_semaphore.access();
84+
let key_name = op.key_name;
85+
let hash = op.hash;
86+
let alg = op.alg;
87+
let signature = op.signature;
88+
let key_triple = KeyTriple::new(app_name, ProviderID::MbedCrypto, key_name);
89+
let store_handle = self.key_info_store.read().expect("Key store lock poisoned");
90+
let key_id = key_management::get_key_id(&key_triple, &*store_handle)?;
91+
92+
let _guard = self
93+
.key_handle_mutex
94+
.lock()
95+
.expect("Grabbing key handle mutex failed");
96+
97+
let mut key_handle;
98+
let mut key_attrs;
99+
let verify_status;
100+
// Safety:
101+
// * at this point the provider has been instantiated so Mbed Crypto has been initialized
102+
// * self.key_handle_mutex prevents concurrent accesses
103+
// * self.key_slot_semaphore prevents overflowing key slots
104+
unsafe {
105+
key_handle = KeyHandle::open(key_id)?;
106+
key_attrs = key_handle.attributes()?;
107+
verify_status = psa_crypto_binding::psa_asymmetric_verify(
108+
key_handle.raw(),
109+
utils::convert_algorithm(&alg.into())?,
110+
hash.as_ptr(),
111+
hash.len(),
112+
signature.as_ptr(),
113+
signature.len(),
114+
);
115+
key_attrs.reset();
116+
key_handle.close()?;
117+
}
118+
119+
if verify_status == PSA_SUCCESS {
120+
Ok(psa_verify_hash::Result {})
121+
} else {
122+
Err(utils::convert_status(verify_status))
123+
}
124+
}
125+
}

0 commit comments

Comments
 (0)