Skip to main content

tss_esapi/structures/
creation.rs

1// Copyright 2020 Contributors to the Parsec project.
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::{
5    Error, Result,
6    attributes::LocalityAttributes,
7    constants::AlgorithmIdentifier,
8    interface_types::algorithm::HashingAlgorithm,
9    structures::{Data, Digest, Name, PcrSelectionList},
10    traits::impl_mu_standard,
11    tss2_esys::{TPM2B_CREATION_DATA, TPMS_CREATION_DATA},
12};
13use std::convert::{TryFrom, TryInto};
14
15#[derive(Debug, Clone, PartialEq, Eq)]
16pub struct CreationData {
17    pcr_select: PcrSelectionList,
18    pcr_digest: Digest,
19    locality: LocalityAttributes,
20    parent_name_alg: Option<HashingAlgorithm>,
21    parent_name: Name,
22    parent_qualified_name: Name,
23    outside_info: Data,
24}
25
26impl TryFrom<TPMS_CREATION_DATA> for CreationData {
27    type Error = Error;
28    fn try_from(tss_creation_data: TPMS_CREATION_DATA) -> Result<Self> {
29        Ok(CreationData {
30            pcr_select: tss_creation_data.pcrSelect.try_into()?,
31            pcr_digest: tss_creation_data.pcrDigest.try_into()?,
32            locality: tss_creation_data.locality.into(),
33            parent_name_alg: match AlgorithmIdentifier::try_from(tss_creation_data.parentNameAlg)? {
34                AlgorithmIdentifier::Null => None,
35                alg => Some(HashingAlgorithm::try_from(alg)?),
36            },
37            parent_name: tss_creation_data.parentName.try_into()?,
38            parent_qualified_name: tss_creation_data.parentQualifiedName.try_into()?,
39            outside_info: tss_creation_data.outsideInfo.try_into()?,
40        })
41    }
42}
43
44impl TryFrom<TPM2B_CREATION_DATA> for CreationData {
45    type Error = Error;
46    fn try_from(tss_creation_data_buffer: TPM2B_CREATION_DATA) -> Result<Self> {
47        CreationData::try_from(tss_creation_data_buffer.creationData)
48    }
49}
50
51impl From<CreationData> for TPMS_CREATION_DATA {
52    fn from(creation_data: CreationData) -> Self {
53        TPMS_CREATION_DATA {
54            pcrSelect: creation_data.pcr_select.into(),
55            pcrDigest: creation_data.pcr_digest.into(),
56            locality: creation_data.locality.into(),
57            parentNameAlg: match creation_data.parent_name_alg {
58                None => AlgorithmIdentifier::Null.into(),
59                Some(alg) => alg.into(),
60            },
61            parentName: creation_data.parent_name.into(),
62            parentQualifiedName: creation_data.parent_qualified_name.into(),
63            outsideInfo: creation_data.outside_info.into(),
64        }
65    }
66}
67
68impl_mu_standard!(CreationData, TPMS_CREATION_DATA);