// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_UNEXPORTABLE_KEYS_UNEXPORTABLE_KEY_SERVICE_H_ #define COMPONENTS_UNEXPORTABLE_KEYS_UNEXPORTABLE_KEY_SERVICE_H_ #include "base/component_export.h" #include "base/containers/span.h" #include "base/functional/callback_forward.h" #include "components/unexportable_keys/background_task_priority.h" #include "components/unexportable_keys/service_error.h" #include "components/unexportable_keys/unexportable_key_id.h" #include "crypto/signature_verifier.h" namespace unexportable_keys { // Service providing access to `UnexportableSigningKey`s. // // The service doesn't give clients direct access to the keys. Instead, // `UnexportableKeyService` returns a key handle, `UnexportableKeyId`, that can // be passed back to the service to perform operations with the key. // // To use the same key across several sessions, a client should perform the // following steps: // // 1. Generate a new `UnexportableSigningKey` and obtain its key ID: // // UnexportableKeyService& service = GetUnexportableKeyService(); // ServiceErrorOr<UnexportableKeyId> key_id; // service.GenerateSigningKeySlowlyAsync( // kAlgorithm, kPriority, [&key_id](auto result) { key_id = result; }); // // 2. Get a wrapped key for this key and save it to disk: // // std::vector<uint8_t> wrapped_key = service.GetWrappedKey(*key_id); // SaveToDisk(wrapped_key); // // 3. After the process restart, restore the same `UnexportableSigningKey` from // the wrapped key: // // UnexportableKeyService& service = GetUnexportableKeyService(); // ServiceErrorOr<UnexportableKeyId> key_id; // std::vector<uint8_t> wrapped_key = ReadFromDisk(); // service.FromWrappedSigningKeySlowlyAsync( // wrapped_key, kPriority, [&key_id](auto result) { key_id = result; }); // // 4. Use obtained key ID to sign data: // // service.SignSlowlyAsync(*key_id, kData, kPriority, std::move(callback)); class COMPONENT_EXPORT(UNEXPORTABLE_KEYS) UnexportableKeyService { … }; } // namespace unexportable_keys #endif // COMPONENTS_UNEXPORTABLE_KEYS_UNEXPORTABLE_KEY_SERVICE_H_