#include "device/fido/large_blob.h"
#include <algorithm>
#include <ostream>
#include "base/containers/map_util.h"
#include "base/containers/span.h"
#include "base/ranges/algorithm.h"
#include "components/cbor/reader.h"
#include "components/cbor/writer.h"
#include "crypto/aead.h"
#include "crypto/random.h"
#include "crypto/sha2.h"
#include "device/fido/fido_parsing_utils.h"
#include "device/fido/pin.h"
namespace device {
namespace {
constexpr size_t kTruncatedHashBytes = …;
constexpr std::array<uint8_t, 4> kLargeBlobADPrefix = …;
constexpr size_t kAssociatedDataLength = …;
std::array<uint8_t, kAssociatedDataLength> GenerateLargeBlobAdditionalData(
size_t size) { … }
}
LargeBlob::LargeBlob(std::vector<uint8_t> compressed_data,
uint64_t original_size)
: … { … }
LargeBlob::~LargeBlob() = default;
LargeBlob::LargeBlob(const LargeBlob&) = default;
LargeBlob& LargeBlob::operator=(const LargeBlob&) = default;
LargeBlob::LargeBlob(LargeBlob&&) = default;
LargeBlob& LargeBlob::operator=(LargeBlob&&) = default;
bool LargeBlob::operator==(const LargeBlob& other) const { … }
LargeBlobArrayFragment::LargeBlobArrayFragment(const std::vector<uint8_t> bytes,
const size_t offset)
: … { … }
LargeBlobArrayFragment::~LargeBlobArrayFragment() = default;
LargeBlobArrayFragment::LargeBlobArrayFragment(LargeBlobArrayFragment&&) =
default;
bool VerifyLargeBlobArrayIntegrity(base::span<const uint8_t> large_blob_array) { … }
LargeBlobsRequest LargeBlobsRequest::ForRead(size_t bytes, size_t offset) { … }
LargeBlobsRequest LargeBlobsRequest::ForWrite(LargeBlobArrayFragment fragment,
size_t length) { … }
LargeBlobsRequest::LargeBlobsRequest() = default;
LargeBlobsRequest::LargeBlobsRequest(LargeBlobsRequest&& other) = default;
LargeBlobsRequest::~LargeBlobsRequest() = default;
void LargeBlobsRequest::SetPinParam(
const pin::TokenResponse& pin_uv_auth_token) { … }
std::optional<LargeBlobsResponse> LargeBlobsResponse::ParseForRead(
const size_t bytes_to_read,
const std::optional<cbor::Value>& cbor_response) { … }
std::optional<LargeBlobsResponse> LargeBlobsResponse::ParseForWrite(
const std::optional<cbor::Value>& cbor_response) { … }
LargeBlobsResponse::LargeBlobsResponse(
std::optional<std::vector<uint8_t>> config)
: … { … }
LargeBlobsResponse::LargeBlobsResponse(LargeBlobsResponse&& other) = default;
LargeBlobsResponse& LargeBlobsResponse::operator=(LargeBlobsResponse&& other) =
default;
LargeBlobsResponse::~LargeBlobsResponse() = default;
std::pair<CtapRequestCommand, std::optional<cbor::Value>>
AsCTAPRequestValuePair(const LargeBlobsRequest& request) { … }
std::optional<LargeBlobData> LargeBlobData::Parse(const cbor::Value& value) { … }
LargeBlobData::LargeBlobData(
std::vector<uint8_t> ciphertext,
base::span<const uint8_t, kLargeBlobArrayNonceLength> nonce,
int64_t orig_size)
: … { … }
LargeBlobData::LargeBlobData(LargeBlobKey key, LargeBlob large_blob)
: … { … }
LargeBlobData::LargeBlobData(LargeBlobData&&) = default;
LargeBlobData& LargeBlobData::operator=(LargeBlobData&&) = default;
LargeBlobData::~LargeBlobData() = default;
bool LargeBlobData::operator==(const LargeBlobData& other) const { … }
std::optional<LargeBlob> LargeBlobData::Decrypt(LargeBlobKey key) const { … }
cbor::Value LargeBlobData::AsCBOR() const { … }
LargeBlobArrayReader::LargeBlobArrayReader() = default;
LargeBlobArrayReader::LargeBlobArrayReader(LargeBlobArrayReader&&) = default;
LargeBlobArrayReader::~LargeBlobArrayReader() = default;
void LargeBlobArrayReader::Append(const std::vector<uint8_t>& fragment) { … }
std::optional<cbor::Value::ArrayValue> LargeBlobArrayReader::Materialize() { … }
LargeBlobArrayWriter::LargeBlobArrayWriter(
cbor::Value::ArrayValue large_blob_array) { … }
LargeBlobArrayWriter::LargeBlobArrayWriter(LargeBlobArrayWriter&&) = default;
LargeBlobArrayWriter::~LargeBlobArrayWriter() = default;
LargeBlobArrayFragment LargeBlobArrayWriter::Pop(size_t length) { … }
}