@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.
Files changed (225) hide show
  1. package/README.md +62 -0
  2. package/bundles/lifeready-core.umd.js +15939 -0
  3. package/bundles/lifeready-core.umd.js.map +1 -0
  4. package/bundles/lifeready-core.umd.min.js +2 -0
  5. package/bundles/lifeready-core.umd.min.js.map +1 -0
  6. package/esm2015/lib/_common/ast.js +40 -0
  7. package/esm2015/lib/_common/deferred-promise.js +24 -0
  8. package/esm2015/lib/_common/exceptions.js +157 -0
  9. package/esm2015/lib/_common/queries.gql.js +190 -0
  10. package/esm2015/lib/_common/run-outside-angular.js +79 -0
  11. package/esm2015/lib/_common/types.js +1 -0
  12. package/esm2015/lib/_common/utils.js +44 -0
  13. package/esm2015/lib/api/contact-card.gql.js +79 -0
  14. package/esm2015/lib/api/contact-card.service.js +154 -0
  15. package/esm2015/lib/api/contact-card2.gql.js +60 -0
  16. package/esm2015/lib/api/contact-card2.service.js +103 -0
  17. package/esm2015/lib/api/file.service.js +74 -0
  18. package/esm2015/lib/api/item2.gql.js +110 -0
  19. package/esm2015/lib/api/item2.service.js +311 -0
  20. package/esm2015/lib/api/key-exchange.gql.js +188 -0
  21. package/esm2015/lib/api/key-exchange.service.js +442 -0
  22. package/esm2015/lib/api/key-exchange.types.js +18 -0
  23. package/esm2015/lib/api/key-exchange2.gql.js +171 -0
  24. package/esm2015/lib/api/key-exchange2.service.js +479 -0
  25. package/esm2015/lib/api/lock.gql.js +40 -0
  26. package/esm2015/lib/api/lock.service.js +64 -0
  27. package/esm2015/lib/api/lr-apollo.service.js +46 -0
  28. package/esm2015/lib/api/lr-graphql/index.js +6 -0
  29. package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -0
  30. package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -0
  31. package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -0
  32. package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -0
  33. package/esm2015/lib/api/lr-graphql/lr.service.js +18 -0
  34. package/esm2015/lib/api/message.service.js +138 -0
  35. package/esm2015/lib/api/persist.service.js +181 -0
  36. package/esm2015/lib/api/query-processor/common-processors.service.js +93 -0
  37. package/esm2015/lib/api/query-processor/index.js +3 -0
  38. package/esm2015/lib/api/query-processor/query-processor.service.js +192 -0
  39. package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -0
  40. package/esm2015/lib/api/shared-contact-card.service.js +119 -0
  41. package/esm2015/lib/api/shared-contact-card2.gql.js +41 -0
  42. package/esm2015/lib/api/shared-contact-card2.service.js +117 -0
  43. package/esm2015/lib/api/time.service.js +146 -0
  44. package/esm2015/lib/api/types/graphql.types.js +7 -0
  45. package/esm2015/lib/api/types/index.js +3 -0
  46. package/esm2015/lib/api/types/lr-graphql.types.js +71 -0
  47. package/esm2015/lib/auth/auth.config.js +57 -0
  48. package/esm2015/lib/auth/auth.gql.js +48 -0
  49. package/esm2015/lib/auth/auth.types.js +27 -0
  50. package/esm2015/lib/auth/idle.service.js +168 -0
  51. package/esm2015/lib/auth/idle.types.js +7 -0
  52. package/esm2015/lib/auth/lbop.service.js +355 -0
  53. package/esm2015/lib/auth/life-ready-auth.service.js +333 -0
  54. package/esm2015/lib/auth/password.service.js +320 -0
  55. package/esm2015/lib/auth/register.service.js +172 -0
  56. package/esm2015/lib/auth/two-factor.service.js +74 -0
  57. package/esm2015/lib/category/category-meta.service.js +99 -0
  58. package/esm2015/lib/category/category.gql.js +406 -0
  59. package/esm2015/lib/category/category.service.js +390 -0
  60. package/esm2015/lib/category/category.types.js +29 -0
  61. package/esm2015/lib/cryptography/cryptography.types.js +11 -0
  62. package/esm2015/lib/cryptography/encryption.service.js +189 -0
  63. package/esm2015/lib/cryptography/key-factory.service.js +237 -0
  64. package/esm2015/lib/cryptography/key-graph.service.js +280 -0
  65. package/esm2015/lib/cryptography/key-meta.service.js +200 -0
  66. package/esm2015/lib/cryptography/key.service.js +124 -0
  67. package/esm2015/lib/cryptography/slip39.service.js +169 -0
  68. package/esm2015/lib/cryptography/web-crypto.service.js +29 -0
  69. package/esm2015/lib/life-ready.config.js +84 -0
  70. package/esm2015/lib/life-ready.module.js +74 -0
  71. package/esm2015/lib/plan/plan.gql.js +123 -0
  72. package/esm2015/lib/plan/plan.service.js +149 -0
  73. package/esm2015/lib/plan/plan.types.js +11 -0
  74. package/esm2015/lib/record/record-attachment.service.js +101 -0
  75. package/esm2015/lib/record/record.gql.js +179 -0
  76. package/esm2015/lib/record/record.service.js +206 -0
  77. package/esm2015/lib/record/record.types.js +15 -0
  78. package/esm2015/lib/record-type/record-type.service.js +75 -0
  79. package/esm2015/lib/record-type/record-type.types.js +28 -0
  80. package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +105 -0
  81. package/esm2015/lib/scenario/approvals/scenario-approval.types.js +1 -0
  82. package/esm2015/lib/scenario/approvals/scenario-approver.service.js +300 -0
  83. package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +52 -0
  84. package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +97 -0
  85. package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +1 -0
  86. package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +150 -0
  87. package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +229 -0
  88. package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +1 -0
  89. package/esm2015/lib/scenario/scenario-setup.service.js +269 -0
  90. package/esm2015/lib/scenario/scenario.gql.js +368 -0
  91. package/esm2015/lib/scenario/scenario.service.js +611 -0
  92. package/esm2015/lib/scenario/scenario.types.js +64 -0
  93. package/esm2015/lib/search/search.gql.js +62 -0
  94. package/esm2015/lib/search/search.service.js +156 -0
  95. package/esm2015/lib/search/search.types.js +6 -0
  96. package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +112 -0
  97. package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +266 -0
  98. package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +232 -0
  99. package/esm2015/lib/trusted-parties/tp-password-reset.service.js +300 -0
  100. package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -0
  101. package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -0
  102. package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -0
  103. package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -0
  104. package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -0
  105. package/esm2015/lib/users/profile-details.service.js +214 -0
  106. package/esm2015/lib/users/profile.gql.js +97 -0
  107. package/esm2015/lib/users/profile.service.js +169 -0
  108. package/esm2015/lib/users/profile.types.js +34 -0
  109. package/esm2015/lib/users/user.gql.js +60 -0
  110. package/esm2015/lib/users/user.service.js +79 -0
  111. package/esm2015/lib/users/user.types.js +5 -0
  112. package/esm2015/lifeready-core.js +10 -0
  113. package/esm2015/public-api.js +81 -0
  114. package/fesm2015/lifeready-core.js +13290 -0
  115. package/fesm2015/lifeready-core.js.map +1 -0
  116. package/lib/_common/ast.d.ts +11 -0
  117. package/lib/_common/deferred-promise.d.ts +12 -0
  118. package/lib/_common/exceptions.d.ts +109 -0
  119. package/lib/_common/queries.gql.d.ts +10 -0
  120. package/lib/_common/run-outside-angular.d.ts +14 -0
  121. package/lib/_common/types.d.ts +10 -0
  122. package/lib/_common/utils.d.ts +3 -0
  123. package/lib/api/contact-card.gql.d.ts +7 -0
  124. package/lib/api/contact-card.service.d.ts +52 -0
  125. package/lib/api/contact-card2.gql.d.ts +34 -0
  126. package/lib/api/contact-card2.service.d.ts +49 -0
  127. package/lib/api/file.service.d.ts +18 -0
  128. package/lib/api/item2.gql.d.ts +96 -0
  129. package/lib/api/item2.service.d.ts +177 -0
  130. package/lib/api/key-exchange.gql.d.ts +9 -0
  131. package/lib/api/key-exchange.service.d.ts +39 -0
  132. package/lib/api/key-exchange.types.d.ts +196 -0
  133. package/lib/api/key-exchange2.gql.d.ts +125 -0
  134. package/lib/api/key-exchange2.service.d.ts +187 -0
  135. package/lib/api/lock.gql.d.ts +27 -0
  136. package/lib/api/lock.service.d.ts +25 -0
  137. package/lib/api/lr-apollo.service.d.ts +15 -0
  138. package/lib/api/lr-graphql/index.d.ts +5 -0
  139. package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -0
  140. package/lib/api/lr-graphql/lr-merged-mutation.d.ts +27 -0
  141. package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -0
  142. package/lib/api/lr-graphql/lr-mutation.d.ts +8 -0
  143. package/lib/api/lr-graphql/lr.service.d.ts +9 -0
  144. package/lib/api/message.service.d.ts +58 -0
  145. package/lib/api/persist.service.d.ts +31 -0
  146. package/lib/api/query-processor/common-processors.service.d.ts +36 -0
  147. package/lib/api/query-processor/index.d.ts +2 -0
  148. package/lib/api/query-processor/query-processor.service.d.ts +18 -0
  149. package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -0
  150. package/lib/api/shared-contact-card.service.d.ts +33 -0
  151. package/lib/api/shared-contact-card2.gql.d.ts +36 -0
  152. package/lib/api/shared-contact-card2.service.d.ts +45 -0
  153. package/lib/api/time.service.d.ts +16 -0
  154. package/lib/api/types/graphql.types.d.ts +29 -0
  155. package/lib/api/types/index.d.ts +2 -0
  156. package/lib/api/types/lr-graphql.types.d.ts +385 -0
  157. package/lib/auth/auth.config.d.ts +5 -0
  158. package/lib/auth/auth.gql.d.ts +15 -0
  159. package/lib/auth/auth.types.d.ts +66 -0
  160. package/lib/auth/idle.service.d.ts +40 -0
  161. package/lib/auth/idle.types.d.ts +10 -0
  162. package/lib/auth/lbop.service.d.ts +91 -0
  163. package/lib/auth/life-ready-auth.service.d.ts +46 -0
  164. package/lib/auth/password.service.d.ts +78 -0
  165. package/lib/auth/register.service.d.ts +25 -0
  166. package/lib/auth/two-factor.service.d.ts +15 -0
  167. package/lib/category/category-meta.service.d.ts +23 -0
  168. package/lib/category/category.gql.d.ts +45 -0
  169. package/lib/category/category.service.d.ts +67 -0
  170. package/lib/category/category.types.d.ts +79 -0
  171. package/lib/cryptography/cryptography.types.d.ts +83 -0
  172. package/lib/cryptography/encryption.service.d.ts +41 -0
  173. package/lib/cryptography/key-factory.service.d.ts +38 -0
  174. package/lib/cryptography/key-graph.service.d.ts +33 -0
  175. package/lib/cryptography/key-meta.service.d.ts +44 -0
  176. package/lib/cryptography/key.service.d.ts +36 -0
  177. package/lib/cryptography/slip39.service.d.ts +43 -0
  178. package/lib/cryptography/web-crypto.service.d.ts +5 -0
  179. package/lib/life-ready.config.d.ts +14 -0
  180. package/lib/life-ready.module.d.ts +5 -0
  181. package/lib/plan/plan.gql.d.ts +11 -0
  182. package/lib/plan/plan.service.d.ts +33 -0
  183. package/lib/plan/plan.types.d.ts +31 -0
  184. package/lib/record/record-attachment.service.d.ts +16 -0
  185. package/lib/record/record.gql.d.ts +14 -0
  186. package/lib/record/record.service.d.ts +25 -0
  187. package/lib/record/record.types.d.ts +57 -0
  188. package/lib/record-type/record-type.service.d.ts +11 -0
  189. package/lib/record-type/record-type.types.d.ts +50 -0
  190. package/lib/scenario/approvals/scenario-approval.gql.d.ts +7 -0
  191. package/lib/scenario/approvals/scenario-approval.types.d.ts +63 -0
  192. package/lib/scenario/approvals/scenario-approver.service.d.ts +32 -0
  193. package/lib/scenario/claimants/scenario-claimant.gql.d.ts +5 -0
  194. package/lib/scenario/claimants/scenario-claimant.service.d.ts +17 -0
  195. package/lib/scenario/claimants/scenario-claimant.types.d.ts +18 -0
  196. package/lib/scenario/receivers/scenario-receiver.gql.d.ts +8 -0
  197. package/lib/scenario/receivers/scenario-receiver.service.d.ts +30 -0
  198. package/lib/scenario/receivers/scenario-receiver.types.d.ts +54 -0
  199. package/lib/scenario/scenario-setup.service.d.ts +22 -0
  200. package/lib/scenario/scenario.gql.d.ts +34 -0
  201. package/lib/scenario/scenario.service.d.ts +58 -0
  202. package/lib/scenario/scenario.types.d.ts +217 -0
  203. package/lib/search/search.gql.d.ts +1 -0
  204. package/lib/search/search.service.d.ts +25 -0
  205. package/lib/search/search.types.d.ts +20 -0
  206. package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -0
  207. package/lib/trusted-parties/tp-password-reset-user.service.d.ts +41 -0
  208. package/lib/trusted-parties/tp-password-reset.gql.d.ts +218 -0
  209. package/lib/trusted-parties/tp-password-reset.service.d.ts +131 -0
  210. package/lib/trusted-parties/trusted-party.gql.d.ts +9 -0
  211. package/lib/trusted-parties/trusted-party.service.d.ts +44 -0
  212. package/lib/trusted-parties/trusted-party.types.d.ts +102 -0
  213. package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -0
  214. package/lib/trusted-parties/trusted-party2.service.d.ts +114 -0
  215. package/lib/users/profile-details.service.d.ts +21 -0
  216. package/lib/users/profile.gql.d.ts +11 -0
  217. package/lib/users/profile.service.d.ts +35 -0
  218. package/lib/users/profile.types.d.ts +96 -0
  219. package/lib/users/user.gql.d.ts +9 -0
  220. package/lib/users/user.service.d.ts +12 -0
  221. package/lib/users/user.types.d.ts +23 -0
  222. package/lifeready-core.d.ts +9 -0
  223. package/lifeready-core.metadata.json +1 -0
  224. package/package.json +29 -0
  225. 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==