1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
// 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 CHROME_BROWSER_UI_ASH_FOCUS_MODE_SIGNATURE_BUILDER_H_
#define CHROME_BROWSER_UI_ASH_FOCUS_MODE_SIGNATURE_BUILDER_H_
#include <optional>
#include <string>
#include <string_view>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ui/ash/focus_mode/certificate_manager.h"
#include "chromeos/ash/components/dbus/attestation/interface.pb.h"
#include "components/account_id/account_id.h"
// Constructs a signature base and headers for YMC API requests to satisfy
// request signing requirements.
// https://developers.google.com/youtube/mediaconnect/guides/device_attestation
class SignatureBuilder {
public:
explicit SignatureBuilder(CertificateManager* certificate_manager);
SignatureBuilder(const SignatureBuilder&) = delete;
SignatureBuilder& operator=(const SignatureBuilder&) = delete;
~SignatureBuilder();
SignatureBuilder& SetAccountId(const AccountId& account_id);
SignatureBuilder& SetPayload(std::vector<uint8_t> bytes);
// Device Info fields
SignatureBuilder& SetBrand(std::string_view brand);
SignatureBuilder& SetModel(std::string_view model);
SignatureBuilder& SetSoftwareVersion(std::string_view version);
SignatureBuilder& SetDeviceId(std::string_view device_id);
using HeaderCallback =
base::OnceCallback<void(const std::vector<std::string>& headers)>;
bool BuildHeaders(HeaderCallback callback);
using SignatureBaseCallback =
base::OnceCallback<void(const std::string& signature_base)>;
bool BuildSignatureBase(SignatureBaseCallback callback);
// Returns a formatted 'Device-Info' HTTP headers string.
std::string DeviceInfoHeader() const;
private:
using SignedCallback =
base::OnceCallback<void(const std::vector<uint8_t>& signature)>;
void SignSignatureBase(const std::string& signature_base,
SignedCallback callback);
void OnCertificateRetrieved(
HeaderCallback callback,
const std::optional<CertificateManager::Key>& key);
struct Fields {
Fields();
Fields(const Fields&);
~Fields();
std::string device_info;
std::string payload_digest;
std::string signature_params;
};
void OnBaseSigned(HeaderCallback callback,
const Fields& fields,
bool success,
const std::string& signature,
const std::string& client_certificate,
const std::vector<std::string>& intermediate_certificates);
std::string SignatureBase(std::string_view device_info,
std::string_view content_digest,
std::string_view signature_params) const;
// Returns the sha-256 of `payload_` encoded in lowercase hexadecimal.
std::string PayloadDigest() const;
std::string DeviceInfo() const;
std::string SignatureParams() const;
// Retrieves a certificate and signs the signature base.
raw_ptr<CertificateManager> certificate_manager_;
std::optional<AccountId> account_id_;
std::vector<uint8_t> payload_;
std::string brand_;
std::string model_;
std::string version_;
std::string device_id_;
base::WeakPtrFactory<SignatureBuilder> weak_factory_{this};
};
#endif // CHROME_BROWSER_UI_ASH_FOCUS_MODE_SIGNATURE_BUILDER_H_
|