blob: 086f1749d523c9374d4e39b5e4c60ef0ec68be8d [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_NETWORK_SSL_PRIVATE_KEY_PROXY_H_
#define SERVICES_NETWORK_SSL_PRIVATE_KEY_PROXY_H_
#include <stdint.h>
#include <string>
#include <vector>
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "net/ssl/ssl_private_key.h"
#include "services/network/public/mojom/url_loader_network_service_observer.mojom.h"
namespace network {
// Implements the net::SSLPrivateKey interface by forwarding signing requests
// via a Mojo pipe.
//
// This class holds a mojo::Remote<mojom::SSLPrivateKey> connection to an actual
// SSL private key implementation. When Sign() is called, it serializes the
// request, sends it over Mojo, and uses the response to invoke the
// net::SSLPrivateKey::SignCallback. It also handles disconnection of the Mojo
// pipe, treating it as an error.
class SSLPrivateKeyProxy : public net::SSLPrivateKey {
public:
SSLPrivateKeyProxy(const std::string& provider_name,
const std::vector<uint16_t>& algorithm_preferences,
mojo::PendingRemote<mojom::SSLPrivateKey> ssl_private_key);
SSLPrivateKeyProxy(const SSLPrivateKeyProxy&) = delete;
SSLPrivateKeyProxy& operator=(const SSLPrivateKeyProxy&) = delete;
// net::SSLPrivateKey:
std::string GetProviderName() override;
std::vector<uint16_t> GetAlgorithmPreferences() override;
void Sign(uint16_t algorithm,
base::span<const uint8_t> input,
net::SSLPrivateKey::SignCallback callback) override;
private:
~SSLPrivateKeyProxy() override;
void HandleSSLPrivateKeyError();
void Callback(net::SSLPrivateKey::SignCallback callback,
int32_t net_error,
const std::vector<uint8_t>& input);
const std::string provider_name_;
const std::vector<uint16_t> algorithm_preferences_;
mojo::Remote<mojom::SSLPrivateKey> ssl_private_key_;
};
} // namespace network
#endif // SERVICES_NETWORK_SSL_PRIVATE_KEY_PROXY_H_