tss_esapi/structures/tagged/
parameters.rs1use 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#[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 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}