blob: 2410736bdde208af9182d6db9a491a6c29c3d093 [file] [edit]
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef THIRD_PARTY_CREDENTIO_FORMATS_BMFF_TEST_UTILS_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_BMFF_TEST_UTILS_H_
#include <cstdint>
#include <string>
#include "absl/log/check.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "constants/labels.h"
#include "testing/test_string_utils.h"
namespace credentio_testing {
using ::credentio::kC2paBmffBoxUuid;
inline constexpr absl::string_view kNul("\x00", 1);
inline std::string Box(absl::string_view type, absl::string_view data) {
CHECK_EQ(type.size(), 4);
return absl::StrCat(Uint32Str(data.size() + 8), type, data);
}
inline std::string BadBox(absl::string_view type, absl::string_view data,
uint32_t data_size) {
CHECK_EQ(type.size(), 4);
return absl::StrCat(Uint32Str(data_size), type, data);
}
inline std::string BigBox(absl::string_view type, absl::string_view data) {
CHECK_EQ(type.size(), 4);
return absl::StrCat(Uint32Str(1), type, Uint64Str(data.size() + 16), data);
}
inline std::string BoxVersion(uint8_t version) { return Uint8Str(version); }
inline std::string BoxFlags(uint32_t flags) {
CHECK_EQ(flags & 0xff000000, 0);
return Uint32Str(flags).substr(1);
}
// Returns the data payload of a UUID box, suitable for passing to Box() or
// BigBox().
inline std::string UuidBoxPayload(absl::string_view uuid,
absl::string_view version,
absl::string_view flags,
absl::string_view data) {
CHECK_EQ(uuid.size(), 16);
CHECK_EQ(version.size(), 1);
CHECK_EQ(flags.size(), 3);
return absl::StrCat(uuid, version, flags, data);
}
// Returns the data payload of a C2PA manifest box, suitable for passing to
// Box() or BigBox().
inline std::string C2paBoxPayload(absl::string_view purpose,
absl::string_view data) {
return UuidBoxPayload(kC2paBmffBoxUuid, BoxVersion(0), BoxFlags(0),
absl::StrCat(purpose, kNul, data));
}
// Returns the data payload of a well-formed C2PA manifest box (i.e., starting
// with an absolute offset to the first `merkle` C2PA box), suitable for passing
// to Box() or BigBox().
inline std::string ManifestBoxPayload(uint64_t merkle_offset,
absl::string_view data) {
return C2paBoxPayload("manifest",
absl::StrCat(Uint64Str(merkle_offset), data));
}
// Returns a full C2PA manifest box encoded as a standard (small) Box.
inline std::string ManifestBox(uint64_t merkle_offset, absl::string_view data) {
return Box("uuid", ManifestBoxPayload(merkle_offset, data));
}
// Returns a full C2PA manifest box encoded as a BigBox.
inline std::string ManifestBigBox(uint64_t merkle_offset,
absl::string_view data) {
return BigBox("uuid", ManifestBoxPayload(merkle_offset, data));
}
inline std::string C2paUuidBox(absl::string_view data,
absl::string_view box_purpose = "manifest",
uint64_t merkle_offset = 0) {
return Box("uuid",
C2paBoxPayload(box_purpose,
absl::StrCat(Uint64Str(merkle_offset), data)));
}
} // namespace credentio_testing
#endif // THIRD_PARTY_CREDENTIO_FORMATS_BMFF_TEST_UTILS_H_