tss_esapi/structures/tagged/
parameters.rs

1// Copyright 2021 Contributors to the Parsec project.
2// SPDX-License-Identifier: Apache-2.0
3use crate::{
4    interface_types::algorithm::PublicAlgorithm,
5    structures::{
6        PublicEccParameters, PublicKeyedHashParameters, PublicRsaParameters,
7        SymmetricCipherParameters,
8    },
9    tss2_esys::{TPMT_PUBLIC_PARMS, TPMU_PUBLIC_PARMS},
10    Error, Result,
11};
12use std::convert::{TryFrom, TryInto};
13/// Enum representing the public parameters structure.
14///
15/// # Details
16/// This corresponds to TPMT_PUBLIC_PARMS
17#[derive(Debug, Clone, Copy, PartialEq, Eq)]
18pub enum PublicParameters {
19    Rsa(PublicRsaParameters),
20    KeyedHash(PublicKeyedHashParameters),
21    Ecc(PublicEccParameters),
22    SymCipher(SymmetricCipherParameters),
23}
24
25impl PublicParameters {
26    /// Returns the algorithm
27    pub fn algorithm(&self) -> PublicAlgorithm {
28        match self {
29            PublicParameters::Rsa(_) => PublicAlgorithm::Rsa,
30            PublicParameters::KeyedHash(_) => PublicAlgorithm::KeyedHash,
31            PublicParameters::Ecc(_) => PublicAlgorithm::Ecc,
32            PublicParameters::SymCipher(_) => PublicAlgorithm::SymCipher,
33        }
34    }
35}
36
37impl From<PublicParameters> for TPMT_PUBLIC_PARMS {
38    fn from(public_parameters: PublicParameters) -> TPMT_PUBLIC_PARMS {
39        let algorithm = public_parameters.algorithm();
40        match public_parameters {
41            PublicParameters::Rsa(parameters) => TPMT_PUBLIC_PARMS {
42                type_: algorithm.into(),
43                parameters: TPMU_PUBLIC_PARMS {
44                    rsaDetail: parameters.into(),
45                },
46            },
47            PublicParameters::KeyedHash(parameters) => TPMT_PUBLIC_PARMS {
48                type_: algorithm.into(),
49                parameters: TPMU_PUBLIC_PARMS {
50                    keyedHashDetail: parameters.into(),
51                },
52            },
53            PublicParameters::Ecc(parameters) => TPMT_PUBLIC_PARMS {
54                type_: algorithm.into(),
55                parameters: TPMU_PUBLIC_PARMS {
56                    eccDetail: parameters.into(),
57                },
58            },
59            PublicParameters::SymCipher(parameters) => TPMT_PUBLIC_PARMS {
60                type_: algorithm.into(),
61                parameters: TPMU_PUBLIC_PARMS {
62                    symDetail: parameters.into(),
63                },
64            },
65        }
66    }
67}
68
69impl TryFrom<TPMT_PUBLIC_PARMS> for PublicParameters {
70    type Error = Error;
71
72    fn try_from(tpmt_public_parms: TPMT_PUBLIC_PARMS) -> Result<Self> {
73        match PublicAlgorithm::try_from(tpmt_public_parms.type_)? {
74            PublicAlgorithm::Rsa => Ok(PublicParameters::Rsa(
75                unsafe { tpmt_public_parms.parameters.rsaDetail }.try_into()?,
76            )),
77            PublicAlgorithm::KeyedHash => Ok(PublicParameters::KeyedHash(
78                unsafe { tpmt_public_parms.parameters.keyedHashDetail }.try_into()?,
79            )),
80            PublicAlgorithm::Ecc => Ok(PublicParameters::Ecc(
81                unsafe { tpmt_public_parms.parameters.eccDetail }.try_into()?,
82            )),
83            PublicAlgorithm::SymCipher => Ok(PublicParameters::SymCipher(
84                unsafe { tpmt_public_parms.parameters.symDetail }.try_into()?,
85            )),
86        }
87    }
88}