tss_esapi/structures/tagged/
signature.rs1use crate::{
4 interface_types::algorithm::SignatureSchemeAlgorithm,
5 structures::{EccSignature, HashAgile, RsaSignature},
6 traits::impl_mu_complex,
7 tss2_esys::{TPMT_SIGNATURE, TPMU_SIGNATURE},
8 Error, Result,
9};
10use std::convert::{TryFrom, TryInto};
11
12#[derive(Debug, Clone, PartialEq, Eq)]
17pub enum Signature {
18 RsaSsa(RsaSignature),
19 RsaPss(RsaSignature),
20 EcDsa(EccSignature),
21 EcDaa(EccSignature),
22 Sm2(EccSignature),
23 EcSchnorr(EccSignature),
24 Hmac(HashAgile),
25 Null,
26}
27
28impl Signature {
29 pub fn algorithm(&self) -> SignatureSchemeAlgorithm {
30 match self {
31 Signature::RsaSsa(_) => SignatureSchemeAlgorithm::RsaSsa,
32 Signature::RsaPss(_) => SignatureSchemeAlgorithm::RsaPss,
33 Signature::EcDsa(_) => SignatureSchemeAlgorithm::EcDsa,
34 Signature::EcDaa(_) => SignatureSchemeAlgorithm::EcDaa,
35 Signature::Sm2(_) => SignatureSchemeAlgorithm::Sm2,
36 Signature::EcSchnorr(_) => SignatureSchemeAlgorithm::EcSchnorr,
37 Signature::Hmac(_) => SignatureSchemeAlgorithm::Hmac,
38 Signature::Null => SignatureSchemeAlgorithm::Null,
39 }
40 }
41}
42
43impl TryFrom<Signature> for TPMT_SIGNATURE {
44 type Error = Error;
45
46 fn try_from(signature: Signature) -> Result<Self> {
47 let signature_algorithm = signature.algorithm().into();
48 match signature {
49 Signature::RsaSsa(rsa_signature) => Ok(TPMT_SIGNATURE {
50 sigAlg: signature_algorithm,
51 signature: TPMU_SIGNATURE {
52 rsassa: rsa_signature.into(),
53 },
54 }),
55 Signature::RsaPss(rsa_signature) => Ok(TPMT_SIGNATURE {
56 sigAlg: signature_algorithm,
57 signature: TPMU_SIGNATURE {
58 rsapss: rsa_signature.into(),
59 },
60 }),
61 Signature::EcDsa(ecc_signature) => Ok(TPMT_SIGNATURE {
62 sigAlg: signature_algorithm,
63 signature: TPMU_SIGNATURE {
64 ecdsa: ecc_signature.into(),
65 },
66 }),
67 Signature::EcDaa(ecc_signature) => Ok(TPMT_SIGNATURE {
68 sigAlg: signature_algorithm,
69 signature: TPMU_SIGNATURE {
70 ecdaa: ecc_signature.into(),
71 },
72 }),
73 Signature::Sm2(ecc_signature) => Ok(TPMT_SIGNATURE {
74 sigAlg: signature_algorithm,
75 signature: TPMU_SIGNATURE {
76 sm2: ecc_signature.into(),
77 },
78 }),
79 Signature::EcSchnorr(ecc_signature) => Ok(TPMT_SIGNATURE {
80 sigAlg: signature_algorithm,
81 signature: TPMU_SIGNATURE {
82 ecschnorr: ecc_signature.into(),
83 },
84 }),
85 Signature::Hmac(hash_agile) => Ok(TPMT_SIGNATURE {
86 sigAlg: signature_algorithm,
87 signature: TPMU_SIGNATURE {
88 hmac: hash_agile.try_into()?,
89 },
90 }),
91 Signature::Null => Ok(TPMT_SIGNATURE {
92 sigAlg: signature_algorithm,
93 signature: Default::default(),
94 }),
95 }
96 }
97}
98
99impl TryFrom<TPMT_SIGNATURE> for Signature {
100 type Error = Error;
101
102 fn try_from(tpmt_signature: TPMT_SIGNATURE) -> Result<Self> {
103 match SignatureSchemeAlgorithm::try_from(tpmt_signature.sigAlg)? {
104 SignatureSchemeAlgorithm::RsaSsa => Ok(Signature::RsaSsa(
105 unsafe { tpmt_signature.signature.rsassa }.try_into()?,
106 )),
107 SignatureSchemeAlgorithm::RsaPss => Ok(Signature::RsaPss(
108 unsafe { tpmt_signature.signature.rsapss }.try_into()?,
109 )),
110 SignatureSchemeAlgorithm::EcDsa => Ok(Signature::EcDsa(
111 unsafe { tpmt_signature.signature.ecdsa }.try_into()?,
112 )),
113 SignatureSchemeAlgorithm::EcDaa => Ok(Signature::EcDaa(
114 unsafe { tpmt_signature.signature.ecdaa }.try_into()?,
115 )),
116 SignatureSchemeAlgorithm::Sm2 => Ok(Signature::Sm2(
117 unsafe { tpmt_signature.signature.sm2 }.try_into()?,
118 )),
119 SignatureSchemeAlgorithm::EcSchnorr => Ok(Signature::EcSchnorr(
120 unsafe { tpmt_signature.signature.ecschnorr }.try_into()?,
121 )),
122 SignatureSchemeAlgorithm::Hmac => Ok(Signature::Hmac(
123 unsafe { tpmt_signature.signature.hmac }.try_into()?,
124 )),
125 SignatureSchemeAlgorithm::Null => Ok(Signature::Null),
126 }
127 }
128}
129
130impl_mu_complex!(Signature, TPMT_SIGNATURE);