Skip to content

Commit 5fb2db7

Browse files
committed
Adds tests for SymmetricDefinition.
Derives Eq and PartialEq trait for SymmetricDefinition. Adds tests for SymmetricDefinition. Signed-off-by: Jesper Brynolf <[email protected]>
1 parent 7205c4c commit 5fb2db7

File tree

5 files changed

+321
-1
lines changed

5 files changed

+321
-1
lines changed

tss-esapi/src/structures/tagged/symmetric.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use std::convert::{TryFrom, TryInto};
1313
///
1414
/// # Details
1515
/// This corresponds to TPMT_SYM_DEF.
16-
#[derive(Debug, Clone, Copy)]
16+
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
1717
pub enum SymmetricDefinition {
1818
// TODO: Investigate why TDES is not included...
1919
Aes {

tss-esapi/tests/integration_tests/common/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,12 @@ mod marshall;
3535
mod tpma_types_equality_checks;
3636
mod tpml_types_equality_checks;
3737
mod tpms_types_equality_checks;
38+
mod tpmt_types_equality_checks;
3839
pub use marshall::*;
3940
pub use tpma_types_equality_checks::*;
4041
pub use tpml_types_equality_checks::*;
4142
pub use tpms_types_equality_checks::*;
43+
pub use tpmt_types_equality_checks::*;
4244

4345
#[allow(dead_code)]
4446
pub const HASH: [u8; 64] = [
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright 2021 Contributors to the Parsec project.
2+
// SPDX-License-Identifier: Apache-2.0
3+
use tss_esapi::{
4+
constants::tss::{TPM2_ALG_AES, TPM2_ALG_CAMELLIA, TPM2_ALG_NULL, TPM2_ALG_SM4, TPM2_ALG_XOR},
5+
tss2_esys::TPMT_SYM_DEF,
6+
};
7+
8+
pub fn ensure_tpmt_sym_def_equality(expected: &TPMT_SYM_DEF, actual: &TPMT_SYM_DEF) {
9+
assert_eq!(
10+
expected.algorithm, actual.algorithm,
11+
"'algorithm' value in TPMT_SYM_DEF, mismatch between actual and expected",
12+
);
13+
14+
match expected.algorithm {
15+
TPM2_ALG_AES => {
16+
let expected_key_bits = unsafe { expected.keyBits.aes };
17+
let expected_mode = unsafe { expected.mode.aes };
18+
let actual_key_bits = unsafe { actual.keyBits.aes };
19+
let actual_mode = unsafe { actual.mode.aes };
20+
assert_eq!(
21+
expected_key_bits, actual_key_bits,
22+
"'keyBits' value in TPMT_SYM_DEF, mismatch between actual and expected",
23+
);
24+
25+
assert_eq!(
26+
expected_mode, actual_mode,
27+
"'mode' value in TPMT_SYM_DEF, mismatch between actual and expected",
28+
);
29+
}
30+
TPM2_ALG_SM4 => {
31+
let expected_key_bits = unsafe { expected.keyBits.sm4 };
32+
let expected_mode = unsafe { expected.mode.sm4 };
33+
let actual_key_bits = unsafe { actual.keyBits.sm4 };
34+
let actual_mode = unsafe { actual.mode.sm4 };
35+
assert_eq!(
36+
expected_key_bits, actual_key_bits,
37+
"'keyBits' value in TPMT_SYM_DEF, mismatch between actual and expected",
38+
);
39+
40+
assert_eq!(
41+
expected_mode, actual_mode,
42+
"'mode' value in TPMT_SYM_DEF, mismatch between actual and expected",
43+
);
44+
}
45+
TPM2_ALG_CAMELLIA => {
46+
let expected_key_bits = unsafe { expected.keyBits.camellia };
47+
let expected_mode = unsafe { expected.mode.camellia };
48+
let actual_key_bits = unsafe { actual.keyBits.camellia };
49+
let actual_mode = unsafe { actual.mode.camellia };
50+
assert_eq!(
51+
expected_key_bits, actual_key_bits,
52+
"'keyBits' value in TPMT_SYM_DEF, mismatch between actual and expected",
53+
);
54+
55+
assert_eq!(
56+
expected_mode, actual_mode,
57+
"'mode' value in TPMT_SYM_DEF, mismatch between actual and expected",
58+
);
59+
}
60+
TPM2_ALG_XOR => {
61+
let expected_key_bits = unsafe { expected.keyBits.exclusiveOr };
62+
let actual_key_bits = unsafe { actual.keyBits.exclusiveOr };
63+
assert_eq!(
64+
expected_key_bits, actual_key_bits,
65+
"'keyBits' value in TPMT_SYM_DEF, mismatch between actual and expected",
66+
);
67+
}
68+
TPM2_ALG_NULL => {}
69+
_ => {
70+
panic!("Invalid algorithm in TPMT_SYM_DEF");
71+
}
72+
}
73+
}

tss-esapi/tests/integration_tests/structures_tests/tagged_tests/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ mod public_rsa_exponent_tests;
66
mod public_rsa_parameters_tests;
77
mod sensitive;
88
mod signature;
9+
mod symmetric_definition_tests;
910
mod tagged_signature_scheme_tests;
Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
// Copyright 2022 Contributors to the Parsec project.
2+
// SPDX-License-Identifier: Apache-2.0
3+
use tss_esapi::{
4+
constants::AlgorithmIdentifier,
5+
interface_types::{
6+
algorithm::{HashingAlgorithm, SymmetricAlgorithm, SymmetricMode},
7+
key_bits::{AesKeyBits, CamelliaKeyBits, Sm4KeyBits},
8+
},
9+
structures::SymmetricDefinition,
10+
tss2_esys::{TPMT_SYM_DEF, TPMU_SYM_KEY_BITS, TPMU_SYM_MODE},
11+
Error, WrapperErrorKind,
12+
};
13+
14+
use std::convert::TryFrom;
15+
16+
const SYM_MODES: [SymmetricMode; 5] = [
17+
SymmetricMode::Cfb,
18+
SymmetricMode::Cbc,
19+
SymmetricMode::Ctr,
20+
SymmetricMode::Ecb,
21+
SymmetricMode::Ofb,
22+
];
23+
24+
#[test]
25+
fn test_valid_aes_conversions() {
26+
const AES_KEY_BITS: [AesKeyBits; 3] =
27+
[AesKeyBits::Aes128, AesKeyBits::Aes192, AesKeyBits::Aes256];
28+
for expected_mode in SYM_MODES {
29+
for expected_key_bits in AES_KEY_BITS {
30+
let expected_tpmt_sym_def = TPMT_SYM_DEF {
31+
algorithm: SymmetricAlgorithm::Aes.into(),
32+
keyBits: TPMU_SYM_KEY_BITS {
33+
aes: expected_key_bits.into(),
34+
},
35+
mode: TPMU_SYM_MODE {
36+
aes: expected_mode.into(),
37+
},
38+
};
39+
40+
let sym_def = SymmetricDefinition::try_from(expected_tpmt_sym_def)
41+
.expect("Failed to convert TPMT_SYM_DEF into SymmetricDefinition");
42+
43+
if let SymmetricDefinition::Aes { key_bits, mode } = sym_def {
44+
assert_eq!(
45+
expected_key_bits, key_bits, "TPMT_SYM_DEF converted into SymmetricDefinition did not contain the correct value for 'key_bits'"
46+
);
47+
assert_eq!(expected_mode, mode, "TPMT_SYM_DEF converted into SymmetricDefinition did not contain the correct value for 'mode'");
48+
} else {
49+
panic!("SymmetricDefinition converted from TPMT_SYM_DEF did not contain the expected algorithm AES");
50+
}
51+
52+
let actual_tpmt_sym_def = TPMT_SYM_DEF::try_from(sym_def)
53+
.expect("Failed to Convert SymmetricDefinition into TPMT_SYM_DEF");
54+
55+
crate::common::ensure_tpmt_sym_def_equality(
56+
&expected_tpmt_sym_def,
57+
&actual_tpmt_sym_def,
58+
);
59+
}
60+
}
61+
}
62+
63+
#[test]
64+
fn test_valid_sm4_conversions() {
65+
for expected_mode in SYM_MODES {
66+
let expected_key_bits = Sm4KeyBits::Sm4_128;
67+
let expected_tpmt_sym_def = TPMT_SYM_DEF {
68+
algorithm: SymmetricAlgorithm::Sm4.into(),
69+
keyBits: TPMU_SYM_KEY_BITS {
70+
sm4: expected_key_bits.into(),
71+
},
72+
mode: TPMU_SYM_MODE {
73+
sm4: expected_mode.into(),
74+
},
75+
};
76+
77+
let sym_def = SymmetricDefinition::try_from(expected_tpmt_sym_def)
78+
.expect("Failed to convert TPMT_SYM_DEF into SymmetricDefinition");
79+
80+
if let SymmetricDefinition::Sm4 { key_bits, mode } = sym_def {
81+
assert_eq!(
82+
expected_key_bits, key_bits, "TPMT_SYM_DEF converted into SymmetricDefinition did not contain the correct value for 'key_bits'"
83+
);
84+
assert_eq!(expected_mode, mode, "TPMT_SYM_DEF converted into SymmetricDefinition did not contain the correct value for 'mode'");
85+
} else {
86+
panic!("SymmetricDefinition converted from TPMT_SYM_DEF did not contain the expected algorithm SM4");
87+
}
88+
89+
let actual_tpmt_sym_def = TPMT_SYM_DEF::try_from(sym_def)
90+
.expect("Failed to Convert SymmetricDefinition into TPMT_SYM_DEF");
91+
92+
crate::common::ensure_tpmt_sym_def_equality(&expected_tpmt_sym_def, &actual_tpmt_sym_def);
93+
}
94+
}
95+
96+
#[test]
97+
fn test_valid_camellia_conversions() {
98+
const CAMELLIA_KEY_BITS: [CamelliaKeyBits; 3] = [
99+
CamelliaKeyBits::Camellia128,
100+
CamelliaKeyBits::Camellia192,
101+
CamelliaKeyBits::Camellia256,
102+
];
103+
for expected_mode in SYM_MODES {
104+
for expected_key_bits in CAMELLIA_KEY_BITS {
105+
let expected_tpmt_sym_def = TPMT_SYM_DEF {
106+
algorithm: SymmetricAlgorithm::Camellia.into(),
107+
keyBits: TPMU_SYM_KEY_BITS {
108+
camellia: expected_key_bits.into(),
109+
},
110+
mode: TPMU_SYM_MODE {
111+
camellia: expected_mode.into(),
112+
},
113+
};
114+
115+
let sym_def = SymmetricDefinition::try_from(expected_tpmt_sym_def)
116+
.expect("Failed to convert TPMT_SYM_DEF into SymmetricDefinition");
117+
118+
if let SymmetricDefinition::Camellia { key_bits, mode } = sym_def {
119+
assert_eq!(
120+
expected_key_bits, key_bits, "TPMT_SYM_DEF converted into SymmetricDefinition did not contain the correct value for 'key_bits'"
121+
);
122+
assert_eq!(expected_mode, mode, "TPMT_SYM_DEF converted into SymmetricDefinition did not contain the correct value for 'mode'");
123+
} else {
124+
panic!("SymmetricDefinition converted from TPMT_SYM_DEF did not contain the expected algorithm CAMELLIA");
125+
}
126+
127+
let actual_tpmt_sym_def = TPMT_SYM_DEF::try_from(sym_def)
128+
.expect("Failed to Convert SymmetricDefinition into TPMT_SYM_DEF");
129+
130+
crate::common::ensure_tpmt_sym_def_equality(
131+
&expected_tpmt_sym_def,
132+
&actual_tpmt_sym_def,
133+
);
134+
}
135+
}
136+
}
137+
138+
#[test]
139+
fn test_valid_xor_conversions() {
140+
const HASHING_ALGORITHMS: [HashingAlgorithm; 8] = [
141+
HashingAlgorithm::Sha1,
142+
HashingAlgorithm::Sha256,
143+
HashingAlgorithm::Sha384,
144+
HashingAlgorithm::Sha512,
145+
HashingAlgorithm::Sm3_256,
146+
HashingAlgorithm::Sha3_256,
147+
HashingAlgorithm::Sha3_384,
148+
HashingAlgorithm::Sha3_512,
149+
];
150+
for expected_hashing_algorithm in HASHING_ALGORITHMS {
151+
let expected_tpmt_sym_def = TPMT_SYM_DEF {
152+
algorithm: SymmetricAlgorithm::Xor.into(),
153+
keyBits: TPMU_SYM_KEY_BITS {
154+
exclusiveOr: expected_hashing_algorithm.into(),
155+
},
156+
mode: Default::default(),
157+
};
158+
159+
let sym_def = SymmetricDefinition::try_from(expected_tpmt_sym_def)
160+
.expect("Failed to convert TPMT_SYM_DEF into SymmetricDefinition");
161+
162+
if let SymmetricDefinition::Xor { hashing_algorithm } = sym_def {
163+
assert_eq!(
164+
expected_hashing_algorithm,
165+
hashing_algorithm,
166+
"TPMT_SYM_DEF converted into SymmetricDefinition did not contain the correct value for 'key_bits'",
167+
);
168+
} else {
169+
panic!("SymmetricDefinition converted from TPMT_SYM_DEF did not contain the expected algorithm XOR");
170+
}
171+
172+
let actual_tpmt_sym_def = TPMT_SYM_DEF::try_from(sym_def)
173+
.expect("Failed to Convert SymmetricDefinition into TPMT_SYM_DEF");
174+
175+
crate::common::ensure_tpmt_sym_def_equality(&expected_tpmt_sym_def, &actual_tpmt_sym_def);
176+
}
177+
}
178+
179+
#[test]
180+
fn test_valid_null_conversions() {
181+
let expected_tpmt_sym_def = TPMT_SYM_DEF {
182+
algorithm: SymmetricAlgorithm::Null.into(),
183+
keyBits: Default::default(),
184+
mode: Default::default(),
185+
};
186+
187+
let sym_def = SymmetricDefinition::try_from(expected_tpmt_sym_def)
188+
.expect("Failed to convert TPMT_SYM_DEF into SymmetricDefinition");
189+
190+
if sym_def != SymmetricDefinition::Null {
191+
panic!("SymmetricDefinition converted from TPMT_SYM_DEF did not contain the expected algorithm NULL");
192+
}
193+
194+
let actual_tpmt_sym_def = TPMT_SYM_DEF::try_from(sym_def)
195+
.expect("Failed to Convert SymmetricDefinition into TPMT_SYM_DEF");
196+
197+
crate::common::ensure_tpmt_sym_def_equality(&expected_tpmt_sym_def, &actual_tpmt_sym_def);
198+
}
199+
200+
#[test]
201+
fn test_invalid_symmetric_algorithm_conversion() {
202+
let invalid_alg_tpmt_sym_def = TPMT_SYM_DEF {
203+
algorithm: AlgorithmIdentifier::RsaPss.into(),
204+
keyBits: Default::default(),
205+
mode: Default::default(),
206+
};
207+
208+
assert_eq!(
209+
Err(Error::WrapperError(WrapperErrorKind::InvalidParam)),
210+
SymmetricDefinition::try_from(invalid_alg_tpmt_sym_def),
211+
"Converting TPMT_SYM_DEF with an invalid symmetric algorithm did not produce the expected error"
212+
);
213+
}
214+
215+
#[test]
216+
fn test_invalid_xor_with_null_conversions() {
217+
let invalid_alg_tpmt_sym_def = TPMT_SYM_DEF {
218+
algorithm: SymmetricAlgorithm::Xor.into(),
219+
keyBits: TPMU_SYM_KEY_BITS {
220+
exclusiveOr: HashingAlgorithm::Null.into(),
221+
},
222+
mode: Default::default(),
223+
};
224+
225+
assert_eq!(
226+
Err(Error::WrapperError(WrapperErrorKind::InvalidParam)),
227+
SymmetricDefinition::try_from(invalid_alg_tpmt_sym_def),
228+
"Converting TPMT_SYM_DEF with an invalid XOR hashing algorithm did not produce the expected error"
229+
);
230+
231+
let invalid_sym_def = SymmetricDefinition::Xor {
232+
hashing_algorithm: HashingAlgorithm::Null,
233+
};
234+
235+
if let Err(actual_error) = TPMT_SYM_DEF::try_from(invalid_sym_def) {
236+
assert_eq!(
237+
Error::WrapperError(WrapperErrorKind::InvalidParam),
238+
actual_error,
239+
"Converting SymmetricDefinition with invalid XOR hashing algorithm did not produce the expected error"
240+
);
241+
} else {
242+
panic!("Converting SymmetricDefinition with invalid XOR hashing algorithm did not produce an error");
243+
}
244+
}

0 commit comments

Comments
 (0)