Skip to main content

tss_esapi/structures/lists/
digest.rs

1// Copyright 2020 Contributors to the Parsec project.
2// SPDX-License-Identifier: Apache-2.0
3use crate::structures::Digest;
4use crate::tss2_esys::TPML_DIGEST;
5use crate::{Error, Result, WrapperErrorKind};
6use log::error;
7use std::convert::TryFrom;
8
9#[derive(Debug, Clone, Default)]
10pub struct DigestList {
11    digests: Vec<Digest>,
12}
13
14impl DigestList {
15    pub const MAX_SIZE: usize = 8;
16
17    /// Creates a new empty DigestList
18    pub const fn new() -> Self {
19        DigestList {
20            digests: Vec::new(),
21        }
22    }
23
24    /// Returns the values in the digest list.
25    pub fn value(&self) -> &[Digest] {
26        &self.digests
27    }
28
29    /// Returns the number of digests in the digestlist
30    pub fn len(&self) -> usize {
31        self.digests.len()
32    }
33
34    /// Indicates if the digest list contains any digests.
35    pub fn is_empty(&self) -> bool {
36        self.digests.is_empty()
37    }
38
39    /// Adds a new digest to the digest list.
40    pub fn add(&mut self, dig: Digest) -> Result<()> {
41        if self.digests.len() >= DigestList::MAX_SIZE {
42            error!("Exceeded maximum count(> {})", DigestList::MAX_SIZE);
43            return Err(Error::local_error(WrapperErrorKind::WrongParamSize));
44        }
45        self.digests.push(dig);
46        Ok(())
47    }
48}
49
50impl TryFrom<TPML_DIGEST> for DigestList {
51    type Error = Error;
52    fn try_from(tpml_digest: TPML_DIGEST) -> Result<Self> {
53        let digests_count = tpml_digest.count as usize;
54
55        if digests_count > DigestList::MAX_SIZE {
56            error!("Invalid TPML_DIGEST count(> {})", DigestList::MAX_SIZE);
57            return Err(Error::local_error(WrapperErrorKind::InvalidParam));
58        }
59
60        tpml_digest.digests[..digests_count]
61            .iter()
62            .map(|&tss_digest| Digest::try_from(tss_digest))
63            .collect::<Result<Vec<Digest>>>()
64            .map(|digests| DigestList { digests })
65    }
66}
67
68impl TryFrom<DigestList> for TPML_DIGEST {
69    type Error = Error;
70    fn try_from(digest_list: DigestList) -> Result<Self> {
71        if digest_list.digests.len() > DigestList::MAX_SIZE {
72            error!("Invalid digest list size(> {})", DigestList::MAX_SIZE);
73            return Err(Error::local_error(WrapperErrorKind::WrongParamSize));
74        }
75
76        let mut tss_digest_list: TPML_DIGEST = Default::default();
77        for digest in digest_list.digests {
78            tss_digest_list.digests[tss_digest_list.count as usize] = digest.into();
79            tss_digest_list.count += 1;
80        }
81        Ok(tss_digest_list)
82    }
83}