Skip to main content

tss_esapi/structures/tagged/
signature.rs

1// Copyright 2021 Contributors to the Parsec project.
2// SPDX-License-Identifier: Apache-2.0
3use 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/// Enum representing a Signature
13///
14/// # Details
15/// This corresponds TPMT_SIGNATURE
16#[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);