|
1 | 1 | // Copyright 2021 Contributors to the Parsec project.
|
2 | 2 | // SPDX-License-Identifier: Apache-2.0
|
3 | 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, TPMT_SYM_DEF_OBJECT}, |
| 4 | + constants::tss::{ |
| 5 | + TPM2_ALG_AES, TPM2_ALG_CAMELLIA, TPM2_ALG_ECC, TPM2_ALG_ECDAA, TPM2_ALG_ECDH, |
| 6 | + TPM2_ALG_ECDSA, TPM2_ALG_ECMQV, TPM2_ALG_ECSCHNORR, TPM2_ALG_HMAC, TPM2_ALG_KDF1_SP800_108, |
| 7 | + TPM2_ALG_KDF1_SP800_56A, TPM2_ALG_KDF2, TPM2_ALG_KEYEDHASH, TPM2_ALG_MGF1, TPM2_ALG_NULL, |
| 8 | + TPM2_ALG_OAEP, TPM2_ALG_RSA, TPM2_ALG_RSAES, TPM2_ALG_RSAPSS, TPM2_ALG_RSASSA, |
| 9 | + TPM2_ALG_SM2, TPM2_ALG_SM4, TPM2_ALG_SYMCIPHER, TPM2_ALG_XOR, |
| 10 | + }, |
| 11 | + tss2_esys::{ |
| 12 | + TPMT_ECC_SCHEME, TPMT_KDF_SCHEME, TPMT_KEYEDHASH_SCHEME, TPMT_PUBLIC_PARMS, |
| 13 | + TPMT_RSA_SCHEME, TPMT_SYM_DEF, TPMT_SYM_DEF_OBJECT, |
| 14 | + }, |
6 | 15 | };
|
7 | 16 |
|
8 | 17 | pub fn ensure_tpmt_sym_def_equality(expected: &TPMT_SYM_DEF, actual: &TPMT_SYM_DEF) {
|
@@ -133,3 +142,197 @@ pub fn ensure_tpmt_sym_def_object_equality(
|
133 | 142 | }
|
134 | 143 | }
|
135 | 144 | }
|
| 145 | + |
| 146 | +pub fn ensure_tpmt_public_parms_equality(expected: &TPMT_PUBLIC_PARMS, actual: &TPMT_PUBLIC_PARMS) { |
| 147 | + assert_eq!( |
| 148 | + expected.type_, actual.type_, |
| 149 | + "'type_' value in TPMT_PUBLIC_PARMS, mismatch between actual and expected", |
| 150 | + ); |
| 151 | + |
| 152 | + match expected.type_ { |
| 153 | + TPM2_ALG_RSA => { |
| 154 | + let expected_rsa_parms = unsafe { &expected.parameters.rsaDetail }; |
| 155 | + let actual_rsa_parms = unsafe { &actual.parameters.rsaDetail }; |
| 156 | + crate::common::ensure_tpms_rsa_parms_equality(expected_rsa_parms, actual_rsa_parms); |
| 157 | + } |
| 158 | + TPM2_ALG_KEYEDHASH => { |
| 159 | + let expected_keyed_hash_parms = unsafe { &expected.parameters.keyedHashDetail }; |
| 160 | + let actual_keyed_hash_parms = unsafe { &actual.parameters.keyedHashDetail }; |
| 161 | + crate::common::ensure_tpms_keyedhash_parms_equality( |
| 162 | + expected_keyed_hash_parms, |
| 163 | + actual_keyed_hash_parms, |
| 164 | + ); |
| 165 | + } |
| 166 | + TPM2_ALG_ECC => { |
| 167 | + let expected_ecc_parms = unsafe { &expected.parameters.eccDetail }; |
| 168 | + let actual_ecc_parms = unsafe { &actual.parameters.eccDetail }; |
| 169 | + crate::common::ensure_tpms_ecc_parms_equality(expected_ecc_parms, actual_ecc_parms); |
| 170 | + } |
| 171 | + TPM2_ALG_SYMCIPHER => { |
| 172 | + let expected_symcipher_parms = unsafe { &expected.parameters.symDetail }; |
| 173 | + let actual_symcipher_parms = unsafe { &actual.parameters.symDetail }; |
| 174 | + crate::common::ensure_tpms_symcipher_parms_equality( |
| 175 | + expected_symcipher_parms, |
| 176 | + actual_symcipher_parms, |
| 177 | + ); |
| 178 | + } |
| 179 | + _ => { |
| 180 | + panic!("Invalid algorithm in TPMT_PUBLIC_PARMS"); |
| 181 | + } |
| 182 | + } |
| 183 | +} |
| 184 | + |
| 185 | +pub fn ensure_tpmt_rsa_scheme_equality(expected: &TPMT_RSA_SCHEME, actual: &TPMT_RSA_SCHEME) { |
| 186 | + assert_eq!( |
| 187 | + expected.scheme, actual.scheme, |
| 188 | + "'scheme' value in TPMT_RSA_SCHEME, mismatch between actual and expected", |
| 189 | + ); |
| 190 | + |
| 191 | + match expected.scheme { |
| 192 | + TPM2_ALG_RSASSA => { |
| 193 | + let expected_hash_scheme = unsafe { &expected.details.rsassa }; |
| 194 | + let actual_hash_scheme = unsafe { &actual.details.rsassa }; |
| 195 | + crate::common::ensure_tpms_scheme_hash_equality( |
| 196 | + expected_hash_scheme, |
| 197 | + actual_hash_scheme, |
| 198 | + ); |
| 199 | + } |
| 200 | + TPM2_ALG_RSAES => {} |
| 201 | + TPM2_ALG_RSAPSS => { |
| 202 | + let expected_hash_scheme = unsafe { &expected.details.rsapss }; |
| 203 | + let actual_hash_scheme = unsafe { &actual.details.rsapss }; |
| 204 | + crate::common::ensure_tpms_scheme_hash_equality( |
| 205 | + expected_hash_scheme, |
| 206 | + actual_hash_scheme, |
| 207 | + ); |
| 208 | + } |
| 209 | + TPM2_ALG_OAEP => { |
| 210 | + let expected_hash_scheme = unsafe { &expected.details.oaep }; |
| 211 | + let actual_hash_scheme = unsafe { &actual.details.oaep }; |
| 212 | + crate::common::ensure_tpms_scheme_hash_equality( |
| 213 | + expected_hash_scheme, |
| 214 | + actual_hash_scheme, |
| 215 | + ); |
| 216 | + } |
| 217 | + TPM2_ALG_NULL => {} |
| 218 | + _ => panic!("Invalid algorithm in TPMT_RSA_SCHEME"), |
| 219 | + } |
| 220 | +} |
| 221 | + |
| 222 | +pub fn ensure_tpmt_ecc_scheme_equality(expected: &TPMT_ECC_SCHEME, actual: &TPMT_ECC_SCHEME) { |
| 223 | + assert_eq!( |
| 224 | + expected.scheme, actual.scheme, |
| 225 | + "'scheme' value in TPMT_ECC_SCHEME, mismatch between actual and expected", |
| 226 | + ); |
| 227 | + match expected.scheme { |
| 228 | + TPM2_ALG_ECDSA => { |
| 229 | + let expected_hash_scheme = unsafe { &expected.details.ecdsa }; |
| 230 | + let actual_hash_scheme = unsafe { &actual.details.ecdsa }; |
| 231 | + crate::common::ensure_tpms_scheme_hash_equality( |
| 232 | + expected_hash_scheme, |
| 233 | + actual_hash_scheme, |
| 234 | + ); |
| 235 | + } |
| 236 | + TPM2_ALG_ECDH => { |
| 237 | + let expected_hash_scheme = unsafe { &expected.details.ecdh }; |
| 238 | + let actual_hash_scheme = unsafe { &actual.details.ecdh }; |
| 239 | + crate::common::ensure_tpms_scheme_hash_equality( |
| 240 | + expected_hash_scheme, |
| 241 | + actual_hash_scheme, |
| 242 | + ); |
| 243 | + } |
| 244 | + TPM2_ALG_ECDAA => { |
| 245 | + let expected_ecdaa_scheme = unsafe { &expected.details.ecdaa }; |
| 246 | + let actual_ecdaa_scheme = unsafe { &actual.details.ecdaa }; |
| 247 | + crate::common::ensure_tpms_scheme_ecdaa_equality( |
| 248 | + expected_ecdaa_scheme, |
| 249 | + actual_ecdaa_scheme, |
| 250 | + ); |
| 251 | + } |
| 252 | + TPM2_ALG_SM2 => { |
| 253 | + let expected_hash_scheme = unsafe { &expected.details.sm2 }; |
| 254 | + let actual_hash_scheme = unsafe { &actual.details.sm2 }; |
| 255 | + crate::common::ensure_tpms_scheme_hash_equality( |
| 256 | + expected_hash_scheme, |
| 257 | + actual_hash_scheme, |
| 258 | + ); |
| 259 | + } |
| 260 | + TPM2_ALG_ECSCHNORR => { |
| 261 | + let expected_hash_scheme = unsafe { &expected.details.ecschnorr }; |
| 262 | + let actual_hash_scheme = unsafe { &actual.details.ecschnorr }; |
| 263 | + crate::common::ensure_tpms_scheme_hash_equality( |
| 264 | + expected_hash_scheme, |
| 265 | + actual_hash_scheme, |
| 266 | + ); |
| 267 | + } |
| 268 | + TPM2_ALG_ECMQV => { |
| 269 | + let expected_hash_scheme = unsafe { &expected.details.ecmqv }; |
| 270 | + let actual_hash_scheme = unsafe { &actual.details.ecmqv }; |
| 271 | + crate::common::ensure_tpms_scheme_hash_equality( |
| 272 | + expected_hash_scheme, |
| 273 | + actual_hash_scheme, |
| 274 | + ); |
| 275 | + } |
| 276 | + TPM2_ALG_NULL => {} |
| 277 | + _ => panic!("Invalid algorithm in TPMT_ECC_SCHEME"), |
| 278 | + } |
| 279 | +} |
| 280 | + |
| 281 | +pub fn ensure_tpmt_keyedhash_scheme_equality( |
| 282 | + expected: &TPMT_KEYEDHASH_SCHEME, |
| 283 | + actual: &TPMT_KEYEDHASH_SCHEME, |
| 284 | +) { |
| 285 | + assert_eq!( |
| 286 | + expected.scheme, actual.scheme, |
| 287 | + "'scheme' value in TPMT_KEYEDHASH_SCHEME, mismatch between actual and expected", |
| 288 | + ); |
| 289 | + match expected.scheme { |
| 290 | + TPM2_ALG_XOR => { |
| 291 | + let expected_xor_scheme = unsafe { &expected.details.exclusiveOr }; |
| 292 | + let actual_xor_scheme = unsafe { &actual.details.exclusiveOr }; |
| 293 | + crate::common::ensure_tpms_scheme_xor_equality(expected_xor_scheme, actual_xor_scheme); |
| 294 | + } |
| 295 | + TPM2_ALG_HMAC => { |
| 296 | + let expected_hmac_scheme = unsafe { &expected.details.hmac }; |
| 297 | + let actual_hmac_scheme = unsafe { &actual.details.hmac }; |
| 298 | + crate::common::ensure_tpms_scheme_hmac_equality( |
| 299 | + expected_hmac_scheme, |
| 300 | + actual_hmac_scheme, |
| 301 | + ); |
| 302 | + } |
| 303 | + TPM2_ALG_NULL => {} |
| 304 | + _ => panic!("Invalid algorithm in TPMT_KEYEDHASH_SCHEME"), |
| 305 | + } |
| 306 | +} |
| 307 | + |
| 308 | +pub fn ensure_tpmt_kdf_scheme_equality(expected: &TPMT_KDF_SCHEME, actual: &TPMT_KDF_SCHEME) { |
| 309 | + assert_eq!( |
| 310 | + expected.scheme, actual.scheme, |
| 311 | + "'scheme' value in TPMT_KDF_SCHEME, mismatch between actual and expected", |
| 312 | + ); |
| 313 | + |
| 314 | + match expected.scheme { |
| 315 | + TPM2_ALG_KDF1_SP800_56A => { |
| 316 | + let expected_scheme = unsafe { &expected.details.kdf1_sp800_56a }; |
| 317 | + let actual_scheme = unsafe { &actual.details.kdf1_sp800_56a }; |
| 318 | + crate::common::ensure_tpms_scheme_hash_equality(expected_scheme, actual_scheme); |
| 319 | + } |
| 320 | + TPM2_ALG_KDF2 => { |
| 321 | + let expected_scheme = unsafe { &expected.details.kdf2 }; |
| 322 | + let actual_scheme = unsafe { &actual.details.kdf2 }; |
| 323 | + crate::common::ensure_tpms_scheme_hash_equality(expected_scheme, actual_scheme); |
| 324 | + } |
| 325 | + TPM2_ALG_KDF1_SP800_108 => { |
| 326 | + let expected_scheme = unsafe { &expected.details.kdf1_sp800_108 }; |
| 327 | + let actual_scheme = unsafe { &actual.details.kdf1_sp800_108 }; |
| 328 | + crate::common::ensure_tpms_scheme_hash_equality(expected_scheme, actual_scheme); |
| 329 | + } |
| 330 | + TPM2_ALG_MGF1 => { |
| 331 | + let expected_scheme = unsafe { &expected.details.mgf1 }; |
| 332 | + let actual_scheme = unsafe { &actual.details.mgf1 }; |
| 333 | + crate::common::ensure_tpms_scheme_hash_equality(expected_scheme, actual_scheme); |
| 334 | + } |
| 335 | + TPM2_ALG_NULL => {} |
| 336 | + _ => panic!("Invalid algorithm in TPMT_KDF_SCHEME"), |
| 337 | + } |
| 338 | +} |
0 commit comments