Skip to main content

tss_esapi/structures/lists/
digest_values.rs

1// Copyright 2020 Contributors to the Parsec project.
2// SPDX-License-Identifier: Apache-2.0
3use crate::interface_types::algorithm::HashingAlgorithm;
4use crate::structures::Digest;
5use crate::structures::HashAgile;
6use crate::tss2_esys::TPML_DIGEST_VALUES;
7use crate::{Error, Result};
8use std::collections::HashMap;
9use std::convert::{TryFrom, TryInto};
10
11#[derive(Debug, Clone, Default)]
12pub struct DigestValues {
13    digests: HashMap<HashingAlgorithm, Digest>,
14}
15
16impl DigestValues {
17    pub fn new() -> Self {
18        DigestValues {
19            digests: HashMap::new(),
20        }
21    }
22
23    pub fn set(&mut self, alg: HashingAlgorithm, dig: Digest) {
24        let _ = self.digests.insert(alg, dig);
25    }
26}
27
28impl TryFrom<DigestValues> for TPML_DIGEST_VALUES {
29    type Error = Error;
30    fn try_from(digest_values: DigestValues) -> Result<Self> {
31        let mut digest_values = digest_values;
32        let mut tss_digest_values: TPML_DIGEST_VALUES = Default::default();
33        for (digest_hash, digest_val) in digest_values.digests.drain() {
34            let ha = HashAgile::new(digest_hash, digest_val);
35            tss_digest_values.digests[tss_digest_values.count as usize] = ha.try_into()?;
36            tss_digest_values.count += 1;
37        }
38        Ok(tss_digest_values)
39    }
40}