Skip to content

Commit d4bc02f

Browse files
committed
Improve mandatory Provide methods
This commit changes the way some methods on the Provide trait are implemented. Given that in some cases the methods _must_ be implemented by the providers (such as `list_keys`), there should be no default implementation for them and the tests must verify that they operate correctly. Signed-off-by: Ionut Mihalcea <[email protected]>
1 parent d563c8b commit d4bc02f

File tree

5 files changed

+67
-55
lines changed

5 files changed

+67
-55
lines changed

e2e_tests/tests/all_providers/normal.rs

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -128,16 +128,19 @@ fn list_keys() {
128128

129129
assert!(keys.is_empty());
130130

131-
let key1 = String::from("list_keys1");
132-
let key2 = String::from("list_keys2");
133-
let key3 = String::from("list_keys3");
134-
135-
client.set_provider(ProviderID::MbedCrypto);
136-
client.generate_rsa_sign_key(key1.clone()).unwrap();
137-
client.set_provider(ProviderID::Pkcs11);
138-
client.generate_rsa_sign_key(key2.clone()).unwrap();
139-
client.set_provider(ProviderID::Tpm);
140-
client.generate_rsa_sign_key(key3.clone()).unwrap();
131+
let providers = client.list_providers().expect("Failed to list providers");
132+
let mut suitable_providers = vec![];
133+
134+
for provider in providers.iter() {
135+
client.set_provider(provider.id);
136+
if !client.is_operation_supported(Opcode::PsaGenerateKey) {
137+
continue;
138+
}
139+
suitable_providers.push(provider.clone());
140+
client
141+
.generate_rsa_sign_key(format!("list_keys_{}", provider.id))
142+
.unwrap();
143+
}
141144

142145
let key_names: Vec<(String, ProviderID)> = client
143146
.list_keys()
@@ -146,10 +149,11 @@ fn list_keys() {
146149
.map(|k| (k.name, k.provider_id))
147150
.collect();
148151

149-
assert_eq!(key_names.len(), 3);
150-
assert!(key_names.contains(&(key1.clone(), ProviderID::MbedCrypto)));
151-
assert!(key_names.contains(&(key2.clone(), ProviderID::Pkcs11)));
152-
assert!(key_names.contains(&(key3.clone(), ProviderID::Tpm)));
152+
assert_eq!(key_names.len(), suitable_providers.len());
153+
154+
for provider in suitable_providers.iter() {
155+
assert!(key_names.contains(&(format!("list_keys_{}", provider.id), provider.id)));
156+
}
153157
}
154158

155159
#[test]
@@ -187,27 +191,47 @@ fn invalid_provider_list_clients() {
187191
fn list_and_delete_clients() {
188192
let mut client = TestClient::new();
189193
client.do_not_destroy_keys();
190-
client.set_default_auth(Some("list_clients test".to_string()));
194+
195+
let all_providers_user = "list_clients test".to_string();
196+
client.set_default_auth(Some(all_providers_user.clone()));
191197

192198
let clients = client.list_clients().expect("list_clients failed");
193-
assert!(!clients.contains(&"list_clients test".to_string()));
199+
assert!(!clients.contains(&all_providers_user));
200+
201+
let providers = client.list_providers().expect("Failed to list providers");
202+
let mut suitable_providers = vec![];
194203

195-
let key1 = String::from("list_clients1");
196-
let key2 = String::from("list_keys2");
197-
let key3 = String::from("list_keys3");
204+
for provider in providers.iter() {
205+
client.set_provider(provider.id);
206+
if !client.is_operation_supported(Opcode::PsaGenerateKey) {
207+
continue;
208+
}
209+
suitable_providers.push(provider.clone());
198210

199-
client.set_provider(ProviderID::MbedCrypto);
200-
client.generate_rsa_sign_key(key1.clone()).unwrap();
201-
client.set_provider(ProviderID::Pkcs11);
202-
client.generate_rsa_sign_key(key2.clone()).unwrap();
203-
client.set_provider(ProviderID::Tpm);
204-
client.generate_rsa_sign_key(key3.clone()).unwrap();
211+
client.set_default_auth(Some(all_providers_user.clone()));
212+
client
213+
.generate_rsa_sign_key("all-providers-user-key".to_string())
214+
.unwrap();
215+
216+
client.set_default_auth(Some(format!("user_{}", provider.id)));
217+
client
218+
.generate_rsa_sign_key(format!("user_{}-key", provider.id))
219+
.unwrap();
220+
}
221+
222+
client.set_default_auth(Some(all_providers_user.clone()));
205223

206224
let clients = client.list_clients().expect("list_clients failed");
207-
assert!(clients.contains(&"list_clients test".to_string()));
208-
client
209-
.delete_client("list_clients test".to_string())
210-
.unwrap();
225+
assert_eq!(clients.len(), suitable_providers.len() + 1);
226+
227+
assert!(clients.contains(&all_providers_user));
228+
client.delete_client(all_providers_user).unwrap();
229+
230+
for provider in suitable_providers.iter() {
231+
let username = format!("user_{}", provider.id);
232+
assert!(clients.contains(&username));
233+
client.delete_client(username).unwrap();
234+
}
211235

212236
let keys = client.list_keys().expect("list_keys failed");
213237

e2e_tests/tests/per_provider/normal_tests/hash.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,14 @@ fn hash_not_supported() {
2727
let mut client = TestClient::new();
2828
if !client.is_operation_supported(Opcode::PsaHashCompute) {
2929
assert_eq!(
30-
client.hash_compute(Hash::Sha256, &vec![],).unwrap_err(),
30+
client.hash_compute(Hash::Sha256, &[],).unwrap_err(),
3131
ResponseStatus::PsaErrorNotSupported
3232
);
3333
}
3434

3535
if !client.is_operation_supported(Opcode::PsaHashCompare) {
3636
assert_eq!(
37-
client
38-
.hash_compare(Hash::Sha256, &vec![], &vec![])
39-
.unwrap_err(),
37+
client.hash_compare(Hash::Sha256, &[], &[]).unwrap_err(),
4038
ResponseStatus::PsaErrorNotSupported
4139
);
4240
}

e2e_tests/tests/per_provider/normal_tests/key_agreement.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,7 @@ fn simple_raw_key_agreement() {
7070
.generate_ecc_pair_secp_r1_key(key_name.clone())
7171
.unwrap();
7272
let _shared_secret = client
73-
.raw_key_agreement(
74-
RawKeyAgreement::Ecdh,
75-
key_name.clone(),
76-
&PEER_PUBLIC_KEY_SECPR1,
77-
)
73+
.raw_key_agreement(RawKeyAgreement::Ecdh, key_name, &PEER_PUBLIC_KEY_SECPR1)
7874
.unwrap();
7975
}
8076

@@ -91,11 +87,7 @@ fn raw_key_agreement_secpr1() {
9187
.import_ecc_pair_secp_r1_key(key_name.clone(), OUR_KEY_DATA_SECPR1.to_vec())
9288
.unwrap();
9389
let shared_secret = client
94-
.raw_key_agreement(
95-
RawKeyAgreement::Ecdh,
96-
key_name.clone(),
97-
&PEER_PUBLIC_KEY_SECPR1,
98-
)
90+
.raw_key_agreement(RawKeyAgreement::Ecdh, key_name, &PEER_PUBLIC_KEY_SECPR1)
9991
.unwrap();
10092

10193
assert_eq!(&EXPECTED_OUTPUT_SECPR1, shared_secret.as_slice());

src/providers/core/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ impl Provide for Provider {
142142

143143
Ok(result)
144144
}
145+
146+
fn describe(&self) -> Result<(ProviderInfo, HashSet<Opcode>)> {
147+
unreachable!()
148+
}
145149
}
146150

147151
/// Builder for CoreProvider

src/providers/mod.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,14 @@ use parsec_interface::requests::{ResponseStatus, Result};
116116
///
117117
/// Definition of the interface that a provider must implement to
118118
/// be linked into the service through a backend handler.
119+
///
120+
/// The methods with no default are used on a service-level by the
121+
/// core provider and so must be supported by all providers.
119122
pub trait Provide {
120123
/// Return a description of the current provider.
121124
///
122125
/// The descriptions are gathered in the Core Provider and returned for a ListProviders operation.
123-
fn describe(&self) -> Result<(list_providers::ProviderInfo, HashSet<Opcode>)> {
124-
trace!("describe ingress");
125-
Err(ResponseStatus::PsaErrorNotSupported)
126-
}
126+
fn describe(&self) -> Result<(list_providers::ProviderInfo, HashSet<Opcode>)>;
127127

128128
/// List the providers running in the service.
129129
fn list_providers(&self, _op: list_providers::Operation) -> Result<list_providers::Result> {
@@ -151,16 +151,10 @@ pub trait Provide {
151151
&self,
152152
_app_name: ApplicationName,
153153
_op: list_keys::Operation,
154-
) -> Result<list_keys::Result> {
155-
trace!("list_keys ingress");
156-
Err(ResponseStatus::PsaErrorNotSupported)
157-
}
154+
) -> Result<list_keys::Result>;
158155

159156
/// Lists all clients currently having data in the service.
160-
fn list_clients(&self, _op: list_clients::Operation) -> Result<list_clients::Result> {
161-
trace!("list_clients ingress");
162-
Err(ResponseStatus::PsaErrorNotSupported)
163-
}
157+
fn list_clients(&self, _op: list_clients::Operation) -> Result<list_clients::Result>;
164158

165159
/// Delete all data a client has in the service..
166160
fn delete_client(&self, _op: delete_client::Operation) -> Result<delete_client::Result> {

0 commit comments

Comments
 (0)