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