Skip to content

Commit 38e1f20

Browse files
committed
Added provider names to the config.
This is an optional field, and will default to a suitable name for each provider if it is not provided. Two providers cannot have the same name. Closes #487 Signed-off-by: Matt Davis <[email protected]>
1 parent ac4ce65 commit 38e1f20

File tree

9 files changed

+298
-16
lines changed

9 files changed

+298
-16
lines changed

config.toml

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,16 @@ manager_type = "OnDisk"
101101

102102
# Example of an Mbed Crypto provider configuration.
103103
[[provider]]
104+
#
105+
# ⚠ WARNING: Provider name cannot change.
106+
# ⚠ WARNING: Choose a suitable naming scheme for your providers now.
107+
# ⚠ WARNING: Provider name defaults to "mbed-crypto-provider" if not provided, you will not be able to change
108+
# ⚠ the provider's name from this if you decide to use the default.
109+
# ⚠ WARNING: Changing provider name after use will lead to loss of existing keys.
110+
#
111+
# (Optional) The name of the provider
112+
name = "mbed-crypto-provider"
113+
104114
# (Required) Type of provider.
105115
provider_type = "MbedCrypto"
106116

@@ -114,6 +124,15 @@ key_info_manager = "on-disk-manager"
114124

115125
# Example of a PKCS 11 provider configuration
116126
#[[provider]]
127+
#
128+
# ⚠ WARNING: Provider name cannot change.
129+
# ⚠ WARNING: Choose a suitable naming scheme for your providers now.
130+
# ⚠ WARNING: Provider name defaults to "pkcs11-provider" if not provided, you will not be able to change
131+
# ⚠ the provider's name from this if you decide to use the default.
132+
# ⚠ WARNING: Changing provider name after use will lead to loss of existing keys.
133+
#
134+
# (Optional) The name of the provider
135+
# name = "pkcs11-provider"
117136
#provider_type = "Pkcs11"
118137
#key_info_manager = "on-disk-manager"
119138
# (Required for this provider) Path to the location of the dynamic library loaded by this provider.
@@ -135,6 +154,15 @@ key_info_manager = "on-disk-manager"
135154

136155
# Example of a TPM provider configuration
137156
#[[provider]]
157+
#
158+
# ⚠ WARNING: Provider name cannot change.
159+
# ⚠ WARNING: Choose a suitable naming scheme for your providers now.
160+
# ⚠ WARNING: Provider name defaults to "tpm-provider" if not provided, you will not be able to change
161+
# ⚠ the provider's name from this if you decide to use the default.
162+
# ⚠ WARNING: Changing provider name after use will lead to loss of existing keys.
163+
#
164+
# (Optional) The name of the provider
165+
# name = "tpm-provider"
138166
#provider_type = "Tpm"
139167
#key_info_manager = "on-disk-manager"
140168
# (Required) TPM TCTI device to use with this provider. The string can include configuration values - if no
@@ -161,6 +189,15 @@ key_info_manager = "on-disk-manager"
161189
# All below parameters depend on what devices, interfaces or parameters are required or supported by
162190
# "rust-cryptoauthlib" wrapper for cryptoauthlib and underlying hardware.
163191
#[[provider]]
192+
#
193+
# ⚠ WARNING: Provider name cannot change.
194+
# ⚠ WARNING: Choose a suitable naming scheme for your providers now.
195+
# ⚠ WARNING: Provider name defaults to "cryptoauthlib-provider" if not provided, you will not be able to change
196+
# ⚠ the provider's name from this if you decide to use the default.
197+
# ⚠ WARNING: Changing provider name after use will lead to loss of existing keys.
198+
#
199+
# (Optional) The name of the provider
200+
# name = "cryptoauthlib-provider"
164201
#provider_type = "CryptoAuthLib"
165202
#key_info_manager = "on-disk-manager"
166203
##########
@@ -213,6 +250,15 @@ key_info_manager = "on-disk-manager"
213250

214251
# Example of a Trusted Service provider configuration.
215252
#[[provider]]
253+
#
254+
# ⚠ WARNING: Provider name cannot change.
255+
# ⚠ WARNING: Choose a suitable naming scheme for your providers now.
256+
# ⚠ WARNING: Provider name defaults to "trusted-service-provider" if not provided, you will not be able to change
257+
# ⚠ the provider's name from this if you decide to use the default.
258+
# ⚠ WARNING: Changing provider name after use will lead to loss of existing keys.
259+
#
260+
# (Optional) The name of the provider
261+
# name = "trusted-service-provider"
216262
# (Required) Type of provider.
217263
#provider_type = "TrustedService"
218264

src/back/backend_handler.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ pub struct BackEndHandler {
3333
provider: Arc<dyn Provide + Send + Sync>,
3434
#[derivative(Debug = "ignore")]
3535
converter: Box<dyn Convert + Send + Sync>,
36+
provider_name: String,
3637
provider_id: ProviderId,
3738
content_type: BodyType,
3839
accept_type: BodyType,
@@ -291,6 +292,7 @@ pub struct BackEndHandlerBuilder {
291292
#[derivative(Debug = "ignore")]
292293
converter: Option<Box<dyn Convert + Send + Sync>>,
293294
provider_id: Option<ProviderId>,
295+
provider_name: Option<String>,
294296
content_type: Option<BodyType>,
295297
accept_type: Option<BodyType>,
296298
}
@@ -302,6 +304,7 @@ impl BackEndHandlerBuilder {
302304
provider: None,
303305
converter: None,
304306
provider_id: None,
307+
provider_name: None,
305308
content_type: None,
306309
accept_type: None,
307310
}
@@ -325,6 +328,12 @@ impl BackEndHandlerBuilder {
325328
self
326329
}
327330

331+
/// Set the provider name of the BackEndHandler
332+
pub fn with_provider_name(mut self, provider_name: String) -> Self {
333+
self.provider_name = Some(provider_name);
334+
self
335+
}
336+
328337
/// Set the content type that the BackEndHandler supports
329338
pub fn with_content_type(mut self, content_type: BodyType) -> Self {
330339
self.content_type = Some(content_type);
@@ -349,6 +358,9 @@ impl BackEndHandlerBuilder {
349358
provider_id: self
350359
.provider_id
351360
.ok_or_else(|| Error::new(ErrorKind::InvalidData, "provider_id is missing"))?,
361+
provider_name: self
362+
.provider_name
363+
.ok_or_else(|| Error::new(ErrorKind::InvalidData, "provider_name is missing"))?,
352364
content_type: self
353365
.content_type
354366
.ok_or_else(|| Error::new(ErrorKind::InvalidData, "content_type is missing"))?,

src/providers/cryptoauthlib/mod.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,33 @@ mod key_management;
3131
mod key_slot;
3232
mod key_slot_storage;
3333

34+
// The UUID for this provider
35+
const PROVIDER_UUID: &str = "b8ba81e2-e9f7-4bdd-b096-a29d0019960c";
36+
3437
/// CryptoAuthLib provider structure
3538
#[derive(Derivative)]
3639
#[derivative(Debug)]
3740
pub struct Provider {
3841
#[derivative(Debug = "ignore")]
3942
device: rust_cryptoauthlib::AteccDevice,
4043
provider_id: ProviderId,
44+
// The name of the provider set in the config.
45+
provider_name: String,
46+
// The UUID of the provider.
47+
provider_uuid: String,
4148
#[derivative(Debug = "ignore")]
4249
key_info_store: KeyInfoManagerClient,
4350
key_slots: KeySlotStorage,
4451
supported_opcodes: HashSet<Opcode>,
4552
}
4653

4754
impl Provider {
55+
/// The default provider name for cryptoauthlib provider
56+
pub const DEFAULT_PROVIDER_NAME: &'static str = "cryptoauthlib-provider";
57+
4858
/// Creates and initialises an instance of CryptoAuthLibProvider
4959
fn new(
60+
provider_name: String,
5061
key_info_store: KeyInfoManagerClient,
5162
atca_iface: rust_cryptoauthlib::AtcaIfaceCfg,
5263
access_key_file_name: Option<String>,
@@ -72,6 +83,8 @@ impl Provider {
7283
cryptoauthlib_provider = Provider {
7384
device,
7485
provider_id: ProviderId::CryptoAuthLib,
86+
provider_uuid: String::from(PROVIDER_UUID),
87+
provider_name,
7588
key_info_store,
7689
key_slots: KeySlotStorage::new(),
7790
supported_opcodes: HashSet::new(),
@@ -228,7 +241,7 @@ impl Provide for Provider {
228241
trace!("describe ingress");
229242
Ok((ProviderInfo {
230243
// Assigned UUID for this provider: b8ba81e2-e9f7-4bdd-b096-a29d0019960c
231-
uuid: Uuid::parse_str("b8ba81e2-e9f7-4bdd-b096-a29d0019960c").or(Err(ResponseStatus::InvalidEncoding))?,
244+
uuid: Uuid::parse_str(PROVIDER_UUID).or(Err(ResponseStatus::InvalidEncoding))?,
232245
description: String::from("User space hardware provider, utilizing MicrochipTech CryptoAuthentication Library for ATECCx08 chips"),
233246
vendor: String::from("Arm"),
234247
version_maj: 0,
@@ -417,6 +430,7 @@ impl Provide for Provider {
417430
#[derive(Default, Derivative)]
418431
#[derivative(Debug)]
419432
pub struct ProviderBuilder {
433+
provider_name: Option<String>,
420434
#[derivative(Debug = "ignore")]
421435
key_info_store: Option<KeyInfoManagerClient>,
422436
device_type: Option<String>,
@@ -433,6 +447,7 @@ impl ProviderBuilder {
433447
/// Create a new CryptoAuthLib builder
434448
pub fn new() -> ProviderBuilder {
435449
ProviderBuilder {
450+
provider_name: None,
436451
key_info_store: None,
437452
device_type: None,
438453
iface_type: None,
@@ -445,6 +460,13 @@ impl ProviderBuilder {
445460
}
446461
}
447462

463+
/// Add a provider name
464+
pub fn with_provider_name(mut self, provider_name: String) -> ProviderBuilder {
465+
self.provider_name = Some(provider_name);
466+
467+
self
468+
}
469+
448470
/// Add a KeyInfo manager
449471
pub fn with_key_info_store(mut self, key_info_store: KeyInfoManagerClient) -> ProviderBuilder {
450472
self.key_info_store = Some(key_info_store);
@@ -556,6 +578,9 @@ impl ProviderBuilder {
556578
None => return Err(Error::new(ErrorKind::InvalidData, "Missing inteface type")),
557579
};
558580
Provider::new(
581+
self.provider_name.ok_or_else(|| {
582+
std::io::Error::new(std::io::ErrorKind::InvalidData, "missing provider name")
583+
})?,
559584
self.key_info_store
560585
.ok_or_else(|| Error::new(ErrorKind::InvalidData, "missing key info store"))?,
561586
iface_cfg,

src/providers/mbed_crypto/mod.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,18 @@ const SUPPORTED_OPCODES: [Opcode; 15] = [
5151
Opcode::PsaGenerateRandom,
5252
];
5353

54+
// The UUID for this provider
55+
const PROVIDER_UUID: &str = "1c1139dc-ad7c-47dc-ad6b-db6fdb466552";
56+
5457
/// Mbed Crypto provider structure
5558
#[derive(Derivative)]
5659
#[derivative(Debug)]
5760
pub struct Provider {
61+
// The name of the provider set in the config.
62+
provider_name: String,
63+
// The UUID of the provider.
64+
provider_uuid: String,
65+
5866
// When calling write on a reference of key_info_store, a type
5967
// std::sync::RwLockWriteGuard<dyn ManageKeyInfo + Send + Sync> is returned. We need to use the
6068
// dereference operator (*) to access the inner type dyn ManageKeyInfo + Send + Sync and then
@@ -74,18 +82,23 @@ pub struct Provider {
7482
}
7583

7684
impl Provider {
85+
/// The default provider name for mbed-crypto provider
86+
pub const DEFAULT_PROVIDER_NAME: &'static str = "mbed-crypto-provider";
87+
7788
/// Creates and initialise a new instance of MbedCryptoProvider.
7889
/// Checks if there are not more keys stored in the Key Info Manager than in the MbedCryptoProvider and
7990
/// if there, delete them. Adds Key IDs currently in use in the local IDs store.
8091
/// Returns `None` if the initialisation failed.
81-
fn new(key_info_store: KeyInfoManagerClient) -> Option<Provider> {
92+
fn new(provider_name: String, key_info_store: KeyInfoManagerClient) -> Option<Provider> {
8293
// Safety: this function should be called before any of the other Mbed Crypto functions
8394
// are.
8495
if let Err(error) = psa_crypto::init() {
8596
format_error!("Error when initialising Mbed Crypto", error);
8697
return None;
8798
}
8899
let mbed_crypto_provider = Provider {
100+
provider_name,
101+
provider_uuid: String::from(PROVIDER_UUID),
89102
key_info_store,
90103
key_handle_mutex: Mutex::new(()),
91104
id_counter: AtomicU32::new(key::PSA_KEY_ID_USER_MIN),
@@ -149,7 +162,7 @@ impl Provide for Provider {
149162
trace!("describe ingress");
150163
Ok((ProviderInfo {
151164
// Assigned UUID for this provider: 1c1139dc-ad7c-47dc-ad6b-db6fdb466552
152-
uuid: Uuid::parse_str("1c1139dc-ad7c-47dc-ad6b-db6fdb466552").or(Err(ResponseStatus::InvalidEncoding))?,
165+
uuid: Uuid::parse_str(PROVIDER_UUID).or(Err(ResponseStatus::InvalidEncoding))?,
153166
description: String::from("User space software provider, based on Mbed Crypto - the reference implementation of the PSA crypto API"),
154167
vendor: String::from("Arm"),
155168
version_maj: 0,
@@ -319,6 +332,7 @@ impl Provide for Provider {
319332
#[derive(Default, Derivative)]
320333
#[derivative(Debug)]
321334
pub struct ProviderBuilder {
335+
provider_name: Option<String>,
322336
#[derivative(Debug = "ignore")]
323337
key_info_store: Option<KeyInfoManagerClient>,
324338
}
@@ -327,10 +341,18 @@ impl ProviderBuilder {
327341
/// Create a new provider builder
328342
pub fn new() -> ProviderBuilder {
329343
ProviderBuilder {
344+
provider_name: None,
330345
key_info_store: None,
331346
}
332347
}
333348

349+
/// Add a provider name
350+
pub fn with_provider_name(mut self, provider_name: String) -> ProviderBuilder {
351+
self.provider_name = Some(provider_name);
352+
353+
self
354+
}
355+
334356
/// Add a KeyInfo manager
335357
pub fn with_key_info_store(mut self, key_info_store: KeyInfoManagerClient) -> ProviderBuilder {
336358
self.key_info_store = Some(key_info_store);
@@ -341,6 +363,9 @@ impl ProviderBuilder {
341363
/// Build into a MbedProvider
342364
pub fn build(self) -> std::io::Result<Provider> {
343365
Provider::new(
366+
self.provider_name.ok_or_else(|| {
367+
std::io::Error::new(std::io::ErrorKind::InvalidData, "missing provider name")
368+
})?,
344369
self.key_info_store
345370
.ok_or_else(|| Error::new(ErrorKind::InvalidData, "missing key info store"))?,
346371
)

0 commit comments

Comments
 (0)