#include "content/browser/aggregation_service/aggregatable_report.h"
#include <stddef.h>
#include <stdint.h>
#include <array>
#include <bit>
#include <limits>
#include <optional>
#include <ostream>
#include <string>
#include <string_view>
#include <type_traits>
#include <utility>
#include <vector>
#include "base/base64.h"
#include "base/check.h"
#include "base/check_op.h"
#include "base/containers/adapters.h"
#include "base/containers/flat_map.h"
#include "base/containers/span.h"
#include "base/feature_list.h"
#include "base/json/json_writer.h"
#include "base/logging.h"
#include "base/notreached.h"
#include "base/numerics/byte_conversions.h"
#include "base/numerics/safe_conversions.h"
#include "base/ranges/algorithm.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/time/time.h"
#include "base/uuid.h"
#include "base/values.h"
#include "components/aggregation_service/aggregation_coordinator_utils.h"
#include "components/aggregation_service/parsing_utils.h"
#include "components/cbor/values.h"
#include "components/cbor/writer.h"
#include "content/browser/aggregation_service/aggregation_service_features.h"
#include "content/browser/aggregation_service/proto/aggregatable_report.pb.h"
#include "content/browser/aggregation_service/public_key.h"
#include "services/network/public/cpp/is_potentially_trustworthy.h"
#include "third_party/abseil-cpp/absl/numeric/int128.h"
#include "third_party/blink/public/mojom/aggregation_service/aggregatable_report.mojom.h"
#include "third_party/boringssl/src/include/openssl/hpke.h"
#include "third_party/distributed_point_functions/shim/buildflags.h"
#include "url/gurl.h"
#include "url/origin.h"
#if BUILDFLAG(USE_DISTRIBUTED_POINT_FUNCTIONS)
#include "third_party/distributed_point_functions/shim/distributed_point_function_shim.h"
#endif
namespace content {
namespace {
constexpr size_t kBitsPerByte = …;
constexpr std::string_view kHistogramValue = …;
constexpr std::string_view kOperationKey = …;
std::vector<GURL> GetDefaultProcessingUrls(
blink::mojom::AggregationServiceMode aggregation_mode,
const std::optional<url::Origin>& aggregation_coordinator_origin) { … }
#if BUILDFLAG(USE_DISTRIBUTED_POINT_FUNCTIONS)
DpfKey;
DpfParameters;
std::vector<DpfParameters> ConstructDpfParameters() { … }
std::vector<DpfKey> GenerateDpfKeys(
const AggregationServicePayloadContents& contents) { … }
std::vector<std::vector<uint8_t>>
ConstructUnencryptedExperimentalPoplarPayloads(
const AggregationServicePayloadContents& payload_contents) { … }
#endif
std::array<uint8_t, 16u> U128ToBigEndian(absl::uint128 integer) { … }
void AppendEncodedContributionToCborArray(
cbor::Value::ArrayValue& array,
const blink::mojom::AggregatableReportHistogramContribution& contribution,
std::optional<size_t> filtering_id_max_bytes) { … }
std::optional<std::vector<uint8_t>> ConstructUnencryptedTeeBasedPayload(
const AggregationServicePayloadContents& payload_contents) { … }
constexpr std::optional<size_t> ComputeCborArrayOverheadLen(
size_t num_elements) { … }
constexpr std::optional<size_t> ComputeTeeBasedPayloadLengthInBytes(
size_t num_contributions,
std::optional<size_t> filtering_id_max_bytes) { … }
std::optional<AggregationServicePayloadContents>
ConvertPayloadContentsFromProto(
const proto::AggregationServicePayloadContents& proto) { … }
std::optional<AggregatableReportSharedInfo> ConvertSharedInfoFromProto(
const proto::AggregatableReportSharedInfo& proto) { … }
std::optional<AggregatableReportRequest> ConvertReportRequestFromProto(
proto::AggregatableReportRequest request_proto) { … }
void ConvertPayloadContentsToProto(
const AggregationServicePayloadContents& payload_contents,
proto::AggregationServicePayloadContents* out) { … }
void ConvertSharedInfoToProto(const AggregatableReportSharedInfo& shared_info,
proto::AggregatableReportSharedInfo* out) { … }
proto::AggregatableReportRequest ConvertReportRequestToProto(
const AggregatableReportRequest& request) { … }
bool FilteringIdsFitInMaxBytes(
std::vector<blink::mojom::AggregatableReportHistogramContribution>
contributions,
std::optional<size_t> filtering_id_max_bytes) { … }
}
GURL GetAggregationServiceProcessingUrl(const url::Origin& origin) { … }
AggregationServicePayloadContents::AggregationServicePayloadContents(
Operation operation,
std::vector<blink::mojom::AggregatableReportHistogramContribution>
contributions,
blink::mojom::AggregationServiceMode aggregation_mode,
std::optional<url::Origin> aggregation_coordinator_origin,
base::StrictNumeric<size_t> max_contributions_allowed,
std::optional<size_t> filtering_id_max_bytes)
: … { … }
AggregationServicePayloadContents::AggregationServicePayloadContents(
const AggregationServicePayloadContents& other) = default;
AggregationServicePayloadContents& AggregationServicePayloadContents::operator=(
const AggregationServicePayloadContents& other) = default;
AggregationServicePayloadContents::AggregationServicePayloadContents(
AggregationServicePayloadContents&& other) = default;
AggregationServicePayloadContents& AggregationServicePayloadContents::operator=(
AggregationServicePayloadContents&& other) = default;
AggregationServicePayloadContents::~AggregationServicePayloadContents() =
default;
AggregatableReportSharedInfo::AggregatableReportSharedInfo(
base::Time scheduled_report_time,
base::Uuid report_id,
url::Origin reporting_origin,
DebugMode debug_mode,
base::Value::Dict additional_fields,
std::string api_version,
std::string api_identifier)
: … { … }
AggregatableReportSharedInfo::AggregatableReportSharedInfo(
AggregatableReportSharedInfo&& other) = default;
AggregatableReportSharedInfo& AggregatableReportSharedInfo::operator=(
AggregatableReportSharedInfo&& other) = default;
AggregatableReportSharedInfo::~AggregatableReportSharedInfo() = default;
AggregatableReportSharedInfo AggregatableReportSharedInfo::Clone() const { … }
std::string AggregatableReportSharedInfo::SerializeAsJson() const { … }
std::optional<AggregatableReportRequest> AggregatableReportRequest::Create(
AggregationServicePayloadContents payload_contents,
AggregatableReportSharedInfo shared_info,
std::optional<AggregatableReportRequest::DelayType> delay_type,
std::string reporting_path,
std::optional<uint64_t> debug_key,
base::flat_map<std::string, std::string> additional_fields,
int failed_send_attempts) { … }
std::optional<AggregatableReportRequest>
AggregatableReportRequest::CreateForTesting(
std::vector<GURL> processing_urls,
AggregationServicePayloadContents payload_contents,
AggregatableReportSharedInfo shared_info,
std::optional<AggregatableReportRequest::DelayType> delay_type,
std::string reporting_path,
std::optional<uint64_t> debug_key,
base::flat_map<std::string, std::string> additional_fields,
int failed_send_attempts) { … }
std::optional<AggregatableReportRequest>
AggregatableReportRequest::CreateInternal(
std::vector<GURL> processing_urls,
AggregationServicePayloadContents payload_contents,
AggregatableReportSharedInfo shared_info,
std::optional<AggregatableReportRequest::DelayType> delay_type,
std::string reporting_path,
std::optional<uint64_t> debug_key,
base::flat_map<std::string, std::string> additional_fields,
int failed_send_attempts) { … }
AggregatableReportRequest::AggregatableReportRequest(
std::vector<GURL> processing_urls,
AggregationServicePayloadContents payload_contents,
AggregatableReportSharedInfo shared_info,
std::optional<AggregatableReportRequest::DelayType> delay_type,
std::string reporting_path,
std::optional<uint64_t> debug_key,
base::flat_map<std::string, std::string> additional_fields,
int failed_send_attempts)
: … { … }
AggregatableReportRequest::AggregatableReportRequest(
AggregatableReportRequest&& other) = default;
AggregatableReportRequest& AggregatableReportRequest::operator=(
AggregatableReportRequest&& other) = default;
AggregatableReportRequest::~AggregatableReportRequest() = default;
GURL AggregatableReportRequest::GetReportingUrl() const { … }
std::optional<AggregatableReportRequest> AggregatableReportRequest::Deserialize(
base::span<const uint8_t> serialized_proto) { … }
std::vector<uint8_t> AggregatableReportRequest::Serialize() const { … }
AggregatableReport::AggregationServicePayload::AggregationServicePayload(
std::vector<uint8_t> payload,
std::string key_id,
std::optional<std::vector<uint8_t>> debug_cleartext_payload)
: … { … }
AggregatableReport::AggregationServicePayload::AggregationServicePayload(
const AggregatableReport::AggregationServicePayload& other) = default;
AggregatableReport::AggregationServicePayload&
AggregatableReport::AggregationServicePayload::operator=(
const AggregatableReport::AggregationServicePayload& other) = default;
AggregatableReport::AggregationServicePayload::AggregationServicePayload(
AggregatableReport::AggregationServicePayload&& other) = default;
AggregatableReport::AggregationServicePayload&
AggregatableReport::AggregationServicePayload::operator=(
AggregatableReport::AggregationServicePayload&& other) = default;
AggregatableReport::AggregationServicePayload::~AggregationServicePayload() =
default;
AggregatableReport::AggregatableReport(
std::vector<AggregationServicePayload> payloads,
std::string shared_info,
std::optional<uint64_t> debug_key,
base::flat_map<std::string, std::string> additional_fields,
std::optional<url::Origin> aggregation_coordinator_origin)
: … { … }
AggregatableReport::AggregatableReport(const AggregatableReport& other) =
default;
AggregatableReport& AggregatableReport::operator=(
const AggregatableReport& other) = default;
AggregatableReport::AggregatableReport(AggregatableReport&& other) = default;
AggregatableReport& AggregatableReport::operator=(AggregatableReport&& other) =
default;
AggregatableReport::~AggregatableReport() = default;
bool AggregatableReport::Provider::g_disable_encryption_for_testing_tool_ = …;
void AggregatableReport::Provider::SetDisableEncryptionForTestingTool(
bool should_disable) { … }
AggregatableReport::Provider::~Provider() = default;
std::optional<AggregatableReport>
AggregatableReport::Provider::CreateFromRequestAndPublicKeys(
const AggregatableReportRequest& report_request,
std::vector<PublicKey> public_keys) const { … }
base::Value::Dict AggregatableReport::GetAsJson() const { … }
bool AggregatableReport::IsNumberOfProcessingUrlsValid(
size_t number,
blink::mojom::AggregationServiceMode aggregation_mode) { … }
bool AggregatableReport::IsNumberOfHistogramContributionsValid(
size_t number,
blink::mojom::AggregationServiceMode aggregation_mode) { … }
std::optional<std::vector<uint8_t>>
AggregatableReport::SerializeTeeBasedPayloadForTesting(
const AggregationServicePayloadContents& payload_contents) { … }
std::optional<size_t>
AggregatableReport::ComputeTeeBasedPayloadLengthInBytesForTesting(
size_t num_contributions,
std::optional<size_t> filtering_id_max_bytes) { … }
std::vector<uint8_t> EncryptAggregatableReportPayloadWithHpke(
base::span<const uint8_t> report_payload_plaintext,
base::span<const uint8_t> public_key,
base::span<const uint8_t> report_authenticated_info) { … }
}