@twin.org/identity-connector-entity-storage 0.0.3-next.7 → 0.0.3-next.8
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.
|
@@ -84,7 +84,7 @@ export class EntityStorageIdentityConnector {
|
|
|
84
84
|
const bitString = new BitString(EntityStorageIdentityConnector._REVOCATION_BITS_SIZE);
|
|
85
85
|
const compressed = await Compression.compress(bitString.getBits(), CompressionType.Gzip);
|
|
86
86
|
const didDocument = {
|
|
87
|
-
"@context": DidContexts.
|
|
87
|
+
"@context": DidContexts.Namespace,
|
|
88
88
|
id: did,
|
|
89
89
|
service: [
|
|
90
90
|
{
|
|
@@ -411,7 +411,7 @@ export class EntityStorageIdentityConnector {
|
|
|
411
411
|
finalTypes.push(credType);
|
|
412
412
|
}
|
|
413
413
|
const verifiableCredential = {
|
|
414
|
-
"@context": JsonLdProcessor.combineContexts(DidContexts.
|
|
414
|
+
"@context": JsonLdProcessor.combineContexts(DidContexts.NamespaceVCv1, credContext),
|
|
415
415
|
id,
|
|
416
416
|
type: finalTypes,
|
|
417
417
|
credentialSubject: subjectClone,
|
|
@@ -694,7 +694,7 @@ export class EntityStorageIdentityConnector {
|
|
|
694
694
|
finalTypes.push(types);
|
|
695
695
|
}
|
|
696
696
|
const verifiablePresentation = {
|
|
697
|
-
"@context": JsonLdProcessor.combineContexts(DidContexts.
|
|
697
|
+
"@context": JsonLdProcessor.combineContexts(DidContexts.NamespaceVCv1, contexts),
|
|
698
698
|
id: presentationId,
|
|
699
699
|
type: finalTypes,
|
|
700
700
|
verifiableCredential: verifiableCredentials,
|
|
@@ -771,7 +771,7 @@ export class EntityStorageIdentityConnector {
|
|
|
771
771
|
}
|
|
772
772
|
await EntityStorageIdentityConnector.verifyDocument(issuerDidDocument, this._vaultConnector);
|
|
773
773
|
issuers.push({
|
|
774
|
-
"@context": DidContexts.
|
|
774
|
+
"@context": DidContexts.Namespace,
|
|
775
775
|
...issuerDidDocument
|
|
776
776
|
});
|
|
777
777
|
const vc = jwt.payload.vc;
|
|
@@ -779,14 +779,14 @@ export class EntityStorageIdentityConnector {
|
|
|
779
779
|
const credentialStatus = vc.credentialStatus;
|
|
780
780
|
if (Is.object(credentialStatus)) {
|
|
781
781
|
revoked = await this.checkRevocation({
|
|
782
|
-
"@context": DidContexts.
|
|
782
|
+
"@context": DidContexts.Namespace,
|
|
783
783
|
...issuerDidDocument
|
|
784
784
|
}, credentialStatus.revocationBitmapIndex);
|
|
785
785
|
}
|
|
786
786
|
else if (Is.arrayValue(credentialStatus)) {
|
|
787
787
|
for (let i = 0; i < credentialStatus.length; i++) {
|
|
788
788
|
revoked = await this.checkRevocation({
|
|
789
|
-
"@context": DidContexts.
|
|
789
|
+
"@context": DidContexts.Namespace,
|
|
790
790
|
...issuerDidDocument
|
|
791
791
|
}, credentialStatus[i].revocationBitmapIndex);
|
|
792
792
|
if (revoked) {
|
|
@@ -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\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} from \"@twin.org/core\";\nimport {\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\tProofHelper,\n\tProofTypes,\n\ttype IDidDocument,\n\ttype IDidDocumentVerificationMethod,\n\ttype IDidService,\n\ttype IDidVerifiableCredentialV1,\n\ttype IDidVerifiablePresentationV1,\n\ttype IProof\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 * 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\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) as [\n\t\t\t\t\ttypeof DidContexts.ContextVCv1\n\t\t\t\t],\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: \"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\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\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 credentialJwt The credential to verify.\n\t * @returns The credential stored in the jwt and the revocation status.\n\t */\n\tpublic async checkVerifiableCredential(credentialJwt: string): Promise<{\n\t\trevoked: boolean;\n\t\tverifiableCredential?: IDidVerifiableCredentialV1;\n\t}> {\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(credentialJwt),\n\t\t\tcredentialJwt\n\t\t);\n\n\t\ttry {\n\t\t\tconst jwtDecoded = await Jwt.decode(credentialJwt);\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(credentialJwt, 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 expiresInMinutes The time in minutes for the presentation to expire.\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\texpiresInMinutes?: number\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(expiresInMinutes)) {\n\t\t\tGuards.integer(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(expiresInMinutes),\n\t\t\t\texpiresInMinutes\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 verifiablePresentation: IDidVerifiablePresentationV1 = {\n\t\t\t\t\"@context\": JsonLdProcessor.combineContexts(DidContexts.ContextVCv1, contexts) as [\n\t\t\t\t\ttypeof DidContexts.ContextVCv1\n\t\t\t\t],\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: \"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\tconst jwtPayload: IJwtPayload = {\n\t\t\t\tiss: idParts.id,\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.integer(expiresInMinutes)) {\n\t\t\t\tconst expiresInSeconds = expiresInMinutes * 60;\n\t\t\t\tjwtPayload.exp = Math.floor(Date.now() / 1000) + expiresInSeconds;\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 presentationJwt The presentation to verify.\n\t * @returns The presentation stored in the jwt and the revocation status.\n\t */\n\tpublic async checkVerifiablePresentation(presentationJwt: string): Promise<{\n\t\trevoked: boolean;\n\t\tverifiablePresentation?: IDidVerifiablePresentationV1;\n\t\tissuers?: IDidDocument[];\n\t}> {\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(presentationJwt),\n\t\t\tpresentationJwt\n\t\t);\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 * @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 */\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 key = await this._vaultConnector.getKey(vaultKey);\n\n\t\t\tconst signedProof = await ProofHelper.createProof(\n\t\t\t\tproofType,\n\t\t\t\tunsecureDocument,\n\t\t\t\tProofHelper.createUnsignedProof(proofType, verificationMethodId),\n\t\t\t\tawait Jwk.fromEd25519Private(key.privateKey)\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 * 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\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} from \"@twin.org/core\";\nimport {\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\tProofHelper,\n\tProofTypes,\n\ttype IDidDocument,\n\ttype IDidDocumentVerificationMethod,\n\ttype IDidService,\n\ttype IDidVerifiableCredentialV1,\n\ttype IDidVerifiablePresentationV1,\n\ttype IProof\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.Namespace,\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 * 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\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.NamespaceVCv1, credContext) as [\n\t\t\t\t\ttypeof DidContexts.NamespaceVCv1\n\t\t\t\t],\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: \"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\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\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 credentialJwt The credential to verify.\n\t * @returns The credential stored in the jwt and the revocation status.\n\t */\n\tpublic async checkVerifiableCredential(credentialJwt: string): Promise<{\n\t\trevoked: boolean;\n\t\tverifiableCredential?: IDidVerifiableCredentialV1;\n\t}> {\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(credentialJwt),\n\t\t\tcredentialJwt\n\t\t);\n\n\t\ttry {\n\t\t\tconst jwtDecoded = await Jwt.decode(credentialJwt);\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(credentialJwt, 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 expiresInMinutes The time in minutes for the presentation to expire.\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\texpiresInMinutes?: number\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(expiresInMinutes)) {\n\t\t\tGuards.integer(\n\t\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\t\tnameof(expiresInMinutes),\n\t\t\t\texpiresInMinutes\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 verifiablePresentation: IDidVerifiablePresentationV1 = {\n\t\t\t\t\"@context\": JsonLdProcessor.combineContexts(DidContexts.NamespaceVCv1, contexts) as [\n\t\t\t\t\ttypeof DidContexts.NamespaceVCv1\n\t\t\t\t],\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: \"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\tconst jwtPayload: IJwtPayload = {\n\t\t\t\tiss: idParts.id,\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.integer(expiresInMinutes)) {\n\t\t\t\tconst expiresInSeconds = expiresInMinutes * 60;\n\t\t\t\tjwtPayload.exp = Math.floor(Date.now() / 1000) + expiresInSeconds;\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 presentationJwt The presentation to verify.\n\t * @returns The presentation stored in the jwt and the revocation status.\n\t */\n\tpublic async checkVerifiablePresentation(presentationJwt: string): Promise<{\n\t\trevoked: boolean;\n\t\tverifiablePresentation?: IDidVerifiablePresentationV1;\n\t\tissuers?: IDidDocument[];\n\t}> {\n\t\tGuards.stringValue(\n\t\t\tEntityStorageIdentityConnector.CLASS_NAME,\n\t\t\tnameof(presentationJwt),\n\t\t\tpresentationJwt\n\t\t);\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.Namespace,\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.Namespace,\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.Namespace,\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 * @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 */\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 key = await this._vaultConnector.getKey(vaultKey);\n\n\t\t\tconst signedProof = await ProofHelper.createProof(\n\t\t\t\tproofType,\n\t\t\t\tunsecureDocument,\n\t\t\t\tProofHelper.createUnsignedProof(proofType, verificationMethodId),\n\t\t\t\tawait Jwk.fromEd25519Private(key.privateKey)\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 * 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"]}
|
package/docs/changelog.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @twin.org/identity-connector-entity-storage- Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.3-next.8](https://github.com/twinfoundation/identity/compare/identity-connector-entity-storage-v0.0.3-next.7...identity-connector-entity-storage-v0.0.3-next.8) (2026-01-14)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* update namespaces and contexts ([#90](https://github.com/twinfoundation/identity/issues/90)) ([0c34d64](https://github.com/twinfoundation/identity/commit/0c34d64add8cca77856fa2d0357e774d72fbbfc1))
|
|
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.7 to 0.0.3-next.8
|
|
16
|
+
|
|
3
17
|
## [0.0.3-next.7](https://github.com/twinfoundation/identity/compare/identity-connector-entity-storage-v0.0.3-next.6...identity-connector-entity-storage-v0.0.3-next.7) (2026-01-13)
|
|
4
18
|
|
|
5
19
|
|
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.8",
|
|
4
4
|
"description": "Identity connector implementation using entity storage",
|
|
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.8",
|
|
23
23
|
"@twin.org/nameof": "next",
|
|
24
24
|
"@twin.org/standards-w3c-did": "next",
|
|
25
25
|
"@twin.org/vault-models": "next",
|