@twin.org/identity-connector-entity-storage 0.0.3-next.25 → 0.0.3-next.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/entityStorageIdentityConnector.js +8 -0
- package/dist/es/entityStorageIdentityConnector.js.map +1 -1
- package/dist/types/entityStorageIdentityConnector.d.ts +16 -0
- package/docs/changelog.md +28 -0
- package/docs/reference/classes/EntityStorageIdentityConnector.md +24 -0
- package/package.json +2 -2
|
@@ -435,6 +435,8 @@ export class EntityStorageIdentityConnector {
|
|
|
435
435
|
* @param options Additional options for creating the verifiable credential.
|
|
436
436
|
* @param options.revocationIndex The bitmap revocation index of the credential, if undefined will not have revocation status.
|
|
437
437
|
* @param options.expirationDate The date the verifiable credential is valid until.
|
|
438
|
+
* @param options.jwtHeaderFields Additional fields to add to the JWT header.
|
|
439
|
+
* @param options.jwtPayloadFields Additional fields to add to the JWT payload.
|
|
438
440
|
* @returns The created verifiable credential and its token.
|
|
439
441
|
* @throws NotFoundError if the id can not be resolved.
|
|
440
442
|
*/
|
|
@@ -510,6 +512,7 @@ export class EntityStorageIdentityConnector {
|
|
|
510
512
|
: undefined
|
|
511
513
|
};
|
|
512
514
|
const jwtHeader = {
|
|
515
|
+
...options?.jwtHeaderFields,
|
|
513
516
|
kid: verificationDidMethod.id,
|
|
514
517
|
typ: "JWT",
|
|
515
518
|
alg: JwsAlgorithms.EdDSA
|
|
@@ -539,6 +542,7 @@ export class EntityStorageIdentityConnector {
|
|
|
539
542
|
ObjectHelper.propertyDelete(jwtVc.credentialSubject, "id");
|
|
540
543
|
}
|
|
541
544
|
const jwtPayload = {
|
|
545
|
+
...options?.jwtPayloadFields,
|
|
542
546
|
iss: idParts.id,
|
|
543
547
|
nbf: Math.floor(Date.now() / 1000),
|
|
544
548
|
jti: verifiableCredential.id,
|
|
@@ -743,6 +747,8 @@ export class EntityStorageIdentityConnector {
|
|
|
743
747
|
* @param verifiableCredentials The credentials to use for creating the presentation in jwt format.
|
|
744
748
|
* @param options Additional options for creating the verifiable presentation.
|
|
745
749
|
* @param options.expirationDate The date the verifiable presentation is valid until.
|
|
750
|
+
* @param options.jwtHeaderFields Additional fields to add to the JWT header.
|
|
751
|
+
* @param options.jwtPayloadFields Additional fields to add to the JWT payload.
|
|
746
752
|
* @returns The created verifiable presentation and its token.
|
|
747
753
|
* @throws NotFoundError if the id can not be resolved.
|
|
748
754
|
*/
|
|
@@ -805,6 +811,7 @@ export class EntityStorageIdentityConnector {
|
|
|
805
811
|
holder: idParts.id
|
|
806
812
|
};
|
|
807
813
|
const jwtHeader = {
|
|
814
|
+
...options?.jwtHeaderFields,
|
|
808
815
|
kid: didMethod.id,
|
|
809
816
|
typ: "JWT",
|
|
810
817
|
alg: JwsAlgorithms.EdDSA
|
|
@@ -818,6 +825,7 @@ export class EntityStorageIdentityConnector {
|
|
|
818
825
|
// as the jwt does not include the proof
|
|
819
826
|
verifiablePresentation.proof = await this.createProof(controller, verificationMethodId, ProofTypes.DataIntegrityProof, JsonLdHelper.toNodeObject(verifiablePresentation));
|
|
820
827
|
const jwtPayload = {
|
|
828
|
+
...options?.jwtPayloadFields,
|
|
821
829
|
iss: verifiablePresentation.holder,
|
|
822
830
|
nbf: Math.floor(Date.now() / 1000),
|
|
823
831
|
vp: jwtVp
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entityStorageIdentityConnector.js","sourceRoot":"","sources":["../../src/entityStorageIdentityConnector.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tArrayHelper,\n\tBaseError,\n\tBitString,\n\tCoerce,\n\tCompression,\n\tCompressionType,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tJsonHelper,\n\tNotFoundError,\n\tObjectHelper,\n\tRandomHelper,\n\tUrl,\n\tUrn\n} from \"@twin.org/core\";\nimport {\n\tJsonLdHelper,\n\tJsonLdProcessor,\n\ttype IJsonLdContextDefinitionRoot,\n\ttype IJsonLdNodeObject\n} from \"@twin.org/data-json-ld\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport { DocumentHelper, type IIdentityConnector } from \"@twin.org/identity-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tDidContexts,\n\tDidTypes,\n\tDidVerificationMethodType,\n\ttype IDidVerifiableCredential,\n\tJwsAlgorithms,\n\tProofHelper,\n\tProofTypes,\n\ttype IDidDocument,\n\ttype IDidDocumentVerificationMethod,\n\ttype IDidService,\n\ttype IDidVerifiableCredentialV1,\n\ttype IDidVerifiablePresentationV1,\n\ttype IProof,\n\ttype IDidVerifiablePresentation\n} from \"@twin.org/standards-w3c-did\";\nimport {\n\tVaultConnectorFactory,\n\tVaultConnectorHelper,\n\tVaultKeyType,\n\ttype IVaultConnector\n} from \"@twin.org/vault-models\";\nimport { Jwk, Jwt, type IJwk, type IJwtHeader, type IJwtPayload } from \"@twin.org/web\";\nimport type { IdentityDocument } from \"./entities/identityDocument.js\";\nimport type { IEntityStorageIdentityConnectorConstructorOptions } from \"./models/IEntityStorageIdentityConnectorConstructorOptions.js\";\n\n/**\n * Class for performing identity operations using entity storage.\n */\nexport class EntityStorageIdentityConnector implements IIdentityConnector {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<EntityStorageIdentityConnector>();\n\n\t/**\n\t * The namespace supported by the identity connector.\n\t */\n\tpublic static readonly NAMESPACE: string = \"entity-storage\";\n\n\t/**\n\t * The size of the revocation bitmap in bits (16Kb).\n\t * @internal\n\t */\n\tprivate static readonly _REVOCATION_BITS_SIZE: number = 131072;\n\n\t/**\n\t * The entity storage for identities.\n\t * @internal\n\t */\n\tprotected readonly _didDocumentEntityStorage: IEntityStorageConnector<IdentityDocument>;\n\n\t/**\n\t * The vault for the keys.\n\t * @internal\n\t */\n\tprotected readonly _vaultConnector: IVaultConnector;\n\n\t/**\n\t * Create a new instance of EntityStorageIdentityConnector.\n\t * @param options The options for the identity connector.\n\t */\n\tconstructor(options?: IEntityStorageIdentityConnectorConstructorOptions) {\n\t\tthis._didDocumentEntityStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.didDocumentEntityStorageType ?? \"identity-document\"\n\t\t);\n\t\tthis._vaultConnector = VaultConnectorFactory.get(options?.vaultConnectorType ?? \"vault\");\n\t}\n\n\t/**\n\t * Build the key name to access the specified key in the vault.\n\t * @param identity The identity of the user to access the vault keys.\n\t * @returns The vault key.\n\t * @internal\n\t */\n\tpublic static buildVaultKey(identity: string, key: string): string {\n\t\treturn `${identity}/${key}`;\n\t}\n\n\t/**\n\t * Verify the document in storage.\n\t * @param didDocument The did document that was stored.\n\t * @internal\n\t */\n\tpublic static async verifyDocument(\n\t\tdidDocument: IdentityDocument,\n\t\tvaultConnector: IVaultConnector\n\t): Promise<void> {\n\t\tconst stringifiedDocument = JsonHelper.canonicalize(didDocument.document);\n\t\tconst docBytes = Converter.utf8ToBytes(stringifiedDocument);\n\n\t\tconst verified = await vaultConnector.verify(\n\t\t\tEntityStorageIdentityConnector.buildVaultKey(didDocument.id, \"did\"),\n\t\t\tdocBytes,\n\t\t\tConverter.base64ToBytes(didDocument.signature)\n\t\t);\n\n\t\tif (!verified) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"signatureVerificationFailed\"\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn EntityStorageIdentityConnector.CLASS_NAME;\n\t}\n\n\t/**\n\t * Create a new document.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The created document.\n\t */\n\tpublic async createDocument(controller: string): Promise<IDidDocument> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\n\t\ttry {\n\t\t\tconst did = `did:${EntityStorageIdentityConnector.NAMESPACE}:${Converter.bytesToHex(RandomHelper.generate(32), true)}`;\n\n\t\t\tawait this._vaultConnector.createKey(\n\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(did, \"did\"),\n\t\t\t\tVaultKeyType.Ed25519\n\t\t\t);\n\n\t\t\tconst bitString = new BitString(EntityStorageIdentityConnector._REVOCATION_BITS_SIZE);\n\t\t\tconst compressed = await Compression.compress(bitString.getBits(), CompressionType.Gzip);\n\n\t\t\tconst didDocument: IDidDocument = {\n\t\t\t\t\"@context\": DidContexts.Context,\n\t\t\t\tid: did,\n\t\t\t\tservice: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${did}#revocation`,\n\t\t\t\t\t\ttype: \"BitstringStatusList\",\n\t\t\t\t\t\tserviceEndpoint: `data:application/octet-stream;base64,${Converter.bytesToBase64Url(compressed)}`\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t};\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\n\t\t\treturn didDocument;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"createDocumentFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a document.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param documentId The id of the document to remove.\n\t * @returns Nothing.\n\t */\n\tpublic async removeDocument(controller: string, documentId: string): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(documentId), documentId);\n\n\t\ttry {\n\t\t\tconst didDocument = await this._didDocumentEntityStorage.get(documentId);\n\t\t\tif (Is.empty(didDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tdocumentId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait this._didDocumentEntityStorage.remove(documentId);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"removeDocumentFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add a verification method to the document in JSON Web key Format.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param documentId The id of the document to add the verification method to.\n\t * @param verificationMethodType The type of the verification method to add.\n\t * @param verificationMethodId The id of the verification method, if undefined uses the kid of the generated JWK.\n\t * @returns The verification method.\n\t * @throws NotFoundError if the id can not be resolved.\n\t * @throws NotSupportedError if the platform does not support multiple keys.\n\t */\n\tpublic async addVerificationMethod(\n\t\tcontroller: string,\n\t\tdocumentId: string,\n\t\tverificationMethodType: DidVerificationMethodType,\n\t\tverificationMethodId?: string\n\t): Promise<IDidDocumentVerificationMethod> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.arrayOneOf<DidVerificationMethodType>(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(verificationMethodType),\n\t\t\tverificationMethodType,\n\t\t\tObject.values(DidVerificationMethodType)\n\t\t);\n\n\t\tlet tempKeyId;\n\t\ttry {\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(documentId);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tdocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tlet methodKeyPublic;\n\t\t\tif (Is.stringValue(verificationMethodId)) {\n\t\t\t\t// If there is a verification method id, we will try to get the key from the vault.\n\t\t\t\ttry {\n\t\t\t\t\t// If there is an existing key, we will use it.\n\t\t\t\t\tconst existingKey = await this._vaultConnector.getKey(\n\t\t\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(didDocument.id, verificationMethodId)\n\t\t\t\t\t);\n\t\t\t\t\tmethodKeyPublic = existingKey.publicKey;\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\tif (Is.empty(methodKeyPublic)) {\n\t\t\t\t// If there is no existing key, we will create a new one with a temporary name.\n\t\t\t\ttempKeyId = `temp-vm-${Converter.bytesToBase64Url(RandomHelper.generate(16))}`;\n\t\t\t\tmethodKeyPublic = await this._vaultConnector.createKey(\n\t\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(didDocument.id, tempKeyId),\n\t\t\t\t\tVaultKeyType.Ed25519\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst jwkParams: IJwk = {\n\t\t\t\talg: \"EdDSA\",\n\t\t\t\tkty: \"OKP\",\n\t\t\t\tcrv: \"Ed25519\",\n\t\t\t\tx: Converter.bytesToBase64Url(methodKeyPublic)\n\t\t\t};\n\n\t\t\tconst kid = await Jwk.generateKid(jwkParams);\n\n\t\t\tconst methodId = `${documentId}#${verificationMethodId ?? kid}`;\n\n\t\t\tif (Is.stringValue(tempKeyId)) {\n\t\t\t\t// If we created a temporary key, we will rename it to the final method id.\n\t\t\t\tawait this._vaultConnector.renameKey(\n\t\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(didDocument.id, tempKeyId),\n\t\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(didDocument.id, verificationMethodId ?? kid)\n\t\t\t\t);\n\t\t\t\ttempKeyId = undefined;\n\t\t\t}\n\n\t\t\tconst methods = this.getAllMethods(didDocument);\n\t\t\tconst existingMethodIndex = methods.findIndex(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === methodId;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === methodId;\n\t\t\t});\n\n\t\t\tif (existingMethodIndex !== -1) {\n\t\t\t\tconst methodArray =\n\t\t\t\t\tdidDocument[methods[existingMethodIndex].arrayKey as keyof IDidDocument];\n\n\t\t\t\tif (Is.array(methodArray)) {\n\t\t\t\t\tmethodArray.splice(existingMethodIndex, 1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst didVerificationMethod: IDidDocumentVerificationMethod = {\n\t\t\t\tid: methodId,\n\t\t\t\tcontroller: documentId,\n\t\t\t\ttype: \"JsonWebKey\",\n\t\t\t\tpublicKeyJwk: {\n\t\t\t\t\t...jwkParams,\n\t\t\t\t\tkid\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdidDocument[verificationMethodType] ??= [];\n\t\t\tdidDocument[verificationMethodType]?.push(didVerificationMethod);\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\n\t\t\treturn didVerificationMethod;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"addVerificationMethodFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t} finally {\n\t\t\tif (Is.stringValue(tempKeyId)) {\n\t\t\t\t// If we created a temporary key and it is still in use, we will remove it from the vault.\n\t\t\t\ttry {\n\t\t\t\t\tawait this._vaultConnector.removeKey(tempKeyId);\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Remove a verification method from the document.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param verificationMethodId The id of the verification method.\n\t * @returns Nothing.\n\t * @throws NotFoundError if the id can not be resolved.\n\t * @throws NotSupportedError if the platform does not support multiple revocable keys.\n\t */\n\tpublic async removeVerificationMethod(\n\t\tcontroller: string,\n\t\tverificationMethodId: string\n\t): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(verificationMethodId),\n\t\t\tverificationMethodId\n\t\t);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\t\t\tif (Is.empty(idParts.fragment)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"missingDid\",\n\t\t\t\t\tverificationMethodId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(idParts.id);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tidParts.id\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tconst methods = this.getAllMethods(didDocument);\n\t\t\tconst existingMethodIndex = methods.findIndex(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === verificationMethodId;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === verificationMethodId;\n\t\t\t});\n\n\t\t\tif (existingMethodIndex !== -1) {\n\t\t\t\tconst methodArray =\n\t\t\t\t\tdidDocument[methods[existingMethodIndex].arrayKey as keyof IDidDocument];\n\n\t\t\t\tif (Is.array(methodArray)) {\n\t\t\t\t\tmethodArray.splice(existingMethodIndex, 1);\n\t\t\t\t\tif (methodArray.length === 0) {\n\t\t\t\t\t\tdelete didDocument[methods[existingMethodIndex].arrayKey as keyof IDidDocument];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"verificationMethodNotFound\",\n\t\t\t\t\tverificationMethodId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"removeVerificationMethodFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add a service to the document.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param documentId The id of the document to add the service to.\n\t * @param serviceId The id of the service.\n\t * @param serviceType The type of the service.\n\t * @param serviceEndpoint The endpoint for the service.\n\t * @returns The service.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async addService(\n\t\tcontroller: string,\n\t\tdocumentId: string,\n\t\tserviceId: string,\n\t\tserviceType: string | string[],\n\t\tserviceEndpoint: string | string[]\n\t): Promise<IDidService> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(serviceId), serviceId);\n\t\tif (Is.array(serviceType)) {\n\t\t\tGuards.arrayValue<string>(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(serviceType),\n\t\t\t\tserviceType\n\t\t\t);\n\t\t} else {\n\t\t\tGuards.stringValue(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(serviceType),\n\t\t\t\tserviceType\n\t\t\t);\n\t\t}\n\t\tif (Is.array(serviceEndpoint)) {\n\t\t\tGuards.arrayValue<string>(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(serviceEndpoint),\n\t\t\t\tserviceEndpoint\n\t\t\t);\n\t\t} else {\n\t\t\tGuards.stringValue(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(serviceEndpoint),\n\t\t\t\tserviceEndpoint\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(documentId);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tdocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tconst fullServiceId = serviceId.includes(\"#\") ? serviceId : `${documentId}#${serviceId}`;\n\n\t\t\tif (Is.array(didDocument.service)) {\n\t\t\t\tconst existingServiceIndex = didDocument.service.findIndex(s => s.id === fullServiceId);\n\t\t\t\tif (existingServiceIndex !== -1) {\n\t\t\t\t\tdidDocument.service?.splice(existingServiceIndex, 1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst didService: IDidService = {\n\t\t\t\tid: fullServiceId,\n\t\t\t\ttype: serviceType,\n\t\t\t\tserviceEndpoint\n\t\t\t};\n\n\t\t\tdidDocument.service ??= [];\n\t\t\tdidDocument.service.push(didService);\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\n\t\t\treturn didService;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"addServiceFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a service from the document.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param serviceId The id of the service.\n\t * @returns Nothing.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async removeService(controller: string, serviceId: string): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(serviceId), serviceId);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(serviceId);\n\t\t\tif (Is.empty(idParts.fragment)) {\n\t\t\t\tthrow new NotFoundError(EntityStorageIdentityConnector.CLASS_NAME, \"missingDid\", serviceId);\n\t\t\t}\n\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(idParts.id);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tidParts.id\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tif (Is.array(didDocument.service)) {\n\t\t\t\tconst existingServiceIndex = didDocument.service.findIndex(s => s.id === serviceId);\n\t\t\t\tif (existingServiceIndex !== -1) {\n\t\t\t\t\tdidDocument.service?.splice(existingServiceIndex, 1);\n\t\t\t\t\tif (didDocument.service?.length === 0) {\n\t\t\t\t\t\tdelete didDocument.service;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"serviceNotFound\",\n\t\t\t\t\tserviceId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"removeServiceFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add an alias to the alsoKnownAs property on the document.\n\t * If the alias is already present the operation is a no-op.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param documentId The id of the document to update.\n\t * @param alias The alias to add. Must be a Url or Urn (typically another DID).\n\t * @returns Nothing.\n\t * @throws GeneralError if the alias is not a Url or Urn.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async addAlsoKnownAs(\n\t\tcontroller: string,\n\t\tdocumentId: string,\n\t\talias: string\n\t): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(alias), alias);\n\t\tif (!Url.tryParseExact(alias) && !Urn.tryParseExact(alias)) {\n\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"invalidAlias\", { alias });\n\t\t}\n\n\t\ttry {\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(documentId);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tdocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tconst existing = Is.array(didDocument.alsoKnownAs) ? didDocument.alsoKnownAs : [];\n\t\t\tif (existing.includes(alias)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdidDocument.alsoKnownAs = [...existing, alias];\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"addAlsoKnownAsFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove an alias from the alsoKnownAs property on the document.\n\t * If the alias is not present the operation is a no-op.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param documentId The id of the document to update.\n\t * @param alias The alias to remove. Must be a Url or Urn.\n\t * @returns Nothing.\n\t * @throws GeneralError if the alias is not a Url or Urn.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async removeAlsoKnownAs(\n\t\tcontroller: string,\n\t\tdocumentId: string,\n\t\talias: string\n\t): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(alias), alias);\n\t\tif (!Url.tryParseExact(alias) && !Urn.tryParseExact(alias)) {\n\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"invalidAlias\", { alias });\n\t\t}\n\n\t\ttry {\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(documentId);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tdocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tif (!Is.array(didDocument.alsoKnownAs) || !didDocument.alsoKnownAs.includes(alias)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst filtered = didDocument.alsoKnownAs.filter(a => a !== alias);\n\t\t\tif (filtered.length === 0) {\n\t\t\t\tdelete didDocument.alsoKnownAs;\n\t\t\t} else {\n\t\t\t\tdidDocument.alsoKnownAs = filtered;\n\t\t\t}\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"removeAlsoKnownAsFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a verifiable credential for a verification method.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param verificationMethodId The verification method id to use.\n\t * @param id The id of the credential.\n\t * @param subject The credential subject to store in the verifiable credential.\n\t * @param options Additional options for creating the verifiable credential.\n\t * @param options.revocationIndex The bitmap revocation index of the credential, if undefined will not have revocation status.\n\t * @param options.expirationDate The date the verifiable credential is valid until.\n\t * @returns The created verifiable credential and its token.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async createVerifiableCredential(\n\t\tcontroller: string,\n\t\tverificationMethodId: string,\n\t\tid: string | undefined,\n\t\tsubject: IJsonLdNodeObject,\n\t\toptions?: {\n\t\t\trevocationIndex?: number;\n\t\t\texpirationDate?: Date;\n\t\t}\n\t): Promise<{\n\t\tverifiableCredential: IDidVerifiableCredentialV1;\n\t\tjwt: string;\n\t}> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(verificationMethodId),\n\t\t\tverificationMethodId\n\t\t);\n\t\tGuards.object<IJsonLdNodeObject>(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(subject),\n\t\t\tsubject\n\t\t);\n\t\tif (!Is.undefined(options?.revocationIndex)) {\n\t\t\tGuards.number(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(options.revocationIndex),\n\t\t\t\toptions.revocationIndex\n\t\t\t);\n\t\t}\n\t\tif (!Is.undefined(options?.expirationDate)) {\n\t\t\tGuards.date(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(options.expirationDate),\n\t\t\t\toptions.expirationDate\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\t\t\tif (Is.empty(idParts.fragment)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"missingDid\",\n\t\t\t\t\tverificationMethodId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst issuerIdentityDocument = await this._didDocumentEntityStorage.get(idParts.id);\n\t\t\tif (Is.undefined(issuerIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tidParts.id\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tissuerIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst issuerDidDocument = issuerIdentityDocument.document;\n\n\t\t\tconst methods = this.getAllMethods(issuerDidDocument);\n\t\t\tconst methodAndArray = methods.find(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === verificationMethodId;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === verificationMethodId;\n\t\t\t});\n\n\t\t\tif (!methodAndArray) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"methodMissing\", {\n\t\t\t\t\tmethod: verificationMethodId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst verificationDidMethod = methodAndArray.method;\n\t\t\tif (!Is.stringValue(verificationDidMethod.publicKeyJwk?.x)) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"publicKeyJwkMissing\", {\n\t\t\t\t\tmethod: verificationMethodId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst revocationService = issuerDidDocument.service?.find(s => s.id.endsWith(\"#revocation\"));\n\n\t\t\tconst subjectClone = ObjectHelper.clone(subject);\n\n\t\t\tconst finalTypes: string[] = [DidTypes.VerifiableCredential];\n\t\t\tconst credContext = ObjectHelper.extractProperty<IJsonLdContextDefinitionRoot>(subjectClone, [\n\t\t\t\t\"@context\"\n\t\t\t]);\n\t\t\tconst credId = ObjectHelper.extractProperty<string>(subjectClone, [\"@id\", \"id\"], false);\n\t\t\tconst credType = ObjectHelper.extractProperty<string>(subjectClone, [\"@type\", \"type\"]);\n\t\t\tif (Is.stringValue(credType)) {\n\t\t\t\tfinalTypes.push(credType);\n\t\t\t}\n\n\t\t\tconst verifiableCredential: IDidVerifiableCredentialV1 = {\n\t\t\t\t\"@context\": (JsonLdProcessor.combineContexts(DidContexts.ContextVCv1, credContext) ??\n\t\t\t\t\tDidContexts.ContextVCv1) as [typeof DidContexts.ContextVCv1],\n\t\t\t\tid,\n\t\t\t\ttype: finalTypes,\n\t\t\t\tcredentialSubject: subjectClone,\n\t\t\t\tissuer: issuerDidDocument.id,\n\t\t\t\tissuanceDate: new Date(Date.now()).toISOString(),\n\t\t\t\texpirationDate: Is.date(options?.expirationDate)\n\t\t\t\t\t? options?.expirationDate.toISOString()\n\t\t\t\t\t: undefined,\n\t\t\t\tcredentialStatus:\n\t\t\t\t\trevocationService && !Is.undefined(options?.revocationIndex)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tid: revocationService.id,\n\t\t\t\t\t\t\t\ttype: Is.array(revocationService.type)\n\t\t\t\t\t\t\t\t\t? revocationService.type[0]\n\t\t\t\t\t\t\t\t\t: revocationService.type,\n\t\t\t\t\t\t\t\trevocationBitmapIndex: options.revocationIndex.toString()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined\n\t\t\t};\n\n\t\t\tconst jwtHeader: IJwtHeader = {\n\t\t\t\tkid: verificationDidMethod.id,\n\t\t\t\ttyp: \"JWT\",\n\t\t\t\talg: JwsAlgorithms.EdDSA\n\t\t\t};\n\n\t\t\tconst jwtVc = ObjectHelper.pick(ObjectHelper.clone(verifiableCredential), [\n\t\t\t\t\"@context\",\n\t\t\t\t\"type\",\n\t\t\t\t\"credentialSubject\",\n\t\t\t\t\"credentialStatus\"\n\t\t\t]);\n\n\t\t\t// Add the proof to the VC after extracting the jwt data\n\t\t\t// as the jwt does not include the proof\n\t\t\tverifiableCredential.proof = await this.createProof(\n\t\t\t\tcontroller,\n\t\t\t\tverificationMethodId,\n\t\t\t\tProofTypes.DataIntegrityProof,\n\t\t\t\tJsonLdHelper.toNodeObject(verifiableCredential)\n\t\t\t);\n\n\t\t\t// As we are adding the receipt to the data we update the JSON-LD context\n\t\t\tconst proofContext = verifiableCredential.proof[\"@context\"];\n\t\t\tif (!Is.empty(proofContext)) {\n\t\t\t\tverifiableCredential[\"@context\"] = (JsonLdProcessor.combineContexts(\n\t\t\t\t\tverifiableCredential[\"@context\"],\n\t\t\t\t\tproofContext\n\t\t\t\t) ?? verifiableCredential[\"@context\"]) as IDidVerifiableCredentialV1[\"@context\"];\n\t\t\t\tdelete verifiableCredential.proof[\"@context\"];\n\t\t\t}\n\n\t\t\tif (Is.array(jwtVc.credentialSubject)) {\n\t\t\t\tjwtVc.credentialSubject = jwtVc.credentialSubject.map(c => {\n\t\t\t\t\tObjectHelper.propertyDelete(c, \"id\");\n\t\t\t\t\treturn c;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tObjectHelper.propertyDelete(jwtVc.credentialSubject, \"id\");\n\t\t\t}\n\n\t\t\tconst jwtPayload: IJwtPayload = {\n\t\t\t\tiss: idParts.id,\n\t\t\t\tnbf: Math.floor(Date.now() / 1000),\n\t\t\t\tjti: verifiableCredential.id,\n\t\t\t\tsub: credId,\n\t\t\t\tvc: jwtVc\n\t\t\t};\n\n\t\t\tif (Is.date(options?.expirationDate)) {\n\t\t\t\tjwtPayload.exp = Math.floor(options.expirationDate.getTime() / 1000);\n\t\t\t}\n\n\t\t\tconst signature = await Jwt.encodeWithSigner(jwtHeader, jwtPayload, async (header, payload) =>\n\t\t\t\tVaultConnectorHelper.jwtSigner(\n\t\t\t\t\tthis._vaultConnector,\n\t\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(idParts.id, idParts.fragment ?? \"\"),\n\t\t\t\t\theader,\n\t\t\t\t\tpayload\n\t\t\t\t)\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tverifiableCredential,\n\t\t\t\tjwt: signature\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"createVerifiableCredentialFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Check a verifiable credential is valid.\n\t * @param credential The credential to verify.\n\t * @returns The credential stored in the jwt and the revocation status.\n\t */\n\tpublic async checkVerifiableCredential(credential: string | IDidVerifiableCredential): Promise<{\n\t\trevoked: boolean;\n\t\tverifiableCredential?: IDidVerifiableCredential;\n\t}> {\n\t\tif (Is.object(credential)) {\n\t\t\tGuards.objectValue<IDidVerifiableCredential>(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(credential),\n\t\t\t\tcredential\n\t\t\t);\n\t\t\tGuards.objectValue<IDidVerifiableCredential>(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(credential.proof),\n\t\t\t\tcredential.proof\n\t\t\t);\n\t\t\tconst { proof, ...doc } = credential;\n\t\t\tawait this.verifyProof(\n\t\t\t\tJsonLdHelper.toNodeObject(doc),\n\t\t\t\tArrayHelper.fromObjectOrArray(proof)[0]\n\t\t\t);\n\t\t\treturn {\n\t\t\t\trevoked: false,\n\t\t\t\tverifiableCredential: doc\n\t\t\t};\n\t\t}\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(credential), credential);\n\n\t\ttry {\n\t\t\tconst jwtDecoded = await Jwt.decode(credential);\n\n\t\t\tconst jwtHeader = jwtDecoded.header;\n\t\t\tconst jwtPayload = jwtDecoded.payload;\n\t\t\tconst jwtSignature = jwtDecoded.signature;\n\n\t\t\tif (\n\t\t\t\tIs.undefined(jwtHeader) ||\n\t\t\t\tIs.undefined(jwtPayload) ||\n\t\t\t\tIs.undefined(jwtPayload.iss) ||\n\t\t\t\tIs.undefined(jwtSignature)\n\t\t\t) {\n\t\t\t\tthrow new NotFoundError(EntityStorageIdentityConnector.CLASS_NAME, \"jwkSignatureFailed\");\n\t\t\t}\n\n\t\t\tconst issuerDocumentId = jwtPayload.iss;\n\t\t\tconst issuerIdentityDocument = await this._didDocumentEntityStorage.get(issuerDocumentId);\n\t\t\tif (Is.undefined(issuerIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tissuerDocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tissuerIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst issuerDidDocument = issuerIdentityDocument.document;\n\n\t\t\tconst methods = this.getAllMethods(issuerDidDocument);\n\t\t\tconst methodAndArray = methods.find(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === jwtHeader.kid;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === jwtHeader.kid;\n\t\t\t});\n\n\t\t\tif (!methodAndArray) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"methodMissing\", {\n\t\t\t\t\tmethod: jwtHeader.kid\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst didMethod = methodAndArray.method;\n\t\t\tif (!Is.stringValue(didMethod.publicKeyJwk?.x)) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"publicKeyJwkMissing\", {\n\t\t\t\t\tmethod: jwtHeader.kid\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tawait Jwt.verifySignature(credential, await Jwk.toCryptoKey(didMethod.publicKeyJwk));\n\n\t\t\tconst verifiableCredential = jwtPayload.vc as IDidVerifiableCredentialV1;\n\t\t\tif (Is.object(verifiableCredential)) {\n\t\t\t\tif (Is.string(jwtPayload.jti)) {\n\t\t\t\t\tverifiableCredential.id = jwtPayload.jti;\n\t\t\t\t}\n\t\t\t\tverifiableCredential.issuer = issuerDocumentId;\n\t\t\t\tif (Is.number(jwtPayload.nbf)) {\n\t\t\t\t\tverifiableCredential.issuanceDate = new Date(jwtPayload.nbf * 1000).toISOString();\n\t\t\t\t}\n\t\t\t\tif (Is.array(verifiableCredential.credentialSubject)) {\n\t\t\t\t\tverifiableCredential.credentialSubject = verifiableCredential.credentialSubject.map(c => {\n\t\t\t\t\t\tObjectHelper.propertySet(c, \"id\", jwtPayload.sub);\n\t\t\t\t\t\treturn c;\n\t\t\t\t\t});\n\t\t\t\t} else if (Is.object(verifiableCredential.credentialSubject)) {\n\t\t\t\t\tObjectHelper.propertySet(verifiableCredential.credentialSubject, \"id\", jwtPayload.sub);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst credentialStatus = verifiableCredential.credentialStatus;\n\t\t\tlet revoked = false;\n\t\t\tif (Is.object(credentialStatus)) {\n\t\t\t\trevoked = await this.checkRevocation(\n\t\t\t\t\tissuerDidDocument,\n\t\t\t\t\tcredentialStatus.revocationBitmapIndex\n\t\t\t\t);\n\t\t\t} else if (Is.arrayValue(credentialStatus)) {\n\t\t\t\tfor (let i = 0; i < credentialStatus.length; i++) {\n\t\t\t\t\trevoked = await this.checkRevocation(\n\t\t\t\t\t\tissuerDidDocument,\n\t\t\t\t\t\tcredentialStatus[i].revocationBitmapIndex\n\t\t\t\t\t);\n\t\t\t\t\tif (revoked) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\trevoked,\n\t\t\t\tverifiableCredential: revoked ? undefined : verifiableCredential\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"checkingVerifiableCredentialFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Revoke verifiable credential(s).\n\t * @param controller The controller of the identity who can make changes.\n\t * @param issuerDocumentId The id of the document to update the revocation list for.\n\t * @param credentialIndices The revocation bitmap index or indices to revoke.\n\t * @returns Nothing.\n\t */\n\tpublic async revokeVerifiableCredentials(\n\t\tcontroller: string,\n\t\tissuerDocumentId: string,\n\t\tcredentialIndices: number[]\n\t): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(issuerDocumentId),\n\t\t\tissuerDocumentId\n\t\t);\n\t\tGuards.arrayValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(credentialIndices),\n\t\t\tcredentialIndices\n\t\t);\n\n\t\ttry {\n\t\t\tconst issuerIdentityDocument = await this._didDocumentEntityStorage.get(issuerDocumentId);\n\t\t\tif (Is.undefined(issuerIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tissuerDocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tissuerIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst issuerDidDocument = issuerIdentityDocument.document;\n\n\t\t\tconst revocationService = issuerDidDocument.service?.find(s => s.id.endsWith(\"#revocation\"));\n\t\t\tif (\n\t\t\t\trevocationService &&\n\t\t\t\tIs.string(revocationService.serviceEndpoint) &&\n\t\t\t\trevocationService.type === \"BitstringStatusList\"\n\t\t\t) {\n\t\t\t\tconst revocationParts = revocationService.serviceEndpoint.split(\",\");\n\t\t\t\tif (revocationParts.length === 2) {\n\t\t\t\t\tconst compressedRevocationBytes = Converter.base64UrlToBytes(revocationParts[1]);\n\t\t\t\t\tconst decompressed = await Compression.decompress(\n\t\t\t\t\t\tcompressedRevocationBytes,\n\t\t\t\t\t\tCompressionType.Gzip\n\t\t\t\t\t);\n\n\t\t\t\t\tconst bitString = BitString.fromBits(\n\t\t\t\t\t\tdecompressed,\n\t\t\t\t\t\tEntityStorageIdentityConnector._REVOCATION_BITS_SIZE\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const credentialIndex of credentialIndices) {\n\t\t\t\t\t\tbitString.setBit(credentialIndex, true);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst compressed = await Compression.compress(bitString.getBits(), CompressionType.Gzip);\n\t\t\t\t\trevocationService.serviceEndpoint = `data:application/octet-stream;base64,${Converter.bytesToBase64Url(compressed)}`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait this.updateDocument(controller, issuerDidDocument);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"revokeVerifiableCredentialsFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Unrevoke verifiable credential(s).\n\t * @param controller The controller of the identity who can make changes.\n\t * @param issuerDocumentId The id of the document to update the revocation list for.\n\t * @param credentialIndices The revocation bitmap index or indices to un revoke.\n\t * @returns Nothing.\n\t */\n\tpublic async unrevokeVerifiableCredentials(\n\t\tcontroller: string,\n\t\tissuerDocumentId: string,\n\t\tcredentialIndices: number[]\n\t): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(issuerDocumentId),\n\t\t\tissuerDocumentId\n\t\t);\n\t\tGuards.arrayValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(credentialIndices),\n\t\t\tcredentialIndices\n\t\t);\n\n\t\ttry {\n\t\t\tconst issuerIdentityDocument = await this._didDocumentEntityStorage.get(issuerDocumentId);\n\t\t\tif (Is.undefined(issuerIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tissuerDocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tissuerIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst issuerDidDocument = issuerIdentityDocument.document;\n\n\t\t\tconst revocationService = issuerDidDocument.service?.find(s => s.id.endsWith(\"#revocation\"));\n\t\t\tif (\n\t\t\t\trevocationService &&\n\t\t\t\tIs.string(revocationService.serviceEndpoint) &&\n\t\t\t\trevocationService.type === \"BitstringStatusList\"\n\t\t\t) {\n\t\t\t\tconst revocationParts = revocationService.serviceEndpoint.split(\",\");\n\t\t\t\tif (revocationParts.length === 2) {\n\t\t\t\t\tconst compressedRevocationBytes = Converter.base64UrlToBytes(revocationParts[1]);\n\t\t\t\t\tconst decompressed = await Compression.decompress(\n\t\t\t\t\t\tcompressedRevocationBytes,\n\t\t\t\t\t\tCompressionType.Gzip\n\t\t\t\t\t);\n\n\t\t\t\t\tconst bitString = BitString.fromBits(\n\t\t\t\t\t\tdecompressed,\n\t\t\t\t\t\tEntityStorageIdentityConnector._REVOCATION_BITS_SIZE\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const credentialIndex of credentialIndices) {\n\t\t\t\t\t\tbitString.setBit(credentialIndex, false);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst compressed = await Compression.compress(bitString.getBits(), CompressionType.Gzip);\n\t\t\t\t\trevocationService.serviceEndpoint = `data:application/octet-stream;base64,${Converter.bytesToBase64Url(compressed)}`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait this.updateDocument(controller, issuerDidDocument);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"unrevokeVerifiableCredentialsFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a verifiable presentation from the supplied verifiable credentials.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param verificationMethodId The method to associate with the presentation.\n\t * @param presentationId The id of the presentation.\n\t * @param contexts The contexts for the data stored in the verifiable credential.\n\t * @param types The types for the data stored in the verifiable credential.\n\t * @param verifiableCredentials The credentials to use for creating the presentation in jwt format.\n\t * @param options Additional options for creating the verifiable presentation.\n\t * @param options.expirationDate The date the verifiable presentation is valid until.\n\t * @returns The created verifiable presentation and its token.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async createVerifiablePresentation(\n\t\tcontroller: string,\n\t\tverificationMethodId: string,\n\t\tpresentationId: string | undefined,\n\t\tcontexts: IJsonLdContextDefinitionRoot | undefined,\n\t\ttypes: string | string[] | undefined,\n\t\tverifiableCredentials: (string | IDidVerifiableCredentialV1)[],\n\t\toptions?: {\n\t\t\texpirationDate?: Date;\n\t\t}\n\t): Promise<{\n\t\tverifiablePresentation: IDidVerifiablePresentationV1;\n\t\tjwt: string;\n\t}> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(verificationMethodId),\n\t\t\tverificationMethodId\n\t\t);\n\t\tif (Is.array(types)) {\n\t\t\tGuards.arrayValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(types), types);\n\t\t} else if (Is.string(types)) {\n\t\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(types), types);\n\t\t}\n\t\tGuards.arrayValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(verifiableCredentials),\n\t\t\tverifiableCredentials\n\t\t);\n\t\tif (!Is.undefined(options?.expirationDate)) {\n\t\t\tGuards.date(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(options.expirationDate),\n\t\t\t\toptions.expirationDate\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\t\t\tif (Is.empty(idParts.fragment)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"missingDid\",\n\t\t\t\t\tverificationMethodId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst holderIdentityDocument = await this._didDocumentEntityStorage.get(idParts.id);\n\t\t\tif (Is.undefined(holderIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tidParts.id\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tholderIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst holderDidDocument = holderIdentityDocument.document;\n\n\t\t\tconst methods = this.getAllMethods(holderDidDocument);\n\t\t\tconst methodAndArray = methods.find(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === verificationMethodId;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === verificationMethodId;\n\t\t\t});\n\n\t\t\tif (!methodAndArray) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"methodMissing\", {\n\t\t\t\t\tmethod: verificationMethodId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst didMethod = methodAndArray.method;\n\t\t\tif (!Is.stringValue(didMethod.publicKeyJwk?.x)) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"publicKeyJwkMissing\", {\n\t\t\t\t\tmethod: verificationMethodId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst finalTypes: string[] = [DidTypes.VerifiablePresentation];\n\t\t\tif (Is.array(types)) {\n\t\t\t\tfinalTypes.push(...types);\n\t\t\t} else if (Is.stringValue(types)) {\n\t\t\t\tfinalTypes.push(types);\n\t\t\t}\n\n\t\t\tconst combinedContext =\n\t\t\t\tJsonLdProcessor.combineContexts(DidContexts.ContextVCv1, contexts) ??\n\t\t\t\tDidContexts.ContextVCv1;\n\n\t\t\tconst verifiablePresentation: IDidVerifiablePresentationV1 = {\n\t\t\t\t\"@context\": combinedContext as [typeof DidContexts.ContextVCv1],\n\t\t\t\tid: presentationId,\n\t\t\t\ttype: finalTypes,\n\t\t\t\tverifiableCredential: verifiableCredentials,\n\t\t\t\tholder: idParts.id\n\t\t\t};\n\n\t\t\tconst jwtHeader: IJwtHeader = {\n\t\t\t\tkid: didMethod.id,\n\t\t\t\ttyp: \"JWT\",\n\t\t\t\talg: JwsAlgorithms.EdDSA\n\t\t\t};\n\n\t\t\tconst jwtVp = ObjectHelper.pick(ObjectHelper.clone(verifiablePresentation), [\n\t\t\t\t\"@context\",\n\t\t\t\t\"type\",\n\t\t\t\t\"verifiableCredential\"\n\t\t\t]);\n\n\t\t\t// Add the proof to the VP after extracting the jwt data\n\t\t\t// as the jwt does not include the proof\n\t\t\tverifiablePresentation.proof = await this.createProof(\n\t\t\t\tcontroller,\n\t\t\t\tverificationMethodId,\n\t\t\t\tProofTypes.DataIntegrityProof,\n\t\t\t\tJsonLdHelper.toNodeObject(verifiablePresentation)\n\t\t\t);\n\n\t\t\tconst jwtPayload: IJwtPayload = {\n\t\t\t\tiss: verifiablePresentation.holder,\n\t\t\t\tnbf: Math.floor(Date.now() / 1000),\n\t\t\t\tvp: jwtVp\n\t\t\t};\n\n\t\t\tif (Is.date(options?.expirationDate)) {\n\t\t\t\tjwtPayload.exp = Math.floor(options.expirationDate.getTime() / 1000);\n\t\t\t}\n\n\t\t\tconst signature = await Jwt.encodeWithSigner(jwtHeader, jwtPayload, async (header, payload) =>\n\t\t\t\tVaultConnectorHelper.jwtSigner(\n\t\t\t\t\tthis._vaultConnector,\n\t\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(idParts.id, idParts.fragment ?? \"\"),\n\t\t\t\t\theader,\n\t\t\t\t\tpayload\n\t\t\t\t)\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tverifiablePresentation,\n\t\t\t\tjwt: signature\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"createVerifiablePresentationFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Check a verifiable presentation is valid.\n\t * @param presentation The presentation to verify.\n\t * @returns The presentation stored in the jwt and the revocation status.\n\t */\n\tpublic async checkVerifiablePresentation(\n\t\tpresentation: string | IDidVerifiablePresentation\n\t): Promise<{\n\t\trevoked: boolean;\n\t\tverifiablePresentation?: IDidVerifiablePresentationV1;\n\t\tissuers?: IDidDocument[];\n\t}> {\n\t\tif (Is.object(presentation)) {\n\t\t\tconst { proof, ...doc } = presentation as IDidVerifiablePresentationV1;\n\t\t\tconst proofEntry = ArrayHelper.fromObjectOrArray(proof)[0];\n\t\t\tGuards.objectValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(proofEntry), proofEntry);\n\t\t\tawait this.verifyProof(JsonLdHelper.toNodeObject(doc), proofEntry);\n\t\t\treturn { revoked: false, verifiablePresentation: doc };\n\t\t}\n\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(presentation),\n\t\t\tpresentation\n\t\t);\n\n\t\tconst presentationJwt = presentation;\n\n\t\ttry {\n\t\t\tconst jwtDecoded = await Jwt.decode(presentationJwt);\n\n\t\t\tconst jwtHeader = jwtDecoded.header;\n\t\t\tconst jwtPayload = jwtDecoded.payload;\n\t\t\tconst jwtSignature = jwtDecoded.signature;\n\n\t\t\tif (\n\t\t\t\tIs.undefined(jwtHeader) ||\n\t\t\t\tIs.undefined(jwtPayload) ||\n\t\t\t\tIs.undefined(jwtPayload.iss) ||\n\t\t\t\tIs.undefined(jwtSignature)\n\t\t\t) {\n\t\t\t\tthrow new NotFoundError(EntityStorageIdentityConnector.CLASS_NAME, \"jwkSignatureFailed\");\n\t\t\t}\n\n\t\t\tconst holderDocumentId = jwtPayload.iss;\n\t\t\tconst holderIdentityDocument = await this._didDocumentEntityStorage.get(holderDocumentId);\n\t\t\tif (Is.undefined(holderIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tholderDocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tholderIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\n\t\t\tconst issuers: IDidDocument[] = [];\n\t\t\tconst tokensRevoked: boolean[] = [];\n\t\t\tconst verifiablePresentation = jwtPayload?.vp as IDidVerifiablePresentationV1;\n\t\t\tif (\n\t\t\t\tIs.object<IDidVerifiablePresentationV1>(verifiablePresentation) &&\n\t\t\t\tIs.array(verifiablePresentation.verifiableCredential)\n\t\t\t) {\n\t\t\t\tfor (const vcJwt of verifiablePresentation.verifiableCredential) {\n\t\t\t\t\tlet revoked = true;\n\t\t\t\t\tif (Is.stringValue(vcJwt)) {\n\t\t\t\t\t\tconst jwt = await Jwt.decode(vcJwt);\n\n\t\t\t\t\t\tif (Is.string(jwt.payload?.iss)) {\n\t\t\t\t\t\t\tconst issuerDocumentId = jwt.payload.iss;\n\t\t\t\t\t\t\tverifiablePresentation.holder = issuerDocumentId;\n\n\t\t\t\t\t\t\tconst issuerDidDocument = await this._didDocumentEntityStorage.get(issuerDocumentId);\n\t\t\t\t\t\t\tif (Is.undefined(issuerDidDocument)) {\n\t\t\t\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\t\t\t\t\tissuerDocumentId\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\t\t\t\t\tissuerDidDocument,\n\t\t\t\t\t\t\t\tthis._vaultConnector\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tissuers.push({\n\t\t\t\t\t\t\t\t\"@context\": DidContexts.Context,\n\t\t\t\t\t\t\t\t...issuerDidDocument\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst vc = jwt.payload.vc as IDidVerifiableCredentialV1;\n\t\t\t\t\t\t\tif (Is.object<IDidVerifiableCredentialV1>(vc)) {\n\t\t\t\t\t\t\t\tconst credentialStatus = vc.credentialStatus;\n\t\t\t\t\t\t\t\tif (Is.object(credentialStatus)) {\n\t\t\t\t\t\t\t\t\trevoked = await this.checkRevocation(\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"@context\": DidContexts.Context,\n\t\t\t\t\t\t\t\t\t\t\t...issuerDidDocument\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tcredentialStatus.revocationBitmapIndex\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} else if (Is.arrayValue(credentialStatus)) {\n\t\t\t\t\t\t\t\t\tfor (let i = 0; i < credentialStatus.length; i++) {\n\t\t\t\t\t\t\t\t\t\trevoked = await this.checkRevocation(\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\"@context\": DidContexts.Context,\n\t\t\t\t\t\t\t\t\t\t\t\t...issuerDidDocument\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tcredentialStatus[i].revocationBitmapIndex\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tif (revoked) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\trevoked = false;\n\t\t\t\t\t}\n\t\t\t\t\ttokensRevoked.push(revoked);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\trevoked: tokensRevoked.some(Boolean),\n\t\t\t\tverifiablePresentation,\n\t\t\t\tissuers\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (BaseError.isErrorMessage(error, /revoked/i)) {\n\t\t\t\treturn {\n\t\t\t\t\trevoked: true\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"checkingVerifiablePresentationFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a proof for arbitrary data with the specified verification method.\n\t * This method uses async signing to ensure the private key never leaves the vault,\n\t * with algorithm validation to ensure key type compatibility.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param verificationMethodId The verification method id to use.\n\t * @param proofType The type of proof to create.\n\t * @param unsecureDocument The unsecure document to create the proof for.\n\t * @returns The proof.\n\t * @throws NotFoundError if the identity or method is not found.\n\t * @throws GeneralError if algorithm doesn't match key type or proof creation fails.\n\t */\n\tpublic async createProof(\n\t\tcontroller: string,\n\t\tverificationMethodId: string,\n\t\tproofType: ProofTypes,\n\t\tunsecureDocument: IJsonLdNodeObject\n\t): Promise<IProof> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(verificationMethodId),\n\t\t\tverificationMethodId\n\t\t);\n\t\tGuards.arrayOneOf<ProofTypes>(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(proofType),\n\t\t\tproofType,\n\t\t\tObject.values(ProofTypes)\n\t\t);\n\t\tGuards.object<IJsonLdNodeObject>(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(unsecureDocument),\n\t\t\tunsecureDocument\n\t\t);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\t\t\tif (Is.empty(idParts.fragment)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"missingDid\",\n\t\t\t\t\tverificationMethodId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(idParts.id);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tidParts.id\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tconst methods = this.getAllMethods(didDocument);\n\t\t\tconst methodAndArray = methods.find(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === verificationMethodId;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === verificationMethodId;\n\t\t\t});\n\n\t\t\tif (!methodAndArray) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"methodMissing\", {\n\t\t\t\t\tmethod: verificationMethodId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst didMethod = methodAndArray.method;\n\t\t\tif (!Is.stringValue(didMethod.publicKeyJwk?.x)) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"publicKeyJwkMissing\", {\n\t\t\t\t\tmethod: verificationMethodId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst vaultKey = EntityStorageIdentityConnector.buildVaultKey(\n\t\t\t\tdidDocument.id,\n\t\t\t\tidParts.fragment ?? \"\"\n\t\t\t);\n\t\t\tconst keyType = await this._vaultConnector.getKeyType(vaultKey);\n\n\t\t\tif (Is.undefined(keyType)) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"privateKeyMissing\", {\n\t\t\t\t\tkeyId: vaultKey\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst unsignedProof = ProofHelper.createUnsignedProof(proofType, verificationMethodId);\n\n\t\t\tconst signedProof = await ProofHelper.createProofWithSigner(\n\t\t\t\tproofType,\n\t\t\t\tunsecureDocument,\n\t\t\t\tunsignedProof,\n\t\t\t\tasync (data, algorithm) => this.signWithVault(vaultKey, keyType, data, algorithm)\n\t\t\t);\n\n\t\t\treturn signedProof;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"createProofFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Verify proof for arbitrary data with the specified verification method.\n\t * @param document The document to verify.\n\t * @param proof The proof to verify.\n\t * @returns True if the proof is verified.\n\t */\n\tpublic async verifyProof(document: IJsonLdNodeObject, proof: IProof): Promise<boolean> {\n\t\tGuards.object<IJsonLdNodeObject>(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(document),\n\t\t\tdocument\n\t\t);\n\t\tGuards.object<IProof>(EntityStorageIdentityConnector.CLASS_NAME, nameof(proof), proof);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(proof.verificationMethod),\n\t\t\tproof.verificationMethod\n\t\t);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(proof.verificationMethod);\n\t\t\tif (Is.empty(idParts.fragment)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"missingDid\",\n\t\t\t\t\tproof.verificationMethod\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(idParts.id);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tidParts.id\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tconst methods = this.getAllMethods(didDocument);\n\n\t\t\tconst methodAndArray = methods.find(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === proof.verificationMethod;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === proof.verificationMethod;\n\t\t\t});\n\n\t\t\tif (!methodAndArray) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"methodMissing\", {\n\t\t\t\t\tmethod: proof.verificationMethod\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst didMethod = methodAndArray.method;\n\t\t\tif (!Is.stringValue(didMethod.publicKeyJwk?.x)) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"publicKeyJwkMissing\", {\n\t\t\t\t\tmethod: proof.verificationMethod\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result = await ProofHelper.verifyProof(document, proof, didMethod.publicKeyJwk);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"verifyProofFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Signs data using the vault connector with algorithm validation.\n\t * @param vaultKey The vault key identifier.\n\t * @param keyType The type of the key.\n\t * @param data The data to sign.\n\t * @param algorithm The signing algorithm.\n\t * @returns The signature bytes.\n\t * @throws GeneralError if algorithm doesn't match key type.\n\t * @internal\n\t */\n\tprivate async signWithVault(\n\t\tvaultKey: string,\n\t\tkeyType: VaultKeyType,\n\t\tdata: Uint8Array,\n\t\talgorithm: string\n\t): Promise<Uint8Array> {\n\t\tif (algorithm === JwsAlgorithms.EdDSA && keyType !== VaultKeyType.Ed25519) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"algorithmKeyTypeMismatch\",\n\t\t\t\t{\n\t\t\t\t\talgorithm,\n\t\t\t\t\texpectedKeyType: VaultKeyType.Ed25519,\n\t\t\t\t\tactualKeyType: keyType,\n\t\t\t\t\tkeyId: vaultKey\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\treturn this._vaultConnector.sign(vaultKey, data);\n\t}\n\n\t/**\n\t * Get all the methods from a document.\n\t * @param document The document to get the methods from.\n\t * @returns The methods.\n\t * @internal\n\t */\n\tprivate getAllMethods(\n\t\tdocument: IDidDocument\n\t): { arrayKey: string; method: Partial<IDidDocumentVerificationMethod> }[] {\n\t\tconst methods: {\n\t\t\tarrayKey: string;\n\t\t\tmethod: Partial<IDidDocumentVerificationMethod>;\n\t\t}[] = [];\n\n\t\tconst methodTypes: DidVerificationMethodType[] = Object.values(DidVerificationMethodType);\n\n\t\tfor (const methodType of methodTypes) {\n\t\t\tconst mt = document[methodType];\n\t\t\tif (Is.arrayValue(mt)) {\n\t\t\t\tmethods.push(\n\t\t\t\t\t...mt.map(m => ({\n\t\t\t\t\t\tarrayKey: methodType,\n\t\t\t\t\t\tmethod: Is.string(m) ? { id: m } : m\n\t\t\t\t\t}))\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn methods;\n\t}\n\n\t/**\n\t * Check if a revocation index is revoked.\n\t * @param document The document to check.\n\t * @param revocationBitmapIndex The revocation index to check.\n\t * @returns True if the index is revoked.\n\t * @internal\n\t */\n\tprivate async checkRevocation(\n\t\tdocument: IDidDocument,\n\t\trevocationBitmapIndex?: unknown\n\t): Promise<boolean> {\n\t\tif (Is.stringValue(revocationBitmapIndex)) {\n\t\t\tconst revocationIndex = Coerce.number(revocationBitmapIndex);\n\t\t\tif (Is.number(revocationIndex)) {\n\t\t\t\tconst revocationService = document.service?.find(s => s.id.endsWith(\"#revocation\"));\n\t\t\t\tif (\n\t\t\t\t\trevocationService &&\n\t\t\t\t\tIs.string(revocationService.serviceEndpoint) &&\n\t\t\t\t\trevocationService.type === \"BitstringStatusList\"\n\t\t\t\t) {\n\t\t\t\t\tconst revocationParts = revocationService.serviceEndpoint.split(\",\");\n\t\t\t\t\tif (revocationParts.length === 2) {\n\t\t\t\t\t\tconst compressedRevocationBytes = Converter.base64UrlToBytes(revocationParts[1]);\n\t\t\t\t\t\tconst decompressed = await Compression.decompress(\n\t\t\t\t\t\t\tcompressedRevocationBytes,\n\t\t\t\t\t\t\tCompressionType.Gzip\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst bitString = BitString.fromBits(\n\t\t\t\t\t\t\tdecompressed,\n\t\t\t\t\t\t\tEntityStorageIdentityConnector._REVOCATION_BITS_SIZE\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn bitString.getBit(revocationIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Update the document in storage.\n\t * @param controller The controller of the document.\n\t * @param didDocument The did document to store.\n\t * @internal\n\t */\n\tprivate async updateDocument(controller: string, didDocument: IDidDocument): Promise<void> {\n\t\tconst stringifiedDocument = JsonHelper.canonicalize(didDocument);\n\t\tconst docBytes = Converter.utf8ToBytes(stringifiedDocument);\n\n\t\tconst signature = await this._vaultConnector.sign(\n\t\t\tEntityStorageIdentityConnector.buildVaultKey(didDocument.id, \"did\"),\n\t\t\tdocBytes\n\t\t);\n\n\t\tawait this._didDocumentEntityStorage.set({\n\t\t\tid: didDocument.id,\n\t\t\tdocument: didDocument,\n\t\t\tsignature: Converter.bytesToBase64(signature),\n\t\t\tcontroller\n\t\t});\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"entityStorageIdentityConnector.js","sourceRoot":"","sources":["../../src/entityStorageIdentityConnector.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tArrayHelper,\n\tBaseError,\n\tBitString,\n\tCoerce,\n\tCompression,\n\tCompressionType,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tJsonHelper,\n\tNotFoundError,\n\tObjectHelper,\n\tRandomHelper,\n\tUrl,\n\tUrn\n} from \"@twin.org/core\";\nimport {\n\tJsonLdHelper,\n\tJsonLdProcessor,\n\ttype IJsonLdContextDefinitionRoot,\n\ttype IJsonLdNodeObject\n} from \"@twin.org/data-json-ld\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport { DocumentHelper, type IIdentityConnector } from \"@twin.org/identity-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tDidContexts,\n\tDidTypes,\n\tDidVerificationMethodType,\n\ttype IDidVerifiableCredential,\n\tJwsAlgorithms,\n\tProofHelper,\n\tProofTypes,\n\ttype IDidDocument,\n\ttype IDidDocumentVerificationMethod,\n\ttype IDidService,\n\ttype IDidVerifiableCredentialV1,\n\ttype IDidVerifiablePresentationV1,\n\ttype IProof,\n\ttype IDidVerifiablePresentation\n} from \"@twin.org/standards-w3c-did\";\nimport {\n\tVaultConnectorFactory,\n\tVaultConnectorHelper,\n\tVaultKeyType,\n\ttype IVaultConnector\n} from \"@twin.org/vault-models\";\nimport { Jwk, Jwt, type IJwk, type IJwtHeader, type IJwtPayload } from \"@twin.org/web\";\nimport type { IdentityDocument } from \"./entities/identityDocument.js\";\nimport type { IEntityStorageIdentityConnectorConstructorOptions } from \"./models/IEntityStorageIdentityConnectorConstructorOptions.js\";\n\n/**\n * Class for performing identity operations using entity storage.\n */\nexport class EntityStorageIdentityConnector implements IIdentityConnector {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<EntityStorageIdentityConnector>();\n\n\t/**\n\t * The namespace supported by the identity connector.\n\t */\n\tpublic static readonly NAMESPACE: string = \"entity-storage\";\n\n\t/**\n\t * The size of the revocation bitmap in bits (16Kb).\n\t * @internal\n\t */\n\tprivate static readonly _REVOCATION_BITS_SIZE: number = 131072;\n\n\t/**\n\t * The entity storage for identities.\n\t * @internal\n\t */\n\tprotected readonly _didDocumentEntityStorage: IEntityStorageConnector<IdentityDocument>;\n\n\t/**\n\t * The vault for the keys.\n\t * @internal\n\t */\n\tprotected readonly _vaultConnector: IVaultConnector;\n\n\t/**\n\t * Create a new instance of EntityStorageIdentityConnector.\n\t * @param options The options for the identity connector.\n\t */\n\tconstructor(options?: IEntityStorageIdentityConnectorConstructorOptions) {\n\t\tthis._didDocumentEntityStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.didDocumentEntityStorageType ?? \"identity-document\"\n\t\t);\n\t\tthis._vaultConnector = VaultConnectorFactory.get(options?.vaultConnectorType ?? \"vault\");\n\t}\n\n\t/**\n\t * Build the key name to access the specified key in the vault.\n\t * @param identity The identity of the user to access the vault keys.\n\t * @returns The vault key.\n\t * @internal\n\t */\n\tpublic static buildVaultKey(identity: string, key: string): string {\n\t\treturn `${identity}/${key}`;\n\t}\n\n\t/**\n\t * Verify the document in storage.\n\t * @param didDocument The did document that was stored.\n\t * @internal\n\t */\n\tpublic static async verifyDocument(\n\t\tdidDocument: IdentityDocument,\n\t\tvaultConnector: IVaultConnector\n\t): Promise<void> {\n\t\tconst stringifiedDocument = JsonHelper.canonicalize(didDocument.document);\n\t\tconst docBytes = Converter.utf8ToBytes(stringifiedDocument);\n\n\t\tconst verified = await vaultConnector.verify(\n\t\t\tEntityStorageIdentityConnector.buildVaultKey(didDocument.id, \"did\"),\n\t\t\tdocBytes,\n\t\t\tConverter.base64ToBytes(didDocument.signature)\n\t\t);\n\n\t\tif (!verified) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"signatureVerificationFailed\"\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn EntityStorageIdentityConnector.CLASS_NAME;\n\t}\n\n\t/**\n\t * Create a new document.\n\t * @param controller The controller of the identity who can make changes.\n\t * @returns The created document.\n\t */\n\tpublic async createDocument(controller: string): Promise<IDidDocument> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\n\t\ttry {\n\t\t\tconst did = `did:${EntityStorageIdentityConnector.NAMESPACE}:${Converter.bytesToHex(RandomHelper.generate(32), true)}`;\n\n\t\t\tawait this._vaultConnector.createKey(\n\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(did, \"did\"),\n\t\t\t\tVaultKeyType.Ed25519\n\t\t\t);\n\n\t\t\tconst bitString = new BitString(EntityStorageIdentityConnector._REVOCATION_BITS_SIZE);\n\t\t\tconst compressed = await Compression.compress(bitString.getBits(), CompressionType.Gzip);\n\n\t\t\tconst didDocument: IDidDocument = {\n\t\t\t\t\"@context\": DidContexts.Context,\n\t\t\t\tid: did,\n\t\t\t\tservice: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${did}#revocation`,\n\t\t\t\t\t\ttype: \"BitstringStatusList\",\n\t\t\t\t\t\tserviceEndpoint: `data:application/octet-stream;base64,${Converter.bytesToBase64Url(compressed)}`\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t};\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\n\t\t\treturn didDocument;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"createDocumentFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a document.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param documentId The id of the document to remove.\n\t * @returns Nothing.\n\t */\n\tpublic async removeDocument(controller: string, documentId: string): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(documentId), documentId);\n\n\t\ttry {\n\t\t\tconst didDocument = await this._didDocumentEntityStorage.get(documentId);\n\t\t\tif (Is.empty(didDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tdocumentId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait this._didDocumentEntityStorage.remove(documentId);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"removeDocumentFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add a verification method to the document in JSON Web key Format.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param documentId The id of the document to add the verification method to.\n\t * @param verificationMethodType The type of the verification method to add.\n\t * @param verificationMethodId The id of the verification method, if undefined uses the kid of the generated JWK.\n\t * @returns The verification method.\n\t * @throws NotFoundError if the id can not be resolved.\n\t * @throws NotSupportedError if the platform does not support multiple keys.\n\t */\n\tpublic async addVerificationMethod(\n\t\tcontroller: string,\n\t\tdocumentId: string,\n\t\tverificationMethodType: DidVerificationMethodType,\n\t\tverificationMethodId?: string\n\t): Promise<IDidDocumentVerificationMethod> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.arrayOneOf<DidVerificationMethodType>(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(verificationMethodType),\n\t\t\tverificationMethodType,\n\t\t\tObject.values(DidVerificationMethodType)\n\t\t);\n\n\t\tlet tempKeyId;\n\t\ttry {\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(documentId);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tdocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tlet methodKeyPublic;\n\t\t\tif (Is.stringValue(verificationMethodId)) {\n\t\t\t\t// If there is a verification method id, we will try to get the key from the vault.\n\t\t\t\ttry {\n\t\t\t\t\t// If there is an existing key, we will use it.\n\t\t\t\t\tconst existingKey = await this._vaultConnector.getKey(\n\t\t\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(didDocument.id, verificationMethodId)\n\t\t\t\t\t);\n\t\t\t\t\tmethodKeyPublic = existingKey.publicKey;\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\tif (Is.empty(methodKeyPublic)) {\n\t\t\t\t// If there is no existing key, we will create a new one with a temporary name.\n\t\t\t\ttempKeyId = `temp-vm-${Converter.bytesToBase64Url(RandomHelper.generate(16))}`;\n\t\t\t\tmethodKeyPublic = await this._vaultConnector.createKey(\n\t\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(didDocument.id, tempKeyId),\n\t\t\t\t\tVaultKeyType.Ed25519\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst jwkParams: IJwk = {\n\t\t\t\talg: \"EdDSA\",\n\t\t\t\tkty: \"OKP\",\n\t\t\t\tcrv: \"Ed25519\",\n\t\t\t\tx: Converter.bytesToBase64Url(methodKeyPublic)\n\t\t\t};\n\n\t\t\tconst kid = await Jwk.generateKid(jwkParams);\n\n\t\t\tconst methodId = `${documentId}#${verificationMethodId ?? kid}`;\n\n\t\t\tif (Is.stringValue(tempKeyId)) {\n\t\t\t\t// If we created a temporary key, we will rename it to the final method id.\n\t\t\t\tawait this._vaultConnector.renameKey(\n\t\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(didDocument.id, tempKeyId),\n\t\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(didDocument.id, verificationMethodId ?? kid)\n\t\t\t\t);\n\t\t\t\ttempKeyId = undefined;\n\t\t\t}\n\n\t\t\tconst methods = this.getAllMethods(didDocument);\n\t\t\tconst existingMethodIndex = methods.findIndex(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === methodId;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === methodId;\n\t\t\t});\n\n\t\t\tif (existingMethodIndex !== -1) {\n\t\t\t\tconst methodArray =\n\t\t\t\t\tdidDocument[methods[existingMethodIndex].arrayKey as keyof IDidDocument];\n\n\t\t\t\tif (Is.array(methodArray)) {\n\t\t\t\t\tmethodArray.splice(existingMethodIndex, 1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst didVerificationMethod: IDidDocumentVerificationMethod = {\n\t\t\t\tid: methodId,\n\t\t\t\tcontroller: documentId,\n\t\t\t\ttype: \"JsonWebKey\",\n\t\t\t\tpublicKeyJwk: {\n\t\t\t\t\t...jwkParams,\n\t\t\t\t\tkid\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdidDocument[verificationMethodType] ??= [];\n\t\t\tdidDocument[verificationMethodType]?.push(didVerificationMethod);\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\n\t\t\treturn didVerificationMethod;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"addVerificationMethodFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t} finally {\n\t\t\tif (Is.stringValue(tempKeyId)) {\n\t\t\t\t// If we created a temporary key and it is still in use, we will remove it from the vault.\n\t\t\t\ttry {\n\t\t\t\t\tawait this._vaultConnector.removeKey(tempKeyId);\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Remove a verification method from the document.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param verificationMethodId The id of the verification method.\n\t * @returns Nothing.\n\t * @throws NotFoundError if the id can not be resolved.\n\t * @throws NotSupportedError if the platform does not support multiple revocable keys.\n\t */\n\tpublic async removeVerificationMethod(\n\t\tcontroller: string,\n\t\tverificationMethodId: string\n\t): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(verificationMethodId),\n\t\t\tverificationMethodId\n\t\t);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\t\t\tif (Is.empty(idParts.fragment)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"missingDid\",\n\t\t\t\t\tverificationMethodId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(idParts.id);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tidParts.id\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tconst methods = this.getAllMethods(didDocument);\n\t\t\tconst existingMethodIndex = methods.findIndex(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === verificationMethodId;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === verificationMethodId;\n\t\t\t});\n\n\t\t\tif (existingMethodIndex !== -1) {\n\t\t\t\tconst methodArray =\n\t\t\t\t\tdidDocument[methods[existingMethodIndex].arrayKey as keyof IDidDocument];\n\n\t\t\t\tif (Is.array(methodArray)) {\n\t\t\t\t\tmethodArray.splice(existingMethodIndex, 1);\n\t\t\t\t\tif (methodArray.length === 0) {\n\t\t\t\t\t\tdelete didDocument[methods[existingMethodIndex].arrayKey as keyof IDidDocument];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"verificationMethodNotFound\",\n\t\t\t\t\tverificationMethodId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"removeVerificationMethodFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add a service to the document.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param documentId The id of the document to add the service to.\n\t * @param serviceId The id of the service.\n\t * @param serviceType The type of the service.\n\t * @param serviceEndpoint The endpoint for the service.\n\t * @returns The service.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async addService(\n\t\tcontroller: string,\n\t\tdocumentId: string,\n\t\tserviceId: string,\n\t\tserviceType: string | string[],\n\t\tserviceEndpoint: string | string[]\n\t): Promise<IDidService> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(serviceId), serviceId);\n\t\tif (Is.array(serviceType)) {\n\t\t\tGuards.arrayValue<string>(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(serviceType),\n\t\t\t\tserviceType\n\t\t\t);\n\t\t} else {\n\t\t\tGuards.stringValue(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(serviceType),\n\t\t\t\tserviceType\n\t\t\t);\n\t\t}\n\t\tif (Is.array(serviceEndpoint)) {\n\t\t\tGuards.arrayValue<string>(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(serviceEndpoint),\n\t\t\t\tserviceEndpoint\n\t\t\t);\n\t\t} else {\n\t\t\tGuards.stringValue(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(serviceEndpoint),\n\t\t\t\tserviceEndpoint\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(documentId);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tdocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tconst fullServiceId = serviceId.includes(\"#\") ? serviceId : `${documentId}#${serviceId}`;\n\n\t\t\tif (Is.array(didDocument.service)) {\n\t\t\t\tconst existingServiceIndex = didDocument.service.findIndex(s => s.id === fullServiceId);\n\t\t\t\tif (existingServiceIndex !== -1) {\n\t\t\t\t\tdidDocument.service?.splice(existingServiceIndex, 1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst didService: IDidService = {\n\t\t\t\tid: fullServiceId,\n\t\t\t\ttype: serviceType,\n\t\t\t\tserviceEndpoint\n\t\t\t};\n\n\t\t\tdidDocument.service ??= [];\n\t\t\tdidDocument.service.push(didService);\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\n\t\t\treturn didService;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"addServiceFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a service from the document.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param serviceId The id of the service.\n\t * @returns Nothing.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async removeService(controller: string, serviceId: string): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(serviceId), serviceId);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(serviceId);\n\t\t\tif (Is.empty(idParts.fragment)) {\n\t\t\t\tthrow new NotFoundError(EntityStorageIdentityConnector.CLASS_NAME, \"missingDid\", serviceId);\n\t\t\t}\n\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(idParts.id);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tidParts.id\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tif (Is.array(didDocument.service)) {\n\t\t\t\tconst existingServiceIndex = didDocument.service.findIndex(s => s.id === serviceId);\n\t\t\t\tif (existingServiceIndex !== -1) {\n\t\t\t\t\tdidDocument.service?.splice(existingServiceIndex, 1);\n\t\t\t\t\tif (didDocument.service?.length === 0) {\n\t\t\t\t\t\tdelete didDocument.service;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"serviceNotFound\",\n\t\t\t\t\tserviceId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"removeServiceFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add an alias to the alsoKnownAs property on the document.\n\t * If the alias is already present the operation is a no-op.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param documentId The id of the document to update.\n\t * @param alias The alias to add. Must be a Url or Urn (typically another DID).\n\t * @returns Nothing.\n\t * @throws GeneralError if the alias is not a Url or Urn.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async addAlsoKnownAs(\n\t\tcontroller: string,\n\t\tdocumentId: string,\n\t\talias: string\n\t): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(alias), alias);\n\t\tif (!Url.tryParseExact(alias) && !Urn.tryParseExact(alias)) {\n\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"invalidAlias\", { alias });\n\t\t}\n\n\t\ttry {\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(documentId);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tdocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tconst existing = Is.array(didDocument.alsoKnownAs) ? didDocument.alsoKnownAs : [];\n\t\t\tif (existing.includes(alias)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdidDocument.alsoKnownAs = [...existing, alias];\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"addAlsoKnownAsFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove an alias from the alsoKnownAs property on the document.\n\t * If the alias is not present the operation is a no-op.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param documentId The id of the document to update.\n\t * @param alias The alias to remove. Must be a Url or Urn.\n\t * @returns Nothing.\n\t * @throws GeneralError if the alias is not a Url or Urn.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async removeAlsoKnownAs(\n\t\tcontroller: string,\n\t\tdocumentId: string,\n\t\talias: string\n\t): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(alias), alias);\n\t\tif (!Url.tryParseExact(alias) && !Urn.tryParseExact(alias)) {\n\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"invalidAlias\", { alias });\n\t\t}\n\n\t\ttry {\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(documentId);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tdocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tif (!Is.array(didDocument.alsoKnownAs) || !didDocument.alsoKnownAs.includes(alias)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst filtered = didDocument.alsoKnownAs.filter(a => a !== alias);\n\t\t\tif (filtered.length === 0) {\n\t\t\t\tdelete didDocument.alsoKnownAs;\n\t\t\t} else {\n\t\t\t\tdidDocument.alsoKnownAs = filtered;\n\t\t\t}\n\n\t\t\tawait this.updateDocument(controller, didDocument);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"removeAlsoKnownAsFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a verifiable credential for a verification method.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param verificationMethodId The verification method id to use.\n\t * @param id The id of the credential.\n\t * @param subject The credential subject to store in the verifiable credential.\n\t * @param options Additional options for creating the verifiable credential.\n\t * @param options.revocationIndex The bitmap revocation index of the credential, if undefined will not have revocation status.\n\t * @param options.expirationDate The date the verifiable credential is valid until.\n\t * @param options.jwtHeaderFields Additional fields to add to the JWT header.\n\t * @param options.jwtPayloadFields Additional fields to add to the JWT payload.\n\t * @returns The created verifiable credential and its token.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async createVerifiableCredential(\n\t\tcontroller: string,\n\t\tverificationMethodId: string,\n\t\tid: string | undefined,\n\t\tsubject: IJsonLdNodeObject,\n\t\toptions?: {\n\t\t\trevocationIndex?: number;\n\t\t\texpirationDate?: Date;\n\t\t\tjwtHeaderFields?: { [id: string]: string };\n\t\t\tjwtPayloadFields?: { [id: string]: string };\n\t\t}\n\t): Promise<{\n\t\tverifiableCredential: IDidVerifiableCredentialV1;\n\t\tjwt: string;\n\t}> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(verificationMethodId),\n\t\t\tverificationMethodId\n\t\t);\n\t\tGuards.object<IJsonLdNodeObject>(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(subject),\n\t\t\tsubject\n\t\t);\n\t\tif (!Is.undefined(options?.revocationIndex)) {\n\t\t\tGuards.number(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(options.revocationIndex),\n\t\t\t\toptions.revocationIndex\n\t\t\t);\n\t\t}\n\t\tif (!Is.undefined(options?.expirationDate)) {\n\t\t\tGuards.date(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(options.expirationDate),\n\t\t\t\toptions.expirationDate\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\t\t\tif (Is.empty(idParts.fragment)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"missingDid\",\n\t\t\t\t\tverificationMethodId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst issuerIdentityDocument = await this._didDocumentEntityStorage.get(idParts.id);\n\t\t\tif (Is.undefined(issuerIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tidParts.id\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tissuerIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst issuerDidDocument = issuerIdentityDocument.document;\n\n\t\t\tconst methods = this.getAllMethods(issuerDidDocument);\n\t\t\tconst methodAndArray = methods.find(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === verificationMethodId;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === verificationMethodId;\n\t\t\t});\n\n\t\t\tif (!methodAndArray) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"methodMissing\", {\n\t\t\t\t\tmethod: verificationMethodId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst verificationDidMethod = methodAndArray.method;\n\t\t\tif (!Is.stringValue(verificationDidMethod.publicKeyJwk?.x)) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"publicKeyJwkMissing\", {\n\t\t\t\t\tmethod: verificationMethodId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst revocationService = issuerDidDocument.service?.find(s => s.id.endsWith(\"#revocation\"));\n\n\t\t\tconst subjectClone = ObjectHelper.clone(subject);\n\n\t\t\tconst finalTypes: string[] = [DidTypes.VerifiableCredential];\n\t\t\tconst credContext = ObjectHelper.extractProperty<IJsonLdContextDefinitionRoot>(subjectClone, [\n\t\t\t\t\"@context\"\n\t\t\t]);\n\t\t\tconst credId = ObjectHelper.extractProperty<string>(subjectClone, [\"@id\", \"id\"], false);\n\t\t\tconst credType = ObjectHelper.extractProperty<string>(subjectClone, [\"@type\", \"type\"]);\n\t\t\tif (Is.stringValue(credType)) {\n\t\t\t\tfinalTypes.push(credType);\n\t\t\t}\n\n\t\t\tconst verifiableCredential: IDidVerifiableCredentialV1 = {\n\t\t\t\t\"@context\": (JsonLdProcessor.combineContexts(DidContexts.ContextVCv1, credContext) ??\n\t\t\t\t\tDidContexts.ContextVCv1) as [typeof DidContexts.ContextVCv1],\n\t\t\t\tid,\n\t\t\t\ttype: finalTypes,\n\t\t\t\tcredentialSubject: subjectClone,\n\t\t\t\tissuer: issuerDidDocument.id,\n\t\t\t\tissuanceDate: new Date(Date.now()).toISOString(),\n\t\t\t\texpirationDate: Is.date(options?.expirationDate)\n\t\t\t\t\t? options?.expirationDate.toISOString()\n\t\t\t\t\t: undefined,\n\t\t\t\tcredentialStatus:\n\t\t\t\t\trevocationService && !Is.undefined(options?.revocationIndex)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tid: revocationService.id,\n\t\t\t\t\t\t\t\ttype: Is.array(revocationService.type)\n\t\t\t\t\t\t\t\t\t? revocationService.type[0]\n\t\t\t\t\t\t\t\t\t: revocationService.type,\n\t\t\t\t\t\t\t\trevocationBitmapIndex: options.revocationIndex.toString()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined\n\t\t\t};\n\n\t\t\tconst jwtHeader: IJwtHeader = {\n\t\t\t\t...options?.jwtHeaderFields,\n\t\t\t\tkid: verificationDidMethod.id,\n\t\t\t\ttyp: \"JWT\",\n\t\t\t\talg: JwsAlgorithms.EdDSA\n\t\t\t};\n\n\t\t\tconst jwtVc = ObjectHelper.pick(ObjectHelper.clone(verifiableCredential), [\n\t\t\t\t\"@context\",\n\t\t\t\t\"type\",\n\t\t\t\t\"credentialSubject\",\n\t\t\t\t\"credentialStatus\"\n\t\t\t]);\n\n\t\t\t// Add the proof to the VC after extracting the jwt data\n\t\t\t// as the jwt does not include the proof\n\t\t\tverifiableCredential.proof = await this.createProof(\n\t\t\t\tcontroller,\n\t\t\t\tverificationMethodId,\n\t\t\t\tProofTypes.DataIntegrityProof,\n\t\t\t\tJsonLdHelper.toNodeObject(verifiableCredential)\n\t\t\t);\n\n\t\t\t// As we are adding the receipt to the data we update the JSON-LD context\n\t\t\tconst proofContext = verifiableCredential.proof[\"@context\"];\n\t\t\tif (!Is.empty(proofContext)) {\n\t\t\t\tverifiableCredential[\"@context\"] = (JsonLdProcessor.combineContexts(\n\t\t\t\t\tverifiableCredential[\"@context\"],\n\t\t\t\t\tproofContext\n\t\t\t\t) ?? verifiableCredential[\"@context\"]) as IDidVerifiableCredentialV1[\"@context\"];\n\t\t\t\tdelete verifiableCredential.proof[\"@context\"];\n\t\t\t}\n\n\t\t\tif (Is.array(jwtVc.credentialSubject)) {\n\t\t\t\tjwtVc.credentialSubject = jwtVc.credentialSubject.map(c => {\n\t\t\t\t\tObjectHelper.propertyDelete(c, \"id\");\n\t\t\t\t\treturn c;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tObjectHelper.propertyDelete(jwtVc.credentialSubject, \"id\");\n\t\t\t}\n\n\t\t\tconst jwtPayload: IJwtPayload = {\n\t\t\t\t...options?.jwtPayloadFields,\n\t\t\t\tiss: idParts.id,\n\t\t\t\tnbf: Math.floor(Date.now() / 1000),\n\t\t\t\tjti: verifiableCredential.id,\n\t\t\t\tsub: credId,\n\t\t\t\tvc: jwtVc\n\t\t\t};\n\n\t\t\tif (Is.date(options?.expirationDate)) {\n\t\t\t\tjwtPayload.exp = Math.floor(options.expirationDate.getTime() / 1000);\n\t\t\t}\n\n\t\t\tconst signature = await Jwt.encodeWithSigner(jwtHeader, jwtPayload, async (header, payload) =>\n\t\t\t\tVaultConnectorHelper.jwtSigner(\n\t\t\t\t\tthis._vaultConnector,\n\t\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(idParts.id, idParts.fragment ?? \"\"),\n\t\t\t\t\theader,\n\t\t\t\t\tpayload\n\t\t\t\t)\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tverifiableCredential,\n\t\t\t\tjwt: signature\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"createVerifiableCredentialFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Check a verifiable credential is valid.\n\t * @param credential The credential to verify.\n\t * @returns The credential stored in the jwt and the revocation status.\n\t */\n\tpublic async checkVerifiableCredential(credential: string | IDidVerifiableCredential): Promise<{\n\t\trevoked: boolean;\n\t\tverifiableCredential?: IDidVerifiableCredential;\n\t}> {\n\t\tif (Is.object(credential)) {\n\t\t\tGuards.objectValue<IDidVerifiableCredential>(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(credential),\n\t\t\t\tcredential\n\t\t\t);\n\t\t\tGuards.objectValue<IDidVerifiableCredential>(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(credential.proof),\n\t\t\t\tcredential.proof\n\t\t\t);\n\t\t\tconst { proof, ...doc } = credential;\n\t\t\tawait this.verifyProof(\n\t\t\t\tJsonLdHelper.toNodeObject(doc),\n\t\t\t\tArrayHelper.fromObjectOrArray(proof)[0]\n\t\t\t);\n\t\t\treturn {\n\t\t\t\trevoked: false,\n\t\t\t\tverifiableCredential: doc\n\t\t\t};\n\t\t}\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(credential), credential);\n\n\t\ttry {\n\t\t\tconst jwtDecoded = await Jwt.decode(credential);\n\n\t\t\tconst jwtHeader = jwtDecoded.header;\n\t\t\tconst jwtPayload = jwtDecoded.payload;\n\t\t\tconst jwtSignature = jwtDecoded.signature;\n\n\t\t\tif (\n\t\t\t\tIs.undefined(jwtHeader) ||\n\t\t\t\tIs.undefined(jwtPayload) ||\n\t\t\t\tIs.undefined(jwtPayload.iss) ||\n\t\t\t\tIs.undefined(jwtSignature)\n\t\t\t) {\n\t\t\t\tthrow new NotFoundError(EntityStorageIdentityConnector.CLASS_NAME, \"jwkSignatureFailed\");\n\t\t\t}\n\n\t\t\tconst issuerDocumentId = jwtPayload.iss;\n\t\t\tconst issuerIdentityDocument = await this._didDocumentEntityStorage.get(issuerDocumentId);\n\t\t\tif (Is.undefined(issuerIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tissuerDocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tissuerIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst issuerDidDocument = issuerIdentityDocument.document;\n\n\t\t\tconst methods = this.getAllMethods(issuerDidDocument);\n\t\t\tconst methodAndArray = methods.find(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === jwtHeader.kid;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === jwtHeader.kid;\n\t\t\t});\n\n\t\t\tif (!methodAndArray) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"methodMissing\", {\n\t\t\t\t\tmethod: jwtHeader.kid\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst didMethod = methodAndArray.method;\n\t\t\tif (!Is.stringValue(didMethod.publicKeyJwk?.x)) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"publicKeyJwkMissing\", {\n\t\t\t\t\tmethod: jwtHeader.kid\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tawait Jwt.verifySignature(credential, await Jwk.toCryptoKey(didMethod.publicKeyJwk));\n\n\t\t\tconst verifiableCredential = jwtPayload.vc as IDidVerifiableCredentialV1;\n\t\t\tif (Is.object(verifiableCredential)) {\n\t\t\t\tif (Is.string(jwtPayload.jti)) {\n\t\t\t\t\tverifiableCredential.id = jwtPayload.jti;\n\t\t\t\t}\n\t\t\t\tverifiableCredential.issuer = issuerDocumentId;\n\t\t\t\tif (Is.number(jwtPayload.nbf)) {\n\t\t\t\t\tverifiableCredential.issuanceDate = new Date(jwtPayload.nbf * 1000).toISOString();\n\t\t\t\t}\n\t\t\t\tif (Is.array(verifiableCredential.credentialSubject)) {\n\t\t\t\t\tverifiableCredential.credentialSubject = verifiableCredential.credentialSubject.map(c => {\n\t\t\t\t\t\tObjectHelper.propertySet(c, \"id\", jwtPayload.sub);\n\t\t\t\t\t\treturn c;\n\t\t\t\t\t});\n\t\t\t\t} else if (Is.object(verifiableCredential.credentialSubject)) {\n\t\t\t\t\tObjectHelper.propertySet(verifiableCredential.credentialSubject, \"id\", jwtPayload.sub);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst credentialStatus = verifiableCredential.credentialStatus;\n\t\t\tlet revoked = false;\n\t\t\tif (Is.object(credentialStatus)) {\n\t\t\t\trevoked = await this.checkRevocation(\n\t\t\t\t\tissuerDidDocument,\n\t\t\t\t\tcredentialStatus.revocationBitmapIndex\n\t\t\t\t);\n\t\t\t} else if (Is.arrayValue(credentialStatus)) {\n\t\t\t\tfor (let i = 0; i < credentialStatus.length; i++) {\n\t\t\t\t\trevoked = await this.checkRevocation(\n\t\t\t\t\t\tissuerDidDocument,\n\t\t\t\t\t\tcredentialStatus[i].revocationBitmapIndex\n\t\t\t\t\t);\n\t\t\t\t\tif (revoked) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\trevoked,\n\t\t\t\tverifiableCredential: revoked ? undefined : verifiableCredential\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"checkingVerifiableCredentialFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Revoke verifiable credential(s).\n\t * @param controller The controller of the identity who can make changes.\n\t * @param issuerDocumentId The id of the document to update the revocation list for.\n\t * @param credentialIndices The revocation bitmap index or indices to revoke.\n\t * @returns Nothing.\n\t */\n\tpublic async revokeVerifiableCredentials(\n\t\tcontroller: string,\n\t\tissuerDocumentId: string,\n\t\tcredentialIndices: number[]\n\t): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(issuerDocumentId),\n\t\t\tissuerDocumentId\n\t\t);\n\t\tGuards.arrayValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(credentialIndices),\n\t\t\tcredentialIndices\n\t\t);\n\n\t\ttry {\n\t\t\tconst issuerIdentityDocument = await this._didDocumentEntityStorage.get(issuerDocumentId);\n\t\t\tif (Is.undefined(issuerIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tissuerDocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tissuerIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst issuerDidDocument = issuerIdentityDocument.document;\n\n\t\t\tconst revocationService = issuerDidDocument.service?.find(s => s.id.endsWith(\"#revocation\"));\n\t\t\tif (\n\t\t\t\trevocationService &&\n\t\t\t\tIs.string(revocationService.serviceEndpoint) &&\n\t\t\t\trevocationService.type === \"BitstringStatusList\"\n\t\t\t) {\n\t\t\t\tconst revocationParts = revocationService.serviceEndpoint.split(\",\");\n\t\t\t\tif (revocationParts.length === 2) {\n\t\t\t\t\tconst compressedRevocationBytes = Converter.base64UrlToBytes(revocationParts[1]);\n\t\t\t\t\tconst decompressed = await Compression.decompress(\n\t\t\t\t\t\tcompressedRevocationBytes,\n\t\t\t\t\t\tCompressionType.Gzip\n\t\t\t\t\t);\n\n\t\t\t\t\tconst bitString = BitString.fromBits(\n\t\t\t\t\t\tdecompressed,\n\t\t\t\t\t\tEntityStorageIdentityConnector._REVOCATION_BITS_SIZE\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const credentialIndex of credentialIndices) {\n\t\t\t\t\t\tbitString.setBit(credentialIndex, true);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst compressed = await Compression.compress(bitString.getBits(), CompressionType.Gzip);\n\t\t\t\t\trevocationService.serviceEndpoint = `data:application/octet-stream;base64,${Converter.bytesToBase64Url(compressed)}`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait this.updateDocument(controller, issuerDidDocument);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"revokeVerifiableCredentialsFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Unrevoke verifiable credential(s).\n\t * @param controller The controller of the identity who can make changes.\n\t * @param issuerDocumentId The id of the document to update the revocation list for.\n\t * @param credentialIndices The revocation bitmap index or indices to un revoke.\n\t * @returns Nothing.\n\t */\n\tpublic async unrevokeVerifiableCredentials(\n\t\tcontroller: string,\n\t\tissuerDocumentId: string,\n\t\tcredentialIndices: number[]\n\t): Promise<void> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(issuerDocumentId),\n\t\t\tissuerDocumentId\n\t\t);\n\t\tGuards.arrayValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(credentialIndices),\n\t\t\tcredentialIndices\n\t\t);\n\n\t\ttry {\n\t\t\tconst issuerIdentityDocument = await this._didDocumentEntityStorage.get(issuerDocumentId);\n\t\t\tif (Is.undefined(issuerIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tissuerDocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tissuerIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst issuerDidDocument = issuerIdentityDocument.document;\n\n\t\t\tconst revocationService = issuerDidDocument.service?.find(s => s.id.endsWith(\"#revocation\"));\n\t\t\tif (\n\t\t\t\trevocationService &&\n\t\t\t\tIs.string(revocationService.serviceEndpoint) &&\n\t\t\t\trevocationService.type === \"BitstringStatusList\"\n\t\t\t) {\n\t\t\t\tconst revocationParts = revocationService.serviceEndpoint.split(\",\");\n\t\t\t\tif (revocationParts.length === 2) {\n\t\t\t\t\tconst compressedRevocationBytes = Converter.base64UrlToBytes(revocationParts[1]);\n\t\t\t\t\tconst decompressed = await Compression.decompress(\n\t\t\t\t\t\tcompressedRevocationBytes,\n\t\t\t\t\t\tCompressionType.Gzip\n\t\t\t\t\t);\n\n\t\t\t\t\tconst bitString = BitString.fromBits(\n\t\t\t\t\t\tdecompressed,\n\t\t\t\t\t\tEntityStorageIdentityConnector._REVOCATION_BITS_SIZE\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const credentialIndex of credentialIndices) {\n\t\t\t\t\t\tbitString.setBit(credentialIndex, false);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst compressed = await Compression.compress(bitString.getBits(), CompressionType.Gzip);\n\t\t\t\t\trevocationService.serviceEndpoint = `data:application/octet-stream;base64,${Converter.bytesToBase64Url(compressed)}`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait this.updateDocument(controller, issuerDidDocument);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"unrevokeVerifiableCredentialsFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a verifiable presentation from the supplied verifiable credentials.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param verificationMethodId The method to associate with the presentation.\n\t * @param presentationId The id of the presentation.\n\t * @param contexts The contexts for the data stored in the verifiable credential.\n\t * @param types The types for the data stored in the verifiable credential.\n\t * @param verifiableCredentials The credentials to use for creating the presentation in jwt format.\n\t * @param options Additional options for creating the verifiable presentation.\n\t * @param options.expirationDate The date the verifiable presentation is valid until.\n\t * @param options.jwtHeaderFields Additional fields to add to the JWT header.\n\t * @param options.jwtPayloadFields Additional fields to add to the JWT payload.\n\t * @returns The created verifiable presentation and its token.\n\t * @throws NotFoundError if the id can not be resolved.\n\t */\n\tpublic async createVerifiablePresentation(\n\t\tcontroller: string,\n\t\tverificationMethodId: string,\n\t\tpresentationId: string | undefined,\n\t\tcontexts: IJsonLdContextDefinitionRoot | undefined,\n\t\ttypes: string | string[] | undefined,\n\t\tverifiableCredentials: (string | IDidVerifiableCredentialV1)[],\n\t\toptions?: {\n\t\t\texpirationDate?: Date;\n\t\t\tjwtHeaderFields?: { [id: string]: string };\n\t\t\tjwtPayloadFields?: { [id: string]: string };\n\t\t}\n\t): Promise<{\n\t\tverifiablePresentation: IDidVerifiablePresentationV1;\n\t\tjwt: string;\n\t}> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(verificationMethodId),\n\t\t\tverificationMethodId\n\t\t);\n\t\tif (Is.array(types)) {\n\t\t\tGuards.arrayValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(types), types);\n\t\t} else if (Is.string(types)) {\n\t\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(types), types);\n\t\t}\n\t\tGuards.arrayValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(verifiableCredentials),\n\t\t\tverifiableCredentials\n\t\t);\n\t\tif (!Is.undefined(options?.expirationDate)) {\n\t\t\tGuards.date(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(options.expirationDate),\n\t\t\t\toptions.expirationDate\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\t\t\tif (Is.empty(idParts.fragment)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"missingDid\",\n\t\t\t\t\tverificationMethodId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst holderIdentityDocument = await this._didDocumentEntityStorage.get(idParts.id);\n\t\t\tif (Is.undefined(holderIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tidParts.id\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tholderIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst holderDidDocument = holderIdentityDocument.document;\n\n\t\t\tconst methods = this.getAllMethods(holderDidDocument);\n\t\t\tconst methodAndArray = methods.find(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === verificationMethodId;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === verificationMethodId;\n\t\t\t});\n\n\t\t\tif (!methodAndArray) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"methodMissing\", {\n\t\t\t\t\tmethod: verificationMethodId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst didMethod = methodAndArray.method;\n\t\t\tif (!Is.stringValue(didMethod.publicKeyJwk?.x)) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"publicKeyJwkMissing\", {\n\t\t\t\t\tmethod: verificationMethodId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst finalTypes: string[] = [DidTypes.VerifiablePresentation];\n\t\t\tif (Is.array(types)) {\n\t\t\t\tfinalTypes.push(...types);\n\t\t\t} else if (Is.stringValue(types)) {\n\t\t\t\tfinalTypes.push(types);\n\t\t\t}\n\n\t\t\tconst combinedContext =\n\t\t\t\tJsonLdProcessor.combineContexts(DidContexts.ContextVCv1, contexts) ??\n\t\t\t\tDidContexts.ContextVCv1;\n\n\t\t\tconst verifiablePresentation: IDidVerifiablePresentationV1 = {\n\t\t\t\t\"@context\": combinedContext as [typeof DidContexts.ContextVCv1],\n\t\t\t\tid: presentationId,\n\t\t\t\ttype: finalTypes,\n\t\t\t\tverifiableCredential: verifiableCredentials,\n\t\t\t\tholder: idParts.id\n\t\t\t};\n\n\t\t\tconst jwtHeader: IJwtHeader = {\n\t\t\t\t...options?.jwtHeaderFields,\n\t\t\t\tkid: didMethod.id,\n\t\t\t\ttyp: \"JWT\",\n\t\t\t\talg: JwsAlgorithms.EdDSA\n\t\t\t};\n\n\t\t\tconst jwtVp = ObjectHelper.pick(ObjectHelper.clone(verifiablePresentation), [\n\t\t\t\t\"@context\",\n\t\t\t\t\"type\",\n\t\t\t\t\"verifiableCredential\"\n\t\t\t]);\n\n\t\t\t// Add the proof to the VP after extracting the jwt data\n\t\t\t// as the jwt does not include the proof\n\t\t\tverifiablePresentation.proof = await this.createProof(\n\t\t\t\tcontroller,\n\t\t\t\tverificationMethodId,\n\t\t\t\tProofTypes.DataIntegrityProof,\n\t\t\t\tJsonLdHelper.toNodeObject(verifiablePresentation)\n\t\t\t);\n\n\t\t\tconst jwtPayload: IJwtPayload = {\n\t\t\t\t...options?.jwtPayloadFields,\n\t\t\t\tiss: verifiablePresentation.holder,\n\t\t\t\tnbf: Math.floor(Date.now() / 1000),\n\t\t\t\tvp: jwtVp\n\t\t\t};\n\n\t\t\tif (Is.date(options?.expirationDate)) {\n\t\t\t\tjwtPayload.exp = Math.floor(options.expirationDate.getTime() / 1000);\n\t\t\t}\n\n\t\t\tconst signature = await Jwt.encodeWithSigner(jwtHeader, jwtPayload, async (header, payload) =>\n\t\t\t\tVaultConnectorHelper.jwtSigner(\n\t\t\t\t\tthis._vaultConnector,\n\t\t\t\t\tEntityStorageIdentityConnector.buildVaultKey(idParts.id, idParts.fragment ?? \"\"),\n\t\t\t\t\theader,\n\t\t\t\t\tpayload\n\t\t\t\t)\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tverifiablePresentation,\n\t\t\t\tjwt: signature\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"createVerifiablePresentationFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Check a verifiable presentation is valid.\n\t * @param presentation The presentation to verify.\n\t * @returns The presentation stored in the jwt and the revocation status.\n\t */\n\tpublic async checkVerifiablePresentation(\n\t\tpresentation: string | IDidVerifiablePresentation\n\t): Promise<{\n\t\trevoked: boolean;\n\t\tverifiablePresentation?: IDidVerifiablePresentationV1;\n\t\tissuers?: IDidDocument[];\n\t}> {\n\t\tif (Is.object(presentation)) {\n\t\t\tconst { proof, ...doc } = presentation as IDidVerifiablePresentationV1;\n\t\t\tconst proofEntry = ArrayHelper.fromObjectOrArray(proof)[0];\n\t\t\tGuards.objectValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(proofEntry), proofEntry);\n\t\t\tawait this.verifyProof(JsonLdHelper.toNodeObject(doc), proofEntry);\n\t\t\treturn { revoked: false, verifiablePresentation: doc };\n\t\t}\n\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(presentation),\n\t\t\tpresentation\n\t\t);\n\n\t\tconst presentationJwt = presentation;\n\n\t\ttry {\n\t\t\tconst jwtDecoded = await Jwt.decode(presentationJwt);\n\n\t\t\tconst jwtHeader = jwtDecoded.header;\n\t\t\tconst jwtPayload = jwtDecoded.payload;\n\t\t\tconst jwtSignature = jwtDecoded.signature;\n\n\t\t\tif (\n\t\t\t\tIs.undefined(jwtHeader) ||\n\t\t\t\tIs.undefined(jwtPayload) ||\n\t\t\t\tIs.undefined(jwtPayload.iss) ||\n\t\t\t\tIs.undefined(jwtSignature)\n\t\t\t) {\n\t\t\t\tthrow new NotFoundError(EntityStorageIdentityConnector.CLASS_NAME, \"jwkSignatureFailed\");\n\t\t\t}\n\n\t\t\tconst holderDocumentId = jwtPayload.iss;\n\t\t\tconst holderIdentityDocument = await this._didDocumentEntityStorage.get(holderDocumentId);\n\t\t\tif (Is.undefined(holderIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tholderDocumentId\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tholderIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\n\t\t\tconst issuers: IDidDocument[] = [];\n\t\t\tconst tokensRevoked: boolean[] = [];\n\t\t\tconst verifiablePresentation = jwtPayload?.vp as IDidVerifiablePresentationV1;\n\t\t\tif (\n\t\t\t\tIs.object<IDidVerifiablePresentationV1>(verifiablePresentation) &&\n\t\t\t\tIs.array(verifiablePresentation.verifiableCredential)\n\t\t\t) {\n\t\t\t\tfor (const vcJwt of verifiablePresentation.verifiableCredential) {\n\t\t\t\t\tlet revoked = true;\n\t\t\t\t\tif (Is.stringValue(vcJwt)) {\n\t\t\t\t\t\tconst jwt = await Jwt.decode(vcJwt);\n\n\t\t\t\t\t\tif (Is.string(jwt.payload?.iss)) {\n\t\t\t\t\t\t\tconst issuerDocumentId = jwt.payload.iss;\n\t\t\t\t\t\t\tverifiablePresentation.holder = issuerDocumentId;\n\n\t\t\t\t\t\t\tconst issuerDidDocument = await this._didDocumentEntityStorage.get(issuerDocumentId);\n\t\t\t\t\t\t\tif (Is.undefined(issuerDidDocument)) {\n\t\t\t\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\t\t\t\t\tissuerDocumentId\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\t\t\t\t\tissuerDidDocument,\n\t\t\t\t\t\t\t\tthis._vaultConnector\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tissuers.push({\n\t\t\t\t\t\t\t\t\"@context\": DidContexts.Context,\n\t\t\t\t\t\t\t\t...issuerDidDocument\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst vc = jwt.payload.vc as IDidVerifiableCredentialV1;\n\t\t\t\t\t\t\tif (Is.object<IDidVerifiableCredentialV1>(vc)) {\n\t\t\t\t\t\t\t\tconst credentialStatus = vc.credentialStatus;\n\t\t\t\t\t\t\t\tif (Is.object(credentialStatus)) {\n\t\t\t\t\t\t\t\t\trevoked = await this.checkRevocation(\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"@context\": DidContexts.Context,\n\t\t\t\t\t\t\t\t\t\t\t...issuerDidDocument\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tcredentialStatus.revocationBitmapIndex\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} else if (Is.arrayValue(credentialStatus)) {\n\t\t\t\t\t\t\t\t\tfor (let i = 0; i < credentialStatus.length; i++) {\n\t\t\t\t\t\t\t\t\t\trevoked = await this.checkRevocation(\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\"@context\": DidContexts.Context,\n\t\t\t\t\t\t\t\t\t\t\t\t...issuerDidDocument\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tcredentialStatus[i].revocationBitmapIndex\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tif (revoked) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\trevoked = false;\n\t\t\t\t\t}\n\t\t\t\t\ttokensRevoked.push(revoked);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\trevoked: tokensRevoked.some(Boolean),\n\t\t\t\tverifiablePresentation,\n\t\t\t\tissuers\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (BaseError.isErrorMessage(error, /revoked/i)) {\n\t\t\t\treturn {\n\t\t\t\t\trevoked: true\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"checkingVerifiablePresentationFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a proof for arbitrary data with the specified verification method.\n\t * This method uses async signing to ensure the private key never leaves the vault,\n\t * with algorithm validation to ensure key type compatibility.\n\t * @param controller The controller of the identity who can make changes.\n\t * @param verificationMethodId The verification method id to use.\n\t * @param proofType The type of proof to create.\n\t * @param unsecureDocument The unsecure document to create the proof for.\n\t * @returns The proof.\n\t * @throws NotFoundError if the identity or method is not found.\n\t * @throws GeneralError if algorithm doesn't match key type or proof creation fails.\n\t */\n\tpublic async createProof(\n\t\tcontroller: string,\n\t\tverificationMethodId: string,\n\t\tproofType: ProofTypes,\n\t\tunsecureDocument: IJsonLdNodeObject\n\t): Promise<IProof> {\n\t\tGuards.stringValue(EntityStorageIdentityConnector.CLASS_NAME, nameof(controller), controller);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(verificationMethodId),\n\t\t\tverificationMethodId\n\t\t);\n\t\tGuards.arrayOneOf<ProofTypes>(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(proofType),\n\t\t\tproofType,\n\t\t\tObject.values(ProofTypes)\n\t\t);\n\t\tGuards.object<IJsonLdNodeObject>(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(unsecureDocument),\n\t\t\tunsecureDocument\n\t\t);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(verificationMethodId);\n\t\t\tif (Is.empty(idParts.fragment)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"missingDid\",\n\t\t\t\t\tverificationMethodId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(idParts.id);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tidParts.id\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tconst methods = this.getAllMethods(didDocument);\n\t\t\tconst methodAndArray = methods.find(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === verificationMethodId;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === verificationMethodId;\n\t\t\t});\n\n\t\t\tif (!methodAndArray) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"methodMissing\", {\n\t\t\t\t\tmethod: verificationMethodId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst didMethod = methodAndArray.method;\n\t\t\tif (!Is.stringValue(didMethod.publicKeyJwk?.x)) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"publicKeyJwkMissing\", {\n\t\t\t\t\tmethod: verificationMethodId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst vaultKey = EntityStorageIdentityConnector.buildVaultKey(\n\t\t\t\tdidDocument.id,\n\t\t\t\tidParts.fragment ?? \"\"\n\t\t\t);\n\t\t\tconst keyType = await this._vaultConnector.getKeyType(vaultKey);\n\n\t\t\tif (Is.undefined(keyType)) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"privateKeyMissing\", {\n\t\t\t\t\tkeyId: vaultKey\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst unsignedProof = ProofHelper.createUnsignedProof(proofType, verificationMethodId);\n\n\t\t\tconst signedProof = await ProofHelper.createProofWithSigner(\n\t\t\t\tproofType,\n\t\t\t\tunsecureDocument,\n\t\t\t\tunsignedProof,\n\t\t\t\tasync (data, algorithm) => this.signWithVault(vaultKey, keyType, data, algorithm)\n\t\t\t);\n\n\t\t\treturn signedProof;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"createProofFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Verify proof for arbitrary data with the specified verification method.\n\t * @param document The document to verify.\n\t * @param proof The proof to verify.\n\t * @returns True if the proof is verified.\n\t */\n\tpublic async verifyProof(document: IJsonLdNodeObject, proof: IProof): Promise<boolean> {\n\t\tGuards.object<IJsonLdNodeObject>(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(document),\n\t\t\tdocument\n\t\t);\n\t\tGuards.object<IProof>(EntityStorageIdentityConnector.CLASS_NAME, nameof(proof), proof);\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(proof.verificationMethod),\n\t\t\tproof.verificationMethod\n\t\t);\n\n\t\ttry {\n\t\t\tconst idParts = DocumentHelper.parseId(proof.verificationMethod);\n\t\t\tif (Is.empty(idParts.fragment)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"missingDid\",\n\t\t\t\t\tproof.verificationMethod\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst didIdentityDocument = await this._didDocumentEntityStorage.get(idParts.id);\n\t\t\tif (Is.undefined(didIdentityDocument)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\t\"documentNotFound\",\n\t\t\t\t\tidParts.id\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait EntityStorageIdentityConnector.verifyDocument(\n\t\t\t\tdidIdentityDocument,\n\t\t\t\tthis._vaultConnector\n\t\t\t);\n\t\t\tconst didDocument = didIdentityDocument.document;\n\n\t\t\tconst methods = this.getAllMethods(didDocument);\n\n\t\t\tconst methodAndArray = methods.find(m => {\n\t\t\t\tif (Is.string(m.method)) {\n\t\t\t\t\treturn m.method === proof.verificationMethod;\n\t\t\t\t}\n\t\t\t\treturn m.method.id === proof.verificationMethod;\n\t\t\t});\n\n\t\t\tif (!methodAndArray) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"methodMissing\", {\n\t\t\t\t\tmethod: proof.verificationMethod\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst didMethod = methodAndArray.method;\n\t\t\tif (!Is.stringValue(didMethod.publicKeyJwk?.x)) {\n\t\t\t\tthrow new GeneralError(EntityStorageIdentityConnector.CLASS_NAME, \"publicKeyJwkMissing\", {\n\t\t\t\t\tmethod: proof.verificationMethod\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result = await ProofHelper.verifyProof(document, proof, didMethod.publicKeyJwk);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"verifyProofFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Signs data using the vault connector with algorithm validation.\n\t * @param vaultKey The vault key identifier.\n\t * @param keyType The type of the key.\n\t * @param data The data to sign.\n\t * @param algorithm The signing algorithm.\n\t * @returns The signature bytes.\n\t * @throws GeneralError if algorithm doesn't match key type.\n\t * @internal\n\t */\n\tprivate async signWithVault(\n\t\tvaultKey: string,\n\t\tkeyType: VaultKeyType,\n\t\tdata: Uint8Array,\n\t\talgorithm: string\n\t): Promise<Uint8Array> {\n\t\tif (algorithm === JwsAlgorithms.EdDSA && keyType !== VaultKeyType.Ed25519) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\t\"algorithmKeyTypeMismatch\",\n\t\t\t\t{\n\t\t\t\t\talgorithm,\n\t\t\t\t\texpectedKeyType: VaultKeyType.Ed25519,\n\t\t\t\t\tactualKeyType: keyType,\n\t\t\t\t\tkeyId: vaultKey\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\treturn this._vaultConnector.sign(vaultKey, data);\n\t}\n\n\t/**\n\t * Get all the methods from a document.\n\t * @param document The document to get the methods from.\n\t * @returns The methods.\n\t * @internal\n\t */\n\tprivate getAllMethods(\n\t\tdocument: IDidDocument\n\t): { arrayKey: string; method: Partial<IDidDocumentVerificationMethod> }[] {\n\t\tconst methods: {\n\t\t\tarrayKey: string;\n\t\t\tmethod: Partial<IDidDocumentVerificationMethod>;\n\t\t}[] = [];\n\n\t\tconst methodTypes: DidVerificationMethodType[] = Object.values(DidVerificationMethodType);\n\n\t\tfor (const methodType of methodTypes) {\n\t\t\tconst mt = document[methodType];\n\t\t\tif (Is.arrayValue(mt)) {\n\t\t\t\tmethods.push(\n\t\t\t\t\t...mt.map(m => ({\n\t\t\t\t\t\tarrayKey: methodType,\n\t\t\t\t\t\tmethod: Is.string(m) ? { id: m } : m\n\t\t\t\t\t}))\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn methods;\n\t}\n\n\t/**\n\t * Check if a revocation index is revoked.\n\t * @param document The document to check.\n\t * @param revocationBitmapIndex The revocation index to check.\n\t * @returns True if the index is revoked.\n\t * @internal\n\t */\n\tprivate async checkRevocation(\n\t\tdocument: IDidDocument,\n\t\trevocationBitmapIndex?: unknown\n\t): Promise<boolean> {\n\t\tif (Is.stringValue(revocationBitmapIndex)) {\n\t\t\tconst revocationIndex = Coerce.number(revocationBitmapIndex);\n\t\t\tif (Is.number(revocationIndex)) {\n\t\t\t\tconst revocationService = document.service?.find(s => s.id.endsWith(\"#revocation\"));\n\t\t\t\tif (\n\t\t\t\t\trevocationService &&\n\t\t\t\t\tIs.string(revocationService.serviceEndpoint) &&\n\t\t\t\t\trevocationService.type === \"BitstringStatusList\"\n\t\t\t\t) {\n\t\t\t\t\tconst revocationParts = revocationService.serviceEndpoint.split(\",\");\n\t\t\t\t\tif (revocationParts.length === 2) {\n\t\t\t\t\t\tconst compressedRevocationBytes = Converter.base64UrlToBytes(revocationParts[1]);\n\t\t\t\t\t\tconst decompressed = await Compression.decompress(\n\t\t\t\t\t\t\tcompressedRevocationBytes,\n\t\t\t\t\t\t\tCompressionType.Gzip\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst bitString = BitString.fromBits(\n\t\t\t\t\t\t\tdecompressed,\n\t\t\t\t\t\t\tEntityStorageIdentityConnector._REVOCATION_BITS_SIZE\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn bitString.getBit(revocationIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Update the document in storage.\n\t * @param controller The controller of the document.\n\t * @param didDocument The did document to store.\n\t * @internal\n\t */\n\tprivate async updateDocument(controller: string, didDocument: IDidDocument): Promise<void> {\n\t\tconst stringifiedDocument = JsonHelper.canonicalize(didDocument);\n\t\tconst docBytes = Converter.utf8ToBytes(stringifiedDocument);\n\n\t\tconst signature = await this._vaultConnector.sign(\n\t\t\tEntityStorageIdentityConnector.buildVaultKey(didDocument.id, \"did\"),\n\t\t\tdocBytes\n\t\t);\n\n\t\tawait this._didDocumentEntityStorage.set({\n\t\t\tid: didDocument.id,\n\t\t\tdocument: didDocument,\n\t\t\tsignature: Converter.bytesToBase64(signature),\n\t\t\tcontroller\n\t\t});\n\t}\n}\n"]}
|
|
@@ -107,12 +107,20 @@ export declare class EntityStorageIdentityConnector implements IIdentityConnecto
|
|
|
107
107
|
* @param options Additional options for creating the verifiable credential.
|
|
108
108
|
* @param options.revocationIndex The bitmap revocation index of the credential, if undefined will not have revocation status.
|
|
109
109
|
* @param options.expirationDate The date the verifiable credential is valid until.
|
|
110
|
+
* @param options.jwtHeaderFields Additional fields to add to the JWT header.
|
|
111
|
+
* @param options.jwtPayloadFields Additional fields to add to the JWT payload.
|
|
110
112
|
* @returns The created verifiable credential and its token.
|
|
111
113
|
* @throws NotFoundError if the id can not be resolved.
|
|
112
114
|
*/
|
|
113
115
|
createVerifiableCredential(controller: string, verificationMethodId: string, id: string | undefined, subject: IJsonLdNodeObject, options?: {
|
|
114
116
|
revocationIndex?: number;
|
|
115
117
|
expirationDate?: Date;
|
|
118
|
+
jwtHeaderFields?: {
|
|
119
|
+
[id: string]: string;
|
|
120
|
+
};
|
|
121
|
+
jwtPayloadFields?: {
|
|
122
|
+
[id: string]: string;
|
|
123
|
+
};
|
|
116
124
|
}): Promise<{
|
|
117
125
|
verifiableCredential: IDidVerifiableCredentialV1;
|
|
118
126
|
jwt: string;
|
|
@@ -152,11 +160,19 @@ export declare class EntityStorageIdentityConnector implements IIdentityConnecto
|
|
|
152
160
|
* @param verifiableCredentials The credentials to use for creating the presentation in jwt format.
|
|
153
161
|
* @param options Additional options for creating the verifiable presentation.
|
|
154
162
|
* @param options.expirationDate The date the verifiable presentation is valid until.
|
|
163
|
+
* @param options.jwtHeaderFields Additional fields to add to the JWT header.
|
|
164
|
+
* @param options.jwtPayloadFields Additional fields to add to the JWT payload.
|
|
155
165
|
* @returns The created verifiable presentation and its token.
|
|
156
166
|
* @throws NotFoundError if the id can not be resolved.
|
|
157
167
|
*/
|
|
158
168
|
createVerifiablePresentation(controller: string, verificationMethodId: string, presentationId: string | undefined, contexts: IJsonLdContextDefinitionRoot | undefined, types: string | string[] | undefined, verifiableCredentials: (string | IDidVerifiableCredentialV1)[], options?: {
|
|
159
169
|
expirationDate?: Date;
|
|
170
|
+
jwtHeaderFields?: {
|
|
171
|
+
[id: string]: string;
|
|
172
|
+
};
|
|
173
|
+
jwtPayloadFields?: {
|
|
174
|
+
[id: string]: string;
|
|
175
|
+
};
|
|
160
176
|
}): Promise<{
|
|
161
177
|
verifiablePresentation: IDidVerifiablePresentationV1;
|
|
162
178
|
jwt: string;
|
package/docs/changelog.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# @twin.org/identity-connector-entity-storage- Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.3-next.27](https://github.com/iotaledger/twin-identity/compare/identity-connector-entity-storage-v0.0.3-next.26...identity-connector-entity-storage-v0.0.3-next.27) (2026-05-21)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* add optional jwt payload and headers to vc and vp tokens ([#135](https://github.com/iotaledger/twin-identity/issues/135)) ([aa1de0f](https://github.com/iotaledger/twin-identity/commit/aa1de0f63be95ff62bae3c699aabc85ea93d74c2))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Dependencies
|
|
12
|
+
|
|
13
|
+
* The following workspace dependencies were updated
|
|
14
|
+
* dependencies
|
|
15
|
+
* @twin.org/identity-models bumped from 0.0.3-next.26 to 0.0.3-next.27
|
|
16
|
+
|
|
17
|
+
## [0.0.3-next.26](https://github.com/iotaledger/twin-identity/compare/identity-connector-entity-storage-v0.0.3-next.25...identity-connector-entity-storage-v0.0.3-next.26) (2026-05-21)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Miscellaneous Chores
|
|
21
|
+
|
|
22
|
+
* **identity-connector-entity-storage:** Synchronize repo versions
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Dependencies
|
|
26
|
+
|
|
27
|
+
* The following workspace dependencies were updated
|
|
28
|
+
* dependencies
|
|
29
|
+
* @twin.org/identity-models bumped from 0.0.3-next.25 to 0.0.3-next.26
|
|
30
|
+
|
|
3
31
|
## [0.0.3-next.25](https://github.com/iotaledger/twin-identity/compare/identity-connector-entity-storage-v0.0.3-next.24...identity-connector-entity-storage-v0.0.3-next.25) (2026-05-20)
|
|
4
32
|
|
|
5
33
|
|
|
@@ -444,6 +444,18 @@ The bitmap revocation index of the credential, if undefined will not have revoca
|
|
|
444
444
|
|
|
445
445
|
The date the verifiable credential is valid until.
|
|
446
446
|
|
|
447
|
+
###### jwtHeaderFields?
|
|
448
|
+
|
|
449
|
+
\{\[`id`: `string`\]: `string`; \}
|
|
450
|
+
|
|
451
|
+
Additional fields to add to the JWT header.
|
|
452
|
+
|
|
453
|
+
###### jwtPayloadFields?
|
|
454
|
+
|
|
455
|
+
\{\[`id`: `string`\]: `string`; \}
|
|
456
|
+
|
|
457
|
+
Additional fields to add to the JWT payload.
|
|
458
|
+
|
|
447
459
|
#### Returns
|
|
448
460
|
|
|
449
461
|
`Promise`\<\{ `verifiableCredential`: `IDidVerifiableCredentialV1`; `jwt`: `string`; \}\>
|
|
@@ -616,6 +628,18 @@ Additional options for creating the verifiable presentation.
|
|
|
616
628
|
|
|
617
629
|
The date the verifiable presentation is valid until.
|
|
618
630
|
|
|
631
|
+
###### jwtHeaderFields?
|
|
632
|
+
|
|
633
|
+
\{\[`id`: `string`\]: `string`; \}
|
|
634
|
+
|
|
635
|
+
Additional fields to add to the JWT header.
|
|
636
|
+
|
|
637
|
+
###### jwtPayloadFields?
|
|
638
|
+
|
|
639
|
+
\{\[`id`: `string`\]: `string`; \}
|
|
640
|
+
|
|
641
|
+
Additional fields to add to the JWT payload.
|
|
642
|
+
|
|
619
643
|
#### Returns
|
|
620
644
|
|
|
621
645
|
`Promise`\<\{ `verifiablePresentation`: `IDidVerifiablePresentationV1`; `jwt`: `string`; \}\>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twin.org/identity-connector-entity-storage",
|
|
3
|
-
"version": "0.0.3-next.
|
|
3
|
+
"version": "0.0.3-next.27",
|
|
4
4
|
"description": "Entity storage connector for persisting and retrieving identity records through a consistent data layer.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"@twin.org/data-core": "next",
|
|
20
20
|
"@twin.org/data-json-ld": "next",
|
|
21
21
|
"@twin.org/entity": "next",
|
|
22
|
-
"@twin.org/identity-models": "0.0.3-next.
|
|
22
|
+
"@twin.org/identity-models": "0.0.3-next.27",
|
|
23
23
|
"@twin.org/nameof": "next",
|
|
24
24
|
"@twin.org/standards-w3c-did": "next",
|
|
25
25
|
"@twin.org/vault-models": "next",
|