tss_esapi/structures/hash/
agile.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::tss2_esys::{TPMT_HA, TPMU_HA};
6use crate::{Error, Result, WrapperErrorKind};
7use std::convert::{TryFrom, TryInto};
8
9#[derive(Debug, Clone, PartialEq, Eq)]
10pub struct HashAgile {
11    algorithm: HashingAlgorithm,
12    digest: Digest,
13}
14
15impl HashAgile {
16    pub fn new(algorithm: HashingAlgorithm, digest: Digest) -> Self {
17        HashAgile { algorithm, digest }
18    }
19}
20
21impl TryFrom<HashAgile> for TPMT_HA {
22    type Error = Error;
23    fn try_from(ha: HashAgile) -> Result<Self> {
24        let algid: crate::tss2_esys::TPM2_ALG_ID = ha.algorithm.into();
25        let digest_val = ha.digest;
26        Ok(TPMT_HA {
27            hashAlg: algid,
28            digest: match ha.algorithm {
29                HashingAlgorithm::Sha1 => TPMU_HA {
30                    sha1: digest_val.try_into()?,
31                },
32                HashingAlgorithm::Sha256 => TPMU_HA {
33                    sha256: digest_val.try_into()?,
34                },
35                HashingAlgorithm::Sha384 => TPMU_HA {
36                    sha384: digest_val.try_into()?,
37                },
38                HashingAlgorithm::Sha512 => TPMU_HA {
39                    sha512: digest_val.try_into()?,
40                },
41                HashingAlgorithm::Sm3_256 => TPMU_HA {
42                    sm3_256: digest_val.try_into()?,
43                },
44                _ => return Err(Error::local_error(WrapperErrorKind::UnsupportedParam)),
45            },
46        })
47    }
48}
49
50impl TryFrom<TPMT_HA> for HashAgile {
51    type Error = Error;
52
53    fn try_from(tpmt_ha: TPMT_HA) -> Result<Self> {
54        let algorithm = HashingAlgorithm::try_from(tpmt_ha.hashAlg)?;
55        Ok(HashAgile {
56            algorithm,
57            digest: match algorithm {
58                HashingAlgorithm::Sha1 => unsafe { tpmt_ha.digest.sha1 }.as_ref().try_into()?,
59                HashingAlgorithm::Sha256 => unsafe { tpmt_ha.digest.sha256 }.as_ref().try_into()?,
60                HashingAlgorithm::Sha384 => unsafe { tpmt_ha.digest.sha384 }.as_ref().try_into()?,
61                HashingAlgorithm::Sha512 => unsafe { tpmt_ha.digest.sha512 }.as_ref().try_into()?,
62                HashingAlgorithm::Sm3_256 => {
63                    unsafe { tpmt_ha.digest.sm3_256 }.as_ref().try_into()?
64                }
65                _ => return Err(Error::local_error(WrapperErrorKind::WrongValueFromTpm)),
66            },
67        })
68    }
69}