@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
152 lines (148 loc) • 6.26 kB
JavaScript
import { CredoError } from "../../../../error/CredoError.mjs";
import "../../../../error/index.mjs";
import { JsonEncoder } from "../../../../utils/JsonEncoder.mjs";
import { JsonTransformer } from "../../../../utils/JsonTransformer.mjs";
import "../../../../utils/index.mjs";
import { PublicJwk } from "../../../kms/jwk/PublicJwk.mjs";
import "../../../kms/index.mjs";
import { parseDid } from "../../domain/parse.mjs";
import { getPublicJwkFromVerificationMethod, getVerificationMethodsForPublicJwk } from "../../domain/key-type/keyDidMapping.mjs";
import { DidDocumentService } from "../../domain/service/DidDocumentService.mjs";
import { DidDocumentBuilder } from "../../domain/DidDocumentBuilder.mjs";
import "../../domain/index.mjs";
//#region src/modules/dids/methods/peer/peerDidNumAlgo2.ts
var DidPeerPurpose = /* @__PURE__ */ function(DidPeerPurpose) {
DidPeerPurpose["Assertion"] = "A";
DidPeerPurpose["Encryption"] = "E";
DidPeerPurpose["Verification"] = "V";
DidPeerPurpose["CapabilityInvocation"] = "I";
DidPeerPurpose["CapabilityDelegation"] = "D";
DidPeerPurpose["Service"] = "S";
return DidPeerPurpose;
}(DidPeerPurpose || {});
function isDidPeerKeyPurpose(purpose) {
return purpose !== DidPeerPurpose.Service && Object.values(DidPeerPurpose).includes(purpose);
}
const didPeerAbbreviations = {
type: "t",
DIDCommMessaging: "dm",
serviceEndpoint: "s",
routingKeys: "r",
accept: "a"
};
const didPeerExpansions = {
t: "type",
dm: "DIDCommMessaging",
s: "serviceEndpoint",
r: "routingKeys",
a: "accept"
};
function didToNumAlgo2DidDocument(did) {
const entries = parseDid(did).id.substring(2).split(".");
const didDocument = new DidDocumentBuilder(did);
let serviceIndex = 0;
let keyIndex = 1;
for (const entry of entries) {
const entryContent = entry.substring(1);
const purpose = entry[0];
if (purpose === DidPeerPurpose.Service) {
let services = JsonEncoder.fromBase64Url(entryContent);
services = Array.isArray(services) ? services : [services];
for (let service of services) {
service = expandServiceAbbreviations(service);
service.id = `${did}#${service.type.toLowerCase()}-${serviceIndex++}`;
didDocument.addService(JsonTransformer.fromJSON(service, DidDocumentService));
}
} else {
const verificationMethods = getVerificationMethodsForPublicJwk(PublicJwk.fromFingerprint(entryContent), did);
for (const verificationMethod of verificationMethods) {
verificationMethod.id = `${did}#key-${keyIndex++}`;
addVerificationMethodToDidDocument(didDocument, verificationMethod, purpose);
}
}
}
return didDocument.build();
}
function didDocumentToNumAlgo2Did(didDocument) {
const purposeMapping = {
[DidPeerPurpose.Assertion]: didDocument.assertionMethod,
[DidPeerPurpose.Encryption]: didDocument.keyAgreement,
[DidPeerPurpose.Verification]: didDocument.authentication,
[DidPeerPurpose.CapabilityInvocation]: didDocument.capabilityInvocation,
[DidPeerPurpose.CapabilityDelegation]: didDocument.capabilityDelegation
};
let did = "did:peer:2";
const keys = [];
for (const [purpose, entries] of Object.entries(purposeMapping)) {
if (entries === void 0) continue;
const dereferenced = entries.map((entry) => typeof entry === "string" ? didDocument.dereferenceVerificationMethod(entry) : entry);
for (const entry of dereferenced) {
const encoded = `.${purpose}${getPublicJwkFromVerificationMethod(entry).fingerprint}`;
keys.push({
id: entry.id,
encoded
});
}
}
const prefix = "key-";
if (!keys.every((key) => key.id.split("#")[1]?.startsWith(prefix))) throw new CredoError("Ids for keys within DID Document for did:peer:2 creation must follow the pattern `#key-n`");
did += keys.sort((a, b) => {
const aFragment = a.id.split("#")[1];
const bFragment = b.id.split("#")[1];
return Number(aFragment.replace(prefix, "")) - Number(bFragment.replace(prefix, ""));
}).map((key) => key.encoded).join("");
if (didDocument.service && didDocument.service.length > 0) {
const abbreviatedServices = didDocument.service.map((service) => {
const serviceJson = JsonTransformer.toJSON(service);
serviceJson.id = void 0;
return abbreviateServiceJson(serviceJson);
});
for (const abbreviatedService of abbreviatedServices) {
const encodedService = JsonEncoder.toBase64Url(abbreviatedService);
did += `.${DidPeerPurpose.Service}${encodedService}`;
}
}
return did;
}
function expandServiceAbbreviations(service) {
const expand = (abbreviated) => didPeerExpansions[abbreviated] ?? abbreviated;
const expandJson = (json) => {
if (!json) return json;
if (typeof json === "number") return json;
if (typeof json === "string") return expand(json);
if (Array.isArray(json)) return json.map(expandJson);
if (typeof json === "object") return Object.entries(json).reduce((jsonBody, [key, value]) => ({
...jsonBody,
[expand(key)]: expandJson(value)
}), {});
};
const fullService = expandJson(service);
if ("t" in service && service.t === "dm" && typeof service.serviceEndpoint === "string") return {
...fullService,
type: "DIDComm"
};
return fullService;
}
function abbreviateServiceJson(service) {
const abbreviate = (expanded) => didPeerAbbreviations[expanded] ?? expanded;
return Object.entries(service).reduce((serviceBody, [key, value]) => ({
...serviceBody,
[abbreviate(key)]: abbreviate(value)
}), {});
}
function addVerificationMethodToDidDocument(didDocument, verificationMethod, purpose) {
const purposeMapping = {
[DidPeerPurpose.Assertion]: didDocument.addAssertionMethod.bind(didDocument),
[DidPeerPurpose.Encryption]: didDocument.addKeyAgreement.bind(didDocument),
[DidPeerPurpose.Verification]: didDocument.addAuthentication.bind(didDocument),
[DidPeerPurpose.CapabilityInvocation]: didDocument.addCapabilityInvocation.bind(didDocument),
[DidPeerPurpose.CapabilityDelegation]: didDocument.addCapabilityDelegation.bind(didDocument)
};
if (isDidPeerKeyPurpose(purpose)) {
const addVerificationMethod = purposeMapping[purpose];
addVerificationMethod(verificationMethod);
} else throw new CredoError(`Unsupported peer did purpose '${purpose}'`);
}
//#endregion
export { didDocumentToNumAlgo2Did, didToNumAlgo2DidDocument };
//# sourceMappingURL=peerDidNumAlgo2.mjs.map