blob: b37bb9b0312b16a119dcd0139408e98ab9f61324 [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_CRYPTO_ALGORITHMS_H_
#define THIRD_PARTY_CREDENTIO_CRYPTO_ALGORITHMS_H_
#include <cstdint>
#include "absl/log/log.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
namespace credentio {
// Hashing algorithms allowed by the C2PA spec, see
// https://c2pa.org/specifications/specifications/2.1/specs/C2PA_Specification.html#_hashing
// All values must correspond to an OpenSSL NID.
enum class HashAlgorithm {
kSha256 = 672, // NID_sha256
kSha384 = 673, // NID_sha384
kSha512 = 674, // NID_sha512
};
inline uint64_t HashSizeBytes(HashAlgorithm algorithm) {
switch (algorithm) {
case credentio::HashAlgorithm::kSha256:
return 32;
case credentio::HashAlgorithm::kSha512:
return 64;
case credentio::HashAlgorithm::kSha384:
return 48;
}
LOG(DFATAL) << "unknown HashAlgorithm enum: " << static_cast<int>(algorithm);
return 0;
}
absl::StatusOr<HashAlgorithm> NidToHashAlgorithm(int nid);
absl::StatusOr<HashAlgorithm> ParseHashAlgorithm(absl::string_view txt);
template <typename Sink>
void AbslStringify(Sink& sink, HashAlgorithm algorithm) {
switch (algorithm) {
case HashAlgorithm::kSha256:
sink.Append("sha256");
return;
case HashAlgorithm::kSha384:
sink.Append("sha384");
return;
case HashAlgorithm::kSha512:
sink.Append("sha512");
return;
}
LOG(DFATAL) << "unknown HashAlgorithm enum: " << static_cast<int>(algorithm);
sink.Append(
absl::StrCat("UNKNOWN_HASH_ALGORITHM_", static_cast<int>(algorithm)));
}
// IANA registry: https://www.iana.org/assignments/cose/cose.xhtml#algorithms
// C2PA accepted list:
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_signature_algorithms
enum class SigningAlgorithm {
kEs256, // ECDSA with SHA-256
kEs384, // ECDSA with SHA-384
kEs512, // ECDSA with SHA-512
kPs256, // RSASSA-PSS using SHA-256 and MGF1 with SHA-256
kPs384, // RSASSA-PSS using SHA-384 and MGF1 with SHA-384
kPs512, // RSASSA-PSS using SHA-512 and MGF1 with SHA-512
kEdDsa, // Edwards-Curve DSA
};
template <typename Sink>
inline void AbslStringify(Sink& sink, const SigningAlgorithm& algorithm) {
switch (algorithm) {
case SigningAlgorithm::kEs256:
sink.Append("ES256");
return;
case SigningAlgorithm::kEs384:
sink.Append("ES384");
return;
case SigningAlgorithm::kEs512:
sink.Append("ES512");
return;
case SigningAlgorithm::kPs256:
sink.Append("PS256");
return;
case SigningAlgorithm::kPs384:
sink.Append("PS384");
return;
case SigningAlgorithm::kPs512:
sink.Append("PS512");
return;
case SigningAlgorithm::kEdDsa:
sink.Append("EdDSA");
return;
}
LOG(DFATAL) << "unknown SigningAlgorithm enum: "
<< static_cast<int>(algorithm);
sink.Append(
absl::StrCat("UNKNOWN_SIGNING_ALGORITHM_", static_cast<int>(algorithm)));
}
} // namespace credentio
#endif // THIRD_PARTY_CREDENTIO_CRYPTO_ALGORITHMS_H_