parsec_service/providers/cryptoauthlib/
access_keys.rs1use super::Provider;
4use log::{error, warn};
5use serde::Deserialize;
6use std::fs::read_to_string;
7use std::path::Path;
8
9#[derive(Debug, Deserialize)]
10struct AccessKeyContainer {
11 access_keys: Vec<AccessKey>,
12}
13
14#[derive(Debug, Deserialize)]
15struct AccessKey {
16 slot: u8,
17 key: [u8; 32],
18}
19
20impl Provider {
21 pub fn set_access_keys(
23 &self,
24 access_keys_file_name: Option<String>,
25 ) -> Option<rust_cryptoauthlib::AtcaStatus> {
26 let access_keys_string = match access_keys_file_name.clone() {
27 None => {
28 warn!("Missing 'access_key_file_name' entry in configuration toml file");
29 return None;
30 }
31 Some(file_name) => match read_to_string(Path::new(&file_name)) {
32 Err(err) => {
33 warn!("Cannot read from {} file because: {}.", file_name, err);
34 return None;
35 }
36 Ok(config_string) => config_string,
37 },
38 };
39 let access_keys_container: AccessKeyContainer = match toml::from_str(&access_keys_string) {
40 Ok(keys) => keys,
41 Err(err) => {
42 error!(
43 "Error parsing access key config file {}. {}",
44 access_keys_file_name.unwrap(),
45 err
46 );
47 return None;
48 }
49 };
50 for access_key in access_keys_container.access_keys.iter() {
51 if rust_cryptoauthlib::ATCA_ATECC_SLOTS_COUNT > access_key.slot {
52 let err = self.device.add_access_key(access_key.slot, &access_key.key);
53 match err {
54 rust_cryptoauthlib::AtcaStatus::AtcaSuccess => (),
55 _ => error!(
56 "add_access_key() for slot {} failed, because {}",
57 access_key.slot, err
58 ),
59 }
60 } else {
61 error!(
62 "add_access_key() for slot {} failed, because it exceeded total slots count {}",
63 access_key.slot,
64 rust_cryptoauthlib::ATCA_ATECC_SLOTS_COUNT
65 )
66 }
67 }
68
69 Some(rust_cryptoauthlib::AtcaStatus::AtcaSuccess)
70 }
71}