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