blob: 20a041fb4f720a2eec6d42da542f5679ea9e86a0 [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.
//
#include "formats/bmff/hasher.h"
#include <string>
#include "absl/status/status.h"
#include "absl/status/status_matchers.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "constants/labels.h"
#include "crypto/algorithms.h"
#include "formats/bmff/test_utils.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "proto/bmff_based_hash_assertion.pb.h"
#include "riegeli/bytes/string_reader.h"
#include "testing/proto_test_utils.h"
namespace credentio {
namespace {
using ::absl_testing::StatusIs;
using ::credentio::kC2paBmffBoxUuid;
using ::credentio_testing::Box;
using ::credentio_testing::BoxFlags;
using ::credentio_testing::BoxVersion;
using ::credentio_testing::EqualsProto;
using ::credentio_testing::ParseTextProtoOrDie;
using ::credentio_testing::UuidBoxPayload;
using ::testing::HasSubstr;
TEST(BmffHasherTest, GetHashAssertionTemplate) {
auto expected = ParseTextProtoOrDie<BmffBasedHashAssertion>(R"pb(
exclusions { xpath: "/ftyp" }
exclusions {
xpath: "/uuid"
data {
offset: 8
value: "\330\376\303\326\033\016H<\222\227X(\207~\304\201"
}
}
exclusions { xpath: "/mfra" }
exclusions { xpath: "/free" }
alg: "sha256"
hash: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
name: "BMFF file hash"
)pb");
EXPECT_THAT(GetBmffHashTemplate(HashAlgorithm::kSha256),
EqualsProto(expected));
}
TEST(BmffHasherTest, Digest) {
auto assertion = ParseTextProtoOrDie<BmffBasedHashAssertion>(R"pb(
exclusions { xpath: "/ftyp" }
exclusions {
xpath: "/uuid"
data {
offset: 8
value: "\330\376\303\326\033\016H<\222\227X(\207~\304\201"
}
}
exclusions { xpath: "/mfra" }
exclusions { xpath: "/free" }
alg: "sha256"
hash: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
name: "BMFF file hash"
)pb");
std::string input_contents = absl::StrCat(
Box("uuid",
UuidBoxPayload(kC2paBmffBoxUuid, BoxVersion(0), BoxFlags(0), "")),
Box("trak", "ijkl"));
riegeli::StringReader<> input(input_contents);
ABSL_ASSERT_OK(DigestBmff(input, assertion));
}
TEST(BmffHasherTest, HashSizeMismatch) {
auto assertion = ParseTextProtoOrDie<BmffBasedHashAssertion>(R"pb(
exclusions { xpath: "/ftyp" }
exclusions {
xpath: "/uuid"
data {
offset: 8
value: "\330\376\303\326\033\016H<\222\227X(\207~\304\201"
}
}
exclusions { xpath: "/mfra" }
exclusions { xpath: "/free" }
alg: "sha256"
hash: "invalid hash"
name: "BMFF file hash"
)pb");
std::string input_contents = absl::StrCat(
Box("uuid",
UuidBoxPayload(kC2paBmffBoxUuid, BoxVersion(0), BoxFlags(0), "")),
Box("trak", "ijkl"));
riegeli::StringReader<> input(input_contents);
EXPECT_THAT(
DigestBmff(input, assertion),
StatusIs(absl::StatusCode::kInternal, HasSubstr("digest size mismatch")));
}
} // namespace
} // namespace credentio