@lifeready/core 1.0.12 → 1.0.15
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 -62
- package/bundles/lifeready-core.umd.js +14315 -14315
- package/bundles/lifeready-core.umd.js.map +1 -1
- package/bundles/lifeready-core.umd.min.js.map +1 -1
- package/esm2015/lib/_common/ast.js +40 -40
- package/esm2015/lib/_common/deferred-promise.js +24 -24
- package/esm2015/lib/_common/exceptions.js +157 -157
- package/esm2015/lib/_common/queries.gql.js +190 -190
- package/esm2015/lib/_common/run-outside-angular.js +79 -79
- package/esm2015/lib/_common/types.js +1 -1
- package/esm2015/lib/_common/utils.js +52 -52
- package/esm2015/lib/api/contact-card.gql.js +79 -79
- package/esm2015/lib/api/contact-card.service.js +154 -154
- package/esm2015/lib/api/contact-card2.gql.js +60 -60
- package/esm2015/lib/api/contact-card2.service.js +103 -103
- package/esm2015/lib/api/file.service.js +74 -74
- package/esm2015/lib/api/key-exchange.gql.js +188 -188
- package/esm2015/lib/api/key-exchange.service.js +442 -442
- package/esm2015/lib/api/key-exchange.types.js +18 -18
- package/esm2015/lib/api/key-exchange2.gql.js +171 -171
- package/esm2015/lib/api/key-exchange2.service.js +479 -479
- package/esm2015/lib/api/lock.gql.js +40 -40
- package/esm2015/lib/api/lock.service.js +64 -64
- package/esm2015/lib/api/lr-apollo.service.js +46 -46
- package/esm2015/lib/api/lr-graphql/index.js +6 -6
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -155
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -213
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -51
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -48
- package/esm2015/lib/api/lr-graphql/lr.service.js +18 -18
- package/esm2015/lib/api/message.service.js +138 -138
- package/esm2015/lib/api/persist.service.js +181 -181
- package/esm2015/lib/api/query-processor/common-processors.service.js +93 -93
- package/esm2015/lib/api/query-processor/index.js +3 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +262 -262
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -109
- package/esm2015/lib/api/shared-contact-card.service.js +119 -119
- package/esm2015/lib/api/shared-contact-card2.gql.js +41 -41
- package/esm2015/lib/api/shared-contact-card2.service.js +117 -117
- package/esm2015/lib/api/time.service.js +146 -146
- package/esm2015/lib/api/types/graphql.types.js +7 -7
- package/esm2015/lib/api/types/index.js +3 -3
- package/esm2015/lib/api/types/lr-graphql.types.js +101 -101
- package/esm2015/lib/auth/auth.config.js +57 -57
- package/esm2015/lib/auth/auth.gql.js +48 -48
- package/esm2015/lib/auth/auth.types.js +27 -27
- package/esm2015/lib/auth/idle.service.js +168 -168
- package/esm2015/lib/auth/idle.types.js +7 -7
- package/esm2015/lib/auth/lbop.service.js +355 -355
- package/esm2015/lib/auth/life-ready-auth.service.js +488 -488
- package/esm2015/lib/auth/password.service.js +320 -320
- package/esm2015/lib/auth/register.service.js +172 -172
- package/esm2015/lib/auth/two-factor.service.js +74 -74
- package/esm2015/lib/category/category-meta.service.js +99 -99
- package/esm2015/lib/category/category.gql.js +406 -406
- package/esm2015/lib/category/category.service.js +390 -390
- package/esm2015/lib/category/category.types.js +29 -29
- package/esm2015/lib/cryptography/cryptography.types.js +11 -11
- package/esm2015/lib/cryptography/encryption.service.js +189 -189
- package/esm2015/lib/cryptography/key-factory.service.js +237 -237
- package/esm2015/lib/cryptography/key-graph.service.js +299 -299
- package/esm2015/lib/cryptography/key-meta.service.js +200 -200
- package/esm2015/lib/cryptography/key.service.js +124 -124
- package/esm2015/lib/cryptography/slip39.service.js +169 -169
- package/esm2015/lib/cryptography/web-crypto.service.js +29 -29
- package/esm2015/lib/items2/item2.gql.js +139 -139
- package/esm2015/lib/items2/item2.service.js +498 -498
- package/esm2015/lib/items2/item2.types.js +1 -1
- package/esm2015/lib/life-ready.config.js +84 -84
- package/esm2015/lib/life-ready.module.js +74 -74
- package/esm2015/lib/notification/notification.gql.js +43 -43
- package/esm2015/lib/notification/notification.service.js +118 -118
- package/esm2015/lib/plan/plan.gql.js +123 -123
- package/esm2015/lib/plan/plan.service.js +149 -149
- package/esm2015/lib/plan/plan.types.js +11 -11
- package/esm2015/lib/record/record-attachment.service.js +101 -101
- package/esm2015/lib/record/record.gql.js +179 -179
- package/esm2015/lib/record/record.service.js +206 -206
- package/esm2015/lib/record/record.types.js +15 -15
- package/esm2015/lib/record-type/record-type.service.js +75 -75
- package/esm2015/lib/record-type/record-type.types.js +28 -28
- package/esm2015/lib/scenario/scenario.constants.js +2 -2
- package/esm2015/lib/scenario/scenario.controller.js +34 -34
- package/esm2015/lib/scenario/scenario.gql.js +72 -72
- package/esm2015/lib/scenario/scenario.gql.private.js +198 -198
- package/esm2015/lib/scenario/scenario.service.js +538 -538
- package/esm2015/lib/scenario/scenario.types.js +1 -1
- package/esm2015/lib/trusted-parties/tp-assembly.gql.private.js +22 -22
- package/esm2015/lib/trusted-parties/tp-assembly.js +362 -362
- package/esm2015/lib/trusted-parties/tp-assembly.types.js +1 -1
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +113 -113
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +129 -129
- package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +4 -4
- package/esm2015/lib/trusted-parties/tp-password-reset.controller.js +34 -34
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +236 -236
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +95 -95
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -148
- package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -326
- package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -41
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -87
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -215
- package/esm2015/lib/users/profile-details.service.js +214 -214
- package/esm2015/lib/users/profile.gql.js +97 -97
- package/esm2015/lib/users/profile.service.js +169 -169
- package/esm2015/lib/users/profile.types.js +34 -34
- package/esm2015/lib/users/user.gql.js +60 -60
- package/esm2015/lib/users/user.service.js +79 -79
- package/esm2015/lib/users/user.types.js +5 -5
- package/esm2015/lifeready-core.js +13 -13
- package/esm2015/public-api.js +71 -71
- package/fesm2015/lifeready-core.js +12258 -12258
- package/fesm2015/lifeready-core.js.map +1 -1
- package/lib/_common/ast.d.ts +11 -11
- package/lib/_common/deferred-promise.d.ts +12 -12
- package/lib/_common/exceptions.d.ts +109 -109
- package/lib/_common/queries.gql.d.ts +10 -10
- package/lib/_common/run-outside-angular.d.ts +14 -14
- package/lib/_common/types.d.ts +10 -10
- package/lib/_common/utils.d.ts +9 -9
- package/lib/api/contact-card.gql.d.ts +7 -7
- package/lib/api/contact-card.service.d.ts +52 -52
- package/lib/api/contact-card2.gql.d.ts +34 -34
- package/lib/api/contact-card2.service.d.ts +49 -49
- package/lib/api/file.service.d.ts +18 -18
- package/lib/api/key-exchange.gql.d.ts +9 -9
- package/lib/api/key-exchange.service.d.ts +39 -39
- package/lib/api/key-exchange.types.d.ts +196 -196
- package/lib/api/key-exchange2.gql.d.ts +125 -125
- package/lib/api/key-exchange2.service.d.ts +187 -187
- package/lib/api/lock.gql.d.ts +27 -27
- package/lib/api/lock.service.d.ts +34 -34
- package/lib/api/lr-apollo.service.d.ts +15 -15
- package/lib/api/lr-graphql/index.d.ts +5 -5
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -60
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +28 -28
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -28
- package/lib/api/lr-graphql/lr-mutation.d.ts +8 -8
- package/lib/api/lr-graphql/lr.service.d.ts +9 -9
- package/lib/api/message.service.d.ts +58 -58
- package/lib/api/persist.service.d.ts +31 -31
- package/lib/api/query-processor/common-processors.service.d.ts +36 -36
- package/lib/api/query-processor/index.d.ts +2 -2
- package/lib/api/query-processor/query-processor.service.d.ts +18 -18
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -15
- package/lib/api/shared-contact-card.service.d.ts +33 -33
- package/lib/api/shared-contact-card2.gql.d.ts +36 -36
- package/lib/api/shared-contact-card2.service.d.ts +45 -45
- package/lib/api/time.service.d.ts +16 -16
- package/lib/api/types/graphql.types.d.ts +29 -29
- package/lib/api/types/index.d.ts +2 -2
- package/lib/api/types/lr-graphql.types.d.ts +502 -502
- package/lib/auth/auth.config.d.ts +5 -5
- package/lib/auth/auth.gql.d.ts +15 -15
- package/lib/auth/auth.types.d.ts +66 -66
- package/lib/auth/idle.service.d.ts +40 -40
- package/lib/auth/idle.types.d.ts +10 -10
- package/lib/auth/lbop.service.d.ts +91 -91
- package/lib/auth/life-ready-auth.service.d.ts +61 -61
- package/lib/auth/password.service.d.ts +78 -78
- package/lib/auth/register.service.d.ts +25 -25
- package/lib/auth/two-factor.service.d.ts +15 -15
- package/lib/category/category-meta.service.d.ts +23 -23
- package/lib/category/category.gql.d.ts +45 -45
- package/lib/category/category.service.d.ts +67 -67
- package/lib/category/category.types.d.ts +79 -79
- package/lib/cryptography/cryptography.types.d.ts +83 -83
- package/lib/cryptography/encryption.service.d.ts +41 -41
- package/lib/cryptography/key-factory.service.d.ts +38 -38
- package/lib/cryptography/key-graph.service.d.ts +41 -41
- package/lib/cryptography/key-meta.service.d.ts +44 -44
- package/lib/cryptography/key.service.d.ts +36 -36
- package/lib/cryptography/slip39.service.d.ts +43 -43
- package/lib/cryptography/web-crypto.service.d.ts +5 -5
- package/lib/items2/item2.gql.d.ts +123 -123
- package/lib/items2/item2.service.d.ts +203 -203
- package/lib/items2/item2.types.d.ts +70 -70
- package/lib/life-ready.config.d.ts +14 -14
- package/lib/life-ready.module.d.ts +5 -5
- package/lib/notification/notification.gql.d.ts +37 -37
- package/lib/notification/notification.service.d.ts +63 -63
- package/lib/plan/plan.gql.d.ts +11 -11
- package/lib/plan/plan.service.d.ts +33 -33
- package/lib/plan/plan.types.d.ts +31 -31
- package/lib/record/record-attachment.service.d.ts +16 -16
- package/lib/record/record.gql.d.ts +14 -14
- package/lib/record/record.service.d.ts +25 -25
- package/lib/record/record.types.d.ts +57 -57
- package/lib/record-type/record-type.service.d.ts +11 -11
- package/lib/record-type/record-type.types.d.ts +50 -50
- package/lib/scenario/scenario.constants.d.ts +1 -1
- package/lib/scenario/scenario.controller.d.ts +10 -10
- package/lib/scenario/scenario.gql.d.ts +62 -62
- package/lib/scenario/scenario.gql.private.d.ts +16 -16
- package/lib/scenario/scenario.service.d.ts +233 -233
- package/lib/scenario/scenario.types.d.ts +50 -50
- package/lib/trusted-parties/tp-assembly.d.ts +177 -177
- package/lib/trusted-parties/tp-assembly.gql.private.d.ts +5 -5
- package/lib/trusted-parties/tp-assembly.types.d.ts +38 -38
- package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -20
- package/lib/trusted-parties/tp-password-reset-user.service.d.ts +35 -35
- package/lib/trusted-parties/tp-password-reset.constants.d.ts +3 -3
- package/lib/trusted-parties/tp-password-reset.controller.d.ts +10 -10
- package/lib/trusted-parties/tp-password-reset.gql.d.ts +223 -223
- package/lib/trusted-parties/tp-password-reset.service.d.ts +188 -188
- package/lib/trusted-parties/trusted-party.gql.d.ts +9 -9
- package/lib/trusted-parties/trusted-party.service.d.ts +44 -44
- package/lib/trusted-parties/trusted-party.types.d.ts +102 -102
- package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -79
- package/lib/trusted-parties/trusted-party2.service.d.ts +114 -114
- package/lib/users/profile-details.service.d.ts +21 -21
- package/lib/users/profile.gql.d.ts +11 -11
- package/lib/users/profile.service.d.ts +35 -35
- package/lib/users/profile.types.d.ts +96 -96
- package/lib/users/user.gql.d.ts +9 -9
- package/lib/users/user.service.d.ts +12 -12
- package/lib/users/user.types.d.ts +23 -23
- package/lifeready-core.d.ts +12 -12
- package/package.json +1 -1
- package/public-api.d.ts +67 -67
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Inject, Injectable } from '@angular/core';
|
|
3
|
-
import { LrNotFoundException } from '../_common/exceptions';
|
|
4
|
-
import { PersistService } from '../api/persist.service';
|
|
5
|
-
import { KeyFactoryService as KFS } from './key-factory.service';
|
|
6
|
-
import { LR_CONFIG } from '../life-ready.config';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "../life-ready.config";
|
|
9
|
-
import * as i2 from "../api/persist.service";
|
|
10
|
-
export class UserKeys {
|
|
11
|
-
}
|
|
12
|
-
export class KeyService {
|
|
13
|
-
constructor(config, persistService) {
|
|
14
|
-
this.config = config;
|
|
15
|
-
this.persistService = persistService;
|
|
16
|
-
this.STORE_MASTER_KEY = 'masterKey';
|
|
17
|
-
// AZ: This can't be change easily. It's basically a PassK or PassIdp rotation.
|
|
18
|
-
// todo: we should eventually increase this periodically to match with Moore's law.
|
|
19
|
-
// The iterations for each key are kept by the server as well but we assume the value
|
|
20
|
-
// from the server is not trustworthy, so need to have minimum thresholds here.
|
|
21
|
-
// If creating new keys, these minimum are used.
|
|
22
|
-
this.MIN_PASS_IDP_PBKDF_ITER = 100000;
|
|
23
|
-
this.MIN_PASS_KEY_PBKDF_ITER = 100000;
|
|
24
|
-
this.MIN_LBOP_KEY_PBKDF_ITER = 100000;
|
|
25
|
-
// These are used as the default values. They must be larger than the minimum values.
|
|
26
|
-
this.DEFAULT_PASS_IDP_PBKDF_ITER = this.MIN_PASS_IDP_PBKDF_ITER;
|
|
27
|
-
this.DEFAULT_PASS_KEY_PBKDF_ITER = this.MIN_PASS_KEY_PBKDF_ITER;
|
|
28
|
-
this.DEFAULT_LBOP_KEY_PBKDF_ITER = this.MIN_LBOP_KEY_PBKDF_ITER;
|
|
29
|
-
this.resetKeys();
|
|
30
|
-
}
|
|
31
|
-
resetKeys() {
|
|
32
|
-
this.keys = null;
|
|
33
|
-
this.masterKey = null;
|
|
34
|
-
}
|
|
35
|
-
purgeKeys() {
|
|
36
|
-
this.resetKeys();
|
|
37
|
-
this.persistService.clear();
|
|
38
|
-
}
|
|
39
|
-
populateKeys(keys) {
|
|
40
|
-
this.keys = keys;
|
|
41
|
-
}
|
|
42
|
-
getCurrentPassKey() {
|
|
43
|
-
return this.keys.passKey;
|
|
44
|
-
}
|
|
45
|
-
getCurrentMasterKey() {
|
|
46
|
-
return this.keys.masterKey;
|
|
47
|
-
}
|
|
48
|
-
getCurrentRootKey() {
|
|
49
|
-
return this.keys.rootKey;
|
|
50
|
-
}
|
|
51
|
-
getCurrentPxk() {
|
|
52
|
-
return this.keys.pxk;
|
|
53
|
-
}
|
|
54
|
-
getCurrentSigPxk() {
|
|
55
|
-
return this.keys.sigPxk;
|
|
56
|
-
}
|
|
57
|
-
expiresAfter(seconds) {
|
|
58
|
-
return new Date(Date.now() + 1000 * seconds);
|
|
59
|
-
}
|
|
60
|
-
persistMasterKey(masterKey, expiresAfterSeconds) {
|
|
61
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
-
const storedKey = {
|
|
63
|
-
id: masterKey.id,
|
|
64
|
-
jwk: masterKey.jwk.toJSON(true),
|
|
65
|
-
};
|
|
66
|
-
this.masterKey = masterKey;
|
|
67
|
-
// Save in an expirable cookie.
|
|
68
|
-
yield this.persistService.set({
|
|
69
|
-
name: this.STORE_MASTER_KEY,
|
|
70
|
-
value: storedKey,
|
|
71
|
-
expiry: this.expiresAfter(expiresAfterSeconds),
|
|
72
|
-
serverSession: !this.config.disableSessionEncryptionKey,
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
setMasterKeyExpiresAfterSeconds(seconds) {
|
|
77
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
-
const storedKey = yield this.persistService.get(this.STORE_MASTER_KEY);
|
|
79
|
-
if (storedKey == null) {
|
|
80
|
-
throw new LrNotFoundException(`Can not find masterKey in persisted storage using name: ${this.STORE_MASTER_KEY}`);
|
|
81
|
-
}
|
|
82
|
-
yield this.persistService.set({
|
|
83
|
-
name: this.STORE_MASTER_KEY,
|
|
84
|
-
value: storedKey,
|
|
85
|
-
expiry: this.expiresAfter(seconds),
|
|
86
|
-
serverSession: !this.config.disableSessionEncryptionKey,
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
// There's little benefit in using WebCrypto's none-extractable keys because if there
|
|
91
|
-
// is an XSS attack, then the attacker has control over the js that downloads the keys. The
|
|
92
|
-
// attacker can modify the code to import the keys as extractable. So none-extractable keys
|
|
93
|
-
// are only useful if they are already persisted and the user cannot download any more keys,
|
|
94
|
-
// which is not feasible.
|
|
95
|
-
// So storing the PassKey in localstorage for now, at least till we know what the usage
|
|
96
|
-
// pattern is, i.e. how often do we need to use the RootK, MaterK, and PassK.
|
|
97
|
-
loadMasterKey(masterKeyId) {
|
|
98
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
99
|
-
if (!this.masterKey) {
|
|
100
|
-
const storedKey = yield this.persistService.get(this.STORE_MASTER_KEY);
|
|
101
|
-
if (!storedKey) {
|
|
102
|
-
throw new LrNotFoundException('Could not find masterKey in persisted storage');
|
|
103
|
-
}
|
|
104
|
-
if (storedKey.id !== masterKeyId) {
|
|
105
|
-
throw new LrNotFoundException(`masterKeyId ${storedKey.id} in persisted storage does not match the one requested ${masterKeyId}`);
|
|
106
|
-
}
|
|
107
|
-
storedKey.jwk = yield KFS.asKey(storedKey.jwk);
|
|
108
|
-
this.masterKey = storedKey;
|
|
109
|
-
}
|
|
110
|
-
return this.masterKey;
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
KeyService.ɵprov = i0.ɵɵdefineInjectable({ factory: function KeyService_Factory() { return new KeyService(i0.ɵɵinject(i1.LR_CONFIG), i0.ɵɵinject(i2.PersistService)); }, token: KeyService, providedIn: "root" });
|
|
115
|
-
KeyService.decorators = [
|
|
116
|
-
{ type: Injectable, args: [{
|
|
117
|
-
providedIn: 'root',
|
|
118
|
-
},] }
|
|
119
|
-
];
|
|
120
|
-
KeyService.ctorParameters = () => [
|
|
121
|
-
{ type: undefined, decorators: [{ type: Inject, args: [LR_CONFIG,] }] },
|
|
122
|
-
{ type: PersistService }
|
|
123
|
-
];
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL29wdC9hdGxhc3NpYW4vcGlwZWxpbmVzL2FnZW50L2J1aWxkL3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL2NyeXB0b2dyYXBoeS9rZXkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsSUFBSSxHQUFHLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRSxPQUFPLEVBQW1CLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7O0FBRWxFLE1BQU0sT0FBTyxRQUFRO0NBTXBCO0FBVUQsTUFBTSxPQUFPLFVBQVU7SUFvQnJCLFlBQzZCLE1BQXVCLEVBQzFDLGNBQThCO1FBRFgsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDMUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBckJ2QixxQkFBZ0IsR0FBRyxXQUFXLENBQUM7UUFLaEQsK0VBQStFO1FBQy9FLG1GQUFtRjtRQUNuRixxRkFBcUY7UUFDckYsK0VBQStFO1FBQy9FLGdEQUFnRDtRQUNoQyw0QkFBdUIsR0FBRyxNQUFNLENBQUM7UUFDakMsNEJBQXVCLEdBQUcsTUFBTSxDQUFDO1FBQ2pDLDRCQUF1QixHQUFHLE1BQU0sQ0FBQztRQUVqRCxxRkFBcUY7UUFDckUsZ0NBQTJCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzNELGdDQUEyQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUMzRCxnQ0FBMkIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFNekUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENB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RUFBRTtvQkFDZCxNQUFNLElBQUksbUJBQW1CLENBQzNCLCtDQUErQyxDQUNoRCxDQUFDO2lCQUNIO2dCQUVELElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxXQUFXLEVBQUU7b0JBQ2hDLE1BQU0sSUFBSSxtQkFBbUIsQ0FDM0IsZUFBZSxTQUFTLENBQUMsRUFBRSwwREFBMEQsV0FBVyxFQUFFLENBQ25HLENBQUM7aUJBQ0g7Z0JBRUQsU0FBUyxDQUFDLEdBQUcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUUvQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQzthQUM1QjtZQUVELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDO0tBQUE7Ozs7WUFwSUYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7NENBc0JJLE1BQU0sU0FBQyxTQUFTO1lBekNaLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEtleSwgUGFzc0tleSB9IGZyb20gJy4vY3J5cHRvZ3JhcGh5LnR5cGVzJztcbmltcG9ydCB7IExyTm90Rm91bmRFeGNlcHRpb24gfSBmcm9tICcuLi9fY29tbW9uL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgUGVyc2lzdFNlcnZpY2UgfSBmcm9tICcuLi9hcGkvcGVyc2lzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEtleUZhY3RvcnlTZXJ2aWNlIGFzIEtGUyB9IGZyb20gJy4va2V5LWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBMaWZlUmVhZHlDb25maWcsIExSX0NPTkZJRyB9IGZyb20gJy4uL2xpZmUtcmVhZHkuY29uZmlnJztcblxuZXhwb3J0IGNsYXNzIFVzZXJLZXlzIHtcbiAgcGFzc0tleTogUGFzc0tleTtcbiAgbWFzdGVyS2V5OiBLZXk7XG4gIHJvb3RLZXk/OiBLZXk7XG4gIHB4az86IEtleTtcbiAgc2lnUHhrPzogS2V5O1xufVxuXG5pbnRlcmZhY2UgU3RvcmVkUGFzc0tleSB7XG4gIGlkOiBzdHJpbmc7XG4gIGp3azogb2JqZWN0O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgS2V5U2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgU1RPUkVfTUFTVEVSX0tFWSA9ICdtYXN0ZXJLZXknO1xuICAvLyB2YXJpYWJsZXNcbiAgcHJpdmF0ZSBrZXlzOiBVc2VyS2V5cztcbiAgcHJpdmF0ZSBtYXN0ZXJLZXk6IEtleTtcblxuICAvLyBBWjogVGhpcyBjYW4ndCBiZSBjaGFuZ2UgZWFzaWx5LiBJdCdzIGJhc2ljYWxseSBhIFBhc3NLIG9yIFBhc3NJZHAgcm90YXRpb24uXG4gIC8vIHRvZG86IHdlIHNob3VsZCBldmVudHVhbGx5IGluY3JlYXNlIHRoaXMgcGVyaW9kaWNhbGx5IHRvIG1hdGNoIHdpdGggTW9vcmUncyBsYXcuXG4gIC8vIFRoZSBpdGVyYXRpb25zIGZvciBlYWNoIGtleSBhcmUga2VwdCBieSB0aGUgc2VydmVyIGFzIHdlbGwgYnV0IHdlIGFzc3VtZSB0aGUgdmFsdWVcbiAgLy8gZnJvbSB0aGUgc2VydmVyIGlzIG5vdCB0cnVzdHdvcnRoeSwgc28gbmVlZCB0byBoYXZlIG1pbmltdW0gdGhyZXNob2xkcyBoZXJlLlxuICAvLyBJZiBjcmVhdGluZyBuZXcga2V5cywgdGhlc2UgbWluaW11bSBhcmUgdXNlZC5cbiAgcHVibGljIHJlYWRvbmx5IE1JTl9QQVNTX0lEUF9QQktERl9JVEVSID0gMTAwMDAwO1xuICBwdWJsaWMgcmVhZG9ubHkgTUlOX1BBU1NfS0VZX1BCS0RGX0lURVIgPSAxMDAwMDA7XG4gIHB1YmxpYyByZWFkb25seSBNSU5fTEJPUF9LRVlfUEJLREZfSVRFUiA9IDEwMDAwMDtcblxuICAvLyBUaGVzZSBhcmUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZXMuIFRoZXkgbXVzdCBiZSBsYXJnZXIgdGhhbiB0aGUgbWluaW11bSB2YWx1ZXMuXG4gIHB1YmxpYyByZWFkb25seSBERUZBVUxUX1BBU1NfSURQX1BCS0RGX0lURVIgPSB0aGlzLk1JTl9QQVNTX0lEUF9QQktERl9JVEVSO1xuICBwdWJsaWMgcmVhZG9ubHkgREVGQVVMVF9QQVNTX0tFWV9QQktERl9JVEVSID0gdGhpcy5NSU5fUEFTU19LRVlfUEJLREZfSVRFUjtcbiAgcHVibGljIHJlYWRvbmx5IERFRkFVTFRfTEJPUF9LRVlfUEJLREZfSVRFUiA9IHRoaXMuTUlOX0xCT1BfS0VZX1BCS0RGX0lURVI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChMUl9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBMaWZlUmVhZHlDb25maWcsXG4gICAgcHJpdmF0ZSBwZXJzaXN0U2VydmljZTogUGVyc2lzdFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5yZXNldEtleXMoKTtcbiAgfVxuXG4gIHJlc2V0S2V5cygpIHtcbiAgICB0aGlzLmtleXMgPSBudWxsO1xuICAgIHRoaXMubWFzdGVyS2V5ID0gbnVsbDtcbiAgfVxuXG4gIHB1cmdlS2V5cygpIHtcbiAgICB0aGlzLnJlc2V0S2V5cygpO1xuICAgIHRoaXMucGVyc2lzdFNlcnZpY2UuY2xlYXIoKTtcbiAgfVxuXG4gIHBvcHVsYXRlS2V5cyhrZXlzOiBVc2VyS2V5cykge1xuICAgIHRoaXMua2V5cyA9IGtleXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFBhc3NLZXkoKTogS2V5IHtcbiAgICByZXR1cm4gdGhpcy5rZXlzLnBhc3NLZXk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudE1hc3RlcktleSgpOiBLZXkge1xuICAgIHJldHVybiB0aGlzLmtleXMubWFzdGVyS2V5O1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRSb290S2V5KCk6IEtleSB7XG4gICAgcmV0dXJuIHRoaXMua2V5cy5yb290S2V5O1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRQeGsoKTogS2V5IHtcbiAgICByZXR1cm4gdGhpcy5rZXlzLnB4aztcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50U2lnUHhrKCk6IEtleSB7XG4gICAgcmV0dXJuIHRoaXMua2V5cy5zaWdQeGs7XG4gIH1cblxuICBwcml2YXRlIGV4cGlyZXNBZnRlcihzZWNvbmRzOiBudW1iZXIpOiBEYXRlIHtcbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSArIDEwMDAgKiBzZWNvbmRzKTtcbiAgfVxuXG4gIGFzeW5jIHBlcnNpc3RNYXN0ZXJLZXkoXG4gICAgbWFzdGVyS2V5OiBLZXksXG4gICAgZXhwaXJlc0FmdGVyU2Vjb25kczogbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0b3JlZEtleSA9IHtcbiAgICAgIGlkOiBtYXN0ZXJLZXkuaWQsXG4gICAgICBqd2s6IG1hc3RlcktleS5qd2sudG9KU09OKHRydWUpLFxuICAgIH07XG5cbiAgICB0aGlzLm1hc3RlcktleSA9IG1hc3RlcktleTtcblxuICAgIC8vIFNhdmUgaW4gYW4gZXhwaXJhYmxlIGNvb2tpZS5cbiAgICBhd2FpdCB0aGlzLnBlcnNpc3RTZXJ2aWNlLnNldCh7XG4gICAgICBuYW1lOiB0aGlzLlNUT1JFX01BU1RFUl9LRVksXG4gICAgICB2YWx1ZTogc3RvcmVkS2V5LFxuICAgICAgZXhwaXJ5OiB0aGlzLmV4cGlyZXNBZnRlcihleHBpcmVzQWZ0ZXJTZWNvbmRzKSxcbiAgICAgIHNlcnZlclNlc3Npb246ICF0aGlzLmNvbmZpZy5kaXNhYmxlU2Vzc2lvbkVuY3J5cHRpb25LZXksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzZXRNYXN0ZXJLZXlFeHBpcmVzQWZ0ZXJTZWNvbmRzKHNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0b3JlZEtleSA9IGF3YWl0IHRoaXMucGVyc2lzdFNlcnZpY2UuZ2V0KHRoaXMuU1RPUkVfTUFTVEVSX0tFWSk7XG4gICAgaWYgKHN0b3JlZEtleSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgTHJOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgYENhbiBub3QgZmluZCBtYXN0ZXJLZXkgaW4gcGVyc2lzdGVkIHN0b3JhZ2UgdXNpbmcgbmFtZTogJHt0aGlzLlNUT1JFX01BU1RFUl9LRVl9YFxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5wZXJzaXN0U2VydmljZS5zZXQoe1xuICAgICAgbmFtZTogdGhpcy5TVE9SRV9NQVNURVJfS0VZLFxuICAgICAgdmFsdWU6IHN0b3JlZEtleSxcbiAgICAgIGV4cGlyeTogdGhpcy5leHBpcmVzQWZ0ZXIoc2Vjb25kcyksXG4gICAgICBzZXJ2ZXJTZXNzaW9uOiAhdGhpcy5jb25maWcuZGlzYWJsZVNlc3Npb25FbmNyeXB0aW9uS2V5LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlcmUncyBsaXR0bGUgYmVuZWZpdCBpbiB1c2luZyBXZWJDcnlwdG8ncyBub25lLWV4dHJhY3RhYmxlIGtleXMgYmVjYXVzZSBpZiB0aGVyZVxuICAvLyBpcyBhbiBYU1MgYXR0YWNrLCB0aGVuIHRoZSBhdHRhY2tlciBoYXMgY29udHJvbCBvdmVyIHRoZSBqcyB0aGF0IGRvd25sb2FkcyB0aGUga2V5cy4gVGhlXG4gIC8vIGF0dGFja2VyIGNhbiBtb2RpZnkgdGhlIGNvZGUgdG8gaW1wb3J0IHRoZSBrZXlzIGFzIGV4dHJhY3RhYmxlLiBTbyBub25lLWV4dHJhY3RhYmxlIGtleXNcbiAgLy8gYXJlIG9ubHkgdXNlZnVsIGlmIHRoZXkgYXJlIGFscmVhZHkgcGVyc2lzdGVkIGFuZCB0aGUgdXNlciBjYW5ub3QgZG93bmxvYWQgYW55IG1vcmUga2V5cyxcbiAgLy8gd2hpY2ggaXMgbm90IGZlYXNpYmxlLlxuICAvLyBTbyBzdG9yaW5nIHRoZSBQYXNzS2V5IGluIGxvY2Fsc3RvcmFnZSBmb3Igbm93LCBhdCBsZWFzdCB0aWxsIHdlIGtub3cgd2hhdCB0aGUgdXNhZ2VcbiAgLy8gcGF0dGVybiBpcywgaS5lLiBob3cgb2Z0ZW4gZG8gd2UgbmVlZCB0byB1c2UgdGhlIFJvb3RLLCBNYXRlckssIGFuZCBQYXNzSy5cbiAgYXN5bmMgbG9hZE1hc3RlcktleShtYXN0ZXJLZXlJZDogc3RyaW5nKTogUHJvbWlzZTxLZXk+IHtcbiAgICBpZiAoIXRoaXMubWFzdGVyS2V5KSB7XG4gICAgICBjb25zdCBzdG9yZWRLZXkgPSBhd2FpdCB0aGlzLnBlcnNpc3RTZXJ2aWNlLmdldCh0aGlzLlNUT1JFX01BU1RFUl9LRVkpO1xuXG4gICAgICBpZiAoIXN0b3JlZEtleSkge1xuICAgICAgICB0aHJvdyBuZXcgTHJOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgICAnQ291bGQgbm90IGZpbmQgbWFzdGVyS2V5IGluIHBlcnNpc3RlZCBzdG9yYWdlJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RvcmVkS2V5LmlkICE9PSBtYXN0ZXJLZXlJZCkge1xuICAgICAgICB0aHJvdyBuZXcgTHJOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgICBgbWFzdGVyS2V5SWQgJHtzdG9yZWRLZXkuaWR9IGluIHBlcnNpc3RlZCBzdG9yYWdlIGRvZXMgbm90IG1hdGNoIHRoZSBvbmUgcmVxdWVzdGVkICR7bWFzdGVyS2V5SWR9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBzdG9yZWRLZXkuandrID0gYXdhaXQgS0ZTLmFzS2V5KHN0b3JlZEtleS5qd2spO1xuXG4gICAgICB0aGlzLm1hc3RlcktleSA9IHN0b3JlZEtleTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tYXN0ZXJLZXk7XG4gIH1cbn1cbiJdfQ==
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Inject, Injectable } from '@angular/core';
|
|
3
|
+
import { LrNotFoundException } from '../_common/exceptions';
|
|
4
|
+
import { PersistService } from '../api/persist.service';
|
|
5
|
+
import { KeyFactoryService as KFS } from './key-factory.service';
|
|
6
|
+
import { LR_CONFIG } from '../life-ready.config';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../life-ready.config";
|
|
9
|
+
import * as i2 from "../api/persist.service";
|
|
10
|
+
export class UserKeys {
|
|
11
|
+
}
|
|
12
|
+
export class KeyService {
|
|
13
|
+
constructor(config, persistService) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.persistService = persistService;
|
|
16
|
+
this.STORE_MASTER_KEY = 'masterKey';
|
|
17
|
+
// AZ: This can't be change easily. It's basically a PassK or PassIdp rotation.
|
|
18
|
+
// todo: we should eventually increase this periodically to match with Moore's law.
|
|
19
|
+
// The iterations for each key are kept by the server as well but we assume the value
|
|
20
|
+
// from the server is not trustworthy, so need to have minimum thresholds here.
|
|
21
|
+
// If creating new keys, these minimum are used.
|
|
22
|
+
this.MIN_PASS_IDP_PBKDF_ITER = 100000;
|
|
23
|
+
this.MIN_PASS_KEY_PBKDF_ITER = 100000;
|
|
24
|
+
this.MIN_LBOP_KEY_PBKDF_ITER = 100000;
|
|
25
|
+
// These are used as the default values. They must be larger than the minimum values.
|
|
26
|
+
this.DEFAULT_PASS_IDP_PBKDF_ITER = this.MIN_PASS_IDP_PBKDF_ITER;
|
|
27
|
+
this.DEFAULT_PASS_KEY_PBKDF_ITER = this.MIN_PASS_KEY_PBKDF_ITER;
|
|
28
|
+
this.DEFAULT_LBOP_KEY_PBKDF_ITER = this.MIN_LBOP_KEY_PBKDF_ITER;
|
|
29
|
+
this.resetKeys();
|
|
30
|
+
}
|
|
31
|
+
resetKeys() {
|
|
32
|
+
this.keys = null;
|
|
33
|
+
this.masterKey = null;
|
|
34
|
+
}
|
|
35
|
+
purgeKeys() {
|
|
36
|
+
this.resetKeys();
|
|
37
|
+
this.persistService.clear();
|
|
38
|
+
}
|
|
39
|
+
populateKeys(keys) {
|
|
40
|
+
this.keys = keys;
|
|
41
|
+
}
|
|
42
|
+
getCurrentPassKey() {
|
|
43
|
+
return this.keys.passKey;
|
|
44
|
+
}
|
|
45
|
+
getCurrentMasterKey() {
|
|
46
|
+
return this.keys.masterKey;
|
|
47
|
+
}
|
|
48
|
+
getCurrentRootKey() {
|
|
49
|
+
return this.keys.rootKey;
|
|
50
|
+
}
|
|
51
|
+
getCurrentPxk() {
|
|
52
|
+
return this.keys.pxk;
|
|
53
|
+
}
|
|
54
|
+
getCurrentSigPxk() {
|
|
55
|
+
return this.keys.sigPxk;
|
|
56
|
+
}
|
|
57
|
+
expiresAfter(seconds) {
|
|
58
|
+
return new Date(Date.now() + 1000 * seconds);
|
|
59
|
+
}
|
|
60
|
+
persistMasterKey(masterKey, expiresAfterSeconds) {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
const storedKey = {
|
|
63
|
+
id: masterKey.id,
|
|
64
|
+
jwk: masterKey.jwk.toJSON(true),
|
|
65
|
+
};
|
|
66
|
+
this.masterKey = masterKey;
|
|
67
|
+
// Save in an expirable cookie.
|
|
68
|
+
yield this.persistService.set({
|
|
69
|
+
name: this.STORE_MASTER_KEY,
|
|
70
|
+
value: storedKey,
|
|
71
|
+
expiry: this.expiresAfter(expiresAfterSeconds),
|
|
72
|
+
serverSession: !this.config.disableSessionEncryptionKey,
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
setMasterKeyExpiresAfterSeconds(seconds) {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
const storedKey = yield this.persistService.get(this.STORE_MASTER_KEY);
|
|
79
|
+
if (storedKey == null) {
|
|
80
|
+
throw new LrNotFoundException(`Can not find masterKey in persisted storage using name: ${this.STORE_MASTER_KEY}`);
|
|
81
|
+
}
|
|
82
|
+
yield this.persistService.set({
|
|
83
|
+
name: this.STORE_MASTER_KEY,
|
|
84
|
+
value: storedKey,
|
|
85
|
+
expiry: this.expiresAfter(seconds),
|
|
86
|
+
serverSession: !this.config.disableSessionEncryptionKey,
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// There's little benefit in using WebCrypto's none-extractable keys because if there
|
|
91
|
+
// is an XSS attack, then the attacker has control over the js that downloads the keys. The
|
|
92
|
+
// attacker can modify the code to import the keys as extractable. So none-extractable keys
|
|
93
|
+
// are only useful if they are already persisted and the user cannot download any more keys,
|
|
94
|
+
// which is not feasible.
|
|
95
|
+
// So storing the PassKey in localstorage for now, at least till we know what the usage
|
|
96
|
+
// pattern is, i.e. how often do we need to use the RootK, MaterK, and PassK.
|
|
97
|
+
loadMasterKey(masterKeyId) {
|
|
98
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
99
|
+
if (!this.masterKey) {
|
|
100
|
+
const storedKey = yield this.persistService.get(this.STORE_MASTER_KEY);
|
|
101
|
+
if (!storedKey) {
|
|
102
|
+
throw new LrNotFoundException('Could not find masterKey in persisted storage');
|
|
103
|
+
}
|
|
104
|
+
if (storedKey.id !== masterKeyId) {
|
|
105
|
+
throw new LrNotFoundException(`masterKeyId ${storedKey.id} in persisted storage does not match the one requested ${masterKeyId}`);
|
|
106
|
+
}
|
|
107
|
+
storedKey.jwk = yield KFS.asKey(storedKey.jwk);
|
|
108
|
+
this.masterKey = storedKey;
|
|
109
|
+
}
|
|
110
|
+
return this.masterKey;
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
KeyService.ɵprov = i0.ɵɵdefineInjectable({ factory: function KeyService_Factory() { return new KeyService(i0.ɵɵinject(i1.LR_CONFIG), i0.ɵɵinject(i2.PersistService)); }, token: KeyService, providedIn: "root" });
|
|
115
|
+
KeyService.decorators = [
|
|
116
|
+
{ type: Injectable, args: [{
|
|
117
|
+
providedIn: 'root',
|
|
118
|
+
},] }
|
|
119
|
+
];
|
|
120
|
+
KeyService.ctorParameters = () => [
|
|
121
|
+
{ type: undefined, decorators: [{ type: Inject, args: [LR_CONFIG,] }] },
|
|
122
|
+
{ type: PersistService }
|
|
123
|
+
];
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiQzovUHJvamVjdHMva2MtY2xpZW50L3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL2NyeXB0b2dyYXBoeS9rZXkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsSUFBSSxHQUFHLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRSxPQUFPLEVBQW1CLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7O0FBRWxFLE1BQU0sT0FBTyxRQUFRO0NBTXBCO0FBVUQsTUFBTSxPQUFPLFVBQVU7SUFvQnJCLFlBQzZCLE1BQXVCLEVBQzFDLGNBQThCO1FBRFgsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDMUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBckJ2QixxQkFBZ0IsR0FBRyxXQUFXLENBQUM7UUFLaEQsK0VBQStFO1FBQy9FLG1GQUFtRjtRQUNuRixxRkFBcUY7UUFDckYsK0VBQStFO1FBQy9FLGdEQUFnRDtRQUNoQyw0QkFBdUIsR0FBRyxNQUFNLENBQUM7UUFDakMsNEJBQXVCLEdBQUcsTUFBTSxDQUFDO1FBQ2pDLDRCQUF1QixHQUFHLE1BQU0sQ0FBQztRQUVqRCxxRkFBcUY7UUFDckUsZ0NBQTJCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzNELGdDQUEyQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUMzRCxnQ0FBMkIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFNekUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxTQUFTO1FB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LElBQUksbUJBQW1CLENBQzNCLCtDQUErQyxDQUNoRCxDQUFDO2lCQUNIO2dCQUVELElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxXQUFXLEVBQUU7b0JBQ2hDLE1BQU0sSUFBSSxtQkFBbUIsQ0FDM0IsZUFBZSxTQUFTLENBQUMsRUFBRSwwREFBMEQsV0FBVyxFQUFFLENBQ25HLENBQUM7aUJBQ0g7Z0JBRUQsU0FBUyxDQUFDLEdBQUcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUUvQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQzthQUM1QjtZQUVELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDO0tBQUE7Ozs7WUFwSUYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7NENBc0JJLE1BQU0sU0FBQyxTQUFTO1lBekNaLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgS2V5LCBQYXNzS2V5IH0gZnJvbSAnLi9jcnlwdG9ncmFwaHkudHlwZXMnO1xyXG5pbXBvcnQgeyBMck5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSAnLi4vX2NvbW1vbi9leGNlcHRpb25zJztcclxuaW1wb3J0IHsgUGVyc2lzdFNlcnZpY2UgfSBmcm9tICcuLi9hcGkvcGVyc2lzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgS2V5RmFjdG9yeVNlcnZpY2UgYXMgS0ZTIH0gZnJvbSAnLi9rZXktZmFjdG9yeS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGlmZVJlYWR5Q29uZmlnLCBMUl9DT05GSUcgfSBmcm9tICcuLi9saWZlLXJlYWR5LmNvbmZpZyc7XHJcblxyXG5leHBvcnQgY2xhc3MgVXNlcktleXMge1xyXG4gIHBhc3NLZXk6IFBhc3NLZXk7XHJcbiAgbWFzdGVyS2V5OiBLZXk7XHJcbiAgcm9vdEtleT86IEtleTtcclxuICBweGs/OiBLZXk7XHJcbiAgc2lnUHhrPzogS2V5O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgU3RvcmVkUGFzc0tleSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBqd2s6IG9iamVjdDtcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEtleVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1RPUkVfTUFTVEVSX0tFWSA9ICdtYXN0ZXJLZXknO1xyXG4gIC8vIHZhcmlhYmxlc1xyXG4gIHByaXZhdGUga2V5czogVXNlcktleXM7XHJcbiAgcHJpdmF0ZSBtYXN0ZXJLZXk6IEtleTtcclxuXHJcbiAgLy8gQVo6IFRoaXMgY2FuJ3QgYmUgY2hhbmdlIGVhc2lseS4gSXQncyBiYXNpY2FsbHkgYSBQYXNzSyBvciBQYXNzSWRwIHJvdGF0aW9uLlxyXG4gIC8vIHRvZG86IHdlIHNob3VsZCBldmVudHVhbGx5IGluY3JlYXNlIHRoaXMgcGVyaW9kaWNhbGx5IHRvIG1hdGNoIHdpdGggTW9vcmUncyBsYXcuXHJcbiAgLy8gVGhlIGl0ZXJhdGlvbnMgZm9yIGVhY2gga2V5IGFyZSBrZXB0IGJ5IHRoZSBzZXJ2ZXIgYXMgd2VsbCBidXQgd2UgYXNzdW1lIHRoZSB2YWx1ZVxyXG4gIC8vIGZyb20gdGhlIHNlcnZlciBpcyBub3QgdHJ1c3R3b3J0aHksIHNvIG5lZWQgdG8gaGF2ZSBtaW5pbXVtIHRocmVzaG9sZHMgaGVyZS5cclxuICAvLyBJZiBjcmVhdGluZyBuZXcga2V5cywgdGhlc2UgbWluaW11bSBhcmUgdXNlZC5cclxuICBwdWJsaWMgcmVhZG9ubHkgTUlOX1BBU1NfSURQX1BCS0RGX0lURVIgPSAxMDAwMDA7XHJcbiAgcHVibGljIHJlYWRvbmx5IE1JTl9QQVNTX0tFWV9QQktERl9JVEVSID0gMTAwMDAwO1xyXG4gIHB1YmxpYyByZWFkb25seSBNSU5fTEJPUF9LRVlfUEJLREZfSVRFUiA9IDEwMDAwMDtcclxuXHJcbiAgLy8gVGhlc2UgYXJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWVzLiBUaGV5IG11c3QgYmUgbGFyZ2VyIHRoYW4gdGhlIG1pbmltdW0gdmFsdWVzLlxyXG4gIHB1YmxpYyByZWFkb25seSBERUZBVUxUX1BBU1NfSURQX1BCS0RGX0lURVIgPSB0aGlzLk1JTl9QQVNTX0lEUF9QQktERl9JVEVSO1xyXG4gIHB1YmxpYyByZWFkb25seSBERUZBVUxUX1BBU1NfS0VZX1BCS0RGX0lURVIgPSB0aGlzLk1JTl9QQVNTX0tFWV9QQktERl9JVEVSO1xyXG4gIHB1YmxpYyByZWFkb25seSBERUZBVUxUX0xCT1BfS0VZX1BCS0RGX0lURVIgPSB0aGlzLk1JTl9MQk9QX0tFWV9QQktERl9JVEVSO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoTFJfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogTGlmZVJlYWR5Q29uZmlnLFxyXG4gICAgcHJpdmF0ZSBwZXJzaXN0U2VydmljZTogUGVyc2lzdFNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMucmVzZXRLZXlzKCk7XHJcbiAgfVxyXG5cclxuICByZXNldEtleXMoKSB7XHJcbiAgICB0aGlzLmtleXMgPSBudWxsO1xyXG4gICAgdGhpcy5tYXN0ZXJLZXkgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVyZ2VLZXlzKCkge1xyXG4gICAgdGhpcy5yZXNldEtleXMoKTtcclxuICAgIHRoaXMucGVyc2lzdFNlcnZpY2UuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIHBvcHVsYXRlS2V5cyhrZXlzOiBVc2VyS2V5cykge1xyXG4gICAgdGhpcy5rZXlzID0ga2V5cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDdXJyZW50UGFzc0tleSgpOiBLZXkge1xyXG4gICAgcmV0dXJuIHRoaXMua2V5cy5wYXNzS2V5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEN1cnJlbnRNYXN0ZXJLZXkoKTogS2V5IHtcclxuICAgIHJldHVybiB0aGlzLmtleXMubWFzdGVyS2V5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEN1cnJlbnRSb290S2V5KCk6IEtleSB7XHJcbiAgICByZXR1cm4gdGhpcy5rZXlzLnJvb3RLZXk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q3VycmVudFB4aygpOiBLZXkge1xyXG4gICAgcmV0dXJuIHRoaXMua2V5cy5weGs7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q3VycmVudFNpZ1B4aygpOiBLZXkge1xyXG4gICAgcmV0dXJuIHRoaXMua2V5cy5zaWdQeGs7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4cGlyZXNBZnRlcihzZWNvbmRzOiBudW1iZXIpOiBEYXRlIHtcclxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpICsgMTAwMCAqIHNlY29uZHMpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcGVyc2lzdE1hc3RlcktleShcclxuICAgIG1hc3RlcktleTogS2V5LFxyXG4gICAgZXhwaXJlc0FmdGVyU2Vjb25kczogbnVtYmVyXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzdG9yZWRLZXkgPSB7XHJcbiAgICAgIGlkOiBtYXN0ZXJLZXkuaWQsXHJcbiAgICAgIGp3azogbWFzdGVyS2V5Lmp3ay50b0pTT04odHJ1ZSksXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMubWFzdGVyS2V5ID0gbWFzdGVyS2V5O1xyXG5cclxuICAgIC8vIFNhdmUgaW4gYW4gZXhwaXJhYmxlIGNvb2tpZS5cclxuICAgIGF3YWl0IHRoaXMucGVyc2lzdFNlcnZpY2Uuc2V0KHtcclxuICAgICAgbmFtZTogdGhpcy5TVE9SRV9NQVNURVJfS0VZLFxyXG4gICAgICB2YWx1ZTogc3RvcmVkS2V5LFxyXG4gICAgICBleHBpcnk6IHRoaXMuZXhwaXJlc0FmdGVyKGV4cGlyZXNBZnRlclNlY29uZHMpLFxyXG4gICAgICBzZXJ2ZXJTZXNzaW9uOiAhdGhpcy5jb25maWcuZGlzYWJsZVNlc3Npb25FbmNyeXB0aW9uS2V5LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBzZXRNYXN0ZXJLZXlFeHBpcmVzQWZ0ZXJTZWNvbmRzKHNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc3RvcmVkS2V5ID0gYXdhaXQgdGhpcy5wZXJzaXN0U2VydmljZS5nZXQodGhpcy5TVE9SRV9NQVNURVJfS0VZKTtcclxuICAgIGlmIChzdG9yZWRLZXkgPT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgTHJOb3RGb3VuZEV4Y2VwdGlvbihcclxuICAgICAgICBgQ2FuIG5vdCBmaW5kIG1hc3RlcktleSBpbiBwZXJzaXN0ZWQgc3RvcmFnZSB1c2luZyBuYW1lOiAke3RoaXMuU1RPUkVfTUFTVEVSX0tFWX1gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnBlcnNpc3RTZXJ2aWNlLnNldCh7XHJcbiAgICAgIG5hbWU6IHRoaXMuU1RPUkVfTUFTVEVSX0tFWSxcclxuICAgICAgdmFsdWU6IHN0b3JlZEtleSxcclxuICAgICAgZXhwaXJ5OiB0aGlzLmV4cGlyZXNBZnRlcihzZWNvbmRzKSxcclxuICAgICAgc2VydmVyU2Vzc2lvbjogIXRoaXMuY29uZmlnLmRpc2FibGVTZXNzaW9uRW5jcnlwdGlvbktleSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gVGhlcmUncyBsaXR0bGUgYmVuZWZpdCBpbiB1c2luZyBXZWJDcnlwdG8ncyBub25lLWV4dHJhY3RhYmxlIGtleXMgYmVjYXVzZSBpZiB0aGVyZVxyXG4gIC8vIGlzIGFuIFhTUyBhdHRhY2ssIHRoZW4gdGhlIGF0dGFja2VyIGhhcyBjb250cm9sIG92ZXIgdGhlIGpzIHRoYXQgZG93bmxvYWRzIHRoZSBrZXlzLiBUaGVcclxuICAvLyBhdHRhY2tlciBjYW4gbW9kaWZ5IHRoZSBjb2RlIHRvIGltcG9ydCB0aGUga2V5cyBhcyBleHRyYWN0YWJsZS4gU28gbm9uZS1leHRyYWN0YWJsZSBrZXlzXHJcbiAgLy8gYXJlIG9ubHkgdXNlZnVsIGlmIHRoZXkgYXJlIGFscmVhZHkgcGVyc2lzdGVkIGFuZCB0aGUgdXNlciBjYW5ub3QgZG93bmxvYWQgYW55IG1vcmUga2V5cyxcclxuICAvLyB3aGljaCBpcyBub3QgZmVhc2libGUuXHJcbiAgLy8gU28gc3RvcmluZyB0aGUgUGFzc0tleSBpbiBsb2NhbHN0b3JhZ2UgZm9yIG5vdywgYXQgbGVhc3QgdGlsbCB3ZSBrbm93IHdoYXQgdGhlIHVzYWdlXHJcbiAgLy8gcGF0dGVybiBpcywgaS5lLiBob3cgb2Z0ZW4gZG8gd2UgbmVlZCB0byB1c2UgdGhlIFJvb3RLLCBNYXRlckssIGFuZCBQYXNzSy5cclxuICBhc3luYyBsb2FkTWFzdGVyS2V5KG1hc3RlcktleUlkOiBzdHJpbmcpOiBQcm9taXNlPEtleT4ge1xyXG4gICAgaWYgKCF0aGlzLm1hc3RlcktleSkge1xyXG4gICAgICBjb25zdCBzdG9yZWRLZXkgPSBhd2FpdCB0aGlzLnBlcnNpc3RTZXJ2aWNlLmdldCh0aGlzLlNUT1JFX01BU1RFUl9LRVkpO1xyXG5cclxuICAgICAgaWYgKCFzdG9yZWRLZXkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgTHJOb3RGb3VuZEV4Y2VwdGlvbihcclxuICAgICAgICAgICdDb3VsZCBub3QgZmluZCBtYXN0ZXJLZXkgaW4gcGVyc2lzdGVkIHN0b3JhZ2UnXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHN0b3JlZEtleS5pZCAhPT0gbWFzdGVyS2V5SWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgTHJOb3RGb3VuZEV4Y2VwdGlvbihcclxuICAgICAgICAgIGBtYXN0ZXJLZXlJZCAke3N0b3JlZEtleS5pZH0gaW4gcGVyc2lzdGVkIHN0b3JhZ2UgZG9lcyBub3QgbWF0Y2ggdGhlIG9uZSByZXF1ZXN0ZWQgJHttYXN0ZXJLZXlJZH1gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3RvcmVkS2V5Lmp3ayA9IGF3YWl0IEtGUy5hc0tleShzdG9yZWRLZXkuandrKTtcclxuXHJcbiAgICAgIHRoaXMubWFzdGVyS2V5ID0gc3RvcmVkS2V5O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLm1hc3RlcktleTtcclxuICB9XHJcbn1cclxuIl19
|