1
1
// Copyright 2020 Contributors to the Parsec project.
2
2
// SPDX-License-Identifier: Apache-2.0
3
3
use crate :: {
4
- constants:: tss :: * ,
4
+ constants:: CapabilityType ,
5
5
structures:: {
6
- AlgorithmPropertyList , CommandCodeList , EccCurveList , HandleList , PcrSelectionList ,
7
- TaggedPcrPropertyList , TaggedTpmPropertyList ,
6
+ AlgorithmPropertyList , CommandCodeAttributesList , CommandCodeList , EccCurveList ,
7
+ HandleList , PcrSelectionList , TaggedPcrPropertyList , TaggedTpmPropertyList ,
8
8
} ,
9
- tss2_esys:: * ,
9
+ tss2_esys:: { TPM2_CAP , TPM2_MAX_CAP_BUFFER , TPMS_CAPABILITY_DATA , TPMU_CAPABILITIES } ,
10
10
Error , Result , WrapperErrorKind ,
11
11
} ;
12
+ use log:: error;
12
13
use std:: convert:: { TryFrom , TryInto } ;
13
14
use std:: mem:: size_of;
14
15
@@ -17,11 +18,12 @@ use std::mem::size_of;
17
18
///
18
19
/// # Details
19
20
/// This corresponds to `TPMS_CAPABILITY_DATA`
21
+ #[ non_exhaustive]
20
22
#[ derive( Debug , Clone ) ]
21
23
pub enum CapabilityData {
22
24
Algorithms ( AlgorithmPropertyList ) ,
23
25
Handles ( HandleList ) ,
24
- Commands ( Vec < TPMA_CC > ) ,
26
+ Commands ( CommandCodeAttributesList ) ,
25
27
PpCommands ( CommandCodeList ) ,
26
28
AuditCommands ( CommandCodeList ) ,
27
29
AssignedPcr ( PcrSelectionList ) ,
@@ -33,85 +35,113 @@ pub enum CapabilityData {
33
35
// ActData(),
34
36
}
35
37
36
- pub ( crate ) const fn max_cap_size < T > ( ) -> u32 {
37
- ( ( TPM2_MAX_CAP_BUFFER as usize - size_of :: < TPM2_CAP > ( ) - size_of :: < u32 > ( ) ) / size_of :: < T > ( ) )
38
- as u32
38
+ pub const fn max_cap_size < T > ( ) -> usize {
39
+ ( TPM2_MAX_CAP_BUFFER as usize - size_of :: < TPM2_CAP > ( ) - size_of :: < u32 > ( ) ) / size_of :: < T > ( )
39
40
}
40
41
41
- fn cd_from_alg_properties ( props : TPML_ALG_PROPERTY ) -> Result < CapabilityData > {
42
- Ok ( CapabilityData :: Algorithms ( props. try_into ( ) ?) )
43
- }
44
-
45
- fn cd_from_handles ( props : TPML_HANDLE ) -> Result < CapabilityData > {
46
- Ok ( CapabilityData :: Handles ( HandleList :: try_from ( props) ?) )
47
- }
48
-
49
- fn cd_from_command ( props : TPML_CCA ) -> Result < CapabilityData > {
50
- if props. count > TPM2_MAX_CAP_CC {
51
- return Err ( Error :: WrapperError ( WrapperErrorKind :: InvalidParam ) ) ;
52
- }
53
-
54
- let mut data = Vec :: new ( ) ;
55
- data. reserve_exact ( props. count as usize ) ;
56
-
57
- for i in 0 ..props. count {
58
- data. push ( props. commandAttributes [ i as usize ] ) ;
42
+ impl From < CapabilityData > for TPMS_CAPABILITY_DATA {
43
+ fn from ( capability_data : CapabilityData ) -> Self {
44
+ match capability_data {
45
+ CapabilityData :: Algorithms ( data) => TPMS_CAPABILITY_DATA {
46
+ capability : CapabilityType :: Algorithms . into ( ) ,
47
+ data : TPMU_CAPABILITIES {
48
+ algorithms : data. into ( ) ,
49
+ } ,
50
+ } ,
51
+ CapabilityData :: Handles ( data) => TPMS_CAPABILITY_DATA {
52
+ capability : CapabilityType :: Handles . into ( ) ,
53
+ data : TPMU_CAPABILITIES {
54
+ handles : data. into ( ) ,
55
+ } ,
56
+ } ,
57
+ CapabilityData :: Commands ( data) => TPMS_CAPABILITY_DATA {
58
+ capability : CapabilityType :: Command . into ( ) ,
59
+ data : TPMU_CAPABILITIES {
60
+ command : data. into ( ) ,
61
+ } ,
62
+ } ,
63
+ CapabilityData :: PpCommands ( data) => TPMS_CAPABILITY_DATA {
64
+ capability : CapabilityType :: PpCommands . into ( ) ,
65
+ data : TPMU_CAPABILITIES {
66
+ ppCommands : data. into ( ) ,
67
+ } ,
68
+ } ,
69
+ CapabilityData :: AuditCommands ( data) => TPMS_CAPABILITY_DATA {
70
+ capability : CapabilityType :: AuditCommands . into ( ) ,
71
+ data : TPMU_CAPABILITIES {
72
+ auditCommands : data. into ( ) ,
73
+ } ,
74
+ } ,
75
+ CapabilityData :: AssignedPcr ( data) => TPMS_CAPABILITY_DATA {
76
+ capability : CapabilityType :: AssignedPcr . into ( ) ,
77
+ data : TPMU_CAPABILITIES {
78
+ assignedPCR : data. into ( ) ,
79
+ } ,
80
+ } ,
81
+ CapabilityData :: TpmProperties ( data) => TPMS_CAPABILITY_DATA {
82
+ capability : CapabilityType :: TpmProperties . into ( ) ,
83
+ data : TPMU_CAPABILITIES {
84
+ tpmProperties : data. into ( ) ,
85
+ } ,
86
+ } ,
87
+ CapabilityData :: PcrProperties ( data) => TPMS_CAPABILITY_DATA {
88
+ capability : CapabilityType :: PcrProperties . into ( ) ,
89
+ data : TPMU_CAPABILITIES {
90
+ pcrProperties : data. into ( ) ,
91
+ } ,
92
+ } ,
93
+ CapabilityData :: EccCurves ( data) => TPMS_CAPABILITY_DATA {
94
+ capability : CapabilityType :: EccCurves . into ( ) ,
95
+ data : TPMU_CAPABILITIES {
96
+ eccCurves : data. into ( ) ,
97
+ } ,
98
+ } ,
99
+ }
59
100
}
60
-
61
- Ok ( CapabilityData :: Commands ( data) )
62
- }
63
-
64
- fn cd_from_pp_commands ( props : TPML_CC ) -> Result < CapabilityData > {
65
- Ok ( CapabilityData :: PpCommands ( CommandCodeList :: try_from (
66
- props,
67
- ) ?) )
68
- }
69
-
70
- fn cd_from_audit_commands ( props : TPML_CC ) -> Result < CapabilityData > {
71
- Ok ( CapabilityData :: AuditCommands ( CommandCodeList :: try_from (
72
- props,
73
- ) ?) )
74
- }
75
-
76
- fn cd_from_assigned_pcrs ( props : TPML_PCR_SELECTION ) -> Result < CapabilityData > {
77
- Ok ( CapabilityData :: AssignedPcr ( props. try_into ( ) ?) )
78
- }
79
-
80
- fn cd_from_tpm_properties ( props : TPML_TAGGED_TPM_PROPERTY ) -> Result < CapabilityData > {
81
- Ok ( CapabilityData :: TpmProperties ( props. try_into ( ) ?) )
82
- }
83
-
84
- fn cd_from_pcr_properties ( props : TPML_TAGGED_PCR_PROPERTY ) -> Result < CapabilityData > {
85
- Ok ( CapabilityData :: PcrProperties ( props. try_into ( ) ?) )
86
- }
87
-
88
- fn cd_from_ecc_curves ( props : TPML_ECC_CURVE ) -> Result < CapabilityData > {
89
- Ok ( CapabilityData :: EccCurves ( EccCurveList :: try_from ( props) ?) )
90
101
}
91
102
92
103
impl TryFrom < TPMS_CAPABILITY_DATA > for CapabilityData {
93
104
type Error = Error ;
94
105
95
- fn try_from ( capab_data : TPMS_CAPABILITY_DATA ) -> Result < Self > {
106
+ fn try_from ( tpms_capability_data : TPMS_CAPABILITY_DATA ) -> Result < Self > {
96
107
// SAFETY: This is a C union, and Rust wants us to make sure we're using the correct item.
97
108
// These unsafe blocks are fine because we ensure the correct type is used.
98
- match capab_data. capability {
99
- TPM2_CAP_ALGS => cd_from_alg_properties ( unsafe { capab_data. data . algorithms } ) ,
100
- TPM2_CAP_HANDLES => cd_from_handles ( unsafe { capab_data. data . handles } ) ,
101
- TPM2_CAP_COMMANDS => cd_from_command ( unsafe { capab_data. data . command } ) ,
102
- TPM2_CAP_PP_COMMANDS => cd_from_pp_commands ( unsafe { capab_data. data . ppCommands } ) ,
103
- TPM2_CAP_AUDIT_COMMANDS => {
104
- cd_from_audit_commands ( unsafe { capab_data. data . auditCommands } )
105
- }
106
- TPM2_CAP_PCRS => cd_from_assigned_pcrs ( unsafe { capab_data. data . assignedPCR } ) ,
107
- TPM2_CAP_TPM_PROPERTIES => {
108
- cd_from_tpm_properties ( unsafe { capab_data. data . tpmProperties } )
109
+ match CapabilityType :: try_from ( tpms_capability_data. capability ) ? {
110
+ CapabilityType :: Algorithms => Ok ( CapabilityData :: Algorithms (
111
+ unsafe { tpms_capability_data. data . algorithms } . try_into ( ) ?,
112
+ ) ) ,
113
+ CapabilityType :: Handles => Ok ( CapabilityData :: Handles (
114
+ unsafe { tpms_capability_data. data . handles } . try_into ( ) ?,
115
+ ) ) ,
116
+ CapabilityType :: Command => Ok ( CapabilityData :: Commands (
117
+ unsafe { tpms_capability_data. data . command } . try_into ( ) ?,
118
+ ) ) ,
119
+ CapabilityType :: PpCommands => Ok ( CapabilityData :: PpCommands (
120
+ unsafe { tpms_capability_data. data . ppCommands } . try_into ( ) ?,
121
+ ) ) ,
122
+ CapabilityType :: AuditCommands => Ok ( CapabilityData :: AuditCommands (
123
+ unsafe { tpms_capability_data. data . auditCommands } . try_into ( ) ?,
124
+ ) ) ,
125
+ CapabilityType :: AssignedPcr => Ok ( CapabilityData :: AssignedPcr (
126
+ unsafe { tpms_capability_data. data . assignedPCR } . try_into ( ) ?,
127
+ ) ) ,
128
+ CapabilityType :: TpmProperties => Ok ( CapabilityData :: TpmProperties (
129
+ unsafe { tpms_capability_data. data . tpmProperties } . try_into ( ) ?,
130
+ ) ) ,
131
+ CapabilityType :: PcrProperties => Ok ( CapabilityData :: PcrProperties (
132
+ unsafe { tpms_capability_data. data . pcrProperties } . try_into ( ) ?,
133
+ ) ) ,
134
+ CapabilityType :: EccCurves => Ok ( CapabilityData :: EccCurves (
135
+ unsafe { tpms_capability_data. data . eccCurves } . try_into ( ) ?,
136
+ ) ) ,
137
+ CapabilityType :: AuthPolicies => {
138
+ error ! ( "AuthPolicies capability type is currently not supported" ) ;
139
+ Err ( Error :: WrapperError ( WrapperErrorKind :: UnsupportedParam ) )
109
140
}
110
- TPM2_CAP_PCR_PROPERTIES => {
111
- cd_from_pcr_properties ( unsafe { capab_data. data . pcrProperties } )
141
+ CapabilityType :: Act => {
142
+ error ! ( "Act capability type is currently not supported" ) ;
143
+ Err ( Error :: WrapperError ( WrapperErrorKind :: UnsupportedParam ) )
112
144
}
113
- TPM2_CAP_ECC_CURVES => cd_from_ecc_curves ( unsafe { capab_data. data . eccCurves } ) ,
114
- _ => Err ( Error :: WrapperError ( WrapperErrorKind :: UnsupportedParam ) ) ,
115
145
}
116
146
}
117
147
}
0 commit comments