Skip to main content

parsec_service/providers/cryptoauthlib/
access_keys.rs

1// Copyright 2021 Contributors to the Parsec project.
2// SPDX-License-Identifier: Apache-2.0
3use 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    /// Read access keys from a configuration file and setup the CALib to use them.
22    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}