blob: 54cdf0a5df1e45ef109d092427e3313130420c6f [file]
// 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_ASSERTION_HASHED_URI_VALIDATOR_H_
#define THIRD_PARTY_CREDENTIO_ASSERTION_HASHED_URI_VALIDATOR_H_
#include <optional>
#include <string>
#include <utility>
#include "absl/strings/string_view.h"
#include "constants/status_codes.h"
#include "crypto/default/hasher.h"
#include "crypto/hash.h"
#include "jumbf/uri.h"
#include "proto/hashed_uri.pb.h"
#include "validator/tracker.h"
namespace credentio {
// A validator that validates `hashed_uri` according to
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_validation_of_references
class HashedUriValidator {
public:
struct Codes {
FailureStatusCode missing = FailureStatusCode::kHashedUriMissing;
FailureStatusCode mismatch = FailureStatusCode::kHashedUriMismatch;
};
HashedUriValidator(std::string manifest_path,
const jumbf::UriResolver& uri_resolver,
const HashCheckerFactory* hash_checker_factory = nullptr)
: manifest_path_(std::move(manifest_path)),
uri_resolver_(uri_resolver),
hash_checker_factory_(hash_checker_factory == nullptr
? DefaultHashCheckerFactory()
: *hash_checker_factory) {}
void SetErrorCodes(Codes codes) { codes_ = codes; }
void SetDefaultAlgorithm(std::string alg) { alg_ = std::move(alg); }
// Returns the validated path if validation is successful (i.e., hash is
// matched); otherwise, std::nullopt.
std::optional<std::string> Validate(
const HashedUri& hashed_uri, absl::string_view assertion_url,
ValidationTracker& validation_tracker) const;
private:
std::string manifest_path_;
const jumbf::UriResolver& uri_resolver_;
const HashCheckerFactory& hash_checker_factory_;
Codes codes_;
std::string alg_;
};
} // namespace credentio
#endif // THIRD_PARTY_CREDENTIO_ASSERTION_HASHED_URI_VALIDATOR_H_