| // 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_U2F_H_ |
| #define LIBHWSEC_BACKEND_U2F_H_ |
| |
| #include <cstdint> |
| #include <optional> |
| |
| #include <brillo/secure_blob.h> |
| |
| #include "libhwsec/status.h" |
| #include "libhwsec/structures/no_default_init.h" |
| #include "libhwsec/structures/u2f.h" |
| |
| namespace hwsec { |
| |
| // U2f provide the functions related to U2F commands. |
| class U2f { |
| public: |
| // Is the U2F commands enabled or not. |
| virtual StatusOr<bool> IsEnabled() = 0; |
| |
| // Generates a user-presence-only U2F credential. |
| // |
| // A user-presence-only U2F credential can't be used to prove user |
| // verification during signing. |
| // |
| // |app_id| is the identifier of the relying party requesting the credential |
| // generation, which is often the domain name or its hash. |
| // |user_secret| is a secret provided from userland to the TPM, to separate |
| // access to credentials of different users on the same device. |
| // |consume| is whether user presence should be consumed (usually meaning |
| // the power button touch state is reset) after processing this command. |
| // |up_required| is whether user presence is required (usually meaning the |
| // the power button is touched recently) to process this command. |
| // |
| // On success, returns the GenerateResult which contains the key handle and |
| // public key of the generated credential. |
| virtual StatusOr<u2f::GenerateResult> GenerateUserPresenceOnly( |
| const brillo::Blob& app_id, |
| const brillo::SecureBlob& user_secret, |
| u2f::ConsumeMode consume_mode, |
| u2f::UserPresenceMode up_mode) = 0; |
| |
| // Generates a U2F credential. |
| // |
| // A U2F credential can be used to prove either user presence or user |
| // verification during signing based on the caller's request. |
| // |
| // |app_id| is the identifier of the relying party requesting the credential |
| // generation, which is often the domain name or its hash. |
| // |user_secret| is a secret provided from userland to the TPM, to separate |
| // access to credentials of different users on the same device. |
| // |consume| is whether user presence should be consumed (usually meaning |
| // the power button touch state is reset) after processing this command. |
| // |up_required| is whether user presence is required (usually meaning the |
| // the power button is touched recently) to process this command. |
| // |auth_time_secret_hash| is a hash used for checking user verification |
| // during signing time. |
| // |
| // On success, returns the GenerateResult which contains the key handle and |
| // public key of the generated credential. |
| virtual StatusOr<u2f::GenerateResult> Generate( |
| const brillo::Blob& app_id, |
| const brillo::SecureBlob& user_secret, |
| u2f::ConsumeMode consume_mode, |
| u2f::UserPresenceMode up_mode, |
| const brillo::Blob& auth_time_secret_hash) = 0; |
| |
| // Signs the hash using a user-presence-only U2F credential. |
| // |
| // A user-presence-only U2F credential can't be used to prove user |
| // verification during signing. |
| // |
| // |app_id| is the identifier of the relying party requesting the credential |
| // generation, which is often the domain name or its hash. |
| // |user_secret| is a secret provided from userland to the TPM, to separate |
| // access to credentials of different users on the same device. |
| // |hash_to_sign| is the hash to sign. |
| // |consume| is whether user presence should be consumed (usually meaning |
| // the power button touch state is reset) after processing this command. |
| // |up_required| is whether user presence is required (usually meaning the |
| // the power button is touched recently) to process this command. |
| // |key_handle| is the key handle of the credential to sign the hash with. |
| // |
| // On success, returns the signature. |
| virtual StatusOr<u2f::Signature> SignUserPresenceOnly( |
| const brillo::Blob& app_id, |
| const brillo::SecureBlob& user_secret, |
| const brillo::Blob& hash_to_sign, |
| u2f::ConsumeMode consume_mode, |
| u2f::UserPresenceMode up_mode, |
| const brillo::Blob& key_handle) = 0; |
| |
| // Signs the hash using a U2F credential. |
| // |
| // A U2F credential can be used to prove either user presence or user |
| // verification during signing based on the caller's request. |
| // |
| // |app_id| is the identifier of the relying party requesting the credential |
| // generation, which is often the domain name or its hash. |
| // |user_secret| is a secret provided from userland to the TPM, to separate |
| // access to credentials of different users on the same device. |
| // |auth_time_secret| is a secret that corresponds to the |
| // |auth_time_secret_hash| passed during credential generation. If |
| // provided the U2F authenticator will verify it, which can be used to |
| // provide user verification authentication. |
| // |hash_to_sign| is the hash to sign. |
| // |consume| is whether user presence should be consumed (usually meaning |
| // the power button touch state is reset) after processing this command. |
| // |up_required| is whether user presence is required (usually meaning the |
| // the power button is touched recently) to process this command. |
| // |key_handle| is the key handle of the credential to sign the hash with. |
| // |
| // On success, returns the signature. |
| virtual StatusOr<u2f::Signature> Sign( |
| const brillo::Blob& app_id, |
| const brillo::SecureBlob& user_secret, |
| const std::optional<brillo::SecureBlob>& auth_time_secret, |
| const brillo::Blob& hash_to_sign, |
| u2f::ConsumeMode consume_mode, |
| u2f::UserPresenceMode up_mode, |
| const brillo::Blob& key_handle) = 0; |
| |
| // Checks whether a user-presence-only U2F credential is valid. |
| // |
| // A user-presence-only U2F credential can't be used to prove user |
| // verification during signing. |
| // |
| // |app_id| is the identifier of the relying party requesting the credential |
| // generation, which is often the domain name or its hash. |
| // |user_secret| is a secret provided from userland to the TPM, to separate |
| // access to credentials of different users on the same device. |
| // |key_handle| is the key handle of the credential to sign the hash with. |
| // |
| // On success, returns the OK status. |
| virtual Status CheckUserPresenceOnly(const brillo::Blob& app_id, |
| const brillo::SecureBlob& user_secret, |
| const brillo::Blob& key_handle) = 0; |
| |
| // Like `CheckUserPresenceOnly`, but checks a normal U2F credential. |
| virtual Status Check(const brillo::Blob& app_id, |
| const brillo::SecureBlob& user_secret, |
| const brillo::Blob& key_handle) = 0; |
| |
| // Attests a G2F format message using the TPM's G2F key. |
| // |
| // |app_id| is the identifier of the relying party requesting the credential |
| // generation, which is often the domain name or its hash. |
| // |user_secret| is a secret provided from userland to the TPM, to separate |
| // access to credentials of different users on the same device. |
| // |challenge| is the challenge of the attestation message. |
| // |key_handle| is the key handle of the credential to attest. |
| // |public_key| is the public key of the credential to attest. |
| // |
| // On success, returns the signature. |
| virtual StatusOr<u2f::Signature> G2fAttest( |
| const brillo::Blob& app_id, |
| const brillo::SecureBlob& user_secret, |
| const brillo::Blob& challenge, |
| const brillo::Blob& key_handle, |
| const brillo::Blob& public_key) = 0; |
| |
| // Gets a G2F format attestation data. |
| // |
| // This is used for generating the attestation data without asking the U2F |
| // authenticator to attest it. This is useful when the caller wants to do a |
| // software attestation. |
| // |
| // |app_id| is the identifier of the relying party requesting the credential |
| // generation, which is often the domain name or its hash. |
| // |challenge| is the challenge of the attestation message. |
| // |key_handle| is the key handle of the credential to attest. |
| // |public_key| is the public key of the credential to attest. |
| // |
| // On success, returns the attestation data. |
| virtual StatusOr<brillo::Blob> GetG2fAttestData( |
| const brillo::Blob& app_id, |
| const brillo::Blob& challenge, |
| const brillo::Blob& key_handle, |
| const brillo::Blob& public_key) = 0; |
| |
| // Attests a corp format message using the TPM's G2F key. |
| // |
| // |app_id| is the identifier of the relying party requesting the credential |
| // generation, which is often the domain name or its hash. |
| // |user_secret| is a secret provided from userland to the TPM, to separate |
| // access to credentials of different users on the same device. |
| // |challenge| is the challenge of the attestation message. |
| // |key_handle| is the key handle of the credential to attest. |
| // |public_key| is the public key of the credential to attest. |
| // |salt| is the salt of the attestation statement. |
| // |
| // On success, returns the signature. |
| virtual StatusOr<u2f::Signature> CorpAttest( |
| const brillo::Blob& app_id, |
| const brillo::SecureBlob& user_secret, |
| const brillo::Blob& challenge, |
| const brillo::Blob& key_handle, |
| const brillo::Blob& public_key, |
| const brillo::Blob& salt) = 0; |
| |
| virtual StatusOr<u2f::Config> GetConfig() = 0; |
| |
| // Gets the FIPS status of the GSC, i.e., whether the FIPS mode is active. |
| // FIPS mode affects the code path taken by U2F, and only when FIPS mode is |
| // active, the code path taken is using FIPS certified crypto algorithms. |
| virtual StatusOr<u2f::FipsInfo> GetFipsInfo() = 0; |
| |
| // Forces GSC to take the FIPS mode path for U2F. Is the FIPS mode is already |
| // active, this is a no-op. Note that this breaks all existing U2F key handles |
| // if FIPS mode is switched from non-active to active. |
| virtual Status ActivateFips() = 0; |
| |
| protected: |
| U2f() = default; |
| ~U2f() = default; |
| }; |
| |
| } // namespace hwsec |
| |
| #endif // LIBHWSEC_BACKEND_U2F_H_ |