// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CRYPTO_USER_VERIFYING_KEY_H_ #define CRYPTO_USER_VERIFYING_KEY_H_ #include <memory> #include <optional> #include <string> #include <variant> #include <vector> #include "base/containers/span.h" #include "base/functional/callback.h" #include "base/memory/ref_counted.h" #include "base/types/expected.h" #include "build/build_config.h" #include "crypto/crypto_export.h" #include "crypto/scoped_lacontext.h" #include "crypto/signature_verifier.h" #include "crypto/unexportable_key.h" namespace crypto { UserVerifyingKeyLabel; // Error values supplied to the callbacks for creating and retrieving // user-verifying keys, upon failure. enum class UserVerifyingKeyCreationError { … }; // Error values supplied to the callback for signing with a user-verifying key, // upon failure. enum class UserVerifyingKeySigningError { … }; // UserVerifyingSigningKey is a hardware-backed key that triggers a user // verification by the platform before a signature will be provided. // // Notes: // - This is currently only supported on Windows and Mac. // - This does not export a wrapped key because the Windows implementation uses // the WinRT KeyCredentialManager which addresses stored keys by name. // - The interface for this class will likely need to be generalized as support // for other platforms is added. class CRYPTO_EXPORT UserVerifyingSigningKey { … }; // Reference-counted wrapper for UserVeriyingSigningKey. class CRYPTO_EXPORT RefCountedUserVerifyingSigningKey : public base::RefCountedThreadSafe<RefCountedUserVerifyingSigningKey> { … }; // UserVerifyingKeyProvider creates |UserVerifyingSigningKey|s. class CRYPTO_EXPORT UserVerifyingKeyProvider { … }; // GetUserVerifyingKeyProvider returns |UserVerifyingKeyProvider| for the // current platform, or nullptr if this is not implemented on the current // platform. // Note that this will return non null if keys are supported but not available, // i.e. if |AreUserVerifyingKeysSupported| returns false. In that case, // operations would fail. CRYPTO_EXPORT std::unique_ptr<UserVerifyingKeyProvider> GetUserVerifyingKeyProvider(UserVerifyingKeyProvider::Config config); // Invokes the callback with true if UV keys can be used on the current // platform, and false otherwise. `callback` can be invoked synchronously or // asynchronously. CRYPTO_EXPORT void AreUserVerifyingKeysSupported( UserVerifyingKeyProvider::Config config, base::OnceCallback<void(bool)> callback); namespace internal { CRYPTO_EXPORT void SetUserVerifyingKeyProviderForTesting( std::unique_ptr<UserVerifyingKeyProvider> (*func)()); } // namespace internal } // namespace crypto #endif // CRYPTO_USER_VERIFYING_KEY_H_