@credo-ts/core
Version:
<p align="center"> <br /> <img alt="Credo Logo" src="https://github.com/openwallet-foundation/credo-ts/blob/c7886cb8377ceb8ee4efe8d264211e561a75072d/images/credo-logo.png" height="250px" /> </p> <h1 align="center"><b>Credo - Core</b></h1
43 lines (42 loc) • 2.41 kB
JavaScript
import { createIssue } from "../W3cDataIntegrityError.mjs";
//#region src/modules/w3c-di/proof-processing/proofSetValidation.ts
/**
* Implements VC Data Integrity v1.0 §4.5 steps 3.2-3.3 chain-structure validation.
*/
function validateProofChainStructure(proofs) {
const proofIdToIndexList = /* @__PURE__ */ new Map();
const proofIdToUniqueIndex = /* @__PURE__ */ new Map();
const issues = [];
for (const [index, proof] of proofs.entries()) {
const proofId = "id" in proof && typeof proof.id === "string" ? proof.id : void 0;
if (!proofId) continue;
const existing = proofIdToIndexList.get(proofId);
if (existing) existing.push(index);
else {
proofIdToIndexList.set(proofId, [index]);
proofIdToUniqueIndex.set(proofId, index);
}
}
for (const [proofId, indices] of proofIdToIndexList.entries()) if (indices.length > 1) {
proofIdToUniqueIndex.delete(proofId);
issues.push(createIssue("https://w3id.org/security#PROOF_VERIFICATION_ERROR", "Duplicate proof id in proof set", `Duplicate proof id '${proofId}' at indices ${indices.join(", ")}`));
}
for (const [index, proof] of proofs.entries()) {
const previousProofReferences = proof.previousProof ? Array.isArray(proof.previousProof) ? proof.previousProof : [proof.previousProof] : [];
for (const previousProofReference of previousProofReferences) {
const referencedProofIndex = proofIdToUniqueIndex.get(previousProofReference);
if (referencedProofIndex === void 0) {
const duplicateReferenceIndices = proofIdToIndexList.get(previousProofReference);
const resolutionDetail = duplicateReferenceIndices ? `Reference '${previousProofReference}' is ambiguous due to duplicate proof ids at indices ${duplicateReferenceIndices.join(", ")}` : `Reference '${previousProofReference}' is not present in this proof set`;
issues.push(createIssue("https://w3id.org/security#PROOF_VERIFICATION_ERROR", "Proof previousProof reference could not be resolved", resolutionDetail));
continue;
}
if (referencedProofIndex >= index) issues.push(createIssue("https://w3id.org/security#PROOF_VERIFICATION_ERROR", "Proof previousProof reference must target an earlier proof", `Reference targets proof index ${referencedProofIndex}, current proof index ${index}`));
}
}
if (issues.length > 0) return issues;
return [];
}
//#endregion
export { validateProofChainStructure };
//# sourceMappingURL=proofSetValidation.mjs.map