@icure/api 8.6.3 → 8.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/icc-api/model/CryptoActorStub.d.ts +2 -0
- package/icc-api/model/CryptoActorStub.js.map +1 -1
- package/icc-api/model/Device.d.ts +1 -0
- package/icc-api/model/Device.js.map +1 -1
- package/icc-api/model/HealthcareParty.d.ts +1 -0
- package/icc-api/model/HealthcareParty.js.map +1 -1
- package/icc-api/model/ModelHelper.d.ts +1 -1
- package/icc-api/model/ModelHelper.js +15 -2
- package/icc-api/model/ModelHelper.js.map +1 -1
- package/icc-api/model/Patient.d.ts +1 -0
- package/icc-api/model/Patient.js.map +1 -1
- package/icc-api/model/User.d.ts +1 -0
- package/icc-api/model/User.js.map +1 -1
- package/icc-x-api/crypto/AES.js +1 -1
- package/icc-x-api/crypto/AES.js.map +1 -1
- package/icc-x-api/crypto/BaseExchangeDataManager.js +14 -14
- package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
- package/icc-x-api/crypto/BaseExchangeKeysManager.js +1 -1
- package/icc-x-api/crypto/BaseExchangeKeysManager.js.map +1 -1
- package/icc-x-api/crypto/CryptoPrimitives.js +3 -2
- package/icc-x-api/crypto/CryptoPrimitives.js.map +1 -1
- package/icc-x-api/crypto/CryptoStrategies.d.ts +2 -1
- package/icc-x-api/crypto/CryptoStrategies.js.map +1 -1
- package/icc-x-api/crypto/ExchangeDataManager.js +3 -3
- package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +1 -1
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
- package/icc-x-api/crypto/KeyRecovery.js +3 -3
- package/icc-x-api/crypto/KeyRecovery.js.map +1 -1
- package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.js +13 -13
- package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.js.map +1 -1
- package/icc-x-api/crypto/RSA.js +2 -2
- package/icc-x-api/crypto/RSA.js.map +1 -1
- package/icc-x-api/crypto/RecoveryDataEncryption.js +5 -5
- package/icc-x-api/crypto/RecoveryDataEncryption.js.map +1 -1
- package/icc-x-api/crypto/SecureDelegationsManager.js +1 -1
- package/icc-x-api/crypto/SecureDelegationsManager.js.map +1 -1
- package/icc-x-api/crypto/ShamirKeysManager.js +1 -1
- package/icc-x-api/crypto/ShamirKeysManager.js.map +1 -1
- package/icc-x-api/crypto/UserEncryptionKeysManager.js +2 -2
- package/icc-x-api/crypto/UserEncryptionKeysManager.js.map +1 -1
- package/icc-x-api/crypto/utils.js +1 -1
- package/icc-x-api/crypto/utils.js.map +1 -1
- package/icc-x-api/filters/HealthElementByHcPartyCodeFilter.d.ts +24 -0
- package/icc-x-api/filters/HealthElementByHcPartyCodeFilter.js +24 -0
- package/icc-x-api/filters/HealthElementByHcPartyCodeFilter.js.map +1 -0
- package/icc-x-api/filters/HealthElementByHcPartyIdentifiersVersioningFilter.d.ts +22 -0
- package/icc-x-api/filters/HealthElementByHcPartyIdentifiersVersioningFilter.js +24 -0
- package/icc-x-api/filters/HealthElementByHcPartyIdentifiersVersioningFilter.js.map +1 -0
- package/icc-x-api/filters/HealthElementByHcPartyStatusVersioningFilter.d.ts +21 -0
- package/icc-x-api/filters/HealthElementByHcPartyStatusVersioningFilter.js +24 -0
- package/icc-x-api/filters/HealthElementByHcPartyStatusVersioningFilter.js.map +1 -0
- package/icc-x-api/filters/HealthElementByHcPartyTagFilter.d.ts +24 -0
- package/icc-x-api/filters/HealthElementByHcPartyTagFilter.js +24 -0
- package/icc-x-api/filters/HealthElementByHcPartyTagFilter.js.map +1 -0
- package/icc-x-api/filters/VersionFiltering.d.ts +14 -0
- package/icc-x-api/filters/VersionFiltering.js +19 -0
- package/icc-x-api/filters/VersionFiltering.js.map +1 -0
- package/icc-x-api/filters/filters.d.ts +8 -4
- package/icc-x-api/filters/filters.js +4 -0
- package/icc-x-api/filters/filters.js.map +1 -1
- package/icc-x-api/icc-receipt-x-api.js +1 -1
- package/icc-x-api/icc-receipt-x-api.js.map +1 -1
- package/icc-x-api/utils/binary-utils.js +1 -1
- package/icc-x-api/utils/binary-utils.js.map +1 -1
- package/package.json +1 -1
- package/test/icc-api/api/IccAnonymousAccessApi.js +1 -1
- package/test/icc-api/api/IccAnonymousAccessApi.js.map +1 -1
- package/test/icc-api/api/IccDocumentApi.js +13 -12
- package/test/icc-api/api/IccDocumentApi.js.map +1 -1
- package/test/icc-x-api/crud/comprehensive-crud-test.js +2 -2
- package/test/icc-x-api/crud/comprehensive-crud-test.js.map +1 -1
- package/test/icc-x-api/crypto/crypto-utils.js +1 -1
- package/test/icc-x-api/crypto/crypto-utils.js.map +1 -1
- package/test/icc-x-api/crypto/soft-deleted-data-owners.js +1 -1
- package/test/icc-x-api/crypto/soft-deleted-data-owners.js.map +1 -1
- package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js +1 -1
- package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js.map +1 -1
- package/test/icc-x-api/filters/healthelement.d.ts +1 -0
- package/test/icc-x-api/filters/healthelement.js +333 -0
- package/test/icc-x-api/filters/healthelement.js.map +1 -0
- package/test/icc-x-api/test-legacy-data-support.js +4 -4
- package/test/icc-x-api/test-legacy-data-support.js.map +1 -1
- package/test/support/CSM-729.d.ts +1 -0
- package/test/support/CSM-729.js +225 -0
- package/test/support/CSM-729.js.map +1 -0
- package/test/utils/TestCryptoStrategies.js +1 -1
- package/test/utils/TestCryptoStrategies.js.map +1 -1
- package/test/utils/roles.d.ts +1 -0
- package/test/utils/roles.js +1 -0
- package/test/utils/roles.js.map +1 -1
- package/test/utils/test_utils.js +2 -2
- package/test/utils/test_utils.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtendedApisUtilsImpl.js","sourceRoot":"","sources":["../../../icc-x-api/crypto/ExtendedApisUtilsImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import { EncryptedEntity, EncryptedEntityStub } from '../../icc-api/model/models'\nimport { IccDataOwnerXApi } from '../icc-data-owner-x-api'\nimport {\n b2a,\n decryptObject,\n EncryptedEntityWithType,\n EncryptedFieldsManifest,\n encryptObject,\n EntityWithDelegationTypeName,\n hex2ua,\n truncateTrailingNulls,\n ua2utf8,\n utf8_2ua,\n} from '../utils'\nimport { CryptoPrimitives } from './CryptoPrimitives'\nimport { SecurityMetadataDecryptor, SecurityMetadataType } from './SecurityMetadataDecryptor'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport { ExtendedApisUtils } from './ExtendedApisUtils'\nimport { EntityShareOrMetadataUpdateRequest } from '../../icc-api/model/requests/EntityShareOrMetadataUpdateRequest'\nimport { EntityBulkShareResult } from '../../icc-api/model/requests/EntityBulkShareResult'\nimport { EntityShareRequest } from '../../icc-api/model/requests/EntityShareRequest'\nimport { SecureDelegationsManager } from './SecureDelegationsManager'\nimport { ShareResult, ShareResultFailure, ShareResultSuccess } from '../utils/ShareResult'\nimport { ShareMetadataBehaviour } from './ShareMetadataBehaviour'\nimport { IccUserXApi } from '../icc-user-x-api'\nimport { MinimalEntityBulkShareResult } from '../../icc-api/model/requests/MinimalEntityBulkShareResult'\nimport { BulkShareOrUpdateMetadataParams, EntityRequestInformation } from '../../icc-api/model/requests/BulkShareOrUpdateMetadataParams'\nimport * as _ from 'lodash'\nimport AccessLevel = SecureDelegation.AccessLevelEnum\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport RequestedPermissionInternal = EntityShareRequest.RequestedPermissionInternal\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\nimport { SecretIdUseOption } from './SecretIdUseOption'\n\n/**\n * @internal this class is for internal use only and may be changed without notice.\n * Methods to support extended apis.\n */\nexport class ExtendedApisUtilsImpl implements ExtendedApisUtils {\n constructor(\n private readonly primitives: CryptoPrimitives,\n private readonly dataOwnerApi: IccDataOwnerXApi,\n private readonly securityMetadataDecryptor: SecurityMetadataDecryptor,\n private readonly secureDelegationsManager: SecureDelegationsManager,\n private readonly userApi: IccUserXApi,\n private readonly useParentKeys: boolean\n ) {}\n\n async encryptionKeysOf(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n return await this.decryptAndMergeHierarchy(dataOwnerId, (hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.EncryptionKey)\n )\n }\n\n async encryptionKeysForHcpHierarchyOf(entity: EncryptedEntityWithType): Promise<{ ownerId: string; extracted: string[] }[]> {\n return this.decryptHierarchy((hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.EncryptionKey)\n )\n }\n\n async secretIdsOf(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n return await this.decryptAndMergeHierarchy(dataOwnerId, (hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.SecretId)\n )\n }\n\n async secretIdsForHcpHierarchyOf(entity: EncryptedEntityWithType): Promise<{ ownerId: string; extracted: string[] }[]> {\n return this.decryptHierarchy((hierarchy) => this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.SecretId))\n }\n\n async owningEntityIdsOf(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n return await this.decryptAndMergeHierarchy(dataOwnerId, (hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.OwningEntityId)\n )\n }\n\n async owningEntityIdsForHcpHierarchyOf(entity: EncryptedEntityWithType): Promise<{ ownerId: string; extracted: string[] }[]> {\n return this.decryptHierarchy((hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.OwningEntityId)\n )\n }\n\n async hasWriteAccess(entity: EncryptedEntityWithType): Promise<boolean> {\n return (\n (await this.securityMetadataDecryptor.getEntityAccessLevel(entity.entity, await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds())) ===\n AccessLevel.WRITE\n )\n }\n\n async entityWithInitialisedEncryptedMetadata<T extends EncryptedEntity>(\n entity: T,\n entityType: EntityWithDelegationTypeName,\n owningEntity: string | undefined,\n owningEntitySecretIds: string[] | undefined,\n initialiseEncryptionKey: boolean,\n autoDelegations: { [p: string]: SecureDelegation.AccessLevelEnum },\n alternateRootDelegation: string | undefined\n ): Promise<{ updatedEntity: T; rawEncryptionKey: string | undefined; secretId: string }> {\n this.throwDetailedExceptionForInvalidParameter('entity.id', entity.id, 'entityWithInitialisedEncryptedMetadata', arguments)\n this.checkEmptyEncryptionMetadata(entity)\n const newRawKey = initialiseEncryptionKey ? await this.primitives.AES.generateCryptoKey(true) : undefined\n const newSecretId = this.primitives.randomUuid()\n return {\n updatedEntity: await this.secureDelegationsManager.entityWithInitialisedEncryptedMetadata(\n {\n ...entity,\n secretForeignKeys: owningEntitySecretIds ?? [],\n },\n entityType,\n newSecretId ? [newSecretId] : [],\n !!owningEntity ? [owningEntity] : [],\n newRawKey ? [newRawKey] : [],\n autoDelegations,\n alternateRootDelegation\n ),\n rawEncryptionKey: newRawKey,\n secretId: newSecretId,\n }\n }\n\n async bulkShareOrUpdateEncryptedEntityMetadata<T extends EncryptedEntityStub>(\n entitiesType: EntityWithDelegationTypeName,\n entitiesUpdates: {\n entity: EncryptedEntityStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n }[],\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<EntityBulkShareResult<T>[]>\n ): Promise<{\n updatedEntities: T[]\n unmodifiedEntitiesIds: string[]\n updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[]\n }> {\n const { allRequestsByEntityId, orderedRequestsInfoByEntityId, unmodifiedEntitiesIds } = await this.prepareBulkShareRequests(\n entitiesType,\n entitiesUpdates\n )\n const results =\n Object.keys(allRequestsByEntityId).length > 0 ? await doRequestBulkShareOrUpdate({ requestsByEntityId: allRequestsByEntityId }) : []\n const updatedEntities: T[] = []\n const updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[] = []\n for (const result of results) {\n if (result.updatedEntity) {\n updatedEntities.push(result.updatedEntity)\n }\n for (const [errorRequestId, error] of Object.entries(result.rejectedRequests ?? {})) {\n const requestIndex = Number(errorRequestId)\n const { delegateId, request, updatedForMigration } = orderedRequestsInfoByEntityId[result.entityId][requestIndex]\n updateErrors.push({\n entityId: result.entityId,\n delegateId,\n request,\n updatedForMigration,\n code: error.code,\n reason: error.reason,\n })\n }\n }\n // TODO implement auto-retry for failed requests if the shouldRetry flag in result.rejectedRequests is set to true\n return {\n updatedEntities,\n updateErrors,\n unmodifiedEntitiesIds,\n }\n }\n\n async bulkShareOrUpdateEncryptedEntityMetadataNoEntities(\n entitiesType: EntityWithDelegationTypeName,\n entitiesUpdates: {\n entity: EncryptedEntityStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds: string[]\n shareEncryptionKeys: string[]\n shareOwningEntityIds: string[]\n requestedPermissions: EntityShareRequest.RequestedPermissionEnum\n }\n }\n }[],\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<MinimalEntityBulkShareResult[]>\n ): Promise<{\n unmodifiedEntitiesIds: string[]\n successfulUpdates: { entityId: string; delegateId: string }[]\n updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: EntityShareRequest.RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[]\n }> {\n const { allRequestsByEntityId, orderedRequestsInfoByEntityId, unmodifiedEntitiesIds } = await this.prepareBulkShareRequests(\n entitiesType,\n entitiesUpdates\n )\n const results = await doRequestBulkShareOrUpdate({ requestsByEntityId: allRequestsByEntityId })\n const updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[] = []\n for (const result of results) {\n for (const [errorRequestId, error] of Object.entries(result.rejectedRequests ?? {})) {\n const requestIndex = Number(errorRequestId)\n const { delegateId, request, updatedForMigration } = orderedRequestsInfoByEntityId[result.entityId][requestIndex]\n updateErrors.push({\n entityId: result.entityId,\n delegateId,\n request,\n updatedForMigration,\n code: error.code,\n reason: error.reason,\n })\n }\n }\n const successfulRequests = Object.entries(allRequestsByEntityId)\n .flatMap(([entityId, requests]) => Object.keys(requests).map((delegateId) => ({ entityId, delegateId })))\n .filter(({ entityId, delegateId }) => !updateErrors.some((error) => error.entityId === entityId && error.delegateId === delegateId))\n return {\n successfulUpdates: successfulRequests,\n updateErrors,\n unmodifiedEntitiesIds,\n }\n }\n\n private async prepareBulkShareRequests(\n entitiesType: EntityWithDelegationTypeName,\n entitiesUpdates: {\n entity: EncryptedEntityStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n }[]\n ): Promise<{\n unmodifiedEntitiesIds: string[]\n allRequestsByEntityId: { [entityId: string]: EntityRequestInformation }\n orderedRequestsInfoByEntityId: {\n [entityId: string]: {\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n }[]\n }\n }> {\n if (new Set(entitiesUpdates.map((e) => e.entity.id)).size !== entitiesUpdates.length) {\n throw new Error('Duplicate requests: the same entity id is present more than once in the input')\n }\n const allRequestsByEntityId = {} as { [entityId: string]: EntityRequestInformation }\n const orderedRequestsInfoByEntityId: {\n [entityId: string]: {\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n }[]\n } = {}\n const unmodifiedEntitiesIds: string[] = []\n for (const { entity, dataForDelegates } of entitiesUpdates) {\n const entityId = entity.id\n if (!entityId) throw new Error('Share of an entity requires for the entity to already exist and have an id')\n const entityWithType = { entity, type: entitiesType }\n const currentRequests = {} as { [requestId: string]: EntityShareOrMetadataUpdateRequest }\n const currentOrderedRequests: {\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n }[] = []\n const migrationRequests = await this.makeMigrationRequestsIfNeeded(entityWithType, dataForDelegates)\n for (const [delegate, request] of Object.entries(migrationRequests)) {\n currentRequests[String(currentOrderedRequests.length)] = request\n currentOrderedRequests.push({\n delegateId: delegate,\n request: dataForDelegates[delegate],\n updatedForMigration: true,\n })\n }\n for (const [delegate, userRequest] of Object.entries(dataForDelegates)) {\n if (!migrationRequests[delegate]) {\n const request = await this.secureDelegationsManager.makeShareOrUpdateRequestParams(\n entityWithType,\n delegate,\n userRequest.shareSecretIds ?? [],\n userRequest.shareEncryptionKeys ?? [],\n userRequest.shareOwningEntityIds ?? [],\n userRequest.requestedPermissions\n )\n if (request) {\n currentRequests[String(currentOrderedRequests.length)] = request\n currentOrderedRequests.push({\n delegateId: delegate,\n request: userRequest,\n updatedForMigration: false,\n })\n }\n }\n }\n if (Object.keys(currentRequests).length > 0) {\n const existingDelegationMembersDetails = await this.securityMetadataDecryptor.getDelegationMemberDetails(entityWithType)\n const accessibleMembers = new Set(\n this.useParentKeys ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds() : [await this.dataOwnerApi.getCurrentDataOwnerId()]\n )\n const potentialParentDelegations = Object.entries(existingDelegationMembersDetails).flatMap(([k, members]) => {\n if ((!!members.delegate && accessibleMembers.has(members.delegate)) || (!!members.delegator && accessibleMembers.has(members.delegator))) {\n return [k]\n } else return []\n })\n allRequestsByEntityId[entityId] = { requests: currentRequests, potentialParentDelegations }\n orderedRequestsInfoByEntityId[entityId] = currentOrderedRequests\n } else {\n unmodifiedEntitiesIds.push(entityId)\n }\n }\n return { unmodifiedEntitiesIds, allRequestsByEntityId, orderedRequestsInfoByEntityId }\n }\n\n async simpleShareOrUpdateEncryptedEntityMetadata<T extends EncryptedEntityStub>(\n entity: { entity: T; type: EntityWithDelegationTypeName },\n delegates: {\n [p: string]: {\n shareSecretIds: string[] | undefined\n shareEncryptionKeys: ShareMetadataBehaviour | undefined\n shareOwningEntityIds: ShareMetadataBehaviour | undefined\n requestedPermissions: EntityShareRequest.RequestedPermissionEnum | undefined\n }\n },\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<EntityBulkShareResult<T>[]>\n ): Promise<ShareResult<T>> {\n const availableEncryptionKeys = await this.encryptionKeysOf(entity)\n const availableOwningEntityIds = await this.owningEntityIdsOf(entity)\n const dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds: string[]\n shareEncryptionKeys: string[]\n shareOwningEntityIds: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n } = {}\n for (const [delegateId, delegateRequests] of Object.entries(delegates)) {\n if (!availableEncryptionKeys.length && delegateRequests.shareEncryptionKeys === ShareMetadataBehaviour.REQUIRED) {\n throw new Error(\n `Entity ${JSON.stringify(\n entity\n )} has no encryption keys or the current data owner can't access any encryption keys, but sharing is required.`\n )\n }\n if (!availableOwningEntityIds.length && delegateRequests.shareOwningEntityIds === ShareMetadataBehaviour.REQUIRED) {\n throw new Error(\n `Entity ${JSON.stringify(\n entity\n )} has no owning entity ids or the current data owner can't access any owning entity ids, but sharing is required.`\n )\n }\n dataForDelegates[delegateId] = {\n shareSecretIds: delegateRequests.shareSecretIds ?? (await this.secretIdsOf(entity)),\n shareEncryptionKeys: delegateRequests.shareEncryptionKeys === ShareMetadataBehaviour.NEVER ? [] : availableEncryptionKeys,\n shareOwningEntityIds: delegateRequests.shareOwningEntityIds === ShareMetadataBehaviour.NEVER ? [] : availableOwningEntityIds,\n requestedPermissions: delegateRequests.requestedPermissions ?? RequestedPermissionEnum.MAX_WRITE,\n }\n }\n const shareResult = await this.bulkShareOrUpdateEncryptedEntityMetadata(\n entity.type,\n [\n {\n entity: entity.entity,\n dataForDelegates,\n },\n ],\n (x) => doRequestBulkShareOrUpdate(x)\n )\n if (shareResult.unmodifiedEntitiesIds.includes(entity.entity.id!)) {\n return new ShareResultSuccess(entity.entity)\n }\n if (!shareResult.updateErrors.length && shareResult.updatedEntities.length === 1) {\n return new ShareResultSuccess(shareResult.updatedEntities[0])\n }\n const requestedDelegates = new Set(Object.keys(delegates))\n const errorsOfRequestedDelegates = shareResult.updateErrors.filter((x) => requestedDelegates.has(x.delegateId))\n if (errorsOfRequestedDelegates.length === 0 && shareResult.updatedEntities.length === 1) {\n console.warn(`Errors with migration of encrypted metadata ${JSON.stringify(shareResult.updateErrors)}.`)\n return new ShareResultSuccess(shareResult.updatedEntities[0])\n }\n return new ShareResultFailure(\n shareResult.updateErrors,\n `There was an error sharing entity with id ${entity.entity.id}. Check the logs for more details.`\n )\n }\n\n private async makeMigrationRequestsIfNeeded(\n entity: EncryptedEntityWithType,\n userRequestsForEntity: {\n [delegateId: string]: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n ): Promise<{ [delegateId: string]: EntityShareOrMetadataUpdateRequest }> {\n const hierarchy = this.useParentKeys\n ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n : [await this.dataOwnerApi.getCurrentDataOwnerId()]\n const legacySecretIds = await this.securityMetadataDecryptor.decryptAllLegacyDelegations(entity.entity, hierarchy, SecurityMetadataType.SecretId)\n const legacyEncryptionKeys = await this.securityMetadataDecryptor.decryptAllLegacyDelegations(\n entity.entity,\n hierarchy,\n SecurityMetadataType.EncryptionKey\n )\n const legacyOwningEntityIds = await this.securityMetadataDecryptor.decryptAllLegacyDelegations(\n entity.entity,\n hierarchy,\n SecurityMetadataType.OwningEntityId\n )\n const res = {} as { [delegateId: string]: EntityShareOrMetadataUpdateRequest }\n const selfId = await this.dataOwnerApi.getCurrentDataOwnerId()\n for (const hierarchyMember of hierarchy) {\n const hierarchyMemberMigration = await this.makeMigrationRequestForMemberOfHierarchy(\n entity,\n selfId,\n hierarchyMember,\n userRequestsForEntity[hierarchyMember],\n legacySecretIds,\n legacyEncryptionKeys,\n legacyOwningEntityIds\n )\n if (hierarchyMemberMigration) {\n res[hierarchyMember] = hierarchyMemberMigration\n }\n }\n return res\n }\n\n private async makeMigrationRequestForMemberOfHierarchy(\n entity: EncryptedEntityWithType,\n selfId: string,\n currMemberId: string,\n userRequestForDelegate:\n | {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n | undefined,\n legacySecretIds: { decrypted: string; dataOwnersWithAccess: string[] }[],\n legacyEncryptionKeys: { decrypted: string; dataOwnersWithAccess: string[] }[],\n legacyOwningEntityIds: { decrypted: string; dataOwnersWithAccess: string[] }[]\n ): Promise<EntityShareOrMetadataUpdateRequest | undefined> {\n // This implementation is very specific from migration from delegations to secure delegations. If in future we will have to migrate from secure delegations to something else, this method may need significant changes in its logic.\n const subHierarchy = this.useParentKeys ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIdsFrom(currMemberId) : [currMemberId]\n const subHierarchySet = new Set(subHierarchy)\n const legacyAccess =\n selfId === entity.entity.id && currMemberId === selfId\n ? AccessLevel.WRITE\n : await this.securityMetadataDecryptor.getEntityLegacyDelegationAccessLevel(entity.entity, subHierarchy)\n if (!legacyAccess) return undefined\n const selfLegacySecretIds = legacySecretIds.filter((x) => x.dataOwnersWithAccess.some((d) => subHierarchySet.has(d))).map((x) => x.decrypted)\n const selfLegacyEncryptionKeys = legacyEncryptionKeys\n .filter((x) => x.dataOwnersWithAccess.some((d) => subHierarchySet.has(d)))\n .map((x) => x.decrypted)\n const selfLegacyOwningEntityIds = legacyOwningEntityIds\n .filter((x) => x.dataOwnersWithAccess.some((d) => subHierarchySet.has(d)))\n .map((x) => x.decrypted)\n let missingSecretIds: string[] = []\n let missingEncryptionKeys: string[] = []\n let missingOwningEntityIds: string[] = []\n if (selfLegacySecretIds.length > 0) {\n const currentSecretIds = new Set(\n (await this.securityMetadataDecryptor.decryptAllSecureDelegations(entity.entity, [currMemberId], SecurityMetadataType.SecretId)).map(\n (x) => x.decrypted\n )\n )\n missingSecretIds = selfLegacySecretIds.filter((x) => !currentSecretIds.has(x))\n }\n if (selfLegacyEncryptionKeys.length > 0) {\n const currentEncryptionKeys = new Set(\n (await this.securityMetadataDecryptor.decryptAllSecureDelegations(entity.entity, [currMemberId], SecurityMetadataType.EncryptionKey)).map(\n (x) => x.decrypted\n )\n )\n missingEncryptionKeys = selfLegacyEncryptionKeys.filter((x) => !currentEncryptionKeys.has(x))\n }\n if (selfLegacyOwningEntityIds.length > 0) {\n const currentOwningEntityIds = new Set(\n (await this.securityMetadataDecryptor.decryptAllSecureDelegations(entity.entity, [currMemberId], SecurityMetadataType.OwningEntityId)).map(\n (x) => x.decrypted\n )\n )\n missingOwningEntityIds = selfLegacyOwningEntityIds.filter((x) => !currentOwningEntityIds.has(x))\n }\n const mustCreateRootDelegation =\n selfId === entity.entity.id &&\n currMemberId === selfId &&\n !(await this.securityMetadataDecryptor.getEntitySecureDelegationAccessLevel(entity.entity, subHierarchy))\n if (missingSecretIds.length > 0 || missingEncryptionKeys.length > 0 || missingOwningEntityIds.length > 0 || mustCreateRootDelegation) {\n let requestedPermissions: RequestedPermissionInternal\n if (currMemberId === selfId) {\n requestedPermissions = RequestedPermissionInternal.ROOT\n } else {\n requestedPermissions = RequestedPermissionInternal.FULL_WRITE // Legacy permission if present is always write\n }\n return await this.secureDelegationsManager.makeShareOrUpdateRequestParams(\n entity,\n currMemberId,\n Array.from(new Set([...missingSecretIds, ...(userRequestForDelegate?.shareSecretIds ?? [])])),\n Array.from(new Set([...missingEncryptionKeys, ...(userRequestForDelegate?.shareEncryptionKeys ?? [])])),\n Array.from(new Set([...missingOwningEntityIds, ...(userRequestForDelegate?.shareOwningEntityIds ?? [])])),\n requestedPermissions\n )\n } else return undefined\n }\n\n async tryDecryptDataOf(\n entity: EncryptedEntityWithType,\n content: ArrayBuffer | Uint8Array,\n validator: (decryptedData: ArrayBuffer) => Promise<boolean> | undefined\n ): Promise<{ data: ArrayBuffer; wasDecrypted: boolean }> {\n const triedKeys: Set<string> = new Set()\n const result = await this.doIncrementallyDecryptingKeys(entity.entity, entity.type, async (e, t, keys) => {\n for (const k of keys) {\n if (!triedKeys.has(k.raw)) {\n triedKeys.add(k.raw)\n try {\n const decrypted = await this.primitives.AES.decrypt(k.key, content)\n if (!validator || (await validator(decrypted))) return { success: decrypted }\n } catch (e) {\n console.warn(`Error while attempting to decrypt attachment of ${entity.entity.id} with raw key ${k.raw}: ${e}`)\n }\n }\n }\n return null\n })\n if (result != null) {\n return { data: result.success, wasDecrypted: true }\n } else {\n return { data: content, wasDecrypted: false }\n }\n }\n\n async encryptDataOf<T extends EncryptedEntityStub>(\n entity: T,\n type: EntityWithDelegationTypeName,\n content: ArrayBuffer | Uint8Array,\n saveEntity: (entity: T) => Promise<T>\n ): Promise<{ encryptedData: ArrayBuffer; updatedEntity: T | undefined }> {\n const ensureInitialisedKeysResult = await this.ensureEncryptionKeysInitialised(entity, type)\n let updatedEntity: T | undefined\n if (!!ensureInitialisedKeysResult) {\n updatedEntity = await saveEntity(ensureInitialisedKeysResult)\n }\n const encrypted = await this.doIncrementallyDecryptingKeys(entity, type, async (e, t, keys) => {\n for (const k of keys) {\n try {\n return {\n success: {\n encryptedData: await this.primitives.AES.encrypt(k.key, content),\n updatedEntity: updatedEntity,\n },\n }\n } catch (e) {\n console.warn(`Error while encrypting with raw key ${k.raw}: ${e}`)\n }\n }\n return null\n })\n if (encrypted != null) return encrypted.success\n throw new Error(`Could not extract any valid encryption keys for entity ${JSON.stringify(entity)}.`)\n }\n\n async tryDecryptEntities<T extends EncryptedEntity>(\n entities: T[],\n entityType: EntityWithDelegationTypeName,\n constructor: (json: any) => T\n ): Promise<{ entity: T; decrypted: boolean }[]> {\n const nothingToDecryptResults = new Map<string, T>()\n for (const entity of entities) {\n const nothingToDecrypt = await decryptObject(entity, async (encrypted) => {\n return null\n })\n if (nothingToDecrypt != null) {\n nothingToDecryptResults.set(entity.id!, constructor(nothingToDecrypt))\n }\n }\n const actuallyDecryptedResults = await this.doManyIncrementallyDecryptingKeys(\n entities.filter((e) => !nothingToDecryptResults.has(e.id!)),\n entityType,\n async (entity, t, keys) => {\n // The decrypt object will try all keys on each of the sub-objects; this is intentional because even though it\n // shouldn't happen, but it is still possible that some entity could be accidentally merged badly and the merged\n // entity has multiple encryptedSelf (on different sub-entities) that use different keys.\n const decrypted = await decryptObject(entity, (encrypted) => this.tryDecryptJson(keys, encrypted, false))\n if (decrypted != null) {\n return { success: constructor(decrypted) }\n } else {\n return null\n }\n }\n )\n const res = []\n for (const entity of entities) {\n const decrypted = actuallyDecryptedResults.get(entity.id!) ?? nothingToDecryptResults.get(entity.id!)\n if (!decrypted) {\n res.push({ entity: entity, decrypted: false })\n } else {\n res.push({ entity: decrypted, decrypted: true })\n }\n }\n return res\n }\n\n async tryDecryptJson(\n potentialKeys: { key: CryptoKey; raw: string }[],\n encrypted: Uint8Array,\n truncateTrailingDecryptedNulls: boolean\n ): Promise<{} | null> {\n for (const key of potentialKeys) {\n try {\n const decrypted = await this.primitives.AES.decrypt(key.key, encrypted, key.raw)\n return JSON.parse(ua2utf8(truncateTrailingDecryptedNulls ? truncateTrailingNulls(new Uint8Array(decrypted)) : decrypted))\n } catch (e) {}\n }\n return null\n }\n\n async tryEncryptEntities<T extends EncryptedEntity>(\n entities: T[],\n entityType: EntityWithDelegationTypeName,\n fieldsToEncrypt: EncryptedFieldsManifest,\n encodeBinaryData: boolean,\n requireEncryption: boolean,\n constructor: (json: any) => T\n ): Promise<T[]> {\n const entitiesWithInitialisedEncryptionKeys: T[] = []\n for (const entity of entities) {\n entitiesWithInitialisedEncryptionKeys.push((await this.ensureEncryptionKeysInitialised(entity, entityType)) ?? entity)\n }\n const results = await this.doManyIncrementallyDecryptingKeys(entitiesWithInitialisedEncryptionKeys, entityType, async (e, t, keys) => {\n for (const k of keys) {\n try {\n const encrypted = await encryptObject(\n e,\n (obj) => {\n // TODO encoding of binary data should probably be applied to everything?\n const json = encodeBinaryData\n ? JSON.stringify(obj, (k, v) => {\n return v instanceof ArrayBuffer || ArrayBuffer.isView(v)\n ? b2a(new Uint8Array(v as ArrayBufferLike).reduce((d, b) => d + String.fromCharCode(b), ''))\n : v\n })\n : JSON.stringify(obj)\n\n return this.primitives.AES.encrypt(k.key, utf8_2ua(json), k.raw)\n },\n fieldsToEncrypt,\n entityType\n )\n return { success: constructor(encrypted) }\n } catch (e) {\n console.warn(`Error while encrypting with raw key ${k.raw}: ${e}`)\n }\n }\n return null\n })\n if (results.size != entitiesWithInitialisedEncryptionKeys.length) {\n if (requireEncryption) {\n throw new Error(\n `Could not encrypt entities ${entitiesWithInitialisedEncryptionKeys.flatMap((e): string[] => (results.has(e.id!) ? [] : [e.id!]))}`\n )\n } else {\n for (const e of entitiesWithInitialisedEncryptionKeys) {\n if (!results.has(e.id!)) {\n await encryptObject(\n e,\n async (obj: { [key: string]: any }) => {\n const hasNonEmptyValues = Object.values(obj).some(\n (v) => v !== undefined && (typeof v !== 'object' || (Array.isArray(v) && v.length > 0) || Object.keys(v).length > 0)\n )\n if (hasNonEmptyValues) {\n throw new Error(\n `Impossible to modify encrypted content of an entity if no encryption key is known.\\nEntity: ${JSON.stringify(\n e\n )}\\nTo encrypt: ${JSON.stringify(obj)}`\n )\n }\n return Promise.resolve(new ArrayBuffer(1))\n },\n fieldsToEncrypt,\n 'entity'\n )\n results.set(e.id!, e)\n }\n }\n }\n }\n return entitiesWithInitialisedEncryptionKeys.map((e) => results.get(e.id!)!)\n }\n\n async ensureEncryptionKeysInitialised<T extends EncryptedEntity>(entity: T, entityType: EntityWithDelegationTypeName): Promise<T | undefined> {\n if (this.securityMetadataDecryptor.hasAnyEncryptionKeys(entity)) return undefined\n if (!entity.rev) {\n throw new Error(\n 'New encrypted entity is lacking encryption metadata. ' +\n 'Please instantiate new entities using the `newInstance` method from the respective extended api.'\n )\n }\n /*\n * Add encryption key and share with all auto-delegates already in legacy delegations.\n * TODO disable this logic and simply throw error for post-2018 customers.\n */\n const existingDelegations = new Set(Object.keys(entity.delegations ?? {}))\n const usersWithAccessToNewKey = Object.fromEntries(\n Object.values((await this.userApi.getCurrentUser()).autoDelegations ?? {})\n .flatMap((x) => x)\n .filter((x) => existingDelegations.has(x))\n .map((x) => [x, AccessLevelEnum.WRITE])\n )\n return await this.secureDelegationsManager.entityWithInitialisedEncryptedMetadata(\n {\n ...entity,\n secretForeignKeys: entity.secretForeignKeys ?? [],\n },\n entityType,\n [],\n [],\n [await this.primitives.AES.generateCryptoKey(true)],\n usersWithAccessToNewKey,\n undefined\n )\n }\n\n private async decryptHierarchy(\n decryptedDataProvider: (dataOwners: string[]) => Promise<{ ownerId: string; extracted: string[] }[]>\n ): Promise<{ ownerId: string; extracted: string[] }[]> {\n const canDecryptOwnerIds = this.useParentKeys\n ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n : [await this.dataOwnerApi.getCurrentDataOwnerId()]\n return await decryptedDataProvider(canDecryptOwnerIds)\n }\n\n private async decryptAndMergeHierarchy(\n dataOwnerId: string | undefined,\n decryptedDataProvider: (dataOwners: string[]) => Promise<{ ownerId: string; extracted: string[] }[]>\n ): Promise<string[]> {\n const hierarchy = this.useParentKeys\n ? dataOwnerId\n ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIdsFrom(dataOwnerId)\n : await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n : [dataOwnerId ?? (await this.dataOwnerApi.getCurrentDataOwnerId())]\n const decryptedData = await decryptedDataProvider(hierarchy)\n const merged = decryptedData.flatMap((x) => x.extracted)\n return this.deduplicate(merged)\n }\n\n private async tryImportKey(key: string): Promise<CryptoKey | undefined> {\n if (!/^[0-9A-Fa-f\\-]+$/g.test(key)) return undefined\n try {\n return await this.primitives.AES.importKey('raw', hex2ua(key.replace(/-/g, '')))\n } catch (e) {\n console.warn(`Could not import key ${key} as an encryption key.`, e)\n return undefined\n }\n }\n\n async doIncrementallyDecryptingKeys<E extends EncryptedEntity | EncryptedEntityStub, T>(\n entity: E,\n entityType: EntityWithDelegationTypeName,\n action: (entity: E, entityType: EntityWithDelegationTypeName, keys: { key: CryptoKey; raw: string }[]) => Promise<{ success: T } | null>\n ): Promise<{ success: T } | null> {\n const res = await this.doManyIncrementallyDecryptingKeys([entity], entityType, (e, t, ks) => action(e, t, ks))\n if (res.has(entity.id!)) {\n return { success: res.get(entity.id!)! }\n } else {\n return null\n }\n }\n\n async doManyIncrementallyDecryptingKeys<E extends EncryptedEntity | EncryptedEntityStub, T>(\n entities: E[],\n entitiesType: EntityWithDelegationTypeName,\n action: (entity: E, entityType: EntityWithDelegationTypeName, keys: { key: CryptoKey; raw: string }[]) => Promise<{ success: T } | null>\n ): Promise<Map<string, T>> {\n if (entities.length == 0) return new Map()\n let deduplicatedEntities = entities\n if (new Set(deduplicatedEntities.map((e) => e.id)).size != deduplicatedEntities.length) {\n console.error(`Duplicate entries in entities ${deduplicatedEntities.map((x) => x.id)}`)\n deduplicatedEntities = this.deduplicateById(deduplicatedEntities)\n }\n\n const hierarchy = await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n const allExtractedKeysForEntities = Object.fromEntries(deduplicatedEntities.map((x) => [x.id!, new Set<string>()] as [string, Set<string>]))\n const newlyExtractedKeysForEntities = Object.fromEntries(deduplicatedEntities.map((x) => [x.id!, new Set<string>()] as [string, Set<string>]))\n const results = new Map<string, T>()\n const remainingEntitiesById = Object.fromEntries(deduplicatedEntities.map((x) => [x.id!, x] as [string, E]))\n const importedKeysByRaw = new Map<string, CryptoKey>()\n const primitives = this.primitives\n\n async function updateExtractedKeysAndDoActionIfNecessary(\n newKeys: { [entityId: string]: string[] },\n forceUpdateOnEntitiesWithNewExtractedKeys: boolean\n ): Promise<void> {\n for (const [entityId, keys] of Object.entries(newKeys)) {\n const newlyExtractedSet = newlyExtractedKeysForEntities[entityId]\n const alreadyExtractedSet = allExtractedKeysForEntities[entityId]\n for (const k of keys) {\n if (!alreadyExtractedSet.has(k)) {\n newlyExtractedSet.add(k)\n if (!importedKeysByRaw.has(k)) {\n importedKeysByRaw.set(k, await primitives.AES.importKey('raw', hex2ua(k)))\n }\n }\n }\n }\n if (\n forceUpdateOnEntitiesWithNewExtractedKeys ||\n Object.keys(remainingEntitiesById).every((eId) => newlyExtractedKeysForEntities[eId].size > 0)\n ) {\n for (const entity of Object.values(remainingEntitiesById)) {\n const currId = entity.id!\n const currNewlyExtracted = newlyExtractedKeysForEntities[currId]\n if (currNewlyExtracted.size > 0) {\n const currAllExtracted = allExtractedKeysForEntities[currId]\n currNewlyExtracted.forEach((k) => currAllExtracted.add(k))\n currNewlyExtracted.clear()\n const actionResult = await action(\n entity,\n entitiesType,\n [...currAllExtracted].map((raw): { raw: string; key: CryptoKey } => ({\n raw: raw,\n key: importedKeysByRaw.get(raw)!,\n }))\n )\n if (actionResult != null) {\n delete remainingEntitiesById[currId]\n results.set(currId, actionResult.success)\n }\n }\n }\n }\n }\n\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptLegacyDelegations(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptSecureDelegationsUsingCache(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptSecureDelegationsUsingKnownExchangeData(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptSecureDelegationsUsingExchangeDataMap(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary({}, true)\n return results\n }\n\n private deduplicate<T>(values: T[]): T[] {\n return [...new Set(values)]\n }\n\n private throwDetailedExceptionForInvalidParameter(argName: string, argValue: any, methodName: string, methodArgs: IArguments) {\n if (argValue) return\n\n let details = '\\nMethod name: icc-crypto-x-api.' + methodName + '()\\nArguments:'\n\n if (methodArgs) {\n try {\n const argsArray = [...methodArgs]\n argsArray.forEach((arg, index) => (details += '\\n[' + index + ']: ' + JSON.stringify(arg)))\n } catch (ex) {\n details += '; a problem occured while logging arguments details: ' + ex\n }\n }\n\n throw new Error('### THIS SHOULD NOT HAPPEN: ' + argName + ' has an invalid value: ' + argValue + details)\n }\n\n private checkEmptyEncryptionMetadata(entity: EncryptedEntity) {\n this.doCheckEmptyEncryptionMetadata(entity, true)\n }\n\n hasEmptyEncryptionMetadata(entity: EncryptedEntity): boolean {\n return this.doCheckEmptyEncryptionMetadata(entity, false)\n }\n\n private doCheckEmptyEncryptionMetadata(entity: EncryptedEntity, throwErrorIfNonEmpty: boolean): boolean {\n const existingMetadata = []\n if (entity.delegations && Object.keys(entity.delegations).length) existingMetadata.push('delegations')\n if (entity.cryptedForeignKeys && Object.keys(entity.cryptedForeignKeys).length) existingMetadata.push('cryptedForeignKeys')\n if (entity.encryptionKeys && Object.keys(entity.encryptionKeys).length) existingMetadata.push('encryptionKeys')\n if (entity.secretForeignKeys && entity.secretForeignKeys.length) existingMetadata.push('secretForeignKeys')\n if (entity.securityMetadata && Object.keys(entity.securityMetadata).length) existingMetadata.push('securityMetadata')\n if (existingMetadata.length > 0) {\n if (throwErrorIfNonEmpty) {\n throw new Error(\n `Entity should have no encryption metadata on initialisation, but the following fields already have some values: ${existingMetadata}\\n` +\n JSON.stringify(entity, undefined, 2)\n )\n } else return false\n }\n return true\n }\n\n async initialiseConfidentialSecretId<T extends EncryptedEntity>(\n entity: T,\n entityType: EntityWithDelegationTypeName,\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<EntityBulkShareResult<T>[]>\n ): Promise<T | undefined> {\n if (await this.getConfidentialSecretId({ entity, type: entityType })) return undefined\n const confidentialSecretId = this.primitives.randomUuid()\n return (\n await this.simpleShareOrUpdateEncryptedEntityMetadata(\n { entity, type: entityType },\n {\n [await this.dataOwnerApi.getCurrentDataOwnerId()]: {\n shareEncryptionKeys: ShareMetadataBehaviour.NEVER,\n shareOwningEntityIds: ShareMetadataBehaviour.NEVER,\n shareSecretIds: [confidentialSecretId],\n requestedPermissions: RequestedPermissionEnum.MAX_WRITE,\n },\n },\n (request) => doRequestBulkShareOrUpdate(request)\n )\n ).updatedEntityOrThrow\n }\n\n async getConfidentialSecretId(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string | undefined> {\n return this.getConfidentialSecretIds(entity, dataOwnerId).then((x) => x[0])\n }\n\n async getConfidentialSecretIds(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n const chosenDataOwnerId = dataOwnerId ?? (await this.dataOwnerApi.getCurrentDataOwnerId())\n const dataOwnerHierarchy = await this.dataOwnerApi.getCurrentDataOwnerHierarchyIdsFrom(chosenDataOwnerId)\n const hierarchySecretIds = (await this.secretIdsForHcpHierarchyOf(entity)).filter((x) => dataOwnerHierarchy.includes(x.ownerId))\n const keysForDataOwner = hierarchySecretIds.find((x) => x.ownerId === chosenDataOwnerId)\n\n if (!keysForDataOwner) return []\n return keysForDataOwner.extracted.filter((k) => !hierarchySecretIds.some((x) => x.ownerId !== chosenDataOwnerId && x.extracted.includes(k)))\n }\n\n async getAnySecretIdSharedWithParents(entity: EncryptedEntityWithType): Promise<string | undefined> {\n return (await this.getSecretIdsSharedWithParents(entity))[0]\n }\n\n async getSecretIdsSharedWithParents(entity: EncryptedEntityWithType): Promise<string[]> {\n return (await this.secretIdsForHcpHierarchyOf(entity))[0].extracted\n }\n\n async resolveSecretIdUseOptions(entity: EncryptedEntityWithType, option: SecretIdUseOption): Promise<string[]> {\n if (option == SecretIdUseOption.UseNone) {\n return []\n } else if (option == SecretIdUseOption.UseAnyConfidential) {\n const all = await this.getConfidentialSecretIds(entity, undefined)\n if (all.length == 0) throw new Error(\"Couldn't find any confidential secret id\")\n return [all[0]]\n } else if (option == SecretIdUseOption.UseAllConfidential) {\n const all = await this.getConfidentialSecretIds(entity, undefined)\n if (all.length == 0) throw new Error(\"Couldn't find any confidential secret id\")\n return all\n } else if (option == SecretIdUseOption.UseAnySharedWithParent) {\n const all = await this.getSecretIdsSharedWithParents(entity)\n if (all.length == 0) throw new Error(\"Couldn't find any secret id shared with parent\")\n return [all[0]]\n } else if (option == SecretIdUseOption.UseAllSharedWithParent) {\n const all = await this.getSecretIdsSharedWithParents(entity)\n if (all.length == 0) throw new Error(\"Couldn't find any secret id shared with parent\")\n return all\n } else if (option instanceof SecretIdUseOption.Use) {\n return [...new Set(option.secretIds)]\n } else {\n throw new Error(`Unrecognized SecretIdUseOption ${option}`)\n }\n }\n\n private deduplicateById<E extends { id?: string }>(entities: E[]) : E[] {\n const seen = new Set<string | undefined>()\n return entities.filter((e) => {\n if (seen.has(e.id)) return false\n seen.add(e.id)\n return true\n })\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ExtendedApisUtilsImpl.js","sourceRoot":"","sources":["../../../icc-x-api/crypto/ExtendedApisUtilsImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import { EncryptedEntity, EncryptedEntityStub } from '../../icc-api/model/models'\nimport { IccDataOwnerXApi } from '../icc-data-owner-x-api'\nimport {\n b2a,\n decryptObject,\n EncryptedEntityWithType,\n EncryptedFieldsManifest,\n encryptObject,\n EntityWithDelegationTypeName,\n hex2ua,\n truncateTrailingNulls,\n ua2ab,\n ua2utf8,\n utf8_2ua,\n} from '../utils'\nimport { CryptoPrimitives } from './CryptoPrimitives'\nimport { SecurityMetadataDecryptor, SecurityMetadataType } from './SecurityMetadataDecryptor'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport { ExtendedApisUtils } from './ExtendedApisUtils'\nimport { EntityShareOrMetadataUpdateRequest } from '../../icc-api/model/requests/EntityShareOrMetadataUpdateRequest'\nimport { EntityBulkShareResult } from '../../icc-api/model/requests/EntityBulkShareResult'\nimport { EntityShareRequest } from '../../icc-api/model/requests/EntityShareRequest'\nimport { SecureDelegationsManager } from './SecureDelegationsManager'\nimport { ShareResult, ShareResultFailure, ShareResultSuccess } from '../utils/ShareResult'\nimport { ShareMetadataBehaviour } from './ShareMetadataBehaviour'\nimport { IccUserXApi } from '../icc-user-x-api'\nimport { MinimalEntityBulkShareResult } from '../../icc-api/model/requests/MinimalEntityBulkShareResult'\nimport { BulkShareOrUpdateMetadataParams, EntityRequestInformation } from '../../icc-api/model/requests/BulkShareOrUpdateMetadataParams'\nimport * as _ from 'lodash'\nimport AccessLevel = SecureDelegation.AccessLevelEnum\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport RequestedPermissionInternal = EntityShareRequest.RequestedPermissionInternal\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\nimport { SecretIdUseOption } from './SecretIdUseOption'\n\n/**\n * @internal this class is for internal use only and may be changed without notice.\n * Methods to support extended apis.\n */\nexport class ExtendedApisUtilsImpl implements ExtendedApisUtils {\n constructor(\n private readonly primitives: CryptoPrimitives,\n private readonly dataOwnerApi: IccDataOwnerXApi,\n private readonly securityMetadataDecryptor: SecurityMetadataDecryptor,\n private readonly secureDelegationsManager: SecureDelegationsManager,\n private readonly userApi: IccUserXApi,\n private readonly useParentKeys: boolean\n ) {}\n\n async encryptionKeysOf(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n return await this.decryptAndMergeHierarchy(dataOwnerId, (hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.EncryptionKey)\n )\n }\n\n async encryptionKeysForHcpHierarchyOf(entity: EncryptedEntityWithType): Promise<{ ownerId: string; extracted: string[] }[]> {\n return this.decryptHierarchy((hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.EncryptionKey)\n )\n }\n\n async secretIdsOf(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n return await this.decryptAndMergeHierarchy(dataOwnerId, (hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.SecretId)\n )\n }\n\n async secretIdsForHcpHierarchyOf(entity: EncryptedEntityWithType): Promise<{ ownerId: string; extracted: string[] }[]> {\n return this.decryptHierarchy((hierarchy) => this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.SecretId))\n }\n\n async owningEntityIdsOf(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n return await this.decryptAndMergeHierarchy(dataOwnerId, (hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.OwningEntityId)\n )\n }\n\n async owningEntityIdsForHcpHierarchyOf(entity: EncryptedEntityWithType): Promise<{ ownerId: string; extracted: string[] }[]> {\n return this.decryptHierarchy((hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.OwningEntityId)\n )\n }\n\n async hasWriteAccess(entity: EncryptedEntityWithType): Promise<boolean> {\n return (\n (await this.securityMetadataDecryptor.getEntityAccessLevel(entity.entity, await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds())) ===\n AccessLevel.WRITE\n )\n }\n\n async entityWithInitialisedEncryptedMetadata<T extends EncryptedEntity>(\n entity: T,\n entityType: EntityWithDelegationTypeName,\n owningEntity: string | undefined,\n owningEntitySecretIds: string[] | undefined,\n initialiseEncryptionKey: boolean,\n autoDelegations: { [p: string]: SecureDelegation.AccessLevelEnum },\n alternateRootDelegation: string | undefined\n ): Promise<{ updatedEntity: T; rawEncryptionKey: string | undefined; secretId: string }> {\n this.throwDetailedExceptionForInvalidParameter('entity.id', entity.id, 'entityWithInitialisedEncryptedMetadata', arguments)\n this.checkEmptyEncryptionMetadata(entity)\n const newRawKey = initialiseEncryptionKey ? await this.primitives.AES.generateCryptoKey(true) : undefined\n const newSecretId = this.primitives.randomUuid()\n return {\n updatedEntity: await this.secureDelegationsManager.entityWithInitialisedEncryptedMetadata(\n {\n ...entity,\n secretForeignKeys: owningEntitySecretIds ?? [],\n },\n entityType,\n newSecretId ? [newSecretId] : [],\n !!owningEntity ? [owningEntity] : [],\n newRawKey ? [newRawKey] : [],\n autoDelegations,\n alternateRootDelegation\n ),\n rawEncryptionKey: newRawKey,\n secretId: newSecretId,\n }\n }\n\n async bulkShareOrUpdateEncryptedEntityMetadata<T extends EncryptedEntityStub>(\n entitiesType: EntityWithDelegationTypeName,\n entitiesUpdates: {\n entity: EncryptedEntityStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n }[],\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<EntityBulkShareResult<T>[]>\n ): Promise<{\n updatedEntities: T[]\n unmodifiedEntitiesIds: string[]\n updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[]\n }> {\n const { allRequestsByEntityId, orderedRequestsInfoByEntityId, unmodifiedEntitiesIds } = await this.prepareBulkShareRequests(\n entitiesType,\n entitiesUpdates\n )\n const results =\n Object.keys(allRequestsByEntityId).length > 0 ? await doRequestBulkShareOrUpdate({ requestsByEntityId: allRequestsByEntityId }) : []\n const updatedEntities: T[] = []\n const updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[] = []\n for (const result of results) {\n if (result.updatedEntity) {\n updatedEntities.push(result.updatedEntity)\n }\n for (const [errorRequestId, error] of Object.entries(result.rejectedRequests ?? {})) {\n const requestIndex = Number(errorRequestId)\n const { delegateId, request, updatedForMigration } = orderedRequestsInfoByEntityId[result.entityId][requestIndex]\n updateErrors.push({\n entityId: result.entityId,\n delegateId,\n request,\n updatedForMigration,\n code: error.code,\n reason: error.reason,\n })\n }\n }\n // TODO implement auto-retry for failed requests if the shouldRetry flag in result.rejectedRequests is set to true\n return {\n updatedEntities,\n updateErrors,\n unmodifiedEntitiesIds,\n }\n }\n\n async bulkShareOrUpdateEncryptedEntityMetadataNoEntities(\n entitiesType: EntityWithDelegationTypeName,\n entitiesUpdates: {\n entity: EncryptedEntityStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds: string[]\n shareEncryptionKeys: string[]\n shareOwningEntityIds: string[]\n requestedPermissions: EntityShareRequest.RequestedPermissionEnum\n }\n }\n }[],\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<MinimalEntityBulkShareResult[]>\n ): Promise<{\n unmodifiedEntitiesIds: string[]\n successfulUpdates: { entityId: string; delegateId: string }[]\n updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: EntityShareRequest.RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[]\n }> {\n const { allRequestsByEntityId, orderedRequestsInfoByEntityId, unmodifiedEntitiesIds } = await this.prepareBulkShareRequests(\n entitiesType,\n entitiesUpdates\n )\n const results = await doRequestBulkShareOrUpdate({ requestsByEntityId: allRequestsByEntityId })\n const updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[] = []\n for (const result of results) {\n for (const [errorRequestId, error] of Object.entries(result.rejectedRequests ?? {})) {\n const requestIndex = Number(errorRequestId)\n const { delegateId, request, updatedForMigration } = orderedRequestsInfoByEntityId[result.entityId][requestIndex]\n updateErrors.push({\n entityId: result.entityId,\n delegateId,\n request,\n updatedForMigration,\n code: error.code,\n reason: error.reason,\n })\n }\n }\n const successfulRequests = Object.entries(allRequestsByEntityId)\n .flatMap(([entityId, requests]) => Object.keys(requests).map((delegateId) => ({ entityId, delegateId })))\n .filter(({ entityId, delegateId }) => !updateErrors.some((error) => error.entityId === entityId && error.delegateId === delegateId))\n return {\n successfulUpdates: successfulRequests,\n updateErrors,\n unmodifiedEntitiesIds,\n }\n }\n\n private async prepareBulkShareRequests(\n entitiesType: EntityWithDelegationTypeName,\n entitiesUpdates: {\n entity: EncryptedEntityStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n }[]\n ): Promise<{\n unmodifiedEntitiesIds: string[]\n allRequestsByEntityId: { [entityId: string]: EntityRequestInformation }\n orderedRequestsInfoByEntityId: {\n [entityId: string]: {\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n }[]\n }\n }> {\n if (new Set(entitiesUpdates.map((e) => e.entity.id)).size !== entitiesUpdates.length) {\n throw new Error('Duplicate requests: the same entity id is present more than once in the input')\n }\n const allRequestsByEntityId = {} as { [entityId: string]: EntityRequestInformation }\n const orderedRequestsInfoByEntityId: {\n [entityId: string]: {\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n }[]\n } = {}\n const unmodifiedEntitiesIds: string[] = []\n for (const { entity, dataForDelegates } of entitiesUpdates) {\n const entityId = entity.id\n if (!entityId) throw new Error('Share of an entity requires for the entity to already exist and have an id')\n const entityWithType = { entity, type: entitiesType }\n const currentRequests = {} as { [requestId: string]: EntityShareOrMetadataUpdateRequest }\n const currentOrderedRequests: {\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n }[] = []\n const migrationRequests = await this.makeMigrationRequestsIfNeeded(entityWithType, dataForDelegates)\n for (const [delegate, request] of Object.entries(migrationRequests)) {\n currentRequests[String(currentOrderedRequests.length)] = request\n currentOrderedRequests.push({\n delegateId: delegate,\n request: dataForDelegates[delegate],\n updatedForMigration: true,\n })\n }\n for (const [delegate, userRequest] of Object.entries(dataForDelegates)) {\n if (!migrationRequests[delegate]) {\n const request = await this.secureDelegationsManager.makeShareOrUpdateRequestParams(\n entityWithType,\n delegate,\n userRequest.shareSecretIds ?? [],\n userRequest.shareEncryptionKeys ?? [],\n userRequest.shareOwningEntityIds ?? [],\n userRequest.requestedPermissions\n )\n if (request) {\n currentRequests[String(currentOrderedRequests.length)] = request\n currentOrderedRequests.push({\n delegateId: delegate,\n request: userRequest,\n updatedForMigration: false,\n })\n }\n }\n }\n if (Object.keys(currentRequests).length > 0) {\n const existingDelegationMembersDetails = await this.securityMetadataDecryptor.getDelegationMemberDetails(entityWithType)\n const accessibleMembers = new Set(\n this.useParentKeys ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds() : [await this.dataOwnerApi.getCurrentDataOwnerId()]\n )\n const potentialParentDelegations = Object.entries(existingDelegationMembersDetails).flatMap(([k, members]) => {\n if ((!!members.delegate && accessibleMembers.has(members.delegate)) || (!!members.delegator && accessibleMembers.has(members.delegator))) {\n return [k]\n } else return []\n })\n allRequestsByEntityId[entityId] = { requests: currentRequests, potentialParentDelegations }\n orderedRequestsInfoByEntityId[entityId] = currentOrderedRequests\n } else {\n unmodifiedEntitiesIds.push(entityId)\n }\n }\n return { unmodifiedEntitiesIds, allRequestsByEntityId, orderedRequestsInfoByEntityId }\n }\n\n async simpleShareOrUpdateEncryptedEntityMetadata<T extends EncryptedEntityStub>(\n entity: { entity: T; type: EntityWithDelegationTypeName },\n delegates: {\n [p: string]: {\n shareSecretIds: string[] | undefined\n shareEncryptionKeys: ShareMetadataBehaviour | undefined\n shareOwningEntityIds: ShareMetadataBehaviour | undefined\n requestedPermissions: EntityShareRequest.RequestedPermissionEnum | undefined\n }\n },\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<EntityBulkShareResult<T>[]>\n ): Promise<ShareResult<T>> {\n const availableEncryptionKeys = await this.encryptionKeysOf(entity)\n const availableOwningEntityIds = await this.owningEntityIdsOf(entity)\n const dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds: string[]\n shareEncryptionKeys: string[]\n shareOwningEntityIds: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n } = {}\n for (const [delegateId, delegateRequests] of Object.entries(delegates)) {\n if (!availableEncryptionKeys.length && delegateRequests.shareEncryptionKeys === ShareMetadataBehaviour.REQUIRED) {\n throw new Error(\n `Entity ${JSON.stringify(\n entity\n )} has no encryption keys or the current data owner can't access any encryption keys, but sharing is required.`\n )\n }\n if (!availableOwningEntityIds.length && delegateRequests.shareOwningEntityIds === ShareMetadataBehaviour.REQUIRED) {\n throw new Error(\n `Entity ${JSON.stringify(\n entity\n )} has no owning entity ids or the current data owner can't access any owning entity ids, but sharing is required.`\n )\n }\n dataForDelegates[delegateId] = {\n shareSecretIds: delegateRequests.shareSecretIds ?? (await this.secretIdsOf(entity)),\n shareEncryptionKeys: delegateRequests.shareEncryptionKeys === ShareMetadataBehaviour.NEVER ? [] : availableEncryptionKeys,\n shareOwningEntityIds: delegateRequests.shareOwningEntityIds === ShareMetadataBehaviour.NEVER ? [] : availableOwningEntityIds,\n requestedPermissions: delegateRequests.requestedPermissions ?? RequestedPermissionEnum.MAX_WRITE,\n }\n }\n const shareResult = await this.bulkShareOrUpdateEncryptedEntityMetadata(\n entity.type,\n [\n {\n entity: entity.entity,\n dataForDelegates,\n },\n ],\n (x) => doRequestBulkShareOrUpdate(x)\n )\n if (shareResult.unmodifiedEntitiesIds.includes(entity.entity.id!)) {\n return new ShareResultSuccess(entity.entity)\n }\n if (!shareResult.updateErrors.length && shareResult.updatedEntities.length === 1) {\n return new ShareResultSuccess(shareResult.updatedEntities[0])\n }\n const requestedDelegates = new Set(Object.keys(delegates))\n const errorsOfRequestedDelegates = shareResult.updateErrors.filter((x) => requestedDelegates.has(x.delegateId))\n if (errorsOfRequestedDelegates.length === 0 && shareResult.updatedEntities.length === 1) {\n console.warn(`Errors with migration of encrypted metadata ${JSON.stringify(shareResult.updateErrors)}.`)\n return new ShareResultSuccess(shareResult.updatedEntities[0])\n }\n return new ShareResultFailure(\n shareResult.updateErrors,\n `There was an error sharing entity with id ${entity.entity.id}. Check the logs for more details.`\n )\n }\n\n private async makeMigrationRequestsIfNeeded(\n entity: EncryptedEntityWithType,\n userRequestsForEntity: {\n [delegateId: string]: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n ): Promise<{ [delegateId: string]: EntityShareOrMetadataUpdateRequest }> {\n const hierarchy = this.useParentKeys\n ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n : [await this.dataOwnerApi.getCurrentDataOwnerId()]\n const legacySecretIds = await this.securityMetadataDecryptor.decryptAllLegacyDelegations(entity.entity, hierarchy, SecurityMetadataType.SecretId)\n const legacyEncryptionKeys = await this.securityMetadataDecryptor.decryptAllLegacyDelegations(\n entity.entity,\n hierarchy,\n SecurityMetadataType.EncryptionKey\n )\n const legacyOwningEntityIds = await this.securityMetadataDecryptor.decryptAllLegacyDelegations(\n entity.entity,\n hierarchy,\n SecurityMetadataType.OwningEntityId\n )\n const res = {} as { [delegateId: string]: EntityShareOrMetadataUpdateRequest }\n const selfId = await this.dataOwnerApi.getCurrentDataOwnerId()\n for (const hierarchyMember of hierarchy) {\n const hierarchyMemberMigration = await this.makeMigrationRequestForMemberOfHierarchy(\n entity,\n selfId,\n hierarchyMember,\n userRequestsForEntity[hierarchyMember],\n legacySecretIds,\n legacyEncryptionKeys,\n legacyOwningEntityIds\n )\n if (hierarchyMemberMigration) {\n res[hierarchyMember] = hierarchyMemberMigration\n }\n }\n return res\n }\n\n private async makeMigrationRequestForMemberOfHierarchy(\n entity: EncryptedEntityWithType,\n selfId: string,\n currMemberId: string,\n userRequestForDelegate:\n | {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n | undefined,\n legacySecretIds: { decrypted: string; dataOwnersWithAccess: string[] }[],\n legacyEncryptionKeys: { decrypted: string; dataOwnersWithAccess: string[] }[],\n legacyOwningEntityIds: { decrypted: string; dataOwnersWithAccess: string[] }[]\n ): Promise<EntityShareOrMetadataUpdateRequest | undefined> {\n // This implementation is very specific from migration from delegations to secure delegations. If in future we will have to migrate from secure delegations to something else, this method may need significant changes in its logic.\n const subHierarchy = this.useParentKeys ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIdsFrom(currMemberId) : [currMemberId]\n const subHierarchySet = new Set(subHierarchy)\n const legacyAccess =\n selfId === entity.entity.id && currMemberId === selfId\n ? AccessLevel.WRITE\n : await this.securityMetadataDecryptor.getEntityLegacyDelegationAccessLevel(entity.entity, subHierarchy)\n if (!legacyAccess) return undefined\n const selfLegacySecretIds = legacySecretIds.filter((x) => x.dataOwnersWithAccess.some((d) => subHierarchySet.has(d))).map((x) => x.decrypted)\n const selfLegacyEncryptionKeys = legacyEncryptionKeys\n .filter((x) => x.dataOwnersWithAccess.some((d) => subHierarchySet.has(d)))\n .map((x) => x.decrypted)\n const selfLegacyOwningEntityIds = legacyOwningEntityIds\n .filter((x) => x.dataOwnersWithAccess.some((d) => subHierarchySet.has(d)))\n .map((x) => x.decrypted)\n let missingSecretIds: string[] = []\n let missingEncryptionKeys: string[] = []\n let missingOwningEntityIds: string[] = []\n if (selfLegacySecretIds.length > 0) {\n const currentSecretIds = new Set(\n (await this.securityMetadataDecryptor.decryptAllSecureDelegations(entity.entity, [currMemberId], SecurityMetadataType.SecretId)).map(\n (x) => x.decrypted\n )\n )\n missingSecretIds = selfLegacySecretIds.filter((x) => !currentSecretIds.has(x))\n }\n if (selfLegacyEncryptionKeys.length > 0) {\n const currentEncryptionKeys = new Set(\n (await this.securityMetadataDecryptor.decryptAllSecureDelegations(entity.entity, [currMemberId], SecurityMetadataType.EncryptionKey)).map(\n (x) => x.decrypted\n )\n )\n missingEncryptionKeys = selfLegacyEncryptionKeys.filter((x) => !currentEncryptionKeys.has(x))\n }\n if (selfLegacyOwningEntityIds.length > 0) {\n const currentOwningEntityIds = new Set(\n (await this.securityMetadataDecryptor.decryptAllSecureDelegations(entity.entity, [currMemberId], SecurityMetadataType.OwningEntityId)).map(\n (x) => x.decrypted\n )\n )\n missingOwningEntityIds = selfLegacyOwningEntityIds.filter((x) => !currentOwningEntityIds.has(x))\n }\n const mustCreateRootDelegation =\n selfId === entity.entity.id &&\n currMemberId === selfId &&\n !(await this.securityMetadataDecryptor.getEntitySecureDelegationAccessLevel(entity.entity, subHierarchy))\n if (missingSecretIds.length > 0 || missingEncryptionKeys.length > 0 || missingOwningEntityIds.length > 0 || mustCreateRootDelegation) {\n let requestedPermissions: RequestedPermissionInternal\n if (currMemberId === selfId) {\n requestedPermissions = RequestedPermissionInternal.ROOT\n } else {\n requestedPermissions = RequestedPermissionInternal.FULL_WRITE // Legacy permission if present is always write\n }\n return await this.secureDelegationsManager.makeShareOrUpdateRequestParams(\n entity,\n currMemberId,\n Array.from(new Set([...missingSecretIds, ...(userRequestForDelegate?.shareSecretIds ?? [])])),\n Array.from(new Set([...missingEncryptionKeys, ...(userRequestForDelegate?.shareEncryptionKeys ?? [])])),\n Array.from(new Set([...missingOwningEntityIds, ...(userRequestForDelegate?.shareOwningEntityIds ?? [])])),\n requestedPermissions\n )\n } else return undefined\n }\n\n async tryDecryptDataOf(\n entity: EncryptedEntityWithType,\n content: ArrayBuffer | Uint8Array,\n validator: (decryptedData: ArrayBuffer) => Promise<boolean> | undefined\n ): Promise<{ data: ArrayBuffer; wasDecrypted: boolean }> {\n const triedKeys: Set<string> = new Set()\n const result = await this.doIncrementallyDecryptingKeys(entity.entity, entity.type, async (e, t, keys) => {\n for (const k of keys) {\n if (!triedKeys.has(k.raw)) {\n triedKeys.add(k.raw)\n try {\n const decrypted = await this.primitives.AES.decrypt(k.key, content)\n if (!validator || (await validator(decrypted))) return { success: decrypted }\n } catch (e) {\n console.warn(`Error while attempting to decrypt attachment of ${entity.entity.id} with raw key ${k.raw}: ${e}`)\n }\n }\n }\n return null\n })\n if (result != null) {\n return { data: result.success, wasDecrypted: true }\n } else {\n return { data: ua2ab(content), wasDecrypted: false }\n }\n }\n\n async encryptDataOf<T extends EncryptedEntityStub>(\n entity: T,\n type: EntityWithDelegationTypeName,\n content: ArrayBuffer | Uint8Array,\n saveEntity: (entity: T) => Promise<T>\n ): Promise<{ encryptedData: ArrayBuffer; updatedEntity: T | undefined }> {\n const ensureInitialisedKeysResult = await this.ensureEncryptionKeysInitialised(entity, type)\n let updatedEntity: T | undefined\n if (!!ensureInitialisedKeysResult) {\n updatedEntity = await saveEntity(ensureInitialisedKeysResult)\n }\n const encrypted = await this.doIncrementallyDecryptingKeys(entity, type, async (e, t, keys) => {\n for (const k of keys) {\n try {\n return {\n success: {\n encryptedData: await this.primitives.AES.encrypt(k.key, content),\n updatedEntity: updatedEntity,\n },\n }\n } catch (e) {\n console.warn(`Error while encrypting with raw key ${k.raw}: ${e}`)\n }\n }\n return null\n })\n if (encrypted != null) return encrypted.success\n throw new Error(`Could not extract any valid encryption keys for entity ${JSON.stringify(entity)}.`)\n }\n\n async tryDecryptEntities<T extends EncryptedEntity>(\n entities: T[],\n entityType: EntityWithDelegationTypeName,\n constructor: (json: any) => T\n ): Promise<{ entity: T; decrypted: boolean }[]> {\n const nothingToDecryptResults = new Map<string, T>()\n for (const entity of entities) {\n const nothingToDecrypt = await decryptObject(entity, async (encrypted) => {\n return null\n })\n if (nothingToDecrypt != null) {\n nothingToDecryptResults.set(entity.id!, constructor(nothingToDecrypt))\n }\n }\n const actuallyDecryptedResults = await this.doManyIncrementallyDecryptingKeys(\n entities.filter((e) => !nothingToDecryptResults.has(e.id!)),\n entityType,\n async (entity, t, keys) => {\n // The decrypt object will try all keys on each of the sub-objects; this is intentional because even though it\n // shouldn't happen, but it is still possible that some entity could be accidentally merged badly and the merged\n // entity has multiple encryptedSelf (on different sub-entities) that use different keys.\n const decrypted = await decryptObject(entity, (encrypted) => this.tryDecryptJson(keys, encrypted, false))\n if (decrypted != null) {\n return { success: constructor(decrypted) }\n } else {\n return null\n }\n }\n )\n const res = []\n for (const entity of entities) {\n const decrypted = actuallyDecryptedResults.get(entity.id!) ?? nothingToDecryptResults.get(entity.id!)\n if (!decrypted) {\n res.push({ entity: entity, decrypted: false })\n } else {\n res.push({ entity: decrypted, decrypted: true })\n }\n }\n return res\n }\n\n async tryDecryptJson(\n potentialKeys: { key: CryptoKey; raw: string }[],\n encrypted: Uint8Array,\n truncateTrailingDecryptedNulls: boolean\n ): Promise<{} | null> {\n for (const key of potentialKeys) {\n try {\n const decrypted = await this.primitives.AES.decrypt(key.key, encrypted, key.raw)\n return JSON.parse(ua2utf8(truncateTrailingDecryptedNulls ? truncateTrailingNulls(new Uint8Array(decrypted)) : decrypted))\n } catch (e) {}\n }\n return null\n }\n\n async tryEncryptEntities<T extends EncryptedEntity>(\n entities: T[],\n entityType: EntityWithDelegationTypeName,\n fieldsToEncrypt: EncryptedFieldsManifest,\n encodeBinaryData: boolean,\n requireEncryption: boolean,\n constructor: (json: any) => T\n ): Promise<T[]> {\n const entitiesWithInitialisedEncryptionKeys: T[] = []\n for (const entity of entities) {\n entitiesWithInitialisedEncryptionKeys.push((await this.ensureEncryptionKeysInitialised(entity, entityType)) ?? entity)\n }\n const results = await this.doManyIncrementallyDecryptingKeys(entitiesWithInitialisedEncryptionKeys, entityType, async (e, t, keys) => {\n for (const k of keys) {\n try {\n const encrypted = await encryptObject(\n e,\n (obj) => {\n // TODO encoding of binary data should probably be applied to everything?\n const json = encodeBinaryData\n ? JSON.stringify(obj, (k, v) => {\n return v instanceof ArrayBuffer || ArrayBuffer.isView(v)\n ? b2a(new Uint8Array(v as ArrayBufferLike).reduce((d, b) => d + String.fromCharCode(b), ''))\n : v\n })\n : JSON.stringify(obj)\n\n return this.primitives.AES.encrypt(k.key, utf8_2ua(json), k.raw)\n },\n fieldsToEncrypt,\n entityType\n )\n return { success: constructor(encrypted) }\n } catch (e) {\n console.warn(`Error while encrypting with raw key ${k.raw}: ${e}`)\n }\n }\n return null\n })\n if (results.size != entitiesWithInitialisedEncryptionKeys.length) {\n if (requireEncryption) {\n throw new Error(\n `Could not encrypt entities ${entitiesWithInitialisedEncryptionKeys.flatMap((e): string[] => (results.has(e.id!) ? [] : [e.id!]))}`\n )\n } else {\n for (const e of entitiesWithInitialisedEncryptionKeys) {\n if (!results.has(e.id!)) {\n await encryptObject(\n e,\n async (obj: { [key: string]: any }) => {\n const hasNonEmptyValues = Object.values(obj).some(\n (v) => v !== undefined && (typeof v !== 'object' || (Array.isArray(v) && v.length > 0) || Object.keys(v).length > 0)\n )\n if (hasNonEmptyValues) {\n throw new Error(\n `Impossible to modify encrypted content of an entity if no encryption key is known.\\nEntity: ${JSON.stringify(\n e\n )}\\nTo encrypt: ${JSON.stringify(obj)}`\n )\n }\n return Promise.resolve(new ArrayBuffer(1))\n },\n fieldsToEncrypt,\n 'entity'\n )\n results.set(e.id!, e)\n }\n }\n }\n }\n return entitiesWithInitialisedEncryptionKeys.map((e) => results.get(e.id!)!)\n }\n\n async ensureEncryptionKeysInitialised<T extends EncryptedEntity>(entity: T, entityType: EntityWithDelegationTypeName): Promise<T | undefined> {\n if (this.securityMetadataDecryptor.hasAnyEncryptionKeys(entity)) return undefined\n if (!entity.rev) {\n throw new Error(\n 'New encrypted entity is lacking encryption metadata. ' +\n 'Please instantiate new entities using the `newInstance` method from the respective extended api.'\n )\n }\n /*\n * Add encryption key and share with all auto-delegates already in legacy delegations.\n * TODO disable this logic and simply throw error for post-2018 customers.\n */\n const existingDelegations = new Set(Object.keys(entity.delegations ?? {}))\n const usersWithAccessToNewKey = Object.fromEntries(\n Object.values((await this.userApi.getCurrentUser()).autoDelegations ?? {})\n .flatMap((x) => x)\n .filter((x) => existingDelegations.has(x))\n .map((x) => [x, AccessLevelEnum.WRITE])\n )\n return await this.secureDelegationsManager.entityWithInitialisedEncryptedMetadata(\n {\n ...entity,\n secretForeignKeys: entity.secretForeignKeys ?? [],\n },\n entityType,\n [],\n [],\n [await this.primitives.AES.generateCryptoKey(true)],\n usersWithAccessToNewKey,\n undefined\n )\n }\n\n private async decryptHierarchy(\n decryptedDataProvider: (dataOwners: string[]) => Promise<{ ownerId: string; extracted: string[] }[]>\n ): Promise<{ ownerId: string; extracted: string[] }[]> {\n const canDecryptOwnerIds = this.useParentKeys\n ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n : [await this.dataOwnerApi.getCurrentDataOwnerId()]\n return await decryptedDataProvider(canDecryptOwnerIds)\n }\n\n private async decryptAndMergeHierarchy(\n dataOwnerId: string | undefined,\n decryptedDataProvider: (dataOwners: string[]) => Promise<{ ownerId: string; extracted: string[] }[]>\n ): Promise<string[]> {\n const hierarchy = this.useParentKeys\n ? dataOwnerId\n ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIdsFrom(dataOwnerId)\n : await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n : [dataOwnerId ?? (await this.dataOwnerApi.getCurrentDataOwnerId())]\n const decryptedData = await decryptedDataProvider(hierarchy)\n const merged = decryptedData.flatMap((x) => x.extracted)\n return this.deduplicate(merged)\n }\n\n private async tryImportKey(key: string): Promise<CryptoKey | undefined> {\n if (!/^[0-9A-Fa-f\\-]+$/g.test(key)) return undefined\n try {\n return await this.primitives.AES.importKey('raw', hex2ua(key.replace(/-/g, '')))\n } catch (e) {\n console.warn(`Could not import key ${key} as an encryption key.`, e)\n return undefined\n }\n }\n\n async doIncrementallyDecryptingKeys<E extends EncryptedEntity | EncryptedEntityStub, T>(\n entity: E,\n entityType: EntityWithDelegationTypeName,\n action: (entity: E, entityType: EntityWithDelegationTypeName, keys: { key: CryptoKey; raw: string }[]) => Promise<{ success: T } | null>\n ): Promise<{ success: T } | null> {\n const res = await this.doManyIncrementallyDecryptingKeys([entity], entityType, (e, t, ks) => action(e, t, ks))\n if (res.has(entity.id!)) {\n return { success: res.get(entity.id!)! }\n } else {\n return null\n }\n }\n\n async doManyIncrementallyDecryptingKeys<E extends EncryptedEntity | EncryptedEntityStub, T>(\n entities: E[],\n entitiesType: EntityWithDelegationTypeName,\n action: (entity: E, entityType: EntityWithDelegationTypeName, keys: { key: CryptoKey; raw: string }[]) => Promise<{ success: T } | null>\n ): Promise<Map<string, T>> {\n if (entities.length == 0) return new Map()\n let deduplicatedEntities = entities\n if (new Set(deduplicatedEntities.map((e) => e.id)).size != deduplicatedEntities.length) {\n console.error(`Duplicate entries in entities ${deduplicatedEntities.map((x) => x.id)}`)\n deduplicatedEntities = this.deduplicateById(deduplicatedEntities)\n }\n\n const hierarchy = await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n const allExtractedKeysForEntities = Object.fromEntries(deduplicatedEntities.map((x) => [x.id!, new Set<string>()] as [string, Set<string>]))\n const newlyExtractedKeysForEntities = Object.fromEntries(deduplicatedEntities.map((x) => [x.id!, new Set<string>()] as [string, Set<string>]))\n const results = new Map<string, T>()\n const remainingEntitiesById = Object.fromEntries(deduplicatedEntities.map((x) => [x.id!, x] as [string, E]))\n const importedKeysByRaw = new Map<string, CryptoKey>()\n const primitives = this.primitives\n\n async function updateExtractedKeysAndDoActionIfNecessary(\n newKeys: { [entityId: string]: string[] },\n forceUpdateOnEntitiesWithNewExtractedKeys: boolean\n ): Promise<void> {\n for (const [entityId, keys] of Object.entries(newKeys)) {\n const newlyExtractedSet = newlyExtractedKeysForEntities[entityId]\n const alreadyExtractedSet = allExtractedKeysForEntities[entityId]\n for (const k of keys) {\n if (!alreadyExtractedSet.has(k)) {\n newlyExtractedSet.add(k)\n if (!importedKeysByRaw.has(k)) {\n importedKeysByRaw.set(k, await primitives.AES.importKey('raw', hex2ua(k)))\n }\n }\n }\n }\n if (\n forceUpdateOnEntitiesWithNewExtractedKeys ||\n Object.keys(remainingEntitiesById).every((eId) => newlyExtractedKeysForEntities[eId].size > 0)\n ) {\n for (const entity of Object.values(remainingEntitiesById)) {\n const currId = entity.id!\n const currNewlyExtracted = newlyExtractedKeysForEntities[currId]\n if (currNewlyExtracted.size > 0) {\n const currAllExtracted = allExtractedKeysForEntities[currId]\n currNewlyExtracted.forEach((k) => currAllExtracted.add(k))\n currNewlyExtracted.clear()\n const actionResult = await action(\n entity,\n entitiesType,\n [...currAllExtracted].map((raw): { raw: string; key: CryptoKey } => ({\n raw: raw,\n key: importedKeysByRaw.get(raw)!,\n }))\n )\n if (actionResult != null) {\n delete remainingEntitiesById[currId]\n results.set(currId, actionResult.success)\n }\n }\n }\n }\n }\n\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptLegacyDelegations(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptSecureDelegationsUsingCache(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptSecureDelegationsUsingKnownExchangeData(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptSecureDelegationsUsingExchangeDataMap(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary({}, true)\n return results\n }\n\n private deduplicate<T>(values: T[]): T[] {\n return [...new Set(values)]\n }\n\n private throwDetailedExceptionForInvalidParameter(argName: string, argValue: any, methodName: string, methodArgs: IArguments) {\n if (argValue) return\n\n let details = '\\nMethod name: icc-crypto-x-api.' + methodName + '()\\nArguments:'\n\n if (methodArgs) {\n try {\n const argsArray = [...methodArgs]\n argsArray.forEach((arg, index) => (details += '\\n[' + index + ']: ' + JSON.stringify(arg)))\n } catch (ex) {\n details += '; a problem occured while logging arguments details: ' + ex\n }\n }\n\n throw new Error('### THIS SHOULD NOT HAPPEN: ' + argName + ' has an invalid value: ' + argValue + details)\n }\n\n private checkEmptyEncryptionMetadata(entity: EncryptedEntity) {\n this.doCheckEmptyEncryptionMetadata(entity, true)\n }\n\n hasEmptyEncryptionMetadata(entity: EncryptedEntity): boolean {\n return this.doCheckEmptyEncryptionMetadata(entity, false)\n }\n\n private doCheckEmptyEncryptionMetadata(entity: EncryptedEntity, throwErrorIfNonEmpty: boolean): boolean {\n const existingMetadata = []\n if (entity.delegations && Object.keys(entity.delegations).length) existingMetadata.push('delegations')\n if (entity.cryptedForeignKeys && Object.keys(entity.cryptedForeignKeys).length) existingMetadata.push('cryptedForeignKeys')\n if (entity.encryptionKeys && Object.keys(entity.encryptionKeys).length) existingMetadata.push('encryptionKeys')\n if (entity.secretForeignKeys && entity.secretForeignKeys.length) existingMetadata.push('secretForeignKeys')\n if (entity.securityMetadata && Object.keys(entity.securityMetadata).length) existingMetadata.push('securityMetadata')\n if (existingMetadata.length > 0) {\n if (throwErrorIfNonEmpty) {\n throw new Error(\n `Entity should have no encryption metadata on initialisation, but the following fields already have some values: ${existingMetadata}\\n` +\n JSON.stringify(entity, undefined, 2)\n )\n } else return false\n }\n return true\n }\n\n async initialiseConfidentialSecretId<T extends EncryptedEntity>(\n entity: T,\n entityType: EntityWithDelegationTypeName,\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<EntityBulkShareResult<T>[]>\n ): Promise<T | undefined> {\n if (await this.getConfidentialSecretId({ entity, type: entityType })) return undefined\n const confidentialSecretId = this.primitives.randomUuid()\n return (\n await this.simpleShareOrUpdateEncryptedEntityMetadata(\n { entity, type: entityType },\n {\n [await this.dataOwnerApi.getCurrentDataOwnerId()]: {\n shareEncryptionKeys: ShareMetadataBehaviour.NEVER,\n shareOwningEntityIds: ShareMetadataBehaviour.NEVER,\n shareSecretIds: [confidentialSecretId],\n requestedPermissions: RequestedPermissionEnum.MAX_WRITE,\n },\n },\n (request) => doRequestBulkShareOrUpdate(request)\n )\n ).updatedEntityOrThrow\n }\n\n async getConfidentialSecretId(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string | undefined> {\n return this.getConfidentialSecretIds(entity, dataOwnerId).then((x) => x[0])\n }\n\n async getConfidentialSecretIds(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n const chosenDataOwnerId = dataOwnerId ?? (await this.dataOwnerApi.getCurrentDataOwnerId())\n const dataOwnerHierarchy = await this.dataOwnerApi.getCurrentDataOwnerHierarchyIdsFrom(chosenDataOwnerId)\n const hierarchySecretIds = (await this.secretIdsForHcpHierarchyOf(entity)).filter((x) => dataOwnerHierarchy.includes(x.ownerId))\n const keysForDataOwner = hierarchySecretIds.find((x) => x.ownerId === chosenDataOwnerId)\n\n if (!keysForDataOwner) return []\n return keysForDataOwner.extracted.filter((k) => !hierarchySecretIds.some((x) => x.ownerId !== chosenDataOwnerId && x.extracted.includes(k)))\n }\n\n async getAnySecretIdSharedWithParents(entity: EncryptedEntityWithType): Promise<string | undefined> {\n return (await this.getSecretIdsSharedWithParents(entity))[0]\n }\n\n async getSecretIdsSharedWithParents(entity: EncryptedEntityWithType): Promise<string[]> {\n return (await this.secretIdsForHcpHierarchyOf(entity))[0].extracted\n }\n\n async resolveSecretIdUseOptions(entity: EncryptedEntityWithType, option: SecretIdUseOption): Promise<string[]> {\n if (option == SecretIdUseOption.UseNone) {\n return []\n } else if (option == SecretIdUseOption.UseAnyConfidential) {\n const all = await this.getConfidentialSecretIds(entity, undefined)\n if (all.length == 0) throw new Error(\"Couldn't find any confidential secret id\")\n return [all[0]]\n } else if (option == SecretIdUseOption.UseAllConfidential) {\n const all = await this.getConfidentialSecretIds(entity, undefined)\n if (all.length == 0) throw new Error(\"Couldn't find any confidential secret id\")\n return all\n } else if (option == SecretIdUseOption.UseAnySharedWithParent) {\n const all = await this.getSecretIdsSharedWithParents(entity)\n if (all.length == 0) throw new Error(\"Couldn't find any secret id shared with parent\")\n return [all[0]]\n } else if (option == SecretIdUseOption.UseAllSharedWithParent) {\n const all = await this.getSecretIdsSharedWithParents(entity)\n if (all.length == 0) throw new Error(\"Couldn't find any secret id shared with parent\")\n return all\n } else if (option instanceof SecretIdUseOption.Use) {\n return [...new Set(option.secretIds)]\n } else {\n throw new Error(`Unrecognized SecretIdUseOption ${option}`)\n }\n }\n\n private deduplicateById<E extends { id?: string }>(entities: E[]): E[] {\n const seen = new Set<string | undefined>()\n return entities.filter((e) => {\n if (seen.has(e.id)) return false\n seen.add(e.id)\n return true\n })\n }\n}\n"]}
|
|
@@ -114,7 +114,7 @@ class KeyRecovery {
|
|
|
114
114
|
try {
|
|
115
115
|
res[fp] = {
|
|
116
116
|
privateKey: recovered,
|
|
117
|
-
publicKey: yield this.primitives.RSA.importKey('spki', (0, utils_1.hex2ua)(pub), ['encrypt'], shaVersion),
|
|
117
|
+
publicKey: yield this.primitives.RSA.importKey('spki', (0, utils_1.ua2ab)((0, utils_1.hex2ua)(pub)), ['encrypt'], shaVersion),
|
|
118
118
|
};
|
|
119
119
|
}
|
|
120
120
|
catch (e) {
|
|
@@ -156,7 +156,7 @@ class KeyRecovery {
|
|
|
156
156
|
}
|
|
157
157
|
try {
|
|
158
158
|
const combinedKey = (0, utils_1.hex2ua)(this.primitives.shamir.combine(decryptedSplits));
|
|
159
|
-
return yield this.primitives.RSA.importKey('pkcs8', combinedKey, ['decrypt'], shaVersion);
|
|
159
|
+
return yield this.primitives.RSA.importKey('pkcs8', (0, utils_1.ua2ab)(combinedKey), ['decrypt'], shaVersion);
|
|
160
160
|
}
|
|
161
161
|
catch (e) {
|
|
162
162
|
// Could be not enough splits decrypted
|
|
@@ -246,7 +246,7 @@ class KeyRecovery {
|
|
|
246
246
|
if (decryptedTransferKey != undefined)
|
|
247
247
|
return {
|
|
248
248
|
privateKey: decryptedTransferKey,
|
|
249
|
-
publicKey: yield this.primitives.RSA.importKey('spki', (0, utils_1.hex2ua)(transferData.publicKey), ['encrypt'], shaVersion),
|
|
249
|
+
publicKey: yield this.primitives.RSA.importKey('spki', (0, utils_1.ua2ab)((0, utils_1.hex2ua)(transferData.publicKey)), ['encrypt'], shaVersion),
|
|
250
250
|
};
|
|
251
251
|
}
|
|
252
252
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyRecovery.js","sourceRoot":"","sources":["../../../icc-x-api/crypto/KeyRecovery.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,+BAA2C;AAG3C,oCAAyC;AACzC,mCAA0F;AAI1F;;;GAGG;AACH,MAAa,WAAW;IACtB,YACmB,UAA4B,EAC5B,YAA8B,EAC9B,uBAAgD,EAChD,uBAAgD;QAHhD,eAAU,GAAV,UAAU,CAAkB;QAC5B,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,4BAAuB,GAAvB,uBAAuB,CAAyB;QAChD,4BAAuB,GAAvB,uBAAuB,CAAyB;IAChE,CAAC;IAEJ;;;;;;;;;OASG;IAEH;;;;;;OAMG;IACG,WAAW,CACf,SAA4B,EAC5B,SAAqD;;YAErD,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC;gBAChC,GAAG,IAAI,CAAC,YAAY,CAAC,0BAA0B,CAAC,SAAS,CAAC,SAAS,CAAC;gBACpE,GAAG,IAAI,CAAC,YAAY,CAAC,4BAA4B,CAAC,SAAS,CAAC,SAAS,CAAC;aACvE,CAAC,CAAA;YACF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;YACtD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,qBAAa,EAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAEnH,MAAM,iBAAiB,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YAC/G,IAAI,cAAc,qBAA6D,SAAS,CAAE,CAAA;YAC1F,IAAI,mBAAmB,GAAG,IAAI,CAAA;YAE9B,OAAO,gBAAgB,CAAC,IAAI,GAAG,CAAC,IAAI,mBAAmB,EAAE,CAAC;gBACxD,qEAAqE;gBACrE,mBAAmB,GAAG,KAAK,CAAA;gBAC3B,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;oBACxC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAA;oBAC5E,MAAM,kBAAkB,GAAyC,EAAE,CAAA;oBACnE,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;wBACtD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAA;wBACrE,IAAI,KAAK,EAAE,CAAC;4BACV,kBAAkB,CAAC,EAAE,CAAC,GAAG,OAAO,CAAA;wBAClC,CAAC;oBACH,CAAC;oBACD,IAAI,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC/C,mBAAmB,GAAG,IAAI,CAAA;wBAC1B,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;wBAC5E,cAAc,mCAAQ,cAAc,GAAK,kBAAkB,CAAE,CAAA;oBAC/D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC3G,CAAC;KAAA;IAED;;;OAGG;IAEW,0BAA0B,CACtC,SAA4B,EAC5B,OAA4D,EAC5D,aAA0B;;YAE1B,IACE,SAAS,CAAC,SAAS,CAAC,SAAS;gBAC7B,SAAS,CAAC,SAAS,CAAC,0BAA0B;gBAC9C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC,MAAM,GAAG,CAAC,EACtE,CAAC;gBACD,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,EAAG,CAAA;gBACtC,MAAM,YAAY,GAA8D;oBAC9E,CAAC,IAAA,qBAAa,EAAC,SAAS,CAAC,SAAS,CAAC,SAAU,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,0BAA2B;iBACjG,CAAA;gBACD,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAClC,IAAI,GAAG,CACL,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CACvI,CACF,CAAA;gBACD,MAAM,YAAY,GAA0C,EAAE,CAAA;gBAC9D,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;oBACzC,YAAY,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;gBAChF,CAAC;gBACD,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,CAAA;YAC5E,CAAC;;gBAAM,OAAO,EAAE,CAAA;QAClB,CAAC;KAAA;IAEa,iBAAiB,CAC7B,SAA4B,EAC5B,MAAiE,EACjE,YAAmD;;;YAEnD,MAAM,GAAG,GAAwD,EAAE,CAAA;YACnE,MAAM,QAAQ,GAAG,IAAA,oCAA4B,EAAC,SAAS,CAAC,SAAS,EAAE,gBAAU,CAAC,IAAI,CAAC,CAAA;YACnF,MAAM,kBAAkB,GAAG,IAAA,oCAA4B,EAAC,SAAS,CAAC,SAAS,EAAE,gBAAU,CAAC,MAAM,CAAC,CAAA;YAC/F,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjD,MAAM,GAAG,GAAG,MAAA,QAAQ,CAAC,EAAE,CAAC,mCAAI,kBAAkB,CAAC,EAAE,CAAC,CAAA;gBAClD,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;gBAChI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;oBAC1B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;oBACpF,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;wBACxB,IAAI,CAAC;4BACH,GAAG,CAAC,EAAE,CAAC,GAAG;gCACR,UAAU,EAAE,SAAS;gCACrB,SAAS,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,IAAA,cAAM,EAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;6BAC7F,CAAA;wBACH,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;wBACvD,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,2BAA2B,CAAC,CAAA;gBACnF,CAAC;YACH,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAEa,sBAAsB,CAClC,KAAuC,EACvC,YAAmD,EACnD,UAAsB;;;YAEtB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;YAC7C,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBACtB,sDAAsD;gBACtD,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;gBACzD,KAAK,MAAM,WAAW,IAAI,MAAA,YAAY,CAAC,QAAQ,CAAC,mCAAI,EAAE,EAAE,CAAC;oBACvD,IAAI,CAAC;wBACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,IAAA,cAAM,EAAC,YAAY,CAAC,CAAC,CAAA;wBACtF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAA;wBACpG,IAAI,WAAW;4BAAE,OAAO,WAAW,CAAA;oBACrC,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;gBAChB,CAAC;gBACD,OAAO,SAAS,CAAA;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM,eAAe,GAAa,EAAE,CAAA;gBACpC,KAAK,MAAM,yBAAyB,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC9D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,yBAAyB,EAAE,YAAY,EAAE,WAAW,CAAC,CAAA;oBACvG,IAAI,SAAS;wBAAE,eAAe,CAAC,IAAI,CAAC,IAAA,cAAM,EAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,eAAe;gBACjF,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,IAAA,cAAM,EAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAA;oBAC3E,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAA;gBAC3F,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,uCAAuC;oBACvC,OAAO,SAAS,CAAA;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;KAAA;IAEa,oBAAoB,CAChC,yBAA2C,EAC3C,YAAmD,EACnD,WAAmB;;;YAEnB,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,GAAG,yBAAyB,CAAA;YAC5D,KAAK,MAAM,WAAW,IAAI,MAAA,YAAY,CAAC,QAAQ,CAAC,mCAAI,EAAE,EAAE,CAAC;gBACvD,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,IAAA,cAAM,EAAC,cAAc,CAAC,CAAC,CAAA;oBACxF,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,WAAW,CAAC;wBAAE,OAAO,SAAS,CAAA;gBAC3E,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;YAChB,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;KAAA;IAEO,sBAAsB,CAAC,cAA2B,EAAE,WAAmB;QAC7E,yFAAyF;QACzF,qDAAqD;QACrD,MAAM,YAAY,GAAG,IAAA,cAAM,EAAC,cAAc,CAAC,CAAA;QAC3C,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,OAAO,KAAK,CAAA;QACpE,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACzD,OAAO,UAAU,GAAG,CAAC,IAAI,UAAU,IAAI,WAAW,CAAA;QACpD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAEa,uBAAuB,CACnC,SAA4B,EAC5B,OAA4D,EAC5D,aAA0B;;;YAE1B,MAAM,+BAA+B,mCAChC,IAAA,oCAA4B,EAAC,SAAS,CAAC,SAAS,EAAE,gBAAU,CAAC,IAAI,CAAC,GAClE,IAAA,oCAA4B,EAAC,SAAS,CAAC,SAAS,EAAE,gBAAU,CAAC,MAAM,CAAC,CACxE,CAAA;YACD,MAAM,uBAAuB,GAA+F,EAAE,CAAA;YAC9H,MAAM,CAAC,MAAM,CAAC,MAAA,SAAS,CAAC,SAAS,CAAC,YAAY,mCAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,uBAAuB,EAAE,EAAE;gBACxF,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,EAAE,EAAE;oBACrG,MAAM,qBAAqB,GAAG,IAAA,qBAAa,EAAC,mBAAmB,CAAC,CAAA,CAAC,6DAA6D;oBAC9H,IAAI,aAAa,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC;wBAC7C,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,qBAAqB,CAAC,CAAA;wBACzE,IAAI,kBAAkB,EAAE,CAAC;4BACvB,kBAAkB,CAAC,mBAAmB,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;wBACzE,CAAC;6BAAM,CAAC;4BACN,MAAM,aAAa,GAAG,+BAA+B,CAAC,qBAAqB,CAAC,CAAA;4BAC5E,IAAI,aAAa,EAAE,CAAC;gCAClB,uBAAuB,CAAC,qBAAqB,CAAC,GAAG;oCAC/C,SAAS,EAAE,aAAa;oCACxB,mBAAmB,EAAE,IAAI,GAAG,CAAC,CAAC,2BAA2B,CAAC,CAAC;iCAC5D,CAAA;4BACH,CAAC;iCAAM,CAAC;gCACN,OAAO,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAA;4BACvF,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;YACF,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,EAAG,EAAE,SAAS,CAAC,SAAS,CAAC,EAAG,EAAE,OAAO,CAAC,CAAA;YAEnH,OAAO,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,MAAM,CAAC,YAAiD,EAAE,iDAA5C,GAAG,EAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC;gBACnG,MAAM,UAAU,GAAG,MAAM,GAAG,CAAA;gBAC5B,MAAM,UAAU,GAAG,IAAA,2BAAmB,EAAC,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;gBACnF,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;oBACjB,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAA;oBAChH,IAAI,qBAAqB,IAAI,SAAS,EAAE,CAAC;wBACvC,uCAAY,UAAU,KAAE,CAAC,mBAAmB,CAAC,EAAE,qBAAqB,IAAE;oBACxE,CAAC;;wBAAM,OAAO,UAAU,CAAA;gBAC1B,CAAC;;oBAAM,OAAO,UAAU,CAAA;YAC1B,CAAC,CAAA,EAAE,OAAO,CAAC,OAAO,CAAC,EAAyD,CAAC,CAAC,CAAA;QAChF,CAAC;KAAA;IAEa,sBAAsB,CAClC,YAAqE,EACrE,qBAAkC,EAClC,UAAsB;;YAEtB,KAAK,MAAM,oBAAoB,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;gBACpE,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAA;gBACtH,IAAI,oBAAoB,IAAI,SAAS;oBACnC,OAAO;wBACL,UAAU,EAAE,oBAAoB;wBAChC,SAAS,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,IAAA,cAAM,EAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;qBAChH,CAAA;YACL,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;KAAA;IAED,qFAAqF;IACvE,qBAAqB,CACjC,oBAA4B,EAAE,gBAAgB;IAC9C,YAAyB,EACzB,UAAsB;;YAEtB,MAAM,iBAAiB,GAAG,IAAA,cAAM,EAAC,oBAAoB,CAAC,CAAA;YACtD,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACH,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAA;oBAC1F,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAA;oBAC5G,IAAI,kBAAkB,IAAI,SAAS;wBAAE,OAAO,kBAAkB,CAAA;gBAChE,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,0EAA0E;gBAC5E,CAAC;YACH,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;KAAA;IAED,6EAA6E;IAC/D,eAAe,CAC3B,IAAY,EACZ,EAAU,EACV,uBAA4E;;YAE5E,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,sBAAsB,CAC/E,MAAM,IAAI,CAAC,uBAAuB,CAAC,2BAA2B,CAAC,IAAI,EAAE,EAAE,CAAC,EACxE,uBAAuB,CACxB,CAAA;YACD,MAAM,yBAAyB,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,sBAAsB,CACzF,MAAM,IAAI,CAAC,uBAAuB,CAAC,sCAAsC,CAAC,IAAI,EAAE,EAAE,CAAC,EACnF,uBAAuB,CACxB,CAAA;YACD,OAAO,CAAC,GAAG,eAAe,CAAC,qBAAqB,EAAE,GAAG,yBAAyB,CAAC,qBAAqB,CAAC,CAAA;QACvG,CAAC;KAAA;CACF;AA5RD,kCA4RC","sourcesContent":["import { IccDataOwnerXApi } from '../icc-data-owner-x-api'\nimport { KeyPair, ShaVersion } from './RSA'\nimport { CryptoPrimitives } from './CryptoPrimitives'\nimport { BaseExchangeKeysManager } from './BaseExchangeKeysManager'\nimport { hex2ua, ua2hex } from '../utils'\nimport { fingerprintToPublicKeysMapOf, fingerprintV1, getShaVersionForKey } from './utils'\nimport { BaseExchangeDataManager } from './BaseExchangeDataManager'\nimport { DataOwnerWithType } from '../../icc-api/model/DataOwnerWithType'\n\n/**\n * @internal this class is intended only for internal use and may be changed without notice.\n *\n */\nexport class KeyRecovery {\n constructor(\n private readonly primitives: CryptoPrimitives,\n private readonly dataOwnerApi: IccDataOwnerXApi,\n private readonly baseExchangeKeysManager: BaseExchangeKeysManager,\n private readonly baseExchangeDataManager: BaseExchangeDataManager\n ) {}\n\n /*TODO\n * Currently there is no support for the recovery of signature keys. When implementing a recovery solution we should consider:\n * - unlike decryption keys signature keys are completely useless if not verified.\n * - we are fine losing the signature private key, but if we could recover and verify the public key it would reduce the inconveniences on user and\n * limit the creation of new exchange data\n * - We can't guarantee that encrypted data in iCure was put there by us... unless we put a piece of the private key as well: we can save an\n * hash of (any verification public key + any encryption private key) in the data owner: only the owner of the private key can create this hash,\n * so if the data owner can recreate the hash with one of his recovered and verified encryption private keys then the signature public key will\n * for sure be safe as well.\n */\n\n /**\n * Attempt to recover private keys of a data owner using all available key recovery methods and all available private keys. The method will\n * automatically try to use newly recovered key pairs to recover additional key pairs.\n * @param dataOwner a data owner.\n * @param knownKeys keys available for the data owner.\n * @return new key pairs (exclude already known pairs) which could be recovered using the known keys.\n */\n async recoverKeys(\n dataOwner: DataOwnerWithType,\n knownKeys: { [pubKeyFp: string]: KeyPair<CryptoKey> }\n ): Promise<{ [pubKeyFp: string]: KeyPair<CryptoKey> }> {\n const selfPublicKeys = Array.from([\n ...this.dataOwnerApi.getHexPublicKeysWithSha1Of(dataOwner.dataOwner),\n ...this.dataOwnerApi.getHexPublicKeysWithSha256Of(dataOwner.dataOwner),\n ])\n const knownKeysFpSet = new Set(Object.keys(knownKeys))\n const missingKeysFpSet = new Set(selfPublicKeys.map((x) => fingerprintV1(x)).filter((x) => !knownKeysFpSet.has(x)))\n\n const recoveryFunctions = [this.recoverFromTransferKeys.bind(this), this.recoverFromShamirSplitKeys.bind(this)]\n let allPrivateKeys: { [pubKeyFingerprint: string]: KeyPair<CryptoKey> } = { ...knownKeys }\n let foundNewPrivateKeys = true\n\n while (missingKeysFpSet.size > 0 && foundNewPrivateKeys) {\n // TODO for each recovered verify correct association with public key\n foundNewPrivateKeys = false\n for (const recover of recoveryFunctions) {\n const recovered = await recover(dataOwner, allPrivateKeys, missingKeysFpSet)\n const validatedRecovered: { [fp: string]: KeyPair<CryptoKey> } = {}\n for (const [fp, keyPair] of Object.entries(recovered)) {\n const valid = await this.primitives.RSA.checkKeyPairValidity(keyPair)\n if (valid) {\n validatedRecovered[fp] = keyPair\n }\n }\n if (Object.keys(validatedRecovered).length > 0) {\n foundNewPrivateKeys = true\n Object.keys(validatedRecovered).forEach((fp) => missingKeysFpSet.delete(fp))\n allPrivateKeys = { ...allPrivateKeys, ...validatedRecovered }\n }\n }\n }\n\n return Object.fromEntries(Object.entries(allPrivateKeys).filter(([keyFp]) => !knownKeysFpSet.has(keyFp)))\n }\n\n /*TODO?\n * Ask access back suggestion: if by getting access back to an exchange key with another data owner I may recover additional keys we could suggest\n * to ask for access back to that data owner.\n */\n\n private async recoverFromShamirSplitKeys(\n dataOwner: DataOwnerWithType,\n allKeys: { [pubKeyFingerprint: string]: KeyPair<CryptoKey> },\n missingKeysFp: Set<string>\n ): Promise<{ [pubKeyFingerprint: string]: KeyPair<CryptoKey> }> {\n if (\n dataOwner.dataOwner.publicKey &&\n dataOwner.dataOwner.privateKeyShamirPartitions &&\n Object.keys(dataOwner.dataOwner.privateKeyShamirPartitions).length > 0\n ) {\n const selfId = dataOwner.dataOwner.id!\n const shamirSplits: { [keyPairFp: string]: { [delegateId: string]: string } } = {\n [fingerprintV1(dataOwner.dataOwner.publicKey!)]: dataOwner.dataOwner.privateKeyShamirPartitions!,\n }\n const delegatesOfSplits = Array.from(\n new Set(\n Object.entries(shamirSplits).flatMap(([splitKeyFp, splitKeyData]) => (missingKeysFp.has(splitKeyFp) ? Object.keys(splitKeyData) : []))\n )\n )\n const exchangeKeys: { [delegateId: string]: CryptoKey[] } = {}\n for (const delegate of delegatesOfSplits) {\n exchangeKeys[delegate] = await this.getExchangeKeys(selfId, delegate, allKeys)\n }\n return await this.recoverWithSplits(dataOwner, shamirSplits, exchangeKeys)\n } else return {}\n }\n\n private async recoverWithSplits(\n dataOwner: DataOwnerWithType,\n splits: { [keyPairFp: string]: { [delegateId: string]: string } },\n exchangeKeys: { [delegateId: string]: CryptoKey[] }\n ): Promise<{ [pubKeyFingerprint: string]: KeyPair<CryptoKey> }> {\n const res: { [pubKeyFingerprint: string]: KeyPair<CryptoKey> } = {}\n const keysByFp = fingerprintToPublicKeysMapOf(dataOwner.dataOwner, ShaVersion.Sha1)\n const keysByFpWithSha256 = fingerprintToPublicKeysMapOf(dataOwner.dataOwner, ShaVersion.Sha256)\n for (const [fp, split] of Object.entries(splits)) {\n const pub = keysByFp[fp] ?? keysByFpWithSha256[fp]\n const shaVersion = !!pub && !!keysByFp[fp] ? ShaVersion.Sha1 : !!pub && !!keysByFpWithSha256[fp] ? ShaVersion.Sha256 : undefined\n if (!!pub && !!shaVersion) {\n const recovered = await this.tryRecoverSplitPrivate(split, exchangeKeys, shaVersion)\n if (recovered) {\n const pub = keysByFp[fp]\n try {\n res[fp] = {\n privateKey: recovered,\n publicKey: await this.primitives.RSA.importKey('spki', hex2ua(pub), ['encrypt'], shaVersion),\n }\n } catch (e) {\n console.warn(`Failed to import public key ${pub}`, e)\n }\n }\n } else {\n console.warn(`Missing public key for fingerprint ${fp} of recovered shamir key.`)\n }\n }\n return res\n }\n\n private async tryRecoverSplitPrivate(\n split: { [delegateId: string]: string },\n exchangeKeys: { [delegateId: string]: CryptoKey[] },\n shaVersion: ShaVersion\n ): Promise<CryptoKey | undefined> {\n const splitsCount = Object.keys(split).length\n if (splitsCount === 1) {\n // Not sure about the key nor if the key is accessible\n const [delegate, encryptedKey] = Object.entries(split)[0]\n for (const exchangeKey of exchangeKeys[delegate] ?? []) {\n try {\n const decrypted = await this.primitives.AES.decrypt(exchangeKey, hex2ua(encryptedKey))\n const importedKey = await this.primitives.RSA.importKey('pkcs8', decrypted, ['decrypt'], shaVersion)\n if (importedKey) return importedKey\n } catch (e) {}\n }\n return undefined\n } else {\n const decryptedSplits: string[] = []\n for (const delegateAndEncryptedSplit of Object.entries(split)) {\n const decrypted = await this.tryDecryptSplitPiece(delegateAndEncryptedSplit, exchangeKeys, splitsCount)\n if (decrypted) decryptedSplits.push(ua2hex(decrypted).slice(1)) // Drop padding\n }\n try {\n const combinedKey = hex2ua(this.primitives.shamir.combine(decryptedSplits))\n return await this.primitives.RSA.importKey('pkcs8', combinedKey, ['decrypt'], shaVersion)\n } catch (e) {\n // Could be not enough splits decrypted\n return undefined\n }\n }\n }\n\n private async tryDecryptSplitPiece(\n delegateAndEncryptedSplit: [string, string],\n exchangeKeys: { [delegateId: string]: CryptoKey[] },\n splitsCount: number\n ): Promise<ArrayBuffer | undefined> {\n const [delegate, encryptedPiece] = delegateAndEncryptedSplit\n for (const exchangeKey of exchangeKeys[delegate] ?? []) {\n try {\n const decrypted = await this.primitives.AES.decrypt(exchangeKey, hex2ua(encryptedPiece))\n if (this.validateDecryptedSplit(decrypted, splitsCount)) return decrypted\n } catch (e) {}\n }\n return undefined\n }\n\n private validateDecryptedSplit(decryptedSplit: ArrayBuffer, splitsCount: number): boolean {\n // Normally shamir split starts with 8 followed by the index of the split in hexadecimal.\n // However, we pad with an extra 'f' at the beginning\n const decryptedHex = ua2hex(decryptedSplit)\n if (decryptedHex[0] !== 'f' || decryptedHex[1] !== '8') return false\n try {\n const splitIndex = parseInt(decryptedHex.slice(2, 4), 16)\n return splitIndex > 0 && splitIndex <= splitsCount\n } catch (e) {\n return false\n }\n }\n\n private async recoverFromTransferKeys(\n dataOwner: DataOwnerWithType,\n allKeys: { [pubKeyFingerprint: string]: KeyPair<CryptoKey> },\n missingKeysFp: Set<string>\n ): Promise<{ [pubKeyFingerprint: string]: KeyPair<CryptoKey> }> {\n const publicKeyFingerprintToPublicKey = {\n ...fingerprintToPublicKeysMapOf(dataOwner.dataOwner, ShaVersion.Sha1),\n ...fingerprintToPublicKeysMapOf(dataOwner.dataOwner, ShaVersion.Sha256),\n }\n const missingKeysTransferData: { [recoverableKeyPubFp: string]: { publicKey: string; encryptedPrivateKey: Set<string> } } = {}\n Object.values(dataOwner.dataOwner.transferKeys ?? {}).forEach((transferKeysByEncryptor) => {\n Object.entries(transferKeysByEncryptor).forEach(([transferToPublicKey, transferPrivateKeyEncrypted]) => {\n const transferToPublicKeyFp = fingerprintV1(transferToPublicKey) // We are not sure if transfer public key will be a fp or not\n if (missingKeysFp.has(transferToPublicKeyFp)) {\n const existingEntryValue = missingKeysTransferData[transferToPublicKeyFp]\n if (existingEntryValue) {\n existingEntryValue.encryptedPrivateKey.add(transferPrivateKeyEncrypted)\n } else {\n const fullPublicKey = publicKeyFingerprintToPublicKey[transferToPublicKeyFp]\n if (fullPublicKey) {\n missingKeysTransferData[transferToPublicKeyFp] = {\n publicKey: fullPublicKey,\n encryptedPrivateKey: new Set([transferPrivateKeyEncrypted]),\n }\n } else {\n console.warn('Invalid data owner: there is a transfer key for an unknown public key')\n }\n }\n }\n })\n })\n const availableExchangeKeys = await this.getExchangeKeys(dataOwner.dataOwner.id!, dataOwner.dataOwner.id!, allKeys)\n\n return Object.entries(missingKeysTransferData).reduce(async (acc, [recoverableKeyPubFp, transferData]) => {\n const awaitedAcc = await acc\n const shaVersion = getShaVersionForKey(dataOwner.dataOwner, transferData.publicKey)\n if (!!shaVersion) {\n const decryptedTransferData = await this.tryDecryptTransferData(transferData, availableExchangeKeys, shaVersion)\n if (decryptedTransferData != undefined) {\n return { ...awaitedAcc, [recoverableKeyPubFp]: decryptedTransferData }\n } else return awaitedAcc\n } else return awaitedAcc\n }, Promise.resolve({} as { [pubKeyFingerprint: string]: KeyPair<CryptoKey> }))\n }\n\n private async tryDecryptTransferData(\n transferData: { publicKey: string; encryptedPrivateKey: Set<string> },\n availableExchangeKeys: CryptoKey[],\n shaVersion: ShaVersion\n ): Promise<KeyPair<CryptoKey> | undefined> {\n for (const encryptedTransferKey of transferData.encryptedPrivateKey) {\n const decryptedTransferKey = await this.tryDecryptTransferKey(encryptedTransferKey, availableExchangeKeys, shaVersion)\n if (decryptedTransferKey != undefined)\n return {\n privateKey: decryptedTransferKey,\n publicKey: await this.primitives.RSA.importKey('spki', hex2ua(transferData.publicKey), ['encrypt'], shaVersion),\n }\n }\n return undefined\n }\n\n // attempt to decrypt a transfer key in pkcs8 using any of the provided exchange keys\n private async tryDecryptTransferKey(\n encryptedTransferKey: string, // in hex format\n exchangeKeys: CryptoKey[],\n shaVersion: ShaVersion\n ): Promise<CryptoKey | undefined> {\n const encryptedKeyBytes = hex2ua(encryptedTransferKey)\n for (const exchangeKey of exchangeKeys) {\n try {\n const decryptedKeyData = await this.primitives.AES.decrypt(exchangeKey, encryptedKeyBytes)\n const importedPrivateKey = await this.primitives.RSA.importPrivateKey('pkcs8', decryptedKeyData, shaVersion)\n if (importedPrivateKey != undefined) return importedPrivateKey\n } catch (e) {\n /* failure is a valid possibility: we don't know the correct key to use */\n }\n }\n return undefined\n }\n\n // Get exchange keys from aes exchange keys / hc party keys and exchange data\n private async getExchangeKeys(\n from: string,\n to: string,\n availableDecryptionKeys: { [pubKeyFingerprint: string]: KeyPair<CryptoKey> }\n ): Promise<CryptoKey[]> {\n const aesExchangeKeys = await this.baseExchangeKeysManager.tryDecryptExchangeKeys(\n await this.baseExchangeKeysManager.getEncryptedExchangeKeysFor(from, to),\n availableDecryptionKeys\n )\n const decryptedExchangeDataKeys = await this.baseExchangeDataManager.tryDecryptExchangeKeys(\n await this.baseExchangeDataManager.getExchangeDataByDelegatorDelegatePair(from, to),\n availableDecryptionKeys\n )\n return [...aesExchangeKeys.successfulDecryptions, ...decryptedExchangeDataKeys.successfulDecryptions]\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"KeyRecovery.js","sourceRoot":"","sources":["../../../icc-x-api/crypto/KeyRecovery.ts"],"names":[],"mappings":"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","sourcesContent":["import { IccDataOwnerXApi } from '../icc-data-owner-x-api'\nimport { KeyPair, ShaVersion } from './RSA'\nimport { CryptoPrimitives } from './CryptoPrimitives'\nimport { BaseExchangeKeysManager } from './BaseExchangeKeysManager'\nimport { hex2ua, ua2ab, ua2hex } from '../utils'\nimport { fingerprintToPublicKeysMapOf, fingerprintV1, getShaVersionForKey } from './utils'\nimport { BaseExchangeDataManager } from './BaseExchangeDataManager'\nimport { DataOwnerWithType } from '../../icc-api/model/DataOwnerWithType'\n\n/**\n * @internal this class is intended only for internal use and may be changed without notice.\n *\n */\nexport class KeyRecovery {\n constructor(\n private readonly primitives: CryptoPrimitives,\n private readonly dataOwnerApi: IccDataOwnerXApi,\n private readonly baseExchangeKeysManager: BaseExchangeKeysManager,\n private readonly baseExchangeDataManager: BaseExchangeDataManager\n ) {}\n\n /*TODO\n * Currently there is no support for the recovery of signature keys. When implementing a recovery solution we should consider:\n * - unlike decryption keys signature keys are completely useless if not verified.\n * - we are fine losing the signature private key, but if we could recover and verify the public key it would reduce the inconveniences on user and\n * limit the creation of new exchange data\n * - We can't guarantee that encrypted data in iCure was put there by us... unless we put a piece of the private key as well: we can save an\n * hash of (any verification public key + any encryption private key) in the data owner: only the owner of the private key can create this hash,\n * so if the data owner can recreate the hash with one of his recovered and verified encryption private keys then the signature public key will\n * for sure be safe as well.\n */\n\n /**\n * Attempt to recover private keys of a data owner using all available key recovery methods and all available private keys. The method will\n * automatically try to use newly recovered key pairs to recover additional key pairs.\n * @param dataOwner a data owner.\n * @param knownKeys keys available for the data owner.\n * @return new key pairs (exclude already known pairs) which could be recovered using the known keys.\n */\n async recoverKeys(\n dataOwner: DataOwnerWithType,\n knownKeys: { [pubKeyFp: string]: KeyPair<CryptoKey> }\n ): Promise<{ [pubKeyFp: string]: KeyPair<CryptoKey> }> {\n const selfPublicKeys = Array.from([\n ...this.dataOwnerApi.getHexPublicKeysWithSha1Of(dataOwner.dataOwner),\n ...this.dataOwnerApi.getHexPublicKeysWithSha256Of(dataOwner.dataOwner),\n ])\n const knownKeysFpSet = new Set(Object.keys(knownKeys))\n const missingKeysFpSet = new Set(selfPublicKeys.map((x) => fingerprintV1(x)).filter((x) => !knownKeysFpSet.has(x)))\n\n const recoveryFunctions = [this.recoverFromTransferKeys.bind(this), this.recoverFromShamirSplitKeys.bind(this)]\n let allPrivateKeys: { [pubKeyFingerprint: string]: KeyPair<CryptoKey> } = { ...knownKeys }\n let foundNewPrivateKeys = true\n\n while (missingKeysFpSet.size > 0 && foundNewPrivateKeys) {\n // TODO for each recovered verify correct association with public key\n foundNewPrivateKeys = false\n for (const recover of recoveryFunctions) {\n const recovered = await recover(dataOwner, allPrivateKeys, missingKeysFpSet)\n const validatedRecovered: { [fp: string]: KeyPair<CryptoKey> } = {}\n for (const [fp, keyPair] of Object.entries(recovered)) {\n const valid = await this.primitives.RSA.checkKeyPairValidity(keyPair)\n if (valid) {\n validatedRecovered[fp] = keyPair\n }\n }\n if (Object.keys(validatedRecovered).length > 0) {\n foundNewPrivateKeys = true\n Object.keys(validatedRecovered).forEach((fp) => missingKeysFpSet.delete(fp))\n allPrivateKeys = { ...allPrivateKeys, ...validatedRecovered }\n }\n }\n }\n\n return Object.fromEntries(Object.entries(allPrivateKeys).filter(([keyFp]) => !knownKeysFpSet.has(keyFp)))\n }\n\n /*TODO?\n * Ask access back suggestion: if by getting access back to an exchange key with another data owner I may recover additional keys we could suggest\n * to ask for access back to that data owner.\n */\n\n private async recoverFromShamirSplitKeys(\n dataOwner: DataOwnerWithType,\n allKeys: { [pubKeyFingerprint: string]: KeyPair<CryptoKey> },\n missingKeysFp: Set<string>\n ): Promise<{ [pubKeyFingerprint: string]: KeyPair<CryptoKey> }> {\n if (\n dataOwner.dataOwner.publicKey &&\n dataOwner.dataOwner.privateKeyShamirPartitions &&\n Object.keys(dataOwner.dataOwner.privateKeyShamirPartitions).length > 0\n ) {\n const selfId = dataOwner.dataOwner.id!\n const shamirSplits: { [keyPairFp: string]: { [delegateId: string]: string } } = {\n [fingerprintV1(dataOwner.dataOwner.publicKey!)]: dataOwner.dataOwner.privateKeyShamirPartitions!,\n }\n const delegatesOfSplits = Array.from(\n new Set(\n Object.entries(shamirSplits).flatMap(([splitKeyFp, splitKeyData]) => (missingKeysFp.has(splitKeyFp) ? Object.keys(splitKeyData) : []))\n )\n )\n const exchangeKeys: { [delegateId: string]: CryptoKey[] } = {}\n for (const delegate of delegatesOfSplits) {\n exchangeKeys[delegate] = await this.getExchangeKeys(selfId, delegate, allKeys)\n }\n return await this.recoverWithSplits(dataOwner, shamirSplits, exchangeKeys)\n } else return {}\n }\n\n private async recoverWithSplits(\n dataOwner: DataOwnerWithType,\n splits: { [keyPairFp: string]: { [delegateId: string]: string } },\n exchangeKeys: { [delegateId: string]: CryptoKey[] }\n ): Promise<{ [pubKeyFingerprint: string]: KeyPair<CryptoKey> }> {\n const res: { [pubKeyFingerprint: string]: KeyPair<CryptoKey> } = {}\n const keysByFp = fingerprintToPublicKeysMapOf(dataOwner.dataOwner, ShaVersion.Sha1)\n const keysByFpWithSha256 = fingerprintToPublicKeysMapOf(dataOwner.dataOwner, ShaVersion.Sha256)\n for (const [fp, split] of Object.entries(splits)) {\n const pub = keysByFp[fp] ?? keysByFpWithSha256[fp]\n const shaVersion = !!pub && !!keysByFp[fp] ? ShaVersion.Sha1 : !!pub && !!keysByFpWithSha256[fp] ? ShaVersion.Sha256 : undefined\n if (!!pub && !!shaVersion) {\n const recovered = await this.tryRecoverSplitPrivate(split, exchangeKeys, shaVersion)\n if (recovered) {\n const pub = keysByFp[fp]\n try {\n res[fp] = {\n privateKey: recovered,\n publicKey: await this.primitives.RSA.importKey('spki', ua2ab(hex2ua(pub)), ['encrypt'], shaVersion),\n }\n } catch (e) {\n console.warn(`Failed to import public key ${pub}`, e)\n }\n }\n } else {\n console.warn(`Missing public key for fingerprint ${fp} of recovered shamir key.`)\n }\n }\n return res\n }\n\n private async tryRecoverSplitPrivate(\n split: { [delegateId: string]: string },\n exchangeKeys: { [delegateId: string]: CryptoKey[] },\n shaVersion: ShaVersion\n ): Promise<CryptoKey | undefined> {\n const splitsCount = Object.keys(split).length\n if (splitsCount === 1) {\n // Not sure about the key nor if the key is accessible\n const [delegate, encryptedKey] = Object.entries(split)[0]\n for (const exchangeKey of exchangeKeys[delegate] ?? []) {\n try {\n const decrypted = await this.primitives.AES.decrypt(exchangeKey, hex2ua(encryptedKey))\n const importedKey = await this.primitives.RSA.importKey('pkcs8', decrypted, ['decrypt'], shaVersion)\n if (importedKey) return importedKey\n } catch (e) {}\n }\n return undefined\n } else {\n const decryptedSplits: string[] = []\n for (const delegateAndEncryptedSplit of Object.entries(split)) {\n const decrypted = await this.tryDecryptSplitPiece(delegateAndEncryptedSplit, exchangeKeys, splitsCount)\n if (decrypted) decryptedSplits.push(ua2hex(decrypted).slice(1)) // Drop padding\n }\n try {\n const combinedKey = hex2ua(this.primitives.shamir.combine(decryptedSplits))\n return await this.primitives.RSA.importKey('pkcs8', ua2ab(combinedKey), ['decrypt'], shaVersion)\n } catch (e) {\n // Could be not enough splits decrypted\n return undefined\n }\n }\n }\n\n private async tryDecryptSplitPiece(\n delegateAndEncryptedSplit: [string, string],\n exchangeKeys: { [delegateId: string]: CryptoKey[] },\n splitsCount: number\n ): Promise<ArrayBuffer | undefined> {\n const [delegate, encryptedPiece] = delegateAndEncryptedSplit\n for (const exchangeKey of exchangeKeys[delegate] ?? []) {\n try {\n const decrypted = await this.primitives.AES.decrypt(exchangeKey, hex2ua(encryptedPiece))\n if (this.validateDecryptedSplit(decrypted, splitsCount)) return decrypted\n } catch (e) {}\n }\n return undefined\n }\n\n private validateDecryptedSplit(decryptedSplit: ArrayBuffer, splitsCount: number): boolean {\n // Normally shamir split starts with 8 followed by the index of the split in hexadecimal.\n // However, we pad with an extra 'f' at the beginning\n const decryptedHex = ua2hex(decryptedSplit)\n if (decryptedHex[0] !== 'f' || decryptedHex[1] !== '8') return false\n try {\n const splitIndex = parseInt(decryptedHex.slice(2, 4), 16)\n return splitIndex > 0 && splitIndex <= splitsCount\n } catch (e) {\n return false\n }\n }\n\n private async recoverFromTransferKeys(\n dataOwner: DataOwnerWithType,\n allKeys: { [pubKeyFingerprint: string]: KeyPair<CryptoKey> },\n missingKeysFp: Set<string>\n ): Promise<{ [pubKeyFingerprint: string]: KeyPair<CryptoKey> }> {\n const publicKeyFingerprintToPublicKey = {\n ...fingerprintToPublicKeysMapOf(dataOwner.dataOwner, ShaVersion.Sha1),\n ...fingerprintToPublicKeysMapOf(dataOwner.dataOwner, ShaVersion.Sha256),\n }\n const missingKeysTransferData: { [recoverableKeyPubFp: string]: { publicKey: string; encryptedPrivateKey: Set<string> } } = {}\n Object.values(dataOwner.dataOwner.transferKeys ?? {}).forEach((transferKeysByEncryptor) => {\n Object.entries(transferKeysByEncryptor).forEach(([transferToPublicKey, transferPrivateKeyEncrypted]) => {\n const transferToPublicKeyFp = fingerprintV1(transferToPublicKey) // We are not sure if transfer public key will be a fp or not\n if (missingKeysFp.has(transferToPublicKeyFp)) {\n const existingEntryValue = missingKeysTransferData[transferToPublicKeyFp]\n if (existingEntryValue) {\n existingEntryValue.encryptedPrivateKey.add(transferPrivateKeyEncrypted)\n } else {\n const fullPublicKey = publicKeyFingerprintToPublicKey[transferToPublicKeyFp]\n if (fullPublicKey) {\n missingKeysTransferData[transferToPublicKeyFp] = {\n publicKey: fullPublicKey,\n encryptedPrivateKey: new Set([transferPrivateKeyEncrypted]),\n }\n } else {\n console.warn('Invalid data owner: there is a transfer key for an unknown public key')\n }\n }\n }\n })\n })\n const availableExchangeKeys = await this.getExchangeKeys(dataOwner.dataOwner.id!, dataOwner.dataOwner.id!, allKeys)\n\n return Object.entries(missingKeysTransferData).reduce(async (acc, [recoverableKeyPubFp, transferData]) => {\n const awaitedAcc = await acc\n const shaVersion = getShaVersionForKey(dataOwner.dataOwner, transferData.publicKey)\n if (!!shaVersion) {\n const decryptedTransferData = await this.tryDecryptTransferData(transferData, availableExchangeKeys, shaVersion)\n if (decryptedTransferData != undefined) {\n return { ...awaitedAcc, [recoverableKeyPubFp]: decryptedTransferData }\n } else return awaitedAcc\n } else return awaitedAcc\n }, Promise.resolve({} as { [pubKeyFingerprint: string]: KeyPair<CryptoKey> }))\n }\n\n private async tryDecryptTransferData(\n transferData: { publicKey: string; encryptedPrivateKey: Set<string> },\n availableExchangeKeys: CryptoKey[],\n shaVersion: ShaVersion\n ): Promise<KeyPair<CryptoKey> | undefined> {\n for (const encryptedTransferKey of transferData.encryptedPrivateKey) {\n const decryptedTransferKey = await this.tryDecryptTransferKey(encryptedTransferKey, availableExchangeKeys, shaVersion)\n if (decryptedTransferKey != undefined)\n return {\n privateKey: decryptedTransferKey,\n publicKey: await this.primitives.RSA.importKey('spki', ua2ab(hex2ua(transferData.publicKey)), ['encrypt'], shaVersion),\n }\n }\n return undefined\n }\n\n // attempt to decrypt a transfer key in pkcs8 using any of the provided exchange keys\n private async tryDecryptTransferKey(\n encryptedTransferKey: string, // in hex format\n exchangeKeys: CryptoKey[],\n shaVersion: ShaVersion\n ): Promise<CryptoKey | undefined> {\n const encryptedKeyBytes = hex2ua(encryptedTransferKey)\n for (const exchangeKey of exchangeKeys) {\n try {\n const decryptedKeyData = await this.primitives.AES.decrypt(exchangeKey, encryptedKeyBytes)\n const importedPrivateKey = await this.primitives.RSA.importPrivateKey('pkcs8', decryptedKeyData, shaVersion)\n if (importedPrivateKey != undefined) return importedPrivateKey\n } catch (e) {\n /* failure is a valid possibility: we don't know the correct key to use */\n }\n }\n return undefined\n }\n\n // Get exchange keys from aes exchange keys / hc party keys and exchange data\n private async getExchangeKeys(\n from: string,\n to: string,\n availableDecryptionKeys: { [pubKeyFingerprint: string]: KeyPair<CryptoKey> }\n ): Promise<CryptoKey[]> {\n const aesExchangeKeys = await this.baseExchangeKeysManager.tryDecryptExchangeKeys(\n await this.baseExchangeKeysManager.getEncryptedExchangeKeysFor(from, to),\n availableDecryptionKeys\n )\n const decryptedExchangeDataKeys = await this.baseExchangeDataManager.tryDecryptExchangeKeys(\n await this.baseExchangeDataManager.getExchangeDataByDelegatorDelegatePair(from, to),\n availableDecryptionKeys\n )\n return [...aesExchangeKeys.successfulDecryptions, ...decryptedExchangeDataKeys.successfulDecryptions]\n }\n}\n"]}
|