| // 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_CONSTANTS_STATUS_CODES_H_ |
| #define THIRD_PARTY_CREDENTIO_CONSTANTS_STATUS_CODES_H_ |
| |
| #include "absl/strings/str_cat.h" |
| |
| namespace credentio { |
| |
| // Constants corresponding to C2PA status codes. |
| // See |
| // https://spec.c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_standard_status_codes |
| // for more information. about the C2PA status codes. Integer ranges for |
| // success/informational/failure are disjoint to be safe. |
| |
| // Success status codes. |
| // See |
| // https://spec.c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_success_codes. |
| enum class SuccessStatusCode { |
| kClaimSignatureValidated = 201, // claimSignature.validated |
| kClaimSignatureInsideValidity, // claimSignature.insideValidity |
| |
| // Custom success codes, specific to this validator. |
| kGoogleAssertionDataHashMatch, // com.google.assertion.dataHash.match |
| kGoogleAssertionBmffHashMatch, // com.google.assertion.bmffHash.match |
| kGoogleAssertionBoxesHashMatch, // com.google.assertion.boxesHash.match |
| // com.google.assertion.multiAssetHash.match |
| kGoogleAssertionMultiAssetHashMatch, |
| // com.google.assertion.collectionHash.match |
| kGoogleAssertionCollectionHashMatch, |
| kAssertionDataHashMatch, // assertion.dataHash.match |
| kIngredientClaimSignatureValidated, // ingredient.claimSignature.validated |
| kIngredientManifestValidated, // ingredient.manifest.validated |
| kAssertionHashedUriMatch, // assertion.hashedURI.match |
| kAssertionBmffHashMatch, // assertion.bmffHash.match |
| kAssertionBoxesHashMatch, // assertion.boxesHash.match |
| kAssertionCollectionHashMatch, // assertion.collectionHash.match |
| kAssertionMultiAssetHashMatch, // assertion.multiAssetHash.match |
| kSigningCredentialTrusted, // signingCredential.trusted |
| kTimestampTrusted, // timeStamp.trusted |
| kTimestampValidated, // timeStamp.validated |
| kSigningCredentialOcspNotRevoked, // signingCredential.ocsp.notRevoked |
| }; |
| |
| // Informational status codes. |
| // See |
| // https://spec.c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_informational_codes. |
| enum class InformationalStatusCode { |
| // Custom informational codes, specific to this validator |
| // go/keep-sorted start |
| // Indicates that the OCSP response's `producedAt` timestamp is outside of the |
| // certificate's validity period or the timestamp's time is outside of the |
| // validity window of the stapled OCSP response. |
| kSigningCredentialOcspOutsideValidity = 601, |
| // com.google.signingCredential.ocsp.outsideValidity |
| // Indicates that the timestamp's time is outside of the range that can be |
| // handled by this validator. The timestamp may be considered valid by |
| // other implementations. |
| kTimestampOutOfRange, // com.google.timeStamp.outOfRange |
| kTimestampV1FormatInV2Header, // com.google.timeStamp.V1FormatInV2Header |
| kTimestampV2MessageImprintInV1Format, |
| // com.google.timeStamp.V2MessageImprintInV1Format |
| // go/keep-sorted end |
| |
| // Standard informational codes |
| // go/keep-sorted start |
| kIngredientUnknownProvenance, // ingredient.unknownProvenance |
| kSigningCredentialOcspSkipped, // signingCredential.ocsp.skipped |
| kTimestampMalformed, // timeStamp.malformed |
| kTimestampMismatch, // timeStamp.mismatch |
| kTimestampOutsideValidity, // timeStamp.outsideValidity |
| kTimestampUntrusted, // timeStamp.untrusted |
| // go/keep-sorted end |
| |
| // Assertion informational codes |
| // go/keep-sorted start |
| // assertion.bmffHash.additionalExclusionsPresent |
| kAssertionBmffHashAdditionalExclusionsPresent, |
| // assertion.boxesHash.additionalExclusionsPresent |
| kAssertionBoxesHashAdditionalExclusionsPresent, |
| // assertion.dataHash.additionalExclusionsPresent |
| kAssertionDataHashAdditionalExclusionsPresent, |
| // go/keep-sorted end |
| }; |
| |
| // Failure status codes. |
| // See |
| // https://spec.c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_failure_codes. |
| enum class FailureStatusCode { |
| kGeneralError = 401, // (custom, name TBD) |
| |
| // Custom failure codes, specific to this validator. |
| kGoogleInternalError, // com.google.internal.error |
| kGoogleUnsupportedSpecVersion, // com.google.unsupportedSpecVersion |
| kGoogleUnsupportedManifestType, // com.google.unsupportedManifestType |
| // com.google.assertion.action.unknownAction |
| kGoogleAssertionActionUnknownAction, |
| kGoogleAssertionDataHashMismatch, // com.google.assertion.dataHash.mismatch |
| kGoogleAssertionDataHashMalformed, // com.google.assertion.dataHash.malformed |
| kGoogleAssertionBmffHashMalformed, // com.google.assertion.bmffHash.malformed |
| kGoogleAssertionBmffHashMismatch, // com.google.assertion.bmffHash.mismatch |
| // com.google.assertion.boxesHash.unknownBox |
| kGoogleAssertionBoxesHashUnknownBox, |
| kGoogleAssertionBoxesHashMismatch, // com.google.assertion.boxesHash.mismatch |
| // com.google.assertion.boxesHash.malformed |
| kGoogleAssertionBoxesHashMalformed, |
| // com.google.assertion.multiAssetHash.mismatch |
| kGoogleAssertionMultiAssetHashMismatch, |
| // com.google.assertion.multiAssetHash.malformed |
| kGoogleAssertionMultiAssetHashMalformed, |
| // com.google.assertion.multiAssetHash.missingPart |
| kGoogleAssertionMultiAssetHashMissingPart, |
| kGoogleHashedUriUnsupported, // com.google.hashedUri.unsupported |
| |
| // Failure codes used for C2PA Claim validation. |
| kAlgorithmUnsupported, // algorithm.unsupported |
| kClaimHardBindingsMissing, // claim.hardBindings.missing |
| kClaimMalformed, // claim.malformed |
| kClaimMissing, // claim.missing |
| kClaimMultiple, // claim.multiple |
| kClaimCborInvalid, // claim.cbor.invalid |
| kClaimSignatureMissing, // claimSignature.missing |
| kClaimSignatureMismatch, // claimSignature.mismatch |
| kClaimSignatureOutsideValidity, // claimSignature.outsideValidity |
| kHashedUriMissing, // hashedUri.missing |
| kSigningCredentialInvalid, // signingCredential.invalid |
| kSigningCredentialOcspRevoked, // signingCredential.ocsp.revoked |
| kSigningCredentialUntrusted, // signingCredential.untrusted |
| |
| // Failure codes used for C2PA Assertion validation. |
| kAssertionCborInvalid, // assertion.cbor.invalid |
| kAssertionJsonInvalid, // assertion.json.invalid |
| kAssertionMultipleHardBindings, // assertion.multipleHardBindings |
| kAssertionDataHashMismatch, // assertion.dataHash.mismatch |
| kAssertionDataHashMalformed, // assertion.dataHash.malformed |
| kAssertionUndeclared, // assertion.undeclared |
| kAssertionOutsideManifest, // assertion.outsideManifest |
| kAssertionMissing, // assertion.missing |
| kAssertionHashedUriMismatch, // assertion.hashedURI.mismatch |
| kAssertionNotRedacted, // assertion.notRedacted |
| kAssertionSelfRedacted, // assertion.selfRedacted |
| kAssertionBmffHashMalformed, // assertion.bmffHash.malformed |
| kAssertionBmffHashMismatch, // assertion.bmffHash.mismatch |
| kAssertionBoxesHashUnknownBox, // assertion.boxesHash.unknownBox |
| kAssertionBoxesHashMismatch, // assertion.boxesHash.mismatch |
| kAssertionBoxesHashMalformed, // assertion.boxesHash.malformed |
| kAssertionMultiAssetHashMismatch, // assertion.multiAssetHash.mismatch |
| kAssertionMultiAssetHashMalformed, // assertion.multiAssetHash.malformed |
| kAssertionMultiAssetHashMissingPart, // assertion.multiAssetHash.missingPart |
| // assertion.collectionHash.incorrectFileCount |
| kAssertionCollectionHashIncorrectFileCount, |
| // assertion.collectionHash.invalidURI |
| kAssertionCollectionHashInvalidUri, |
| kAssertionCollectionHashMismatch, // assertion.collectionHash.mismatch |
| kAssertionCollectionHashMalformed, // assertion.collectionHash.malformed |
| kAssertionActionRedacted, // assertion.action.redacted |
| kAssertionActionMalformed, // assertion.action.malformed |
| kAssertionActionSoftBindingMissing, // assertion.action.softBindingMissing |
| kAssertionActionIngredientMismatch, // assertion.action.ingredientMismatch |
| kAssertionActionRedactionMismatch, // assertion.action.redactionMismatch |
| kAssertionIngredientMalformed, // assertion.ingredient.malformed |
| kHashedUriMismatch, // hashedUri.mismatch |
| |
| // Failure codes related to C2PA ingredient manifests |
| kIngredientClaimSignatureMissing, // ingredient.claimSignature.missing |
| kIngredientClaimSignatureMismatch, // ingredient.claimSignature.mismatch |
| kIngredientManifestMissing, // ingredient.manifest.missing |
| kIngredientManifestMismatch, // ingredient.manifest.mismatch |
| |
| kManifestMultipleParents, // manifest.multipleParents |
| kManifestUpdateInvalid, // manifest.update.invalid |
| kManifestUpdateWrongParents, // manifest.update.wrongParents |
| }; |
| |
| template <typename Sink> |
| void AbslStringify(Sink& sink, SuccessStatusCode status) { |
| switch (status) { |
| case SuccessStatusCode::kClaimSignatureValidated: |
| sink.Append("claimSignature.validated"); |
| return; |
| case SuccessStatusCode::kClaimSignatureInsideValidity: |
| sink.Append("claimSignature.insideValidity"); |
| return; |
| case SuccessStatusCode::kAssertionDataHashMatch: |
| sink.Append("assertion.dataHash.match"); |
| return; |
| case SuccessStatusCode::kIngredientManifestValidated: |
| sink.Append("ingredient.manifest.validated"); |
| return; |
| case SuccessStatusCode::kIngredientClaimSignatureValidated: |
| sink.Append("ingredient.claimSignature.validated"); |
| return; |
| case SuccessStatusCode::kAssertionHashedUriMatch: |
| sink.Append("assertion.hashedURI.match"); |
| return; |
| case SuccessStatusCode::kAssertionBmffHashMatch: |
| sink.Append("assertion.bmffHash.match"); |
| return; |
| case SuccessStatusCode::kAssertionBoxesHashMatch: |
| sink.Append("assertion.boxesHash.match"); |
| return; |
| case SuccessStatusCode::kAssertionCollectionHashMatch: |
| sink.Append("assertion.collectionHash.match"); |
| return; |
| case SuccessStatusCode::kSigningCredentialTrusted: |
| sink.Append("signingCredential.trusted"); |
| return; |
| case SuccessStatusCode::kTimestampTrusted: |
| sink.Append("timeStamp.trusted"); |
| return; |
| case SuccessStatusCode::kTimestampValidated: |
| sink.Append("timeStamp.validated"); |
| return; |
| case SuccessStatusCode::kSigningCredentialOcspNotRevoked: |
| sink.Append("signingCredential.ocsp.notRevoked"); |
| return; |
| case SuccessStatusCode::kGoogleAssertionDataHashMatch: |
| sink.Append("com.google.assertion.dataHash.match"); |
| return; |
| case SuccessStatusCode::kGoogleAssertionCollectionHashMatch: |
| sink.Append("com.google.assertion.collectionHash.match"); |
| return; |
| case SuccessStatusCode::kGoogleAssertionBmffHashMatch: |
| sink.Append("com.google.assertion.bmffHash.match"); |
| return; |
| case SuccessStatusCode::kGoogleAssertionBoxesHashMatch: |
| sink.Append("com.google.assertion.boxesHash.match"); |
| return; |
| case SuccessStatusCode::kGoogleAssertionMultiAssetHashMatch: |
| sink.Append("com.google.assertion.multiAssetHash.match"); |
| return; |
| case SuccessStatusCode::kAssertionMultiAssetHashMatch: |
| sink.Append("assertion.multiAssetHash.match"); |
| return; |
| } |
| sink.Append( |
| absl::StrCat("UNKNOWN_SUCCESS_STATUS_", static_cast<int>(status))); |
| } |
| |
| template <typename Sink> |
| void AbslStringify(Sink& sink, InformationalStatusCode status) { |
| switch (status) { |
| case credentio::InformationalStatusCode:: |
| kSigningCredentialOcspOutsideValidity: |
| sink.Append("com.google.signingCredential.ocsp.outsideValidity"); |
| return; |
| case credentio::InformationalStatusCode::kTimestampOutOfRange: |
| sink.Append("com.google.timeStamp.outOfRange"); |
| return; |
| case InformationalStatusCode::kTimestampV1FormatInV2Header: |
| sink.Append("com.google.timeStamp.V1FormatInV2Header"); |
| return; |
| case InformationalStatusCode::kTimestampV2MessageImprintInV1Format: |
| sink.Append("com.google.timeStamp.V2MessageImprintInV1Format"); |
| return; |
| case InformationalStatusCode::kIngredientUnknownProvenance: |
| sink.Append("ingredient.unknownProvenance"); |
| return; |
| case InformationalStatusCode::kTimestampMalformed: |
| sink.Append("timeStamp.malformed"); |
| return; |
| case InformationalStatusCode::kTimestampUntrusted: |
| sink.Append("timeStamp.untrusted"); |
| return; |
| case credentio::InformationalStatusCode::kTimestampOutsideValidity: |
| sink.Append("timeStamp.outsideValidity"); |
| return; |
| case InformationalStatusCode::kSigningCredentialOcspSkipped: |
| sink.Append("signingCredential.ocsp.skipped"); |
| return; |
| case InformationalStatusCode::kTimestampMismatch: |
| sink.Append("timeStamp.mismatch"); |
| return; |
| case InformationalStatusCode::kAssertionDataHashAdditionalExclusionsPresent: |
| sink.Append("assertion.dataHash.additionalExclusionsPresent"); |
| return; |
| case InformationalStatusCode:: |
| kAssertionBoxesHashAdditionalExclusionsPresent: |
| sink.Append("assertion.boxesHash.additionalExclusionsPresent"); |
| return; |
| case InformationalStatusCode::kAssertionBmffHashAdditionalExclusionsPresent: |
| sink.Append("assertion.bmffHash.additionalExclusionsPresent"); |
| return; |
| } |
| sink.Append( |
| absl::StrCat("UNKNOWN_INFORMATIONAL_STATUS_", static_cast<int>(status))); |
| } |
| |
| template <typename Sink> |
| void AbslStringify(Sink& sink, FailureStatusCode status) { |
| switch (status) { |
| case FailureStatusCode::kGeneralError: |
| sink.Append("general.error"); |
| return; |
| case FailureStatusCode::kGoogleInternalError: |
| sink.Append("com.google.internal.error"); |
| return; |
| case FailureStatusCode::kGoogleUnsupportedSpecVersion: |
| sink.Append("com.google.unsupportedSpecVersion"); |
| return; |
| case FailureStatusCode::kGoogleUnsupportedManifestType: |
| sink.Append("com.google.unsupportedManifestType"); |
| return; |
| case FailureStatusCode::kClaimMissing: |
| sink.Append("claim.missing"); |
| return; |
| case FailureStatusCode::kClaimMultiple: |
| sink.Append("claim.multiple"); |
| return; |
| case FailureStatusCode::kClaimCborInvalid: |
| sink.Append("claim.cbor.invalid"); |
| return; |
| case FailureStatusCode::kClaimSignatureMissing: |
| sink.Append("claimSignature.missing"); |
| return; |
| case FailureStatusCode::kClaimSignatureMismatch: |
| sink.Append("claimSignature.mismatch"); |
| return; |
| case FailureStatusCode::kClaimSignatureOutsideValidity: |
| sink.Append("claimSignature.outsideValidity"); |
| return; |
| case FailureStatusCode::kHashedUriMissing: |
| sink.Append("hashedUri.missing"); |
| return; |
| case FailureStatusCode::kSigningCredentialInvalid: |
| sink.Append("signingCredential.invalid"); |
| return; |
| case FailureStatusCode::kSigningCredentialUntrusted: |
| sink.Append("signingCredential.untrusted"); |
| return; |
| case FailureStatusCode::kAssertionCborInvalid: |
| sink.Append("assertion.cbor.invalid"); |
| return; |
| case FailureStatusCode::kAssertionJsonInvalid: |
| sink.Append("assertion.json.invalid"); |
| return; |
| case FailureStatusCode::kClaimHardBindingsMissing: |
| sink.Append("claim.hardBindings.missing"); |
| return; |
| case FailureStatusCode::kClaimMalformed: |
| sink.Append("claim.malformed"); |
| return; |
| case FailureStatusCode::kAssertionMultipleHardBindings: |
| sink.Append("assertion.multipleHardBindings"); |
| return; |
| case FailureStatusCode::kAssertionDataHashMismatch: |
| sink.Append("assertion.dataHash.mismatch"); |
| return; |
| case FailureStatusCode::kAlgorithmUnsupported: |
| sink.Append("algorithm.unsupported"); |
| return; |
| case FailureStatusCode::kAssertionDataHashMalformed: |
| sink.Append("assertion.dataHash.malformed"); |
| return; |
| case FailureStatusCode::kAssertionUndeclared: |
| sink.Append("assertion.undeclared"); |
| return; |
| case FailureStatusCode::kAssertionOutsideManifest: |
| sink.Append("assertion.outsideManifest"); |
| return; |
| case FailureStatusCode::kAssertionMissing: |
| sink.Append("assertion.missing"); |
| return; |
| case FailureStatusCode::kIngredientClaimSignatureMissing: |
| sink.Append("ingredient.claimSignature.missing"); |
| return; |
| case FailureStatusCode::kIngredientClaimSignatureMismatch: |
| sink.Append("ingredient.claimSignature.mismatch"); |
| return; |
| case FailureStatusCode::kIngredientManifestMissing: |
| sink.Append("ingredient.manifest.missing"); |
| return; |
| case FailureStatusCode::kIngredientManifestMismatch: |
| sink.Append("ingredient.manifest.mismatch"); |
| return; |
| case FailureStatusCode::kAssertionHashedUriMismatch: |
| sink.Append("assertion.hashedURI.mismatch"); |
| return; |
| case FailureStatusCode::kAssertionNotRedacted: |
| sink.Append("assertion.notRedacted"); |
| return; |
| case FailureStatusCode::kAssertionSelfRedacted: |
| sink.Append("assertion.selfRedacted"); |
| return; |
| case FailureStatusCode::kAssertionBmffHashMalformed: |
| sink.Append("assertion.bmffHash.malformed"); |
| return; |
| case FailureStatusCode::kAssertionBmffHashMismatch: |
| sink.Append("assertion.bmffHash.mismatch"); |
| return; |
| case FailureStatusCode::kAssertionBoxesHashUnknownBox: |
| sink.Append("assertion.boxesHash.unknownBox"); |
| return; |
| case FailureStatusCode::kAssertionBoxesHashMismatch: |
| sink.Append("assertion.boxesHash.mismatch"); |
| return; |
| case FailureStatusCode::kGoogleAssertionActionUnknownAction: |
| sink.Append("com.google.assertion.action.unknownAction"); |
| return; |
| case FailureStatusCode::kAssertionActionRedacted: |
| sink.Append("assertion.action.redacted"); |
| return; |
| case FailureStatusCode::kAssertionActionMalformed: |
| sink.Append("assertion.action.malformed"); |
| return; |
| case FailureStatusCode::kAssertionActionSoftBindingMissing: |
| sink.Append("assertion.action.softBindingMissing"); |
| return; |
| case FailureStatusCode::kAssertionActionIngredientMismatch: |
| sink.Append("assertion.action.ingredientMismatch"); |
| return; |
| case FailureStatusCode::kAssertionActionRedactionMismatch: |
| sink.Append("assertion.action.redactionMismatch"); |
| return; |
| case FailureStatusCode::kAssertionIngredientMalformed: |
| sink.Append("assertion.ingredient.malformed"); |
| return; |
| case FailureStatusCode::kHashedUriMismatch: |
| sink.Append("hashedUri.mismatch"); |
| return; |
| case FailureStatusCode::kManifestMultipleParents: |
| sink.Append("manifest.multipleParents"); |
| return; |
| case FailureStatusCode::kManifestUpdateInvalid: |
| sink.Append("manifest.update.invalid"); |
| return; |
| case FailureStatusCode::kManifestUpdateWrongParents: |
| sink.Append("manifest.update.wrongParents"); |
| return; |
| case FailureStatusCode::kSigningCredentialOcspRevoked: |
| sink.Append("signingCredential.ocsp.revoked"); |
| return; |
| case FailureStatusCode::kGoogleAssertionDataHashMismatch: |
| sink.Append("com.google.assertion.dataHash.mismatch"); |
| return; |
| case FailureStatusCode::kGoogleAssertionDataHashMalformed: |
| sink.Append("com.google.assertion.dataHash.malformed"); |
| return; |
| case FailureStatusCode::kGoogleAssertionBmffHashMalformed: |
| sink.Append("com.google.assertion.bmffHash.malformed"); |
| return; |
| case FailureStatusCode::kGoogleAssertionBmffHashMismatch: |
| sink.Append("com.google.assertion.bmffHash.mismatch"); |
| return; |
| case FailureStatusCode::kGoogleAssertionBoxesHashUnknownBox: |
| sink.Append("com.google.assertion.boxesHash.unknownBox"); |
| return; |
| case FailureStatusCode::kGoogleAssertionBoxesHashMismatch: |
| sink.Append("com.google.assertion.boxesHash.mismatch"); |
| return; |
| case FailureStatusCode::kGoogleHashedUriUnsupported: |
| sink.Append("com.google.hashedUri.unsupported"); |
| return; |
| case FailureStatusCode::kAssertionBoxesHashMalformed: |
| sink.Append("assertion.boxesHash.malformed"); |
| return; |
| case FailureStatusCode::kGoogleAssertionBoxesHashMalformed: |
| sink.Append("com.google.assertion.boxesHash.malformed"); |
| return; |
| case FailureStatusCode::kGoogleAssertionMultiAssetHashMismatch: |
| sink.Append("com.google.assertion.multiAssetHash.mismatch"); |
| return; |
| case FailureStatusCode::kGoogleAssertionMultiAssetHashMalformed: |
| sink.Append("com.google.assertion.multiAssetHash.malformed"); |
| return; |
| case FailureStatusCode::kGoogleAssertionMultiAssetHashMissingPart: |
| sink.Append("com.google.assertion.multiAssetHash.missingPart"); |
| return; |
| case FailureStatusCode::kAssertionMultiAssetHashMismatch: |
| sink.Append("assertion.multiAssetHash.mismatch"); |
| return; |
| case FailureStatusCode::kAssertionMultiAssetHashMalformed: |
| sink.Append("assertion.multiAssetHash.malformed"); |
| return; |
| case FailureStatusCode::kAssertionMultiAssetHashMissingPart: |
| sink.Append("assertion.multiAssetHash.missingPart"); |
| return; |
| case FailureStatusCode::kAssertionCollectionHashIncorrectFileCount: |
| sink.Append("assertion.collectionHash.incorrectFileCount"); |
| return; |
| case FailureStatusCode::kAssertionCollectionHashInvalidUri: |
| sink.Append("assertion.collectionHash.invalidURI"); |
| return; |
| case FailureStatusCode::kAssertionCollectionHashMismatch: |
| sink.Append("assertion.collectionHash.mismatch"); |
| return; |
| case FailureStatusCode::kAssertionCollectionHashMalformed: |
| sink.Append("assertion.collectionHash.malformed"); |
| return; |
| } |
| sink.Append( |
| absl::StrCat("UNKNOWN_FAILURE_STATUS_", static_cast<int>(status))); |
| } |
| |
| } // namespace credentio |
| |
| #endif // THIRD_PARTY_CREDENTIO_CONSTANTS_STATUS_CODES_H_ |