Skip to content

Commit a8847bf

Browse files
committed
Moved setup and drop calls to psa-crypto and removed all references to psa_crypto_binding
Now Parsec calls psa-crypto when initialising and dropping an mbedcrypto provider. Also Parsec no longer has references for the bdinging to the mbedtls C lib. Signed-off-by: Samuel Bailey <samuel.bailey@arm.com>
1 parent 7b2ca72 commit a8847bf

File tree

7 files changed

+33
-265
lines changed

7 files changed

+33
-265
lines changed

e2e_tests/tests/per_provider/normal_tests/asym_sign_verify.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ fn asym_verify_fail() -> Result<()> {
5656
let status = client
5757
.verify_with_rsa_sha256(key_name, HASH.to_vec(), signature)
5858
.expect_err("Verification should fail.");
59-
dbg!("Status: {}", status);
6059
if !(status == ResponseStatus::PsaErrorInvalidSignature
6160
|| status == ResponseStatus::PsaErrorCorruptionDetected)
6261
{

e2e_tests/tests/per_provider/normal_tests/create_destroy_key.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,12 @@ fn create_destroy_twice() -> Result<()> {
8787
fn generate_public_rsa_check_modulus() -> Result<()> {
8888
// As stated in the operation page, the public exponent of RSA key pair should be 65537
8989
// (0x010001).
90-
println!("test");
9190
let mut client = TestClient::new();
92-
let key_name = String::from("generate_public_rsa_check_modulus1");
91+
let key_name = String::from("generate_public_rsa_check_modulus");
9392
client.generate_rsa_sign_key(key_name.clone())?;
9493
let public_key = client.export_public_key(key_name)?;
9594

9695
let public_key: RsaPublicKey = picky_asn1_der::from_bytes(&public_key).unwrap();
97-
println!("{:?}", &public_key.public_exponent.as_unsigned_bytes_be()[..]);
9896
assert_eq!(
9997
public_key.public_exponent.as_unsigned_bytes_be(),
10098
[0x01, 0x00, 0x01]

src/providers/mbed_provider/asym_sign.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,18 @@ impl MbedProvider {
3131
.key_handle_mutex
3232
.lock()
3333
.expect("Grabbing key handle mutex failed");
34+
35+
// Safety:
36+
// * at this point the provider has been instantiated so Mbed Crypto has been initialized
37+
// * self.key_handle_mutex prevents concurrent accesses
38+
// * self.key_slot_semaphore prevents overflowing key slots
39+
3440
let id = key::Id::from_persistent_key_id(key_id);
3541
let key_attributes = new_key_management::get_key_attributes(id)?;
3642
let buffer_size = utils::psa_asymmetric_sign_output_size(&key_attributes)?;
3743
let mut signature = vec![0u8; buffer_size];
3844
let mut signature_size = 0;
3945

40-
4146
match asym_signature::sign_hash(id, alg, &hash, &mut signature)
4247
{
4348
Ok(size) => {
@@ -77,6 +82,10 @@ impl MbedProvider {
7782
.lock()
7883
.expect("Grabbing key handle mutex failed");
7984

85+
// Safety:
86+
// * at this point the provider has been instantiated so Mbed Crypto has been initialized
87+
// * self.key_handle_mutex prevents concurrent accesses
88+
// * self.key_slot_semaphore prevents overflowing key slots
8089
let id = key::Id::from_persistent_key_id(key_id);
8190
match asym_signature::verify_hash(id, alg, &hash, &signature) {
8291
Ok(()) => Ok(psa_verify_hash::Result {}),

src/providers/mbed_provider/constants.rs

Lines changed: 0 additions & 157 deletions
This file was deleted.

src/providers/mbed_provider/key_management.rs

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
// Copyright 2020 Contributors to the Parsec project.
22
// SPDX-License-Identifier: Apache-2.0
3-
use super::constants::PSA_MAX_PERSISTENT_KEY_IDENTIFIER;
4-
use super::psa_crypto_binding::psa_key_id_t;
53
use super::utils;
64
use super::{LocalIdStore, MbedProvider};
75
use crate::authenticators::ApplicationName;
@@ -22,7 +20,7 @@ use psa_crypto::types::key;
2220
pub fn get_key_id(
2321
key_triple: &KeyTriple,
2422
store_handle: &dyn ManageKeyInfo,
25-
) -> Result<psa_key_id_t> {
23+
) -> Result<key::key_id_type> {
2624
match store_handle.get(key_triple) {
2725
Ok(Some(key_info)) => {
2826
if key_info.id.len() == 4 {
@@ -45,13 +43,13 @@ fn create_key_id(
4543
key_attributes: Attributes,
4644
store_handle: &mut dyn ManageKeyInfo,
4745
local_ids_handle: &mut LocalIdStore,
48-
) -> Result<psa_key_id_t> {
49-
let mut key_id = rand::random::<psa_key_id_t>();
46+
) -> Result<key::key_id_type> {
47+
let mut key_id = rand::random::<key::key_id_type>();
5048
while local_ids_handle.contains(&key_id)
5149
|| key_id == 0
52-
|| key_id > PSA_MAX_PERSISTENT_KEY_IDENTIFIER
50+
|| key_id > key::PSA_MAX_PERSISTENT_KEY_IDENTIFIER
5351
{
54-
key_id = rand::random::<psa_key_id_t>();
52+
key_id = rand::random::<key::key_id_type>();
5553
}
5654
let key_info = KeyInfo {
5755
id: key_id.to_ne_bytes().to_vec(),
@@ -72,7 +70,7 @@ fn create_key_id(
7270

7371
fn remove_key_id(
7472
key_triple: &KeyTriple,
75-
key_id: psa_key_id_t,
73+
key_id: key::key_id_type,
7674
store_handle: &mut dyn ManageKeyInfo,
7775
local_ids_handle: &mut LocalIdStore,
7876
) -> Result<()> {
@@ -122,14 +120,12 @@ impl MbedProvider {
122120
.lock()
123121
.expect("Grabbing key handle mutex failed");
124122

125-
psa_crypto::init()?;
126123
// Safety:
127124
// * at this point the provider has been instantiated so Mbed Crypto has been initialized
128125
// * self.key_handle_mutex prevents concurrent accesses
129126
// * self.key_slot_semaphore prevents overflowing key slots
130127
match new_key_management::generate(key_attributes, Some(key_id)) {
131-
Ok(()) => Ok(psa_generate_key::Result {}),
132-
128+
Ok(_) => Ok(psa_generate_key::Result {}),
133129
Err(error) => {
134130
remove_key_id(
135131
&key_triple,
@@ -180,8 +176,7 @@ impl MbedProvider {
180176
// * self.key_handle_mutex prevents concurrent accesses
181177
// * self.key_slot_semaphore prevents overflowing key slots
182178
match new_key_management::import(key_attributes, Some(key_id), &key_data[..]) {
183-
Ok(()) => Ok(psa_import_key::Result {}),
184-
179+
Ok(_) => Ok(psa_import_key::Result {}),
185180
Err(error) => {
186181
remove_key_id(
187182
&key_triple,
@@ -213,8 +208,6 @@ impl MbedProvider {
213208
.lock()
214209
.expect("Grabbing key handle mutex failed");
215210

216-
psa_crypto::init()?;
217-
218211
// Safety:
219212
// * at this point the provider has been instantiated so Mbed Crypto has been initialized
220213
// * self.key_handle_mutex prevents concurrent accesses
@@ -252,7 +245,6 @@ impl MbedProvider {
252245
.lock()
253246
.expect("Grabbing key handle mutex failed");
254247
let destroy_key_status;
255-
psa_crypto::init()?;
256248

257249
// Safety:
258250
// * at this point the provider has been instantiated so Mbed Crypto has been initialized

src/providers/mbed_provider/mod.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,19 @@
33
use super::Provide;
44
use crate::authenticators::ApplicationName;
55
use crate::key_info_managers::{KeyTriple, ManageKeyInfo};
6-
use constants::PSA_SUCCESS;
76
use derivative::Derivative;
87
use log::{error, trace};
98
use parsec_interface::operations::list_providers::ProviderInfo;
109
use parsec_interface::operations::{
1110
psa_destroy_key, psa_export_public_key, psa_generate_key, psa_import_key, psa_sign_hash,
1211
psa_verify_hash,
1312
};
13+
use psa_crypto::types::{status, key};
1414
use parsec_interface::requests::{Opcode, ProviderID, ResponseStatus, Result};
1515
use std::collections::HashSet;
1616
use std::io::{Error, ErrorKind};
1717
use std::sync::{Arc, Mutex, RwLock};
1818
use std_semaphore::Semaphore;
19-
use utils::KeyHandle;
2019
use uuid::Uuid;
2120

2221
#[allow(
@@ -27,17 +26,13 @@ use uuid::Uuid;
2726
trivial_casts
2827
)]
2928
#[allow(clippy::all)]
30-
mod psa_crypto_binding {
31-
include!(concat!(env!("OUT_DIR"), "/psa_crypto_bindings.rs"));
32-
}
3329

3430
mod asym_sign;
3531
#[allow(dead_code)]
36-
mod constants;
3732
mod key_management;
3833
mod utils;
3934

40-
type LocalIdStore = HashSet<psa_key_id_t>;
35+
type LocalIdStore = HashSet<key::key_id_type>;
4136

4237
const SUPPORTED_OPCODES: [Opcode; 6] = [
4338
Opcode::PsaGenerateKey,
@@ -79,15 +74,15 @@ impl MbedProvider {
7974
fn new(key_info_store: Arc<RwLock<dyn ManageKeyInfo + Send + Sync>>) -> Option<MbedProvider> {
8075
// Safety: this function should be called before any of the other Mbed Crypto functions
8176
// are.
82-
if unsafe { psa_crypto_binding::psa_crypto_init() } != PSA_SUCCESS {
77+
if psa_crypto::init().is_err() {
8378
error!("Error when initialising Mbed Crypto");
8479
return None;
8580
}
8681
let mbed_provider = MbedProvider {
8782
key_info_store,
8883
local_ids: RwLock::new(HashSet::new()),
8984
key_handle_mutex: Mutex::new(()),
90-
key_slot_semaphore: Semaphore::new(constants::PSA_KEY_SLOT_COUNT),
85+
key_slot_semaphore: Semaphore::new(key::PSA_KEY_SLOT_COUNT),
9186
};
9287
{
9388
// The local scope allows to drop store_handle and local_ids_handle in order to return
@@ -106,6 +101,11 @@ impl MbedProvider {
106101
// Delete those who are not present and add to the local_store the ones present.
107102
match store_handle.get_all(ProviderID::MbedCrypto) {
108103
Ok(key_triples) => {
104+
if let Err(error) = psa_crypto::init() {
105+
error!("Error {} when initialising Mbed Crypto library.", error);
106+
return None;
107+
}
108+
109109
for key_triple in key_triples.iter().cloned() {
110110
let key_id = match key_management::get_key_id(key_triple, &*store_handle) {
111111
Ok(key_id) => key_id,
@@ -119,11 +119,12 @@ impl MbedProvider {
119119
// Safety: safe because:
120120
// * the Mbed Crypto library has been initialized
121121
// * this code is executed only by the main thread
122-
match unsafe { KeyHandle::open(key_id) } {
122+
let pc_key_id = key::Id::from_persistent_key_id(key_id);
123+
match psa_crypto::operations::key_management::get_key_attributes(pc_key_id) {
123124
Ok(_) => {
124125
let _ = local_ids_handle.insert(key_id);
125126
}
126-
Err(ResponseStatus::PsaErrorDoesNotExist) => {
127+
Err(status::Error::DoesNotExist) => {
127128
to_remove.push(key_triple.clone())
128129
}
129130
Err(e) => {
@@ -223,9 +224,7 @@ impl Provide for MbedProvider {
223224
impl Drop for MbedProvider {
224225
fn drop(&mut self) {
225226
// Safety: the Provider was initialized with psa_crypto_init
226-
unsafe {
227-
psa_crypto_binding::mbedtls_psa_crypto_free();
228-
}
227+
psa_crypto::drop();
229228
}
230229
}
231230

0 commit comments

Comments
 (0)