blob: 412d7a6f3c6297a1afebe5c2f1f4e31e451bfb38 [file] [log] [blame]
// 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.
#include "components/unexportable_keys/unexportable_key_tasks.h"
#include <optional>
#include "base/memory/scoped_refptr.h"
#include "base/trace_event/typed_macros.h"
#include "components/unexportable_keys/background_task_type.h"
#include "components/unexportable_keys/ref_counted_unexportable_signing_key.h"
#include "crypto/signature_verifier.h"
#include "crypto/unexportable_key.h"
namespace unexportable_keys {
namespace {
std::unique_ptr<crypto::UnexportableSigningKey> GenerateSigningKeySlowly(
std::unique_ptr<crypto::UnexportableKeyProvider> key_provider,
base::span<const crypto::SignatureVerifier::SignatureAlgorithm>
acceptable_algorithms,
void* task_ptr_for_tracing) {
TRACE_EVENT("browser", "unexportable_keys::GenerateSigningKeySlowly",
perfetto::Flow::FromPointer(task_ptr_for_tracing));
CHECK(key_provider);
return key_provider->GenerateSigningKeySlowly(acceptable_algorithms);
}
std::unique_ptr<crypto::UnexportableSigningKey> FromWrappedSigningKeySlowly(
std::unique_ptr<crypto::UnexportableKeyProvider> key_provider,
base::span<const uint8_t> wrapped_key,
void* task_ptr_for_tracing) {
TRACE_EVENT("browser", "unexportable_keys::FromWrappedSigningKeySlowly",
perfetto::Flow::FromPointer(task_ptr_for_tracing));
CHECK(key_provider);
return key_provider->FromWrappedSigningKeySlowly(wrapped_key);
}
std::optional<std::vector<uint8_t>> SignSlowlyWithRefCountedKey(
scoped_refptr<RefCountedUnexportableSigningKey> signing_key,
base::span<const uint8_t> data,
void* task_ptr_for_tracing) {
TRACE_EVENT("browser", "unexportable_keys::SignSlowlyWithRefCountedKey",
perfetto::Flow::FromPointer(task_ptr_for_tracing));
CHECK(signing_key);
return signing_key->key().SignSlowly(data);
}
} // namespace
GenerateKeyTask::GenerateKeyTask(
std::unique_ptr<crypto::UnexportableKeyProvider> key_provider,
base::span<const crypto::SignatureVerifier::SignatureAlgorithm>
acceptable_algorithms,
BackgroundTaskPriority priority,
base::OnceCallback<void(GenerateKeyTask::ReturnType)> callback)
: internal::BackgroundTaskImpl<GenerateKeyTask::ReturnType>(
base::BindOnce(
&GenerateSigningKeySlowly,
std::move(key_provider),
std::vector<crypto::SignatureVerifier::SignatureAlgorithm>(
acceptable_algorithms.begin(),
acceptable_algorithms.end()),
this),
std::move(callback),
priority,
BackgroundTaskType::kGenerateKey) {}
FromWrappedKeyTask::FromWrappedKeyTask(
std::unique_ptr<crypto::UnexportableKeyProvider> key_provider,
base::span<const uint8_t> wrapped_key,
BackgroundTaskPriority priority,
base::OnceCallback<void(FromWrappedKeyTask::ReturnType)> callback)
: internal::BackgroundTaskImpl<FromWrappedKeyTask::ReturnType>(
base::BindOnce(
&FromWrappedSigningKeySlowly,
std::move(key_provider),
std::vector<uint8_t>(wrapped_key.begin(), wrapped_key.end()),
this),
std::move(callback),
priority,
BackgroundTaskType::kFromWrappedKey) {}
SignTask::SignTask(scoped_refptr<RefCountedUnexportableSigningKey> signing_key,
base::span<const uint8_t> data,
BackgroundTaskPriority priority,
base::OnceCallback<void(SignTask::ReturnType)> callback)
: internal::BackgroundTaskImpl<SignTask::ReturnType>(
base::BindOnce(&SignSlowlyWithRefCountedKey,
std::move(signing_key),
std::vector<uint8_t>(data.begin(), data.end()),
this),
std::move(callback),
priority,
BackgroundTaskType::kSign) {}
} // namespace unexportable_keys