| // 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. | |
| // | |
| // Types to represent deserialized JUMBF boxes, as defined by ISO/IEC 19566-5. | |
| #ifndef THIRD_PARTY_CREDENTIO_JUMBF_BOX_H_ | |
| #define THIRD_PARTY_CREDENTIO_JUMBF_BOX_H_ | |
| #include <cstdint> | |
| #include <optional> | |
| #include <variant> | |
| #include <vector> | |
| #include "absl/strings/string_view.h" | |
| #include "uuid/uuid.h" | |
| namespace jumbf { | |
| struct ContentBox; | |
| struct UnknownBox { | |
| uint32_t type; | |
| absl::string_view payload; | |
| bool operator==(const UnknownBox&) const = default; | |
| }; | |
| // See section A.3 | |
| struct DescriptionBox { | |
| // The type UUID, referred to simply as "type" in section A.3, not to be | |
| // confused with the 32 bit box type described in section 4.3 (all description | |
| // boxes must have box type "jumd"). | |
| credentio::Uuid type_uuid; | |
| bool requestable = false; | |
| std::optional<absl::string_view> label; | |
| std::optional<uint32_t> id; | |
| // The SHA-256 hash of the associated content boxes. In identical byte order | |
| // to the serialized form as defined in the standard (FIPS PUB 180-4). This | |
| // value is taken directly from the serialized data and has not been validated | |
| // in any way. | |
| std::optional<absl::string_view> unvalidated_hash; | |
| std::vector<ContentBox> private_content; | |
| bool operator==(const DescriptionBox&) const = default; | |
| }; | |
| // See section A.2, also see note on naming conventions in README.md | |
| struct SuperBox { | |
| DescriptionBox description; | |
| std::vector<ContentBox> contents; | |
| absl::string_view raw_bytes; | |
| bool operator==(const SuperBox&) const = default; | |
| }; | |
| // See section B.7 | |
| struct CborBox { | |
| absl::string_view payload; | |
| bool operator==(const CborBox&) const = default; | |
| }; | |
| // See section B.6.2 | |
| struct EmbeddedFileDescriptionBox { | |
| absl::string_view media_type; | |
| bool external = false; | |
| std::optional<absl::string_view> file_name; | |
| bool operator==(const EmbeddedFileDescriptionBox&) const = default; | |
| }; | |
| // See section B.6.3 | |
| struct BinaryDataBox { | |
| absl::string_view payload; | |
| bool operator==(const BinaryDataBox&) const = default; | |
| }; | |
| // A super box that was not parsed because the recursion limit was reached. | |
| struct SerializedSuperbox { | |
| // The entire serialized super box. | |
| absl::string_view serialized; | |
| bool operator==(const SerializedSuperbox&) const = default; | |
| }; | |
| // See C2PA 2.0 section 8.3.1.3 | |
| struct C2paSaltBox { | |
| absl::string_view salt; | |
| bool operator==(const C2paSaltBox&) const = default; | |
| }; | |
| struct JsonBox { | |
| absl::string_view payload; | |
| bool operator==(const JsonBox&) const = default; | |
| }; | |
| struct UuidBox { | |
| absl::string_view payload; | |
| bool operator==(const UuidBox&) const = default; | |
| }; | |
| struct ContentBox { | |
| absl::string_view raw_bytes; | |
| std::variant<UnknownBox, CborBox, SerializedSuperbox, SuperBox, | |
| EmbeddedFileDescriptionBox, BinaryDataBox, C2paSaltBox, JsonBox, | |
| UuidBox> | |
| payload; | |
| bool operator==(const ContentBox&) const = default; | |
| template <typename ExpectedBox> | |
| bool Holds() const { | |
| return std::holds_alternative<ExpectedBox>(payload); | |
| } | |
| // Retrieves the payload of type `DesiredBox`. Crashes if this content box | |
| // does not contain that type. Use `Holds<ExpectedBox>()` above to check the | |
| // contained type first to guarantee safety. | |
| template <typename DesiredBox> | |
| const DesiredBox& Get() const { | |
| return std::get<DesiredBox>(payload); | |
| } | |
| }; | |
| } // namespace jumbf | |
| #endif // THIRD_PARTY_CREDENTIO_JUMBF_BOX_H_ |