| // 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_ |