@sphereon/pex
Version:
A Typescript implementation of the v1 and v2 DIF Presentation Exchange specification
44 lines • 5.41 kB
JavaScript
import { getSDAlgAndPayload, unpackObj } from '@sd-jwt/decode';
import { createHashMappingForSerializedDisclosure, selectDisclosures } from '@sd-jwt/present';
import * as u8a from 'uint8arrays';
import { ObjectUtils } from './ObjectUtils';
export function calculateSdHash(compactSdJwtVc, alg, hasher) {
const digest = hasher(compactSdJwtVc, alg);
return u8a.toString(digest, 'base64url');
}
/**
* Applies the presentation frame to the decoded sd-jwt vc and will update the
* `decodedPayload`, `compactSdJwt` and `disclosures` properties.
*
* Both the input and output interfaces of this method are defined in `@sphereon/ssi-types`, so
* this method hides the actual implementation of SD-JWT (which is currently based on @sd-jwt/*)
*/
export function applySdJwtLimitDisclosure(sdJwtDecodedVerifiableCredential, presentationFrame) {
const serializedDisclosures = sdJwtDecodedVerifiableCredential.disclosures.map((d) => ({
digest: d.digest,
encoded: d.encoded,
salt: d.decoded[0],
value: d.decoded.length === 3 ? d.decoded[2] : d.decoded[1],
key: d.decoded.length === 3 ? d.decoded[1] : undefined,
}));
const requiredDisclosures = selectDisclosures(ObjectUtils.cloneDeep(sdJwtDecodedVerifiableCredential.signedPayload),
// Map to sd-jwt disclosure format
serializedDisclosures, presentationFrame);
sdJwtDecodedVerifiableCredential.disclosures = requiredDisclosures.map((d) => ({
encoded: d.encoded,
decoded: (d.key ? [d.salt, d.key, d.value] : [d.salt, d.value]),
digest: d.digest,
}));
const includedDisclosures = sdJwtDecodedVerifiableCredential.disclosures.map((d) => d.encoded);
const sdJwtParts = sdJwtDecodedVerifiableCredential.compactSdJwtVc.split('~');
sdJwtDecodedVerifiableCredential.compactSdJwtVc = sdJwtParts
// We want to keep first item (sd-jwt), last item (kb-jwt) and the digests
.filter((item, index) => index === 0 || index === sdJwtParts.length - 1 || includedDisclosures.includes(item))
.join('~');
const { payload } = getSDAlgAndPayload(ObjectUtils.cloneDeep(sdJwtDecodedVerifiableCredential.signedPayload));
const disclosureHashMap = createHashMappingForSerializedDisclosure(requiredDisclosures);
const { unpackedObj: decodedPayload } = unpackObj(payload, disclosureHashMap);
// Update the decoded / 'pretty' payload
sdJwtDecodedVerifiableCredential.decodedPayload = decodedPayload;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2RKd3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvdXRpbHMvc2RKd3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9ELE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBUzlGLE9BQU8sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUMsTUFBTSxVQUFVLGVBQWUsQ0FBQyxjQUFzQixFQUFFLEdBQVcsRUFBRSxNQUFjO0lBQ2pGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0MsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxnQ0FBa0UsRUFDbEUsaUJBQXlDO0lBRXpDLE1BQU0scUJBQXFCLEdBQUcsZ0NBQWdDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07UUFDaEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO1FBQ2xCLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNsQixLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMzRCxHQUFHLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBRUosTUFBTSxtQkFBbUIsR0FBRyxpQkFBaUIsQ0FDM0MsV0FBVyxDQUFDLFNBQVMsQ0FBQyxnQ0FBZ0MsQ0FBQyxhQUFhLENBQUM7SUFDckUsa0NBQWtDO0lBQ2xDLHFCQUFxQixFQUNyQixpQkFBK0QsQ0FDaEUsQ0FBQztJQUVGLGdDQUFnQyxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0UsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO1FBQ2xCLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBMkI7UUFDekYsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNO0tBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBRUosTUFBTSxtQkFBbUIsR0FBRyxnQ0FBZ0MsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0YsTUFBTSxVQUFVLEdBQUcsZ0NBQWdDLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU5RSxnQ0FBZ0MsQ0FBQyxjQUFjLEdBQUcsVUFBVTtRQUMxRCwwRUFBMEU7U0FDekUsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUViLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGdDQUFnQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDOUcsTUFBTSxpQkFBaUIsR0FBRyx3Q0FBd0MsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBRTlFLHdDQUF3QztJQUN4QyxnQ0FBZ0MsQ0FBQyxjQUFjLEdBQUcsY0FBeUQsQ0FBQztBQUM5RyxDQUFDIn0=