@iden3/js-iden3-auth
Version:
iden3-auth implementation in JavaScript
51 lines (50 loc) • 2.13 kB
JavaScript
import { getDocumentLoader } from '@iden3/js-jsonld-merklization';
import { Operators, parseQueriesMetadata, checkQueryRequest, validateDisclosureV2Circuit, validateEmptyCredentialSubjectV2Circuit, verifyFieldValueInclusionV2, validateOperators, checkCircuitOperator } from '@0xpolygonid/js-sdk';
export const userStateError = new Error(`user state is not valid`);
export async function checkQueryV2Circuits(circuitId, query, outs, schemaLoader, opts, verifiablePresentation) {
if (!query.type) {
throw new Error(`proof query type is undefined`);
}
const loader = schemaLoader || getDocumentLoader();
// validate schema
let context;
try {
context = (await loader(query.context ?? '')).document;
}
catch (e) {
throw new Error(`can't load schema for request query`);
}
const queriesMetadata = await parseQueriesMetadata(query.type, JSON.stringify(context), query.credentialSubject, {
documentLoader: loader
});
await checkQueryRequest(query, queriesMetadata, context, outs, circuitId, loader, opts);
const queryMetadata = queriesMetadata[0]; // only one query is supported
checkCircuitOperator(circuitId, outs.operator);
// validate selective disclosure
if (queryMetadata.operator === Operators.SD) {
try {
await validateDisclosureV2Circuit(queryMetadata, outs, verifiablePresentation, loader);
}
catch (e) {
throw new Error(`failed to validate selective disclosure: ${e.message}`);
}
}
else if (!queryMetadata.fieldName && queryMetadata.operator == Operators.NOOP) {
try {
await validateEmptyCredentialSubjectV2Circuit(queryMetadata, outs);
}
catch (e) {
throw new Error(`failed to validate operators: ${e.message}`);
}
}
else {
try {
await validateOperators(queryMetadata, outs);
}
catch (e) {
throw new Error(`failed to validate operators: ${e.message}`);
}
}
// verify field inclusion
verifyFieldValueInclusionV2(outs, queryMetadata);
}