@lifeready/core 1.0.21 → 1.0.23
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/bundles/lifeready-core.umd.js +10612 -10527
- package/bundles/lifeready-core.umd.js.map +1 -1
- package/bundles/lifeready-core.umd.min.js +1 -15
- package/bundles/lifeready-core.umd.min.js.map +1 -1
- package/esm2015/lib/_common/ast.js +2 -1
- package/esm2015/lib/_common/deferred-promise.js +1 -1
- package/esm2015/lib/_common/exceptions.js +1 -1
- package/esm2015/lib/_common/queries.gql.js +1 -1
- package/esm2015/lib/_common/run-outside-angular.js +3 -2
- package/esm2015/lib/_common/types.js +2 -1
- package/esm2015/lib/_common/utils.js +2 -1
- package/esm2015/lib/api/lr-apollo.service.js +4 -3
- package/esm2015/lib/api/lr-graphql/index.js +1 -1
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +9 -8
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +5 -6
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +1 -1
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +3 -3
- package/esm2015/lib/api/lr-graphql/lr.service.js +1 -1
- package/esm2015/lib/api/query-processor/common-processors.service.js +4 -3
- package/esm2015/lib/api/query-processor/index.js +1 -1
- package/esm2015/lib/api/query-processor/query-processor.service.js +5 -4
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +8 -7
- package/esm2015/lib/api/types/graphql.types.js +2 -1
- package/esm2015/lib/api/types/index.js +1 -1
- package/esm2015/lib/api/types/lr-graphql.types.js +1 -1
- package/esm2015/lib/auth/auth.config.js +1 -1
- package/esm2015/lib/auth/auth.gql.js +1 -28
- package/esm2015/lib/auth/auth.types.js +1 -1
- package/esm2015/lib/auth/life-ready-auth.service.js +36 -32
- package/esm2015/lib/category/category-meta.service.js +1 -1
- package/esm2015/lib/category/category.gql.js +3 -2
- package/esm2015/lib/category/category.service.js +9 -8
- package/esm2015/lib/category/category.types.js +1 -1
- package/esm2015/lib/contact-card/contact-card.gql.js +79 -0
- package/esm2015/lib/contact-card/contact-card.service.js +156 -0
- package/esm2015/lib/contact-card/contact-card2.gql.js +29 -0
- package/esm2015/lib/contact-card/contact-card2.service.js +103 -0
- package/esm2015/lib/encryption/encryption.service.js +190 -0
- package/esm2015/lib/file-upload/file-upload.service.js +74 -0
- package/esm2015/lib/file-upload/file-upload.types.js +2 -0
- package/esm2015/lib/idle/idle.service.js +168 -0
- package/esm2015/lib/idle/idle.types.js +7 -0
- package/esm2015/lib/item2/item2.gql.js +127 -0
- package/esm2015/lib/item2/item2.gql.private.js +23 -0
- package/esm2015/lib/item2/item2.service.js +519 -0
- package/esm2015/lib/item2/item2.types.js +2 -0
- package/esm2015/lib/key/key-factory.service.js +237 -0
- package/esm2015/lib/key/key-graph.service.js +300 -0
- package/esm2015/lib/key/key-meta.service.js +201 -0
- package/esm2015/lib/{cryptography → key}/key.service.js +4 -4
- package/esm2015/lib/key/key.types.js +11 -0
- package/esm2015/lib/key-exchange/key-exchange.gql.js +188 -0
- package/esm2015/lib/key-exchange/key-exchange.service.js +441 -0
- package/esm2015/lib/key-exchange/key-exchange.types.js +7 -0
- package/esm2015/lib/key-exchange/key-exchange2.gql.js +171 -0
- package/esm2015/lib/key-exchange/key-exchange2.service.js +500 -0
- package/esm2015/lib/lbop/lbop.service.js +357 -0
- package/esm2015/lib/life-ready.config.js +2 -1
- package/esm2015/lib/life-ready.module.js +2 -27
- package/esm2015/lib/lock/lock.gql.js +40 -0
- package/esm2015/lib/lock/lock.service.js +64 -0
- package/esm2015/lib/message/message.gql.js +32 -0
- package/esm2015/lib/message/message.service.js +118 -0
- package/esm2015/lib/message/message.types.js +2 -0
- package/esm2015/lib/notification/notification.gql.js +1 -1
- package/esm2015/lib/notification/notification.service.js +2 -2
- package/esm2015/lib/password/password.gql.js +28 -0
- package/esm2015/lib/password/password.service.js +316 -0
- package/esm2015/lib/persist/persist.service.js +181 -0
- package/esm2015/lib/plan/plan.gql.js +1 -1
- package/esm2015/lib/plan/plan.service.js +3 -2
- package/esm2015/lib/plan/plan.types.js +1 -1
- package/esm2015/lib/profile/profile-details.service.js +215 -0
- package/esm2015/lib/profile/profile.gql.js +98 -0
- package/esm2015/lib/profile/profile.service.js +170 -0
- package/esm2015/lib/profile/profile.types.js +34 -0
- package/esm2015/lib/record/record-attachment.service.js +16 -15
- package/esm2015/lib/record/record.gql.js +1 -1
- package/esm2015/lib/record/record.service.js +8 -8
- package/esm2015/lib/record/record.types.js +1 -1
- package/esm2015/lib/record-type/record-type.service.js +1 -1
- package/esm2015/lib/record-type/record-type.types.js +1 -1
- package/esm2015/lib/register/register.service.js +173 -0
- package/esm2015/lib/scenario/scenario.constants.js +1 -1
- package/esm2015/lib/scenario/scenario.controller.js +2 -2
- package/esm2015/lib/scenario/scenario.gql.js +1 -1
- package/esm2015/lib/scenario/scenario.private.gql.js +198 -0
- package/esm2015/lib/scenario/scenario.service.js +19 -17
- package/esm2015/lib/scenario/scenario.types.js +2 -1
- package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +119 -0
- package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +41 -0
- package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +117 -0
- package/esm2015/lib/slip39/slip39.service.js +167 -0
- package/esm2015/lib/time/time.service.js +146 -0
- package/esm2015/lib/tp-assembly/tp-assembly.js +365 -0
- package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +22 -0
- package/esm2015/lib/tp-assembly/tp-assembly.types.js +2 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +100 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +118 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +4 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +34 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +74 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +165 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +54 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +92 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +2 -0
- package/esm2015/lib/trusted-party/trusted-party.gql.js +148 -0
- package/esm2015/lib/trusted-party/trusted-party.service.js +327 -0
- package/esm2015/lib/trusted-party/trusted-party.types.js +41 -0
- package/esm2015/lib/trusted-party/trusted-party2.gql.js +64 -0
- package/esm2015/lib/trusted-party/trusted-party2.gql.private.js +25 -0
- package/esm2015/lib/trusted-party/trusted-party2.service.js +224 -0
- package/esm2015/lib/trusted-party/trusted-party2.types.js +2 -0
- package/esm2015/lib/two-factor/two-factor.service.js +74 -0
- package/esm2015/lib/user/user.gql.js +60 -0
- package/esm2015/lib/user/user.service.js +80 -0
- package/esm2015/lib/user/user.types.js +2 -0
- package/esm2015/lib/web-crypto/web-crypto.service.js +29 -0
- package/esm2015/lifeready-core.js +15 -13
- package/esm2015/public-api.js +49 -51
- package/fesm2015/lifeready-core.js +8764 -8737
- package/fesm2015/lifeready-core.js.map +1 -1
- package/lib/_common/types.d.ts +3 -1
- package/lib/_common/utils.d.ts +2 -2
- package/lib/api/lr-apollo.service.d.ts +2 -2
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +26 -8
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +22 -4
- package/lib/api/lr-graphql/lr-mutation.d.ts +1 -2
- package/lib/api/query-processor/common-processors.service.d.ts +1 -1
- package/lib/api/query-processor/query-processor.service.d.ts +1 -1
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +2 -2
- package/lib/api/types/lr-graphql.types.d.ts +14 -3
- package/lib/auth/auth.gql.d.ts +0 -3
- package/lib/auth/auth.types.d.ts +5 -5
- package/lib/auth/life-ready-auth.service.d.ts +13 -13
- package/lib/category/category.gql.d.ts +1 -1
- package/lib/category/category.service.d.ts +3 -3
- package/lib/{api → contact-card}/contact-card.service.d.ts +9 -9
- package/lib/contact-card/contact-card2.gql.d.ts +25 -0
- package/lib/contact-card/contact-card2.service.d.ts +64 -0
- package/lib/{cryptography → encryption}/encryption.service.d.ts +10 -9
- package/lib/{api/file.service.d.ts → file-upload/file-upload.service.d.ts} +5 -8
- package/lib/file-upload/file-upload.types.d.ts +5 -0
- package/lib/{auth → idle}/idle.service.d.ts +6 -6
- package/lib/{items2 → item2}/item2.gql.d.ts +16 -16
- package/lib/{items2 → item2}/item2.service.d.ts +34 -35
- package/lib/{cryptography → key}/key-factory.service.d.ts +4 -3
- package/lib/{cryptography → key}/key-graph.service.d.ts +6 -6
- package/lib/{cryptography → key}/key-meta.service.d.ts +1 -1
- package/lib/{cryptography → key}/key.service.d.ts +2 -2
- package/lib/{cryptography/cryptography.types.d.ts → key/key.types.d.ts} +13 -17
- package/lib/{api → key-exchange}/key-exchange.service.d.ts +5 -5
- package/lib/{api → key-exchange}/key-exchange.types.d.ts +4 -4
- package/lib/{api → key-exchange}/key-exchange2.gql.d.ts +1 -1
- package/lib/{api → key-exchange}/key-exchange2.service.d.ts +82 -29
- package/lib/{auth → lbop}/lbop.service.d.ts +7 -7
- package/lib/life-ready.config.d.ts +1 -1
- package/lib/{api → lock}/lock.gql.d.ts +1 -1
- package/lib/{api → lock}/lock.service.d.ts +1 -1
- package/lib/message/message.gql.d.ts +13 -0
- package/lib/message/message.service.d.ts +36 -0
- package/lib/message/message.types.d.ts +12 -0
- package/lib/notification/notification.service.d.ts +3 -2
- package/lib/password/password.gql.d.ts +3 -0
- package/lib/{auth → password}/password.service.d.ts +9 -9
- package/lib/{api → persist}/persist.service.d.ts +3 -3
- package/lib/plan/plan.service.d.ts +3 -2
- package/lib/plan/plan.types.d.ts +2 -1
- package/lib/{users → profile}/profile-details.service.d.ts +3 -3
- package/lib/{users → profile}/profile.gql.d.ts +2 -2
- package/lib/{users → profile}/profile.service.d.ts +6 -6
- package/lib/{users → profile}/profile.types.d.ts +3 -2
- package/lib/record/record-attachment.service.d.ts +6 -6
- package/lib/record/record.service.d.ts +3 -3
- package/lib/{auth → register}/register.service.d.ts +4 -4
- package/lib/scenario/scenario.controller.d.ts +1 -1
- package/lib/scenario/scenario.service.d.ts +105 -5
- package/lib/scenario/scenario.types.d.ts +1 -1
- package/lib/{api → shared-contact-card}/shared-contact-card.service.d.ts +9 -9
- package/lib/{api → shared-contact-card}/shared-contact-card2.gql.d.ts +1 -1
- package/lib/{api → shared-contact-card}/shared-contact-card2.service.d.ts +6 -6
- package/lib/{cryptography → slip39}/slip39.service.d.ts +0 -1
- package/lib/{trusted-parties → tp-assembly}/tp-assembly.d.ts +7 -7
- package/lib/{trusted-parties → tp-assembly}/tp-assembly.types.d.ts +3 -3
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset-request.service.d.ts +5 -9
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset-user.service.d.ts +7 -13
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.controller.d.ts +1 -1
- package/lib/tp-password-reset/tp-password-reset.gql.d.ts +63 -0
- package/lib/{trusted-parties/tp-password-reset.gql.d.ts → tp-password-reset/tp-password-reset.private.gql.d.ts} +1 -63
- package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +59 -0
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.service.d.ts +6 -89
- package/lib/tp-password-reset/tp-password-reset.types.d.ts +40 -0
- package/lib/{trusted-parties → trusted-party}/trusted-party.service.d.ts +7 -7
- package/lib/{trusted-parties → trusted-party}/trusted-party.types.d.ts +2 -3
- package/lib/{trusted-parties → trusted-party}/trusted-party2.gql.d.ts +0 -22
- package/lib/trusted-party/trusted-party2.gql.private.d.ts +23 -0
- package/lib/{trusted-parties → trusted-party}/trusted-party2.service.d.ts +11 -35
- package/lib/trusted-party/trusted-party2.types.d.ts +12 -0
- package/lib/{users → user}/user.gql.d.ts +1 -1
- package/lib/{users → user}/user.service.d.ts +1 -1
- package/lib/{users → user}/user.types.d.ts +1 -1
- package/lifeready-core.d.ts +14 -12
- package/lifeready-core.metadata.json +1 -1
- package/package.json +2 -2
- package/public-api.d.ts +48 -50
- package/esm2015/lib/api/contact-card.gql.js +0 -79
- package/esm2015/lib/api/contact-card.service.js +0 -154
- package/esm2015/lib/api/contact-card2.gql.js +0 -60
- package/esm2015/lib/api/contact-card2.service.js +0 -103
- package/esm2015/lib/api/file.service.js +0 -74
- package/esm2015/lib/api/key-exchange.gql.js +0 -188
- package/esm2015/lib/api/key-exchange.service.js +0 -442
- package/esm2015/lib/api/key-exchange.types.js +0 -7
- package/esm2015/lib/api/key-exchange2.gql.js +0 -171
- package/esm2015/lib/api/key-exchange2.service.js +0 -480
- package/esm2015/lib/api/lock.gql.js +0 -40
- package/esm2015/lib/api/lock.service.js +0 -64
- package/esm2015/lib/api/message.service.js +0 -138
- package/esm2015/lib/api/persist.service.js +0 -181
- package/esm2015/lib/api/shared-contact-card.service.js +0 -119
- package/esm2015/lib/api/shared-contact-card2.gql.js +0 -41
- package/esm2015/lib/api/shared-contact-card2.service.js +0 -117
- package/esm2015/lib/api/time.service.js +0 -146
- package/esm2015/lib/auth/idle.service.js +0 -168
- package/esm2015/lib/auth/idle.types.js +0 -7
- package/esm2015/lib/auth/lbop.service.js +0 -355
- package/esm2015/lib/auth/password.service.js +0 -315
- package/esm2015/lib/auth/register.service.js +0 -172
- package/esm2015/lib/auth/two-factor.service.js +0 -74
- package/esm2015/lib/cryptography/cryptography.types.js +0 -11
- package/esm2015/lib/cryptography/encryption.service.js +0 -189
- package/esm2015/lib/cryptography/key-factory.service.js +0 -237
- package/esm2015/lib/cryptography/key-graph.service.js +0 -299
- package/esm2015/lib/cryptography/key-meta.service.js +0 -200
- package/esm2015/lib/cryptography/slip39.service.js +0 -169
- package/esm2015/lib/cryptography/web-crypto.service.js +0 -29
- package/esm2015/lib/items2/item2.gql.js +0 -127
- package/esm2015/lib/items2/item2.gql.private.js +0 -23
- package/esm2015/lib/items2/item2.service.js +0 -516
- package/esm2015/lib/items2/item2.types.js +0 -1
- package/esm2015/lib/scenario/scenario.gql.private.js +0 -198
- package/esm2015/lib/trusted-parties/tp-assembly.gql.private.js +0 -22
- package/esm2015/lib/trusted-parties/tp-assembly.js +0 -365
- package/esm2015/lib/trusted-parties/tp-assembly.types.js +0 -1
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +0 -113
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +0 -129
- package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +0 -4
- package/esm2015/lib/trusted-parties/tp-password-reset.controller.js +0 -34
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +0 -237
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +0 -95
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +0 -148
- package/esm2015/lib/trusted-parties/trusted-party.service.js +0 -326
- package/esm2015/lib/trusted-parties/trusted-party.types.js +0 -41
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +0 -87
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +0 -218
- package/esm2015/lib/users/profile-details.service.js +0 -214
- package/esm2015/lib/users/profile.gql.js +0 -97
- package/esm2015/lib/users/profile.service.js +0 -169
- package/esm2015/lib/users/profile.types.js +0 -34
- package/esm2015/lib/users/user.gql.js +0 -60
- package/esm2015/lib/users/user.service.js +0 -79
- package/esm2015/lib/users/user.types.js +0 -1
- package/lib/api/contact-card2.gql.d.ts +0 -34
- package/lib/api/contact-card2.service.d.ts +0 -50
- package/lib/api/message.service.d.ts +0 -59
- /package/lib/{api → contact-card}/contact-card.gql.d.ts +0 -0
- /package/lib/{auth → idle}/idle.types.d.ts +0 -0
- /package/lib/{items2 → item2}/item2.gql.private.d.ts +0 -0
- /package/lib/{items2 → item2}/item2.types.d.ts +0 -0
- /package/lib/{api → key-exchange}/key-exchange.gql.d.ts +0 -0
- /package/lib/scenario/{scenario.gql.private.d.ts → scenario.private.gql.d.ts} +0 -0
- /package/lib/{api → time}/time.service.d.ts +0 -0
- /package/lib/{trusted-parties/tp-assembly.gql.private.d.ts → tp-assembly/tp-assembly.private.gql.d.ts} +0 -0
- /package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.constants.d.ts +0 -0
- /package/lib/{trusted-parties → trusted-party}/trusted-party.gql.d.ts +0 -0
- /package/lib/{auth → two-factor}/two-factor.service.d.ts +0 -0
- /package/lib/{cryptography → web-crypto}/web-crypto.service.d.ts +0 -0
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import graphlib, { Graph } from '@dagrejs/graphlib';
|
|
4
|
-
import _ from 'lodash';
|
|
5
|
-
import { LrException, LrEncryptionException, LrNotFoundException, LrBadArgumentException, } from '../_common/exceptions';
|
|
6
|
-
import { EdgeType, NodeType, } from './cryptography.types';
|
|
7
|
-
import { asJwk, EncryptionService, isSymmetricKey, } from './encryption.service';
|
|
8
|
-
import { KeyFactoryService, KeyFactoryService as KFS, } from './key-factory.service';
|
|
9
|
-
import { KeyService } from './key.service';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "./encryption.service";
|
|
12
|
-
import * as i2 from "./key.service";
|
|
13
|
-
import * as i3 from "./key-factory.service";
|
|
14
|
-
export class KeyGraphService {
|
|
15
|
-
// private keyCache: {
|
|
16
|
-
// [id: string]: Key;
|
|
17
|
-
// };
|
|
18
|
-
constructor(encryptionService, keyService, keyFactory) {
|
|
19
|
-
this.encryptionService = encryptionService;
|
|
20
|
-
this.keyService = keyService;
|
|
21
|
-
this.keyFactory = keyFactory;
|
|
22
|
-
this.purgeKeys();
|
|
23
|
-
}
|
|
24
|
-
purgeKeys() {
|
|
25
|
-
this.graph = new Graph();
|
|
26
|
-
// this.keyCache = null;
|
|
27
|
-
}
|
|
28
|
-
populateKeys(userKey) {
|
|
29
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
-
this.keyService.populateKeys({
|
|
31
|
-
passKey: userKey.passKey,
|
|
32
|
-
masterKey: yield this.keyService.loadMasterKey(userKey.masterKey.id),
|
|
33
|
-
rootKey: yield this.unwrapKey(userKey.masterKey.id, userKey.rootKey.id),
|
|
34
|
-
pxk: yield this.unwrapKey(userKey.masterKey.id, userKey.pxk.id),
|
|
35
|
-
sigPxk: yield this.unwrapKey(userKey.masterKey.id, userKey.sigPxk.id),
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
hasKey(keyId) {
|
|
40
|
-
return !!this.graph.node(keyId);
|
|
41
|
-
}
|
|
42
|
-
getNode(id, type) {
|
|
43
|
-
const node = this.graph.node(id);
|
|
44
|
-
if (!node) {
|
|
45
|
-
throw new LrNotFoundException(`Key graphs does not contain key id: ${id}`);
|
|
46
|
-
}
|
|
47
|
-
if (node.type !== type) {
|
|
48
|
-
throw new LrException({
|
|
49
|
-
message: `Key with id ${id} is not of type ${type}`,
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
return node.data;
|
|
53
|
-
}
|
|
54
|
-
key(id) {
|
|
55
|
-
return this.getNode(id, NodeType.Key);
|
|
56
|
-
}
|
|
57
|
-
passKey(id) {
|
|
58
|
-
return this.getNode(id, NodeType.PassKey);
|
|
59
|
-
}
|
|
60
|
-
addKeys(src) {
|
|
61
|
-
// Keys
|
|
62
|
-
if (src.keys) {
|
|
63
|
-
// What key graph returns can not be customized. So keys are essentially immutable.
|
|
64
|
-
// Therefore, if a key exists, there's no reason to update it.
|
|
65
|
-
for (const key of src.keys) {
|
|
66
|
-
// Note using Relay global id allows us to not worry about clashing node id
|
|
67
|
-
if (this.graph.hasNode(key.id)) {
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
const node = {
|
|
71
|
-
type: NodeType.Key,
|
|
72
|
-
data: _.cloneDeep(key),
|
|
73
|
-
};
|
|
74
|
-
this.graph.setNode(key.id, node);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
// KeyLinks
|
|
78
|
-
if (src.keyLinks) {
|
|
79
|
-
for (const keyLink of src.keyLinks) {
|
|
80
|
-
if (this.graph.hasEdge(keyLink.wrappingKeyId, keyLink.keyId)) {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
const edge = {
|
|
84
|
-
type: EdgeType.KeyLink,
|
|
85
|
-
data: _.cloneDeep(keyLink),
|
|
86
|
-
};
|
|
87
|
-
// Edge goes from wrapping key to wrapped key.
|
|
88
|
-
this.graph.setEdge(keyLink.wrappingKeyId, keyLink.keyId, edge);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
// PassKeyLinks
|
|
92
|
-
if (src.passKeyLinks) {
|
|
93
|
-
for (const passKeyLink of src.passKeyLinks) {
|
|
94
|
-
if (this.graph.hasEdge(passKeyLink.passKeyId, passKeyLink.keyId)) {
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
const edge = {
|
|
98
|
-
type: EdgeType.PassKeyLink,
|
|
99
|
-
data: _.cloneDeep(passKeyLink),
|
|
100
|
-
};
|
|
101
|
-
// Edge goes from wrapping key to wrapped key.
|
|
102
|
-
this.graph.setEdge(passKeyLink.passKeyId, passKeyLink.keyId, edge);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
// The graph is the single source of truth. These are lazily calculated.
|
|
106
|
-
// this.keyCache = null;
|
|
107
|
-
}
|
|
108
|
-
tracePath(distances, keyId) {
|
|
109
|
-
// The node label is the same as the id of the key nodes.
|
|
110
|
-
const ret = [];
|
|
111
|
-
let node = keyId;
|
|
112
|
-
if (!distances[node].predecessor) {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
while (distances[node].predecessor) {
|
|
116
|
-
const child = distances[node].predecessor;
|
|
117
|
-
ret.push(this.graph.edge(child, node));
|
|
118
|
-
node = child;
|
|
119
|
-
}
|
|
120
|
-
// After reverse, the first element is the passkey
|
|
121
|
-
ret.reverse();
|
|
122
|
-
return ret;
|
|
123
|
-
}
|
|
124
|
-
getPath(knownKeyId, keyId) {
|
|
125
|
-
if (!knownKeyId || typeof knownKeyId !== 'string') {
|
|
126
|
-
throw new LrEncryptionException(`Param knownKeyId wrong format: ${knownKeyId}`);
|
|
127
|
-
}
|
|
128
|
-
if (!keyId || typeof keyId !== 'string') {
|
|
129
|
-
throw new LrEncryptionException(`Param keyId wrong format: ${keyId}`);
|
|
130
|
-
}
|
|
131
|
-
// => { A: { distance: 0 },
|
|
132
|
-
// B: { distance: 6, predecessor: 'C' },
|
|
133
|
-
// C: { distance: 4, predecessor: 'A' },
|
|
134
|
-
// D: { distance: 2, predecessor: 'A' },
|
|
135
|
-
// E: { distance: 8, predecessor: 'F' },
|
|
136
|
-
// F: { distance: 4, predecessor: 'D' } }
|
|
137
|
-
const distances = graphlib.alg.dijkstra(this.graph, knownKeyId);
|
|
138
|
-
// Trace path from keyId to knownKeyId
|
|
139
|
-
return this.tracePath(distances, keyId);
|
|
140
|
-
}
|
|
141
|
-
getJwkKey(keyOrId, getKeyIdCallback) {
|
|
142
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
143
|
-
return (yield this.getKey(keyOrId, getKeyIdCallback)).jwk;
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
// We assume that when a keyId is fetched, the key graph
|
|
147
|
-
// for the key is also returned and merged into the client-side
|
|
148
|
-
// key graph. By insisting a keyId is returned instead of the
|
|
149
|
-
// actual key we ensure key-graph is consistent.
|
|
150
|
-
getKey(keyOrId, getKeyIdCallback) {
|
|
151
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
152
|
-
let keyId = typeof keyOrId === 'string' ? keyOrId : keyOrId === null || keyOrId === void 0 ? void 0 : keyOrId.id;
|
|
153
|
-
if (!this.hasKey(keyId) && getKeyIdCallback) {
|
|
154
|
-
keyId = yield getKeyIdCallback();
|
|
155
|
-
}
|
|
156
|
-
// else, continue and let it fail.
|
|
157
|
-
const key = this.key(keyId);
|
|
158
|
-
if (key.jwk) {
|
|
159
|
-
return key;
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
return this.unwrapKey(this.keyService.getCurrentMasterKey().id, keyId);
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
_unwrapLink(wrappingKey, link, dstKey) {
|
|
167
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
168
|
-
// console.log("_unwrapLink:", link.data.keyId);
|
|
169
|
-
const wrappedKey = JSON.parse(link.data.wrappedKey);
|
|
170
|
-
// Signatures of keys contain the key itself. This way we only need
|
|
171
|
-
// to access the KeyLinks to decrypt/verify keys.
|
|
172
|
-
let nextRawKey;
|
|
173
|
-
if (wrappedKey.signatures) {
|
|
174
|
-
nextRawKey = yield this.encryptionService.verify(wrappingKey, wrappedKey);
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
nextRawKey = yield this.encryptionService.decrypt(wrappingKey, wrappedKey);
|
|
178
|
-
}
|
|
179
|
-
dstKey.jwk = yield KFS.asKey(nextRawKey);
|
|
180
|
-
dstKey.task = null;
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
_unwrap(key, path) {
|
|
184
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
185
|
-
for (const link of path) {
|
|
186
|
-
const dstKey = this.key(link.data.keyId);
|
|
187
|
-
// console.log("key: ", link.data.keyId);
|
|
188
|
-
if (dstKey.jwk) {
|
|
189
|
-
key = dstKey.jwk;
|
|
190
|
-
// console.log("Returning cached key: ", link.data.keyId);
|
|
191
|
-
continue;
|
|
192
|
-
}
|
|
193
|
-
if (!dstKey.task) {
|
|
194
|
-
dstKey.task = this._unwrapLink(key, link, dstKey);
|
|
195
|
-
}
|
|
196
|
-
yield dstKey.task;
|
|
197
|
-
key = dstKey.jwk;
|
|
198
|
-
}
|
|
199
|
-
return key;
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
unwrapWithPassKey(passKeyId, passKey, keyId) {
|
|
203
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
204
|
-
// Get path of the directory key.
|
|
205
|
-
const path = this.getPath(passKeyId, keyId);
|
|
206
|
-
return {
|
|
207
|
-
id: keyId,
|
|
208
|
-
jwk: yield this._unwrap(passKey, path),
|
|
209
|
-
};
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
unwrapKey(masterKeyId, keyId) {
|
|
213
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
214
|
-
// The first key should be a masterKey
|
|
215
|
-
const masterKey = yield this.keyService.loadMasterKey(masterKeyId);
|
|
216
|
-
if (masterKeyId === keyId) {
|
|
217
|
-
return masterKey;
|
|
218
|
-
}
|
|
219
|
-
// Get path of the directory key.
|
|
220
|
-
const path = this.getPath(masterKey.id, keyId);
|
|
221
|
-
return {
|
|
222
|
-
id: keyId,
|
|
223
|
-
jwk: yield this._unwrap(masterKey.jwk, path),
|
|
224
|
-
};
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
decryptFromString(keyOrId, cipherData, options) {
|
|
228
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
229
|
-
if (cipherData) {
|
|
230
|
-
const key = yield this.getJwkKey(keyOrId);
|
|
231
|
-
return (yield this.encryptionService.decrypt(key, JSON.parse(cipherData), options));
|
|
232
|
-
}
|
|
233
|
-
return null;
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
decryptFile(keyId, file) {
|
|
237
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
238
|
-
const key = yield this.getJwkKey(keyId);
|
|
239
|
-
return (yield this.encryptionService.decrypt(key, file, {
|
|
240
|
-
payloadType: 'ArrayBuffer',
|
|
241
|
-
}));
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
// TODO rename this to encrypt() and use as the most common usecase
|
|
245
|
-
encryptToString(key, content) {
|
|
246
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
-
// Empty string should be encrypted since you want to clear the field.
|
|
248
|
-
// Null is not encrypted because it's not valid JSON in the old JSON spec. Use
|
|
249
|
-
// empty string instead. It'll function as a logic false as well.
|
|
250
|
-
// Note that passing in empty string means it'll be encrypted which verifies
|
|
251
|
-
// it's integrity. But we still want to have a way to set the DB field
|
|
252
|
-
// to NULL, so we explicitly return null when content == null. A null
|
|
253
|
-
// variable in graphql mutation on KC server clears the field to NULL.
|
|
254
|
-
if (content == null) {
|
|
255
|
-
return null;
|
|
256
|
-
}
|
|
257
|
-
const jwk = asJwk(key) || (yield this.getJwkKey(key));
|
|
258
|
-
return this.encryptionService.encryptToString(jwk, content);
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
// Wraps a symmetric encryption key.
|
|
262
|
-
// Throws exception if wrapping public keys.
|
|
263
|
-
wrapKey(wrappingKey, key) {
|
|
264
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
265
|
-
if (!isSymmetricKey(key)) {
|
|
266
|
-
throw new LrBadArgumentException('Only allowing wrapping of symmetric keys.');
|
|
267
|
-
}
|
|
268
|
-
return this.encryptToString(wrappingKey, key.toJSON(true));
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
// TODO
|
|
272
|
-
// async wrapPublicKey<T>();
|
|
273
|
-
// async wrapPrivateKey<T>();
|
|
274
|
-
encryptWithNewKey(wrappingKeyId, cipherClearJson) {
|
|
275
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
276
|
-
const key = yield this.keyFactory.createKey();
|
|
277
|
-
const wrappedKey = yield this.encryptToString(wrappingKeyId, key.toJSON(true));
|
|
278
|
-
const cipher = yield this.encryptToString(key, cipherClearJson);
|
|
279
|
-
return {
|
|
280
|
-
key,
|
|
281
|
-
wrappingKeyId,
|
|
282
|
-
wrappedKey,
|
|
283
|
-
cipher,
|
|
284
|
-
};
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
KeyGraphService.ɵprov = i0.ɵɵdefineInjectable({ factory: function KeyGraphService_Factory() { return new KeyGraphService(i0.ɵɵinject(i1.EncryptionService), i0.ɵɵinject(i2.KeyService), i0.ɵɵinject(i3.KeyFactoryService)); }, token: KeyGraphService, providedIn: "root" });
|
|
289
|
-
KeyGraphService.decorators = [
|
|
290
|
-
{ type: Injectable, args: [{
|
|
291
|
-
providedIn: 'root',
|
|
292
|
-
},] }
|
|
293
|
-
];
|
|
294
|
-
KeyGraphService.ctorParameters = () => [
|
|
295
|
-
{ type: EncryptionService },
|
|
296
|
-
{ type: KeyService },
|
|
297
|
-
{ type: KeyFactoryService }
|
|
298
|
-
];
|
|
299
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWdyYXBoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL29wdC9hdGxhc3NpYW4vcGlwZWxpbmVzL2FnZW50L2J1aWxkL3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL2NyeXB0b2dyYXBoeS9rZXktZ3JhcGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUl2QixPQUFPLEVBQ0wsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsc0JBQXNCLEdBQ3ZCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUVMLFFBQVEsRUFJUixRQUFRLEdBRVQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsS0FBSyxFQUVMLGlCQUFpQixFQUNqQixjQUFjLEdBQ2YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGlCQUFpQixJQUFJLEdBQUcsR0FDekIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQVMzQyxNQUFNLE9BQU8sZUFBZTtJQUUxQixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLEtBQUs7SUFFTCxZQUNVLGlCQUFvQyxFQUNwQyxVQUFzQixFQUN0QixVQUE2QjtRQUY3QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFFckMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUss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ZUFBZSxDQUFDLENBQUM7WUFFaEUsT0FBTztnQkFDTCxHQUFHO2dCQUNILGFBQWE7Z0JBQ2IsVUFBVTtnQkFDVixNQUFNO2FBQ1AsQ0FBQztRQUNKLENBQUM7S0FBQTs7OztZQTdVRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQWZDLGlCQUFpQjtZQU9WLFVBQVU7WUFIakIsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IGdyYXBobGliLCB7IEdyYXBoIH0gZnJvbSAnQGRhZ3JlanMvZ3JhcGhsaWInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEpXSyB9IGZyb20gJ25vZGUtam9zZSc7XG5pbXBvcnQgeyBKU09OT2JqZWN0IH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IEN1cnJlbnRVc2VyS2V5IH0gZnJvbSAnLi4vdXNlcnMvcHJvZmlsZS50eXBlcyc7XG5pbXBvcnQge1xuICBMckV4Y2VwdGlvbixcbiAgTHJFbmNyeXB0aW9uRXhjZXB0aW9uLFxuICBMck5vdEZvdW5kRXhjZXB0aW9uLFxuICBMckJhZEFyZ3VtZW50RXhjZXB0aW9uLFxufSBmcm9tICcuLi9fY29tbW9uL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtcbiAgRWRnZSxcbiAgRWRnZVR5cGUsXG4gIEtleSxcbiAgS2V5R3JhcGhSZXNwb25zZSxcbiAgTm9kZSxcbiAgTm9kZVR5cGUsXG4gIFBhc3NLZXksXG59IGZyb20gJy4vY3J5cHRvZ3JhcGh5LnR5cGVzJztcbmltcG9ydCB7XG4gIGFzSndrLFxuICBEZWNyeXB0T3B0aW9ucyxcbiAgRW5jcnlwdGlvblNlcnZpY2UsXG4gIGlzU3ltbWV0cmljS2V5LFxufSBmcm9tICcuL2VuY3J5cHRpb24uc2VydmljZSc7XG5pbXBvcnQge1xuICBLZXlGYWN0b3J5U2VydmljZSxcbiAgS2V5RmFjdG9yeVNlcnZpY2UgYXMgS0ZTLFxufSBmcm9tICcuL2tleS1mYWN0b3J5LnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4va2V5LnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyYXBoS2V5IGV4dGVuZHMgS2V5IHtcbiAgdGFzaz86IFByb21pc2U8YW55Pjtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEtleUdyYXBoU2VydmljZSB7XG4gIHByaXZhdGUgZ3JhcGg6IEdyYXBoO1xuICAvLyBwcml2YXRlIGtleUNhY2hlOiB7XG4gIC8vICAgW2lkOiBzdHJpbmddOiBLZXk7XG4gIC8vIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbmNyeXB0aW9uU2VydmljZTogRW5jcnlwdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuICAgIHByaXZhdGUga2V5RmFjdG9yeTogS2V5RmFjdG9yeVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5wdXJnZUtleXMoKTtcbiAgfVxuXG4gIHB1cmdlS2V5cygpIHtcbiAgICB0aGlzLmdyYXBoID0gbmV3IEdyYXBoKCk7XG4gICAgLy8gdGhpcy5rZXlDYWNoZSA9IG51bGw7XG4gIH1cblxuICBhc3luYyBwb3B1bGF0ZUtleXModXNlcktleTogQ3VycmVudFVzZXJLZXkpIHtcbiAgICB0aGlzLmtleVNlcnZpY2UucG9wdWxhdGVLZXlzKHtcbiAgICAgIHBhc3NLZXk6IHVzZXJLZXkucGFzc0tleSxcbiAgICAgIG1hc3RlcktleTogYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmxvYWRNYXN0ZXJLZXkodXNlcktleS5tYXN0ZXJLZXkuaWQpLFxuICAgICAgcm9vdEtleTogYXdhaXQgdGhpcy51bndyYXBLZXkodXNlcktleS5tYXN0ZXJLZXkuaWQsIHVzZXJLZXkucm9vdEtleS5pZCksXG4gICAgICBweGs6IGF3YWl0IHRoaXMudW53cmFwS2V5KHVzZXJLZXkubWFzdGVyS2V5LmlkLCB1c2VyS2V5LnB4ay5pZCksXG4gICAgICBzaWdQeGs6IGF3YWl0IHRoaXMudW53cmFwS2V5KHVzZXJLZXkubWFzdGVyS2V5LmlkLCB1c2VyS2V5LnNpZ1B4ay5pZCksXG4gICAgfSk7XG4gIH1cblxuICBoYXNLZXkoa2V5SWQ6IHN0cmluZykge1xuICAgIHJldHVybiAhIXRoaXMuZ3JhcGgubm9kZShrZXlJZCk7XG4gIH1cblxuICBwcml2YXRlIGdldE5vZGUoaWQsIHR5cGUpOiBHcmFwaEtleSB8IFBhc3NLZXkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdyYXBoLm5vZGUoaWQpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgdGhyb3cgbmV3IExyTm90Rm91bmRFeGNlcHRpb24oXG4gICAgICAgIGBLZXkgZ3JhcGhzIGRvZXMgbm90IGNvbnRhaW4ga2V5IGlkOiAke2lkfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChub2RlLnR5cGUgIT09IHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBMckV4Y2VwdGlvbih7XG4gICAgICAgIG1lc3NhZ2U6IGBLZXkgd2l0aCBpZCAke2lkfSBpcyBub3Qgb2YgdHlwZSAke3R5cGV9YCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5kYXRhO1xuICB9XG5cbiAga2V5KGlkKTogR3JhcGhLZXkge1xuICAgIHJldHVybiB0aGlzLmdldE5vZGUoaWQsIE5vZGVUeXBlLktleSk7XG4gIH1cblxuICBwYXNzS2V5KGlkKTogUGFzc0tleSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZShpZCwgTm9kZVR5cGUuUGFzc0tleSk7XG4gIH1cblxuICBhZGRLZXlzKHNyYzogS2V5R3JhcGhSZXNwb25zZSkge1xuICAgIC8vIEtleXNcbiAgICBpZiAoc3JjLmtleXMpIHtcbiAgICAgIC8vIFdoYXQga2V5IGdyYXBoIHJldHVybnMgY2FuIG5vdCBiZSBjdXN0b21pemVkLiBTbyBrZXlzIGFyZSBlc3NlbnRpYWxseSBpbW11dGFibGUuXG4gICAgICAvLyBUaGVyZWZvcmUsIGlmIGEga2V5IGV4aXN0cywgdGhlcmUncyBubyByZWFzb24gdG8gdXBkYXRlIGl0LlxuICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc3JjLmtleXMpIHtcbiAgICAgICAgLy8gTm90ZSB1c2luZyBSZWxheSBnbG9iYWwgaWQgYWxsb3dzIHVzIHRvIG5vdCB3b3JyeSBhYm91dCBjbGFzaGluZyBub2RlIGlkXG4gICAgICAgIGlmICh0aGlzLmdyYXBoLmhhc05vZGUoa2V5LmlkKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IHtcbiAgICAgICAgICB0eXBlOiBOb2RlVHlwZS5LZXksXG4gICAgICAgICAgZGF0YTogXy5jbG9uZURlZXAoa2V5KSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmdyYXBoLnNldE5vZGUoa2V5LmlkLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBLZXlMaW5rc1xuICAgIGlmIChzcmMua2V5TGlua3MpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5TGluayBvZiBzcmMua2V5TGlua3MpIHtcbiAgICAgICAgaWYgKHRoaXMuZ3JhcGguaGFzRWRnZShrZXlMaW5rLndyYXBwaW5nS2V5SWQsIGtleUxpbmsua2V5SWQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlZGdlOiBFZGdlID0ge1xuICAgICAgICAgIHR5cGU6IEVkZ2VUeXBlLktleUxpbmssXG4gICAgICAgICAgZGF0YTogXy5jbG9uZURlZXAoa2V5TGluayksXG4gICAgICAgIH07XG4gICAgICAgIC8vIEVkZ2UgZ29lcyBmcm9tIHdyYXBwaW5nIGtleSB0byB3cmFwcGVkIGtleS5cbiAgICAgICAgdGhpcy5ncmFwaC5zZXRFZGdlKGtleUxpbmsud3JhcHBpbmdLZXlJZCwga2V5TGluay5rZXlJZCwgZWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGFzc0tleUxpbmtzXG4gICAgaWYgKHNyYy5wYXNzS2V5TGlua3MpIHtcbiAgICAgIGZvciAoY29uc3QgcGFzc0tleUxpbmsgb2Ygc3JjLnBhc3NLZXlMaW5rcykge1xuICAgICAgICBpZiAodGhpcy5ncmFwaC5oYXNFZGdlKHBhc3NLZXlMaW5rLnBhc3NLZXlJZCwgcGFzc0tleUxpbmsua2V5SWQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlZGdlOiBFZGdlID0ge1xuICAgICAgICAgIHR5cGU6IEVkZ2VUeXBlLlBhc3NLZXlMaW5rLFxuICAgICAgICAgIGRhdGE6IF8uY2xvbmVEZWVwKHBhc3NLZXlMaW5rKSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gRWRnZSBnb2VzIGZyb20gd3JhcHBpbmcga2V5IHRvIHdyYXBwZWQga2V5LlxuICAgICAgICB0aGlzLmdyYXBoLnNldEVkZ2UocGFzc0tleUxpbmsucGFzc0tleUlkLCBwYXNzS2V5TGluay5rZXlJZCwgZWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGdyYXBoIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoLiBUaGVzZSBhcmUgbGF6aWx5IGNhbGN1bGF0ZWQuXG4gICAgLy8gdGhpcy5rZXlDYWNoZSA9IG51bGw7XG4gIH1cblxuICB0cmFjZVBhdGgoZGlzdGFuY2VzLCBrZXlJZDogc3RyaW5nKTogRWRnZVtdIHtcbiAgICAvLyBUaGUgbm9kZSBsYWJlbCBpcyB0aGUgc2FtZSBhcyB0aGUgaWQgb2YgdGhlIGtleSBub2Rlcy5cbiAgICBjb25zdCByZXQ6IEVkZ2VbXSA9IFtdO1xuICAgIGxldCBub2RlID0ga2V5SWQ7XG4gICAgaWYgKCFkaXN0YW5jZXNbbm9kZV0ucHJlZGVjZXNzb3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHdoaWxlIChkaXN0YW5jZXNbbm9kZV0ucHJlZGVjZXNzb3IpIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZGlzdGFuY2VzW25vZGVdLnByZWRlY2Vzc29yO1xuICAgICAgcmV0LnB1c2godGhpcy5ncmFwaC5lZGdlKGNoaWxkLCBub2RlKSk7XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuXG4gICAgLy8gQWZ0ZXIgcmV2ZXJzZSwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIHBhc3NrZXlcbiAgICByZXQucmV2ZXJzZSgpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIGdldFBhdGgoa25vd25LZXlJZDogc3RyaW5nLCBrZXlJZDogc3RyaW5nKTogRWRnZVtdIHtcbiAgICBpZiAoIWtub3duS2V5SWQgfHwgdHlwZW9mIGtub3duS2V5SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgTHJFbmNyeXB0aW9uRXhjZXB0aW9uKFxuICAgICAgICBgUGFyYW0ga25vd25LZXlJZCB3cm9uZyBmb3JtYXQ6ICR7a25vd25LZXlJZH1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWtleUlkIHx8IHR5cGVvZiBrZXlJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBMckVuY3J5cHRpb25FeGNlcHRpb24oYFBhcmFtIGtleUlkIHdyb25nIGZvcm1hdDogJHtrZXlJZH1gKTtcbiAgICB9XG5cbiAgICAvLyA9PiB7IEE6IHsgZGlzdGFuY2U6IDAgfSxcbiAgICAvLyAgICAgIEI6IHsgZGlzdGFuY2U6IDYsIHByZWRlY2Vzc29yOiAnQycgfSxcbiAgICAvLyAgICAgIEM6IHsgZGlzdGFuY2U6IDQsIHByZWRlY2Vzc29yOiAnQScgfSxcbiAgICAvLyAgICAgIEQ6IHsgZGlzdGFuY2U6IDIsIHByZWRlY2Vzc29yOiAnQScgfSxcbiAgICAvLyAgICAgIEU6IHsgZGlzdGFuY2U6IDgsIHByZWRlY2Vzc29yOiAnRicgfSxcbiAgICAvLyAgICAgIEY6IHsgZGlzdGFuY2U6IDQsIHByZWRlY2Vzc29yOiAnRCcgfSB9XG4gICAgY29uc3QgZGlzdGFuY2VzID0gZ3JhcGhsaWIuYWxnLmRpamtzdHJhKHRoaXMuZ3JhcGgsIGtub3duS2V5SWQpO1xuXG4gICAgLy8gVHJhY2UgcGF0aCBmcm9tIGtleUlkIHRvIGtub3duS2V5SWRcbiAgICByZXR1cm4gdGhpcy50cmFjZVBhdGgoZGlzdGFuY2VzLCBrZXlJZCk7XG4gIH1cblxuICBhc3luYyBnZXRKd2tLZXkoXG4gICAga2V5T3JJZDogc3RyaW5nIHwgS2V5LFxuICAgIGdldEtleUlkQ2FsbGJhY2s/OiAoKSA9PiBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxKV0suS2V5PiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldEtleShrZXlPcklkLCBnZXRLZXlJZENhbGxiYWNrKSkuandrO1xuICB9XG5cbiAgLy8gV2UgYXNzdW1lIHRoYXQgd2hlbiBhIGtleUlkIGlzIGZldGNoZWQsIHRoZSBrZXkgZ3JhcGhcbiAgLy8gZm9yIHRoZSBrZXkgaXMgYWxzbyByZXR1cm5lZCBhbmQgbWVyZ2VkIGludG8gdGhlIGNsaWVudC1zaWRlXG4gIC8vIGtleSBncmFwaC4gQnkgaW5zaXN0aW5nIGEga2V5SWQgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiB0aGVcbiAgLy8gYWN0dWFsIGtleSB3ZSBlbnN1cmUga2V5LWdyYXBoIGlzIGNvbnNpc3RlbnQuXG4gIGFzeW5jIGdldEtleShcbiAgICBrZXlPcklkOiBzdHJpbmcgfCBLZXksXG4gICAgZ2V0S2V5SWRDYWxsYmFjaz86ICgpID0+IFByb21pc2U8c3RyaW5nPiB8IHN0cmluZ1xuICApOiBQcm9taXNlPEtleT4ge1xuICAgIGxldCBrZXlJZCA9IHR5cGVvZiBrZXlPcklkID09PSAnc3RyaW5nJyA/IGtleU9ySWQgOiBrZXlPcklkPy5pZDtcblxuICAgIGlmICghdGhpcy5oYXNLZXkoa2V5SWQpICYmIGdldEtleUlkQ2FsbGJhY2spIHtcbiAgICAgIGtleUlkID0gYXdhaXQgZ2V0S2V5SWRDYWxsYmFjaygpO1xuICAgIH1cbiAgICAvLyBlbHNlLCBjb250aW51ZSBhbmQgbGV0IGl0IGZhaWwuXG5cbiAgICBjb25zdCBrZXkgPSB0aGlzLmtleShrZXlJZCk7XG4gICAgaWYgKGtleS5qd2spIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnVud3JhcEtleSh0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudE1hc3RlcktleSgpLmlkLCBrZXlJZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfdW53cmFwTGluayh3cmFwcGluZ0tleSwgbGluaywgZHN0S2V5KSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJfdW53cmFwTGluazpcIiwgbGluay5kYXRhLmtleUlkKTtcbiAgICBjb25zdCB3cmFwcGVkS2V5ID0gSlNPTi5wYXJzZShsaW5rLmRhdGEud3JhcHBlZEtleSk7XG4gICAgLy8gU2lnbmF0dXJlcyBvZiBrZXlzIGNvbnRhaW4gdGhlIGtleSBpdHNlbGYuIFRoaXMgd2F5IHdlIG9ubHkgbmVlZFxuICAgIC8vIHRvIGFjY2VzcyB0aGUgS2V5TGlua3MgdG8gZGVjcnlwdC92ZXJpZnkga2V5cy5cbiAgICBsZXQgbmV4dFJhd0tleTtcbiAgICBpZiAod3JhcHBlZEtleS5zaWduYXR1cmVzKSB7XG4gICAgICBuZXh0UmF3S2V5ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS52ZXJpZnkod3JhcHBpbmdLZXksIHdyYXBwZWRLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0UmF3S2V5ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KFxuICAgICAgICB3cmFwcGluZ0tleSxcbiAgICAgICAgd3JhcHBlZEtleVxuICAgICAgKTtcbiAgICB9XG4gICAgZHN0S2V5Lmp3ayA9IGF3YWl0IEtGUy5hc0tleShuZXh0UmF3S2V5KTtcbiAgICBkc3RLZXkudGFzayA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF91bndyYXAoa2V5OiBKV0suS2V5LCBwYXRoOiBFZGdlW10pOiBQcm9taXNlPEpXSy5LZXk+IHtcbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcGF0aCkge1xuICAgICAgY29uc3QgZHN0S2V5ID0gdGhpcy5rZXkobGluay5kYXRhLmtleUlkKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwia2V5OiBcIiwgbGluay5kYXRhLmtleUlkKTtcbiAgICAgIGlmIChkc3RLZXkuandrKSB7XG4gICAgICAgIGtleSA9IGRzdEtleS5qd2s7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUmV0dXJuaW5nIGNhY2hlZCBrZXk6IFwiLCBsaW5rLmRhdGEua2V5SWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkc3RLZXkudGFzaykge1xuICAgICAgICBkc3RLZXkudGFzayA9IHRoaXMuX3Vud3JhcExpbmsoa2V5LCBsaW5rLCBkc3RLZXkpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBkc3RLZXkudGFzaztcbiAgICAgIGtleSA9IGRzdEtleS5qd2s7XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1bndyYXBXaXRoUGFzc0tleShcbiAgICBwYXNzS2V5SWQ6IHN0cmluZyxcbiAgICBwYXNzS2V5OiBKV0suS2V5LFxuICAgIGtleUlkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXk+IHtcbiAgICAvLyBHZXQgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IGtleS5cbiAgICBjb25zdCBwYXRoID0gdGhpcy5nZXRQYXRoKHBhc3NLZXlJZCwga2V5SWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBrZXlJZCxcbiAgICAgIGp3azogYXdhaXQgdGhpcy5fdW53cmFwKHBhc3NLZXksIHBhdGgpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyB1bndyYXBLZXkobWFzdGVyS2V5SWQ6IHN0cmluZywga2V5SWQ6IHN0cmluZyk6IFByb21pc2U8S2V5PiB7XG4gICAgLy8gVGhlIGZpcnN0IGtleSBzaG91bGQgYmUgYSBtYXN0ZXJLZXlcbiAgICBjb25zdCBtYXN0ZXJLZXkgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UubG9hZE1hc3RlcktleShtYXN0ZXJLZXlJZCk7XG5cbiAgICBpZiAobWFzdGVyS2V5SWQgPT09IGtleUlkKSB7XG4gICAgICByZXR1cm4gbWFzdGVyS2V5O1xuICAgIH1cblxuICAgIC8vIEdldCBwYXRoIG9mIHRoZSBkaXJlY3Rvcnkga2V5LlxuICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldFBhdGgobWFzdGVyS2V5LmlkLCBrZXlJZCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGtleUlkLFxuICAgICAgandrOiBhd2FpdCB0aGlzLl91bndyYXAobWFzdGVyS2V5Lmp3aywgcGF0aCksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlY3J5cHRGcm9tU3RyaW5nPFQ+KFxuICAgIGtleU9ySWQ6IHN0cmluZyB8IEtleSxcbiAgICBjaXBoZXJEYXRhOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IERlY3J5cHRPcHRpb25zXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGlmIChjaXBoZXJEYXRhKSB7XG4gICAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmdldEp3a0tleShrZXlPcklkKTtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KFxuICAgICAgICBrZXksXG4gICAgICAgIEpTT04ucGFyc2UoY2lwaGVyRGF0YSksXG4gICAgICAgIG9wdGlvbnNcbiAgICAgICkpIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBhc3luYyBkZWNyeXB0RmlsZShrZXlJZDogc3RyaW5nLCBmaWxlOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZ2V0SndrS2V5KGtleUlkKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChrZXksIGZpbGUsIHtcbiAgICAgIHBheWxvYWRUeXBlOiAnQXJyYXlCdWZmZXInLFxuICAgIH0pKSBhcyBhbnk7XG4gIH1cblxuICAvLyBUT0RPIHJlbmFtZSB0aGlzIHRvIGVuY3J5cHQoKSBhbmQgdXNlIGFzIHRoZSBtb3N0IGNvbW1vbiB1c2VjYXNlXG4gIGFzeW5jIGVuY3J5cHRUb1N0cmluZyhcbiAgICBrZXk6IHN0cmluZyB8IEtleSB8IEpXSy5LZXksXG4gICAgY29udGVudDogYW55XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gRW1wdHkgc3RyaW5nIHNob3VsZCBiZSBlbmNyeXB0ZWQgc2luY2UgeW91IHdhbnQgdG8gY2xlYXIgdGhlIGZpZWxkLlxuICAgIC8vIE51bGwgaXMgbm90IGVuY3J5cHRlZCBiZWNhdXNlIGl0J3Mgbm90IHZhbGlkIEpTT04gaW4gdGhlIG9sZCBKU09OIHNwZWMuIFVzZVxuICAgIC8vIGVtcHR5IHN0cmluZyBpbnN0ZWFkLiBJdCdsbCBmdW5jdGlvbiBhcyBhIGxvZ2ljIGZhbHNlIGFzIHdlbGwuXG4gICAgLy8gTm90ZSB0aGF0IHBhc3NpbmcgaW4gZW1wdHkgc3RyaW5nIG1lYW5zIGl0J2xsIGJlIGVuY3J5cHRlZCB3aGljaCB2ZXJpZmllc1xuICAgIC8vIGl0J3MgaW50ZWdyaXR5LiBCdXQgd2Ugc3RpbGwgd2FudCB0byBoYXZlIGEgd2F5IHRvIHNldCB0aGUgREIgZmllbGRcbiAgICAvLyB0byBOVUxMLCBzbyB3ZSBleHBsaWNpdGx5IHJldHVybiBudWxsIHdoZW4gY29udGVudCA9PSBudWxsLiBBIG51bGxcbiAgICAvLyB2YXJpYWJsZSBpbiBncmFwaHFsIG11dGF0aW9uIG9uIEtDIHNlcnZlciBjbGVhcnMgdGhlIGZpZWxkIHRvIE5VTEwuXG4gICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgandrID0gYXNKd2soa2V5KSB8fCAoYXdhaXQgdGhpcy5nZXRKd2tLZXkoa2V5IGFzIHN0cmluZyB8IEtleSkpO1xuICAgIHJldHVybiB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhqd2ssIGNvbnRlbnQpO1xuICB9XG5cbiAgLy8gV3JhcHMgYSBzeW1tZXRyaWMgZW5jcnlwdGlvbiBrZXkuXG4gIC8vIFRocm93cyBleGNlcHRpb24gaWYgd3JhcHBpbmcgcHVibGljIGtleXMuXG4gIGFzeW5jIHdyYXBLZXk8VD4oXG4gICAgd3JhcHBpbmdLZXk6IHN0cmluZyB8IEtleSB8IEpXSy5LZXksXG4gICAga2V5OiBKV0suS2V5XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc1N5bW1ldHJpY0tleShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgTHJCYWRBcmd1bWVudEV4Y2VwdGlvbihcbiAgICAgICAgJ09ubHkgYWxsb3dpbmcgd3JhcHBpbmcgb2Ygc3ltbWV0cmljIGtleXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lbmNyeXB0VG9TdHJpbmcod3JhcHBpbmdLZXksIGtleS50b0pTT04odHJ1ZSkpO1xuICB9XG5cbiAgLy8gVE9ET1xuICAvLyBhc3luYyB3cmFwUHVibGljS2V5PFQ+KCk7XG4gIC8vIGFzeW5jIHdyYXBQcml2YXRlS2V5PFQ+KCk7XG5cbiAgYXN5bmMgZW5jcnlwdFdpdGhOZXdLZXkod3JhcHBpbmdLZXlJZDogc3RyaW5nLCBjaXBoZXJDbGVhckpzb246IEpTT05PYmplY3QpIHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XG4gICAgY29uc3Qgd3JhcHBlZEtleSA9IGF3YWl0IHRoaXMuZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgd3JhcHBpbmdLZXlJZCxcbiAgICAgIGtleS50b0pTT04odHJ1ZSlcbiAgICApO1xuICAgIGNvbnN0IGNpcGhlciA9IGF3YWl0IHRoaXMuZW5jcnlwdFRvU3RyaW5nKGtleSwgY2lwaGVyQ2xlYXJKc29uKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICB3cmFwcGluZ0tleUlkLFxuICAgICAgd3JhcHBlZEtleSxcbiAgICAgIGNpcGhlcixcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { LrApolloService } from '../api/lr-apollo.service';
|
|
4
|
-
import { GetCategoryKeyIdQuery } from '../category/category.gql';
|
|
5
|
-
import { EncryptionService, } from './encryption.service';
|
|
6
|
-
import { KeyFactoryService } from './key-factory.service';
|
|
7
|
-
import { KeyGraphService } from './key-graph.service';
|
|
8
|
-
import { KeyService } from './key.service';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "./encryption.service";
|
|
11
|
-
import * as i2 from "./key-graph.service";
|
|
12
|
-
import * as i3 from "../api/lr-apollo.service";
|
|
13
|
-
import * as i4 from "./key.service";
|
|
14
|
-
import * as i5 from "./key-factory.service";
|
|
15
|
-
export class WrappedContent {
|
|
16
|
-
}
|
|
17
|
-
export class WrappingKey {
|
|
18
|
-
}
|
|
19
|
-
export class KeyMetaService {
|
|
20
|
-
constructor(encryptionService, keyGraph, lrApollo, keyService, keyFactory) {
|
|
21
|
-
this.encryptionService = encryptionService;
|
|
22
|
-
this.keyGraph = keyGraph;
|
|
23
|
-
this.lrApollo = lrApollo;
|
|
24
|
-
this.keyService = keyService;
|
|
25
|
-
this.keyFactory = keyFactory;
|
|
26
|
-
}
|
|
27
|
-
// async decryptFromString<T>(
|
|
28
|
-
// keyOrId: string | Key,
|
|
29
|
-
// cipherData: string,
|
|
30
|
-
// options?: DecryptOptions
|
|
31
|
-
// ): Promise<T> {
|
|
32
|
-
// if (cipherData) {
|
|
33
|
-
// const key = await this.keyGraphService.getJwkKey(keyOrId);
|
|
34
|
-
// return (await this.encryptionService.decrypt(
|
|
35
|
-
// key,
|
|
36
|
-
// JSON.parse(cipherData),
|
|
37
|
-
// options
|
|
38
|
-
// )) as any;
|
|
39
|
-
// }
|
|
40
|
-
// return null;
|
|
41
|
-
// }
|
|
42
|
-
decryptMeta(metaHaver) {
|
|
43
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
44
|
-
if (metaHaver.cipherMeta) {
|
|
45
|
-
const key = yield this.keyGraph.getJwkKey(metaHaver.keyId);
|
|
46
|
-
return (yield this.encryptionService.decrypt(key, JSON.parse(metaHaver.cipherMeta)));
|
|
47
|
-
}
|
|
48
|
-
return null;
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
// async decryptFile(keyId: string, file: any): Promise<any> {
|
|
52
|
-
// const key = await this.keyGraphService.getJwkKey(keyId);
|
|
53
|
-
// return (await this.encryptionService.decrypt(key, file, {
|
|
54
|
-
// payloadType: 'ArrayBuffer',
|
|
55
|
-
// })) as any;
|
|
56
|
-
// }
|
|
57
|
-
// // TODO rename this to encrypt() and use as the most common usecase
|
|
58
|
-
// async encryptToString(
|
|
59
|
-
// key: string | Key | JWK.Key,
|
|
60
|
-
// content: any
|
|
61
|
-
// ): Promise<string> {
|
|
62
|
-
// // Empty string should be encrypted since you want to clear the field.
|
|
63
|
-
// // Null is not encrypted because it's not valid JSON in the old JSON spec. Use
|
|
64
|
-
// // empty string instead. It'll function as a logic false as well.
|
|
65
|
-
// // Note that passing in empty string means it'll be encrypted which verifies
|
|
66
|
-
// // it's integrity. But we still want to have a way to set the DB field
|
|
67
|
-
// // to NULL, so we explicitly return null when content == null. A null
|
|
68
|
-
// // variable in graphql mutation on KC server clears the field to NULL.
|
|
69
|
-
// if (content == null) {
|
|
70
|
-
// return null;
|
|
71
|
-
// }
|
|
72
|
-
// const jwk =
|
|
73
|
-
// asJwk(key) || (await this.keyGraphService.getJwkKey(key as string | Key));
|
|
74
|
-
// return JSON.stringify(await this.encryptionService.encrypt(jwk, content));
|
|
75
|
-
// }
|
|
76
|
-
// // Wraps a symmetric encryption key.
|
|
77
|
-
// // Throws exception if wrapping public keys.
|
|
78
|
-
// async wrapKey<T>(
|
|
79
|
-
// wrappingKey: string | Key | JWK.Key,
|
|
80
|
-
// key: JWK.Key
|
|
81
|
-
// ): Promise<string> {
|
|
82
|
-
// if (!isSymmetricKey(key)) {
|
|
83
|
-
// throw new LrBadArgumentException(
|
|
84
|
-
// 'Only allowing wrapping of symmetric keys.'
|
|
85
|
-
// );
|
|
86
|
-
// }
|
|
87
|
-
// return this.encryptToString(wrappingKey, key.toJSON(true));
|
|
88
|
-
// }
|
|
89
|
-
// // TODO
|
|
90
|
-
// // async wrapPublicKey<T>();
|
|
91
|
-
// // async wrapPrivateKey<T>();
|
|
92
|
-
doubleWrapContent(secureContent, categoryIds, fileContent) {
|
|
93
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
-
const key = yield this.keyFactory.createKey();
|
|
95
|
-
const wrappedContent = yield this.wrapContent(key.toJSON(true), categoryIds);
|
|
96
|
-
return {
|
|
97
|
-
rootKey: wrappedContent.rootKey,
|
|
98
|
-
wrappedKeys: wrappedContent.wrappedKeys,
|
|
99
|
-
doubleWrappedKey: wrappedContent.cipherMeta,
|
|
100
|
-
cipherMeta: secureContent
|
|
101
|
-
? JSON.stringify(yield this.encryptionService.encrypt(key, secureContent))
|
|
102
|
-
: null,
|
|
103
|
-
cipherFileContent: fileContent
|
|
104
|
-
? JSON.stringify(yield this.encryptionService.encrypt(key, fileContent))
|
|
105
|
-
: null,
|
|
106
|
-
};
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
reWrapContent(keyId, secureContent) {
|
|
110
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
-
const key = yield this.keyGraph.getJwkKey(keyId);
|
|
112
|
-
const newKey = yield this.keyFactory.createKey();
|
|
113
|
-
return {
|
|
114
|
-
doubleWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(key, newKey.toJSON(true))),
|
|
115
|
-
cipherMeta: secureContent
|
|
116
|
-
? JSON.stringify(yield this.encryptionService.encrypt(newKey, secureContent))
|
|
117
|
-
: null,
|
|
118
|
-
};
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
wrapContent(secureContent, categoryIds) {
|
|
122
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
-
const key = yield this.keyFactory.createKey();
|
|
124
|
-
let wrappedKeys;
|
|
125
|
-
let rootWrappingKey;
|
|
126
|
-
if (categoryIds && categoryIds.length) {
|
|
127
|
-
wrappedKeys = yield Promise.all(categoryIds.map((categoryId) => __awaiter(this, void 0, void 0, function* () {
|
|
128
|
-
const parentKey = yield this.getCategoryKeyId(categoryId);
|
|
129
|
-
const wrappedKey = JSON.stringify(yield this.encryptionService.encrypt(parentKey.key, key.toJSON(true)));
|
|
130
|
-
return {
|
|
131
|
-
directoryId: categoryId,
|
|
132
|
-
wrappingKeyId: parentKey.keyId,
|
|
133
|
-
wrappedKey,
|
|
134
|
-
};
|
|
135
|
-
})));
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
// Adding to root directory
|
|
139
|
-
const rootKey = this.keyService.getCurrentRootKey();
|
|
140
|
-
const wrappedKey = JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, key.toJSON(true)));
|
|
141
|
-
rootWrappingKey = {
|
|
142
|
-
wrappingKeyId: rootKey.id,
|
|
143
|
-
wrappedKey,
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
return {
|
|
147
|
-
key,
|
|
148
|
-
rootKey: rootWrappingKey,
|
|
149
|
-
wrappedKeys,
|
|
150
|
-
cipherMeta: secureContent
|
|
151
|
-
? JSON.stringify(yield this.encryptionService.encrypt(key, secureContent))
|
|
152
|
-
: null,
|
|
153
|
-
};
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
wrapContentWithKey(secureContent, keyId) {
|
|
157
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
158
|
-
const key = yield this.keyFactory.createKey();
|
|
159
|
-
const wrappedKey = yield this.keyGraph.encryptToString(keyId, key.toJSON(true));
|
|
160
|
-
return {
|
|
161
|
-
key,
|
|
162
|
-
rootKey: {
|
|
163
|
-
wrappingKeyId: keyId,
|
|
164
|
-
wrappedKey,
|
|
165
|
-
},
|
|
166
|
-
cipherMeta: secureContent
|
|
167
|
-
? JSON.stringify(yield this.encryptionService.encrypt(key, secureContent))
|
|
168
|
-
: null,
|
|
169
|
-
};
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
getCategoryKeyId(categoryId) {
|
|
173
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
174
|
-
const { category } = yield this.lrApollo.query({
|
|
175
|
-
query: GetCategoryKeyIdQuery,
|
|
176
|
-
variables: {
|
|
177
|
-
id: categoryId,
|
|
178
|
-
},
|
|
179
|
-
});
|
|
180
|
-
return {
|
|
181
|
-
keyId: category.keyId,
|
|
182
|
-
key: yield this.keyGraph.getJwkKey(category.keyId),
|
|
183
|
-
};
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
KeyMetaService.ɵprov = i0.ɵɵdefineInjectable({ factory: function KeyMetaService_Factory() { return new KeyMetaService(i0.ɵɵinject(i1.EncryptionService), i0.ɵɵinject(i2.KeyGraphService), i0.ɵɵinject(i3.LrApolloService), i0.ɵɵinject(i4.KeyService), i0.ɵɵinject(i5.KeyFactoryService)); }, token: KeyMetaService, providedIn: "root" });
|
|
188
|
-
KeyMetaService.decorators = [
|
|
189
|
-
{ type: Injectable, args: [{
|
|
190
|
-
providedIn: 'root',
|
|
191
|
-
},] }
|
|
192
|
-
];
|
|
193
|
-
KeyMetaService.ctorParameters = () => [
|
|
194
|
-
{ type: EncryptionService },
|
|
195
|
-
{ type: KeyGraphService },
|
|
196
|
-
{ type: LrApolloService },
|
|
197
|
-
{ type: KeyService },
|
|
198
|
-
{ type: KeyFactoryService }
|
|
199
|
-
];
|
|
200
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LW1ldGEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIvb3B0L2F0bGFzc2lhbi9waXBlbGluZXMvYWdlbnQvYnVpbGQvcHJvamVjdHMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvY3J5cHRvZ3JhcGh5L2tleS1tZXRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR2pFLE9BQU8sRUFHTCxpQkFBaUIsR0FFbEIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQU8zQyxNQUFNLE9BQU8sY0FBYztDQUsxQjtBQUVELE1BQU0sT0FBTyxXQUFXO0NBSXZCO0FBS0QsTUFBTSxPQUFPLGNBQWM7SUFDekIsWUFDVSxpQkFBb0MsRUFDcEMsUUFBeUIsRUFDekIsUUFBeUIsRUFDekIsVUFBc0IsRUFDdEIsVUFBNkI7UUFKN0Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQW1CO0lBQ3BDLENBQUM7SUFFSiw4QkFBOEI7SUFDOUIsMkJBQTJCO0lBQzNCLHdCQUF3QjtJQUN4Qiw2QkFBNkI7SUFDN0Isa0JBQWtCO0lBQ2xCLHNCQUFzQjtJQUN0QixpRUFBaUU7SUFDakUsb0RBQW9EO0lBQ3BELGFBQWE7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TSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBTTtnQkFDbEQsS0FBSyxFQUFFLHFCQUFxQjtnQkFDNUIsU0FBUyxFQUFFO29CQUNULEVBQUUsRUFBRSxVQUFVO2lCQUNmO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsT0FBTztnQkFDTCxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7Z0JBQ3JCLEdBQUcsRUFBRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7YUFDbkQsQ0FBQztRQUNKLENBQUM7S0FBQTs7OztZQTFORixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQTNCQyxpQkFBaUI7WUFJVixlQUFlO1lBWGYsZUFBZTtZQVlmLFVBQVU7WUFGVixpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKV0sgfSBmcm9tICdub2RlLWpvc2UnO1xuaW1wb3J0IHsgTHJBcG9sbG9TZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2xyLWFwb2xsby5zZXJ2aWNlJztcbmltcG9ydCB7IEdldENhdGVnb3J5S2V5SWRRdWVyeSB9IGZyb20gJy4uL2NhdGVnb3J5L2NhdGVnb3J5LmdxbCc7XG5pbXBvcnQgeyBMckJhZEFyZ3VtZW50RXhjZXB0aW9uIH0gZnJvbSAnLi4vX2NvbW1vbi9leGNlcHRpb25zJztcbmltcG9ydCB7IEtleSwgUGF5bG9hZFR5cGUgfSBmcm9tICcuL2NyeXB0b2dyYXBoeS50eXBlcyc7XG5pbXBvcnQge1xuICBhc0p3ayxcbiAgRGVjcnlwdE9wdGlvbnMsXG4gIEVuY3J5cHRpb25TZXJ2aWNlLFxuICBpc1N5bW1ldHJpY0tleSxcbn0gZnJvbSAnLi9lbmNyeXB0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuL2tleS1mYWN0b3J5LnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5R3JhcGhTZXJ2aWNlIH0gZnJvbSAnLi9rZXktZ3JhcGguc2VydmljZSc7XG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi9rZXkuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFzQ2lwaGVyTWV0YSB7XG4gIGtleUlkOiBzdHJpbmc7XG4gIGNpcGhlck1ldGE6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFdyYXBwZWRDb250ZW50IHtcbiAga2V5OiBKV0suS2V5O1xuICBjaXBoZXJNZXRhOiBzdHJpbmc7XG4gIHdyYXBwZWRLZXlzPzogV3JhcHBpbmdLZXlbXTtcbiAgcm9vdEtleT86IFdyYXBwaW5nS2V5O1xufVxuXG5leHBvcnQgY2xhc3MgV3JhcHBpbmdLZXkge1xuICBkaXJlY3RvcnlJZD86IHN0cmluZztcbiAgd3JhcHBpbmdLZXlJZDogc3RyaW5nO1xuICB3cmFwcGVkS2V5OiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBLZXlNZXRhU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUga2V5R3JhcGg6IEtleUdyYXBoU2VydmljZSxcbiAgICBwcml2YXRlIGxyQXBvbGxvOiBMckFwb2xsb1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuICAgIHByaXZhdGUga2V5RmFjdG9yeTogS2V5RmFjdG9yeVNlcnZpY2VcbiAgKSB7fVxuXG4gIC8vIGFzeW5jIGRlY3J5cHRGcm9tU3RyaW5nPFQ+KFxuICAvLyAgIGtleU9ySWQ6IHN0cmluZyB8IEtleSxcbiAgLy8gICBjaXBoZXJEYXRhOiBzdHJpbmcsXG4gIC8vICAgb3B0aW9ucz86IERlY3J5cHRPcHRpb25zXG4gIC8vICk6IFByb21pc2U8VD4ge1xuICAvLyAgIGlmIChjaXBoZXJEYXRhKSB7XG4gIC8vICAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoU2VydmljZS5nZXRKd2tLZXkoa2V5T3JJZCk7XG4gIC8vICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcbiAgLy8gICAgICAga2V5LFxuICAvLyAgICAgICBKU09OLnBhcnNlKGNpcGhlckRhdGEpLFxuICAvLyAgICAgICBvcHRpb25zXG4gIC8vICAgICApKSBhcyBhbnk7XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiBudWxsO1xuICAvLyB9XG5cbiAgYXN5bmMgZGVjcnlwdE1ldGE8VD4obWV0YUhhdmVyOiBIYXNDaXBoZXJNZXRhKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKG1ldGFIYXZlci5jaXBoZXJNZXRhKSB7XG4gICAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEp3a0tleShtZXRhSGF2ZXIua2V5SWQpO1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXG4gICAgICAgIGtleSxcbiAgICAgICAgSlNPTi5wYXJzZShtZXRhSGF2ZXIuY2lwaGVyTWV0YSlcbiAgICAgICkpIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBhc3luYyBkZWNyeXB0RmlsZShrZXlJZDogc3RyaW5nLCBmaWxlOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAvLyAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGhTZXJ2aWNlLmdldEp3a0tleShrZXlJZCk7XG4gIC8vICAgcmV0dXJuIChhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoa2V5LCBmaWxlLCB7XG4gIC8vICAgICBwYXlsb2FkVHlwZTogJ0FycmF5QnVmZmVyJyxcbiAgLy8gICB9KSkgYXMgYW55O1xuICAvLyB9XG5cbiAgLy8gLy8gVE9ETyByZW5hbWUgdGhpcyB0byBlbmNyeXB0KCkgYW5kIHVzZSBhcyB0aGUgbW9zdCBjb21tb24gdXNlY2FzZVxuICAvLyBhc3luYyBlbmNyeXB0VG9TdHJpbmcoXG4gIC8vICAga2V5OiBzdHJpbmcgfCBLZXkgfCBKV0suS2V5LFxuICAvLyAgIGNvbnRlbnQ6IGFueVxuICAvLyApOiBQcm9taXNlPHN0cmluZz4ge1xuICAvLyAgIC8vIEVtcHR5IHN0cmluZyBzaG91bGQgYmUgZW5jcnlwdGVkIHNpbmNlIHlvdSB3YW50IHRvIGNsZWFyIHRoZSBmaWVsZC5cbiAgLy8gICAvLyBOdWxsIGlzIG5vdCBlbmNyeXB0ZWQgYmVjYXVzZSBpdCdzIG5vdCB2YWxpZCBKU09OIGluIHRoZSBvbGQgSlNPTiBzcGVjLiBVc2VcbiAgLy8gICAvLyBlbXB0eSBzdHJpbmcgaW5zdGVhZC4gSXQnbGwgZnVuY3Rpb24gYXMgYSBsb2dpYyBmYWxzZSBhcyB3ZWxsLlxuICAvLyAgIC8vIE5vdGUgdGhhdCBwYXNzaW5nIGluIGVtcHR5IHN0cmluZyBtZWFucyBpdCdsbCBiZSBlbmNyeXB0ZWQgd2hpY2ggdmVyaWZpZXNcbiAgLy8gICAvLyBpdCdzIGludGVncml0eS4gQnV0IHdlIHN0aWxsIHdhbnQgdG8gaGF2ZSBhIHdheSB0byBzZXQgdGhlIERCIGZpZWxkXG4gIC8vICAgLy8gdG8gTlVMTCwgc28gd2UgZXhwbGljaXRseSByZXR1cm4gbnVsbCB3aGVuIGNvbnRlbnQgPT0gbnVsbC4gQSBudWxsXG4gIC8vICAgLy8gdmFyaWFibGUgaW4gZ3JhcGhxbCBtdXRhdGlvbiBvbiBLQyBzZXJ2ZXIgY2xlYXJzIHRoZSBmaWVsZCB0byBOVUxMLlxuICAvLyAgIGlmIChjb250ZW50ID09IG51bGwpIHtcbiAgLy8gICAgIHJldHVybiBudWxsO1xuICAvLyAgIH1cblxuICAvLyAgIGNvbnN0IGp3ayA9XG4gIC8vICAgICBhc0p3ayhrZXkpIHx8IChhd2FpdCB0aGlzLmtleUdyYXBoU2VydmljZS5nZXRKd2tLZXkoa2V5IGFzIHN0cmluZyB8IEtleSkpO1xuICAvLyAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoandrLCBjb250ZW50KSk7XG4gIC8vIH1cblxuICAvLyAvLyBXcmFwcyBhIHN5bW1ldHJpYyBlbmNyeXB0aW9uIGtleS5cbiAgLy8gLy8gVGhyb3dzIGV4Y2VwdGlvbiBpZiB3cmFwcGluZyBwdWJsaWMga2V5cy5cbiAgLy8gYXN5bmMgd3JhcEtleTxUPihcbiAgLy8gICB3cmFwcGluZ0tleTogc3RyaW5nIHwgS2V5IHwgSldLLktleSxcbiAgLy8gICBrZXk6IEpXSy5LZXlcbiAgLy8gKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gICBpZiAoIWlzU3ltbWV0cmljS2V5KGtleSkpIHtcbiAgLy8gICAgIHRocm93IG5ldyBMckJhZEFyZ3VtZW50RXhjZXB0aW9uKFxuICAvLyAgICAgICAnT25seSBhbGxvd2luZyB3cmFwcGluZyBvZiBzeW1tZXRyaWMga2V5cy4nXG4gIC8vICAgICApO1xuICAvLyAgIH1cblxuICAvLyAgIHJldHVybiB0aGlzLmVuY3J5cHRUb1N0cmluZyh3cmFwcGluZ0tleSwga2V5LnRvSlNPTih0cnVlKSk7XG4gIC8vIH1cblxuICAvLyAvLyBUT0RPXG4gIC8vIC8vIGFzeW5jIHdyYXBQdWJsaWNLZXk8VD4oKTtcbiAgLy8gLy8gYXN5bmMgd3JhcFByaXZhdGVLZXk8VD4oKTtcblxuICBhc3luYyBkb3VibGVXcmFwQ29udGVudChcbiAgICBzZWN1cmVDb250ZW50OiBhbnksXG4gICAgY2F0ZWdvcnlJZHM6IHN0cmluZ1tdLFxuICAgIGZpbGVDb250ZW50PzogQXJyYXlCdWZmZXJcbiAgKSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuXG4gICAgY29uc3Qgd3JhcHBlZENvbnRlbnQgPSBhd2FpdCB0aGlzLndyYXBDb250ZW50KFxuICAgICAga2V5LnRvSlNPTih0cnVlKSxcbiAgICAgIGNhdGVnb3J5SWRzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICByb290S2V5OiB3cmFwcGVkQ29udGVudC5yb290S2V5LFxuICAgICAgd3JhcHBlZEtleXM6IHdyYXBwZWRDb250ZW50LndyYXBwZWRLZXlzLFxuICAgICAgZG91YmxlV3JhcHBlZEtleTogd3JhcHBlZENvbnRlbnQuY2lwaGVyTWV0YSxcbiAgICAgIGNpcGhlck1ldGE6IHNlY3VyZUNvbnRlbnRcbiAgICAgICAgPyBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChrZXksIHNlY3VyZUNvbnRlbnQpXG4gICAgICAgICAgKVxuICAgICAgICA6IG51bGwsXG4gICAgICBjaXBoZXJGaWxlQ29udGVudDogZmlsZUNvbnRlbnRcbiAgICAgICAgPyBKU09OLnN0cmluZ2lmeShhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoa2V5LCBmaWxlQ29udGVudCkpXG4gICAgICAgIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVXcmFwQ29udGVudChrZXlJZDogc3RyaW5nLCBzZWN1cmVDb250ZW50OiBhbnkpIHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEp3a0tleShrZXlJZCk7XG4gICAgY29uc3QgbmV3S2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRvdWJsZVdyYXBwZWRLZXk6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoa2V5LCBuZXdLZXkudG9KU09OKHRydWUpKVxuICAgICAgKSxcbiAgICAgIGNpcGhlck1ldGE6IHNlY3VyZUNvbnRlbnRcbiAgICAgICAgPyBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChuZXdLZXksIHNlY3VyZUNvbnRlbnQpXG4gICAgICAgICAgKVxuICAgICAgICA6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHdyYXBDb250ZW50KFxuICAgIHNlY3VyZUNvbnRlbnQ6IGFueSxcbiAgICBjYXRlZ29yeUlkcz86IHN0cmluZ1tdXG4gICk6IFByb21pc2U8V3JhcHBlZENvbnRlbnQ+IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XG5cbiAgICBsZXQgd3JhcHBlZEtleXM6IFdyYXBwaW5nS2V5W107XG4gICAgbGV0IHJvb3RXcmFwcGluZ0tleTogV3JhcHBpbmdLZXk7XG5cbiAgICBpZiAoY2F0ZWdvcnlJZHMgJiYgY2F0ZWdvcnlJZHMubGVuZ3RoKSB7XG4gICAgICB3cmFwcGVkS2V5cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjYXRlZ29yeUlkcy5tYXAoYXN5bmMgKGNhdGVnb3J5SWQpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJlbnRLZXkgPSBhd2FpdCB0aGlzLmdldENhdGVnb3J5S2V5SWQoY2F0ZWdvcnlJZCk7XG4gICAgICAgICAgY29uc3Qgd3JhcHBlZEtleSA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgICAgICAgICBwYXJlbnRLZXkua2V5LFxuICAgICAgICAgICAgICBrZXkudG9KU09OKHRydWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlyZWN0b3J5SWQ6IGNhdGVnb3J5SWQsXG4gICAgICAgICAgICB3cmFwcGluZ0tleUlkOiBwYXJlbnRLZXkua2V5SWQsXG4gICAgICAgICAgICB3cmFwcGVkS2V5LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGRpbmcgdG8gcm9vdCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IHJvb3RLZXkgPSB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudFJvb3RLZXkoKTtcbiAgICAgIGNvbnN0IHdyYXBwZWRLZXkgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KHJvb3RLZXkuandrLCBrZXkudG9KU09OKHRydWUpKVxuICAgICAgKTtcbiAgICAgIHJvb3RXcmFwcGluZ0tleSA9IHtcbiAgICAgICAgd3JhcHBpbmdLZXlJZDogcm9vdEtleS5pZCxcbiAgICAgICAgd3JhcHBlZEtleSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGtleSxcbiAgICAgIHJvb3RLZXk6IHJvb3RXcmFwcGluZ0tleSxcbiAgICAgIHdyYXBwZWRLZXlzLFxuICAgICAgY2lwaGVyTWV0YTogc2VjdXJlQ29udGVudFxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KGtleSwgc2VjdXJlQ29udGVudClcbiAgICAgICAgICApXG4gICAgICAgIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgd3JhcENvbnRlbnRXaXRoS2V5KFxuICAgIHNlY3VyZUNvbnRlbnQ6IGFueSxcbiAgICBrZXlJZDogc3RyaW5nXG4gICk6IFByb21pc2U8V3JhcHBlZENvbnRlbnQ+IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XG5cbiAgICBjb25zdCB3cmFwcGVkS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBrZXlJZCxcbiAgICAgIGtleS50b0pTT04odHJ1ZSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGtleSxcbiAgICAgIHJvb3RLZXk6IHtcbiAgICAgICAgd3JhcHBpbmdLZXlJZDoga2V5SWQsXG4gICAgICAgIHdyYXBwZWRLZXksXG4gICAgICB9LFxuICAgICAgY2lwaGVyTWV0YTogc2VjdXJlQ29udGVudFxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KGtleSwgc2VjdXJlQ29udGVudClcbiAgICAgICAgICApXG4gICAgICAgIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRDYXRlZ29yeUtleUlkKFxuICAgIGNhdGVnb3J5SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHsga2V5SWQ6IHN0cmluZzsga2V5OiBhbnkgfT4ge1xuICAgIGNvbnN0IHsgY2F0ZWdvcnkgfSA9IGF3YWl0IHRoaXMubHJBcG9sbG8ucXVlcnk8YW55Pih7XG4gICAgICBxdWVyeTogR2V0Q2F0ZWdvcnlLZXlJZFF1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlkOiBjYXRlZ29yeUlkLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXlJZDogY2F0ZWdvcnkua2V5SWQsXG4gICAgICBrZXk6IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0SndrS2V5KGNhdGVnb3J5LmtleUlkKSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|