C2PA Ingredient Manifest의 명시적·재귀 검증을 확인하는 법
파일과 검토 질문을 먼저 고정합니다
C2PA 호환 validator로 열기 전에 실제 자산을 편집하지 않고 저장합니다. 파일명 또는 출처 URL, 가져온 시각, validator 이름과 버전, active-manifest label, 전체 validation output을 기록해 파일과 함께 보관합니다. 이 기록표는 재검토를 위한 본문의 실무 제안이며 C2PA가 요구하는 서식은 아닙니다.
질문은 해당 validator가 관련 ingredient assertion을 모두 처리하고, 참조된 ingredient manifest를 따라가며, 기록된 validation result를 반환했는지로 제한합니다. Ingredient manifest는 C2PA 계보 안의 provenance 관계를 설명합니다. Caption, 화자, 장소, 촬영 시각, 화면 속 사건의 진실을 확정하지 않습니다.
재귀 추적 전에 명시적 검증을 확인합니다
C2PA 2.2의 ingredient assertion에는 relationship field가 있어야 합니다. 값은 parentOf, inputTo, componentOf 중 하나입니다. Field가 없거나 다른 값이면 assertion.ingredient.malformed가 반환됩니다. 검토 사본에서 값을 고치거나 파일명으로 관계를 추정하지 말고 실제 값을 그대로 적습니다.
Standard manifest에서는 relationship 값과 무관하게 각 ingredient를 검증합니다. Update manifest에서는 해당 update manifest의 parentOf ingredient를 검증합니다. Ingredient 안의 time-stamp manifest는 time-stamp assertion을 선호하면서 폐기된 기능이므로 무시됩니다. 세 경우를 다른 행에 두어 서로 다른 처리 규칙을 섞지 않습니다.
Ingredient assertion마다 한 행을 만들고 manifest label, assertion URI, relationship, activeManifest, claimSignature, validationResults 존재 여부와 실제 success, informational, failure code를 기록합니다. 전체 결과 하나만 남기면 어느 field나 lineage 단계에서 문제가 생겼는지 알 수 없습니다.
참조된 manifest를 전체 계보에서 재귀 추적합니다
명세는 자산에 있는 모든 ingredient manifest를 재귀적으로 검증하도록 요구합니다. Depth-first search는 예시이며, 다른 구현도 같은 결과를 내야 합니다. Validator는 전체 계보의 ingredient-manifest hashed_uri 목록과 redacted assertion JUMBF URI 목록을 만듭니다.
각 manifest에서 claim을 찾고 redaction을 살핀 뒤 ingredient assertion의 hashed URI를 해석합니다. URI를 해석할 수 없거나 hash가 다르거나 JUMBF Content box가 0으로만 채워졌다면 다음 ingredient assertion으로 이동합니다. 도구가 표시하지 않은 code를 추정하지 말고 그 단계의 전체 출력을 보존합니다.
Assertion에 activeManifest가 있으면, version 1 또는 2에서는 c2pa_manifest가 있으면, active-manifest와 claim-signature 참조를 기록하고 해당 manifest로 들어갑니다. 이 field가 없으면 relationship이 inputTo인 경우를 제외하고 ingredient.unknownProvenance를 반환한 뒤 다음 assertion으로 진행합니다. 따라서 field 존재 여부와 relationship을 함께 기록해야 합니다.
새 결과와 기록된 validation results를 대조합니다
Matching redacted assertion이 있으면 claim-signature hash validation method를 사용합니다. Matching redaction이 없으면 manifest hash method 또는 claim-signature hash method를 사용할 수 있습니다. Validator가 사용한 방법을 그대로 기록합니다.
Claim-signature 방법은 참조된 signature box와 hash를 확인하고 claim signature, time-stamp, credential revocation, redaction되지 않은 assertion을 검증하지만 ingredient hard binding은 평가하지 않습니다. Manifest-hash 방법은 참조된 ingredient manifest를 해석하고 hash를 비교하며, 일치하면 ingredient.manifest.validated를 반환할 수 있습니다.
validationResults가 있으면 이전 기록에는 있지만 새 실행에 없는 entry와 새 실행에는 있지만 기록에 없는 entry를 모두 반환합니다. Version 3 ingredient assertion에 activeManifest가 있으면서 validationResults가 없으면 assertion.ingredient.malformed입니다. 이전 기록과 새 결과를 다른 칸에 적은 뒤 대조합니다. Compiled ingredient-manifest 목록에 없는 추가 manifest는 검증 대상에 넣지 않습니다.
Provenance와 media detection을 분리합니다
최종 기록에는 자산, validator와 버전, 각 relationship, 재귀 경로, 사용한 방법, 이전과 새 validation result, redaction, 미해결 참조, 실제 조치를 남깁니다. 다음 담당자가 어느 파일과 branch를 봤는지 추측하지 않고 같은 경로를 반복할 수 있어야 합니다.
저장한 자산을 DeepFakeCheck로 분석한다면 확률적 risk signal을 별도로 보관합니다. 자동 탐지는 진짜 media를 의심하는 오탐과 합성 또는 변경 media를 놓치는 미탐을 낼 수 있습니다. DeepFakeCheck는 C2PA validator를 대신하거나 위 ingredient validation code를 발행하지 않습니다.
성공 결과는 해당 실행에서 확인한 provenance record와 reference에 관한 제한된 기술 결론입니다. 실패는 조사할 기술 문제를 가리킵니다. 어느 쪽도 화면 속 사건의 진실이나 거짓을 증명하지 않으므로 원 게시물과 독립 자료로 사건 주장을 따로 확인합니다.
출처
- C2PA, “C2PA Technical Specification, Validate the Ingredients”: https://spec.c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_validate_the_ingredients