| // Copyright 2022 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIBHWSEC_BACKEND_TPM1_STATIC_UTILS_H_ |
| #define LIBHWSEC_BACKEND_TPM1_STATIC_UTILS_H_ |
| |
| #include <cstdint> |
| |
| #include <brillo/secure_blob.h> |
| #include <crypto/scoped_openssl_types.h> |
| #include <trousers/tss.h> |
| |
| #include "libhwsec/overalls/overalls.h" |
| #include "libhwsec/status.h" |
| #include "libhwsec/structures/device_config.h" |
| |
| namespace hwsec { |
| |
| // Size of the migration destination key to be generated. Note that the choice |
| // of this size is constrained by restrictions from the TPM 1.2 specs. |
| inline constexpr int kMigrationDestinationKeySizeBits = 2048; |
| inline constexpr int kMigrationDestinationKeySizeFlag = TSS_KEY_SIZE_2048; |
| inline constexpr int kMigrationDestinationKeySizeBytes = |
| kMigrationDestinationKeySizeBits / 8; |
| |
| // Size of the certified migratable key to be created. Note that the choice of |
| // this size is dictated by restrictions from the TPM 1.2 specs |
| inline constexpr int kCmkKeySizeBits = 2048; |
| inline constexpr int kCmkKeySizeFlag = TSS_KEY_SIZE_2048; |
| inline constexpr int kCmkKeySizeBytes = kCmkKeySizeBits / 8; |
| inline constexpr int kCmkPrivateKeySizeBytes = kCmkKeySizeBytes / 2; |
| |
| // The RSA OAEP label parameter specified to be used by the TPM 1.2 specs (see |
| // TPM 1.2 Part 1 Section 31.1.1 "TPM_ES_RSAESOAEP_SHA1_MGF1"). |
| inline constexpr char kTpmRsaOaepLabel[] = {'T', 'C', 'P', 'A'}; |
| |
| // Sizes of the two parts of the migrated CMK private key blob: as described in |
| // TPM 1.2 Part 3 Section 11.9 ("TPM_CMK_CreateBlob"), one part goes into the |
| // OAEP seed and the rest goes into the TPM_MIGRATE_ASYMKEY struct. |
| inline constexpr int kMigratedCmkPrivateKeySeedPartSizeBytes = 16; |
| inline constexpr int kMigratedCmkPrivateKeyRestPartSizeBytes = 112; |
| static_assert(kMigratedCmkPrivateKeySeedPartSizeBytes == SHA_DIGEST_LENGTH - 4, |
| "Invalid private key seed part size constant"); |
| static_assert(kMigratedCmkPrivateKeySeedPartSizeBytes + |
| kMigratedCmkPrivateKeyRestPartSizeBytes == |
| kCmkPrivateKeySizeBytes, |
| "Invalid private key part size constants"); |
| |
| // Size of the TPM_MIGRATE_ASYMKEY structure containing the part of the migrated |
| // private key blob. |
| inline constexpr int kTpmMigrateAsymkeyBlobSize = |
| sizeof(TPM_PAYLOAD_TYPE) /* for payload */ + |
| SHA_DIGEST_LENGTH /* for usageAuth.authdata */ + |
| SHA_DIGEST_LENGTH /* for pubDataDigest.digest */ + |
| sizeof(uint32_t) /* for partPrivKeyLen */ + |
| kMigratedCmkPrivateKeyRestPartSizeBytes /* for *partPrivKey */; |
| |
| StatusOr<crypto::ScopedRSA> ParseRsaFromTpmPubkeyBlob( |
| overalls::Overalls& overalls, const brillo::Blob& pubkey); |
| |
| StatusOr<crypto::ScopedRSA> ExtractCmkPrivateKeyFromMigratedBlob( |
| overalls::Overalls& overalls, |
| const brillo::Blob& migrated_cmk_key12_blob, |
| const brillo::Blob& migration_random_blob, |
| const brillo::Blob& cmk_pubkey, |
| const brillo::Blob& cmk_pubkey_digest, |
| const brillo::Blob& msa_composite_digest, |
| RSA& migration_destination_rsa); |
| |
| StatusOr<brillo::Blob> GetAttribData(overalls::Overalls& overalls, |
| TSS_HCONTEXT context, |
| TSS_HOBJECT object, |
| TSS_FLAG flag, |
| TSS_FLAG sub_flag); |
| |
| brillo::Blob GetTpm1PCRValueForMode( |
| const DeviceConfigSettings::BootModeSetting::Mode& mode); |
| |
| } // namespace hwsec |
| |
| #endif // LIBHWSEC_BACKEND_TPM1_STATIC_UTILS_H_ |