@lifeready/core 1.0.15 → 1.0.16
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,29 +1,29 @@
|
|
|
1
|
-
export var AccessLevel;
|
|
2
|
-
(function (AccessLevel) {
|
|
3
|
-
AccessLevel["Owner"] = "OWNER";
|
|
4
|
-
AccessLevel["Admin"] = "ADMIN";
|
|
5
|
-
AccessLevel["Writer"] = "WRITER";
|
|
6
|
-
AccessLevel["Reader"] = "READER";
|
|
7
|
-
AccessLevel["Deny"] = "DENY";
|
|
8
|
-
})(AccessLevel || (AccessLevel = {}));
|
|
9
|
-
export class SharedAccess {
|
|
10
|
-
}
|
|
11
|
-
export class DefaultCategory {
|
|
12
|
-
}
|
|
13
|
-
export class VaultRecordType {
|
|
14
|
-
}
|
|
15
|
-
export class VaultRecord {
|
|
16
|
-
}
|
|
17
|
-
export class Category {
|
|
18
|
-
}
|
|
19
|
-
export class CurrentCategory extends Category {
|
|
20
|
-
}
|
|
21
|
-
export class VaultCategory {
|
|
22
|
-
}
|
|
23
|
-
export class NewCategory {
|
|
24
|
-
}
|
|
25
|
-
export class UpdatedCategory {
|
|
26
|
-
}
|
|
27
|
-
export class Vault {
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export var AccessLevel;
|
|
2
|
+
(function (AccessLevel) {
|
|
3
|
+
AccessLevel["Owner"] = "OWNER";
|
|
4
|
+
AccessLevel["Admin"] = "ADMIN";
|
|
5
|
+
AccessLevel["Writer"] = "WRITER";
|
|
6
|
+
AccessLevel["Reader"] = "READER";
|
|
7
|
+
AccessLevel["Deny"] = "DENY";
|
|
8
|
+
})(AccessLevel || (AccessLevel = {}));
|
|
9
|
+
export class SharedAccess {
|
|
10
|
+
}
|
|
11
|
+
export class DefaultCategory {
|
|
12
|
+
}
|
|
13
|
+
export class VaultRecordType {
|
|
14
|
+
}
|
|
15
|
+
export class VaultRecord {
|
|
16
|
+
}
|
|
17
|
+
export class Category {
|
|
18
|
+
}
|
|
19
|
+
export class CurrentCategory extends Category {
|
|
20
|
+
}
|
|
21
|
+
export class VaultCategory {
|
|
22
|
+
}
|
|
23
|
+
export class NewCategory {
|
|
24
|
+
}
|
|
25
|
+
export class UpdatedCategory {
|
|
26
|
+
}
|
|
27
|
+
export class Vault {
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnkudHlwZXMuanMiLCJzb3VyY2VSb290IjoiL29wdC9hdGxhc3NpYW4vcGlwZWxpbmVzL2FnZW50L2J1aWxkL3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL2NhdGVnb3J5L2NhdGVnb3J5LnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLFdBTVg7QUFORCxXQUFZLFdBQVc7SUFDckIsOEJBQWUsQ0FBQTtJQUNmLDhCQUFlLENBQUE7SUFDZixnQ0FBaUIsQ0FBQTtJQUNqQixnQ0FBaUIsQ0FBQTtJQUNqQiw0QkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQU5XLFdBQVcsS0FBWCxXQUFXLFFBTXRCO0FBRUQsTUFBTSxPQUFPLFlBQVk7Q0FLeEI7QUFFRCxNQUFNLE9BQU8sZUFBZTtDQU8zQjtBQUVELE1BQU0sT0FBTyxlQUFlO0NBRzNCO0FBRUQsTUFBTSxPQUFPLFdBQVc7Q0FVdkI7QUFFRCxNQUFNLE9BQU8sUUFBUTtDQWNwQjtBQUVELE1BQU0sT0FBTyxlQUFnQixTQUFRLFFBQVE7Q0FFNUM7QUFFRCxNQUFNLE9BQU8sYUFBYTtDQUl6QjtBQUVELE1BQU0sT0FBTyxXQUFXO0NBT3ZCO0FBRUQsTUFBTSxPQUFPLGVBQWU7Q0FNM0I7QUFFRCxNQUFNLE9BQU8sS0FBSztDQUlqQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIEFjY2Vzc0xldmVsIHtcbiAgT3duZXIgPSAnT1dORVInLFxuICBBZG1pbiA9ICdBRE1JTicsXG4gIFdyaXRlciA9ICdXUklURVInLFxuICBSZWFkZXIgPSAnUkVBREVSJyxcbiAgRGVueSA9ICdERU5ZJyxcbn1cblxuZXhwb3J0IGNsYXNzIFNoYXJlZEFjY2VzcyB7XG4gIHRydXN0ZWRQYXJ0eUlkOiBzdHJpbmc7XG4gIGFjY2Vzc0xldmVsOiBBY2Nlc3NMZXZlbDtcbiAgaXNJbmhlcml0ZWQ6IGJvb2xlYW47XG4gIGluaGVyaXRlZEZyb20/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0Q2F0ZWdvcnkge1xuICBjb2RlOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgYWxsb3dSZWNvcmRzOiBib29sZWFuO1xuICBhbGxvd0N1c3RvbUNhdGVnb3JpZXM6IGJvb2xlYW47XG4gIGFyY2hpdmVkOiBib29sZWFuO1xuICBzdWJDYXRlZ29yaWVzPzogRGVmYXVsdENhdGVnb3J5W107XG59XG5cbmV4cG9ydCBjbGFzcyBWYXVsdFJlY29yZFR5cGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBWYXVsdFJlY29yZCB7XG4gIGlkOiBzdHJpbmc7XG4gIGtleUlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVjb3JkVHlwZTogVmF1bHRSZWNvcmRUeXBlO1xuICBjcmVhdGVkT246IHN0cmluZyB8IERhdGU7XG4gIGxhc3RNb2RpZmllZDogc3RyaW5nIHwgRGF0ZTtcbiAgaXNBcmNoaXZlZDogYm9vbGVhbjtcbiAgbXlBY2Nlc3NMZXZlbDogQWNjZXNzTGV2ZWw7XG4gIHNoYXJlZEFjY2VzczogU2hhcmVkQWNjZXNzW107XG59XG5cbmV4cG9ydCBjbGFzcyBDYXRlZ29yeSB7XG4gIGlkOiBzdHJpbmc7XG4gIGtleUlkOiBzdHJpbmc7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgaXNIaWRkZW46IGJvb2xlYW47XG4gIGlzQ3VzdG9tOiBib29sZWFuO1xuICBpc0VtcHR5OiBib29sZWFuO1xuICBpc0FyY2hpdmVkOiBib29sZWFuO1xuICBhbGxSZWNvcmRzQ291bnQ6IG51bWJlcjtcbiAgYWxsb3dSZWNvcmRzOiBib29sZWFuO1xuICBhbGxvd0N1c3RvbUNhdGVnb3JpZXM6IGJvb2xlYW47XG4gIG15QWNjZXNzTGV2ZWw6IEFjY2Vzc0xldmVsO1xuICBzaGFyZWRBY2Nlc3M6IFNoYXJlZEFjY2Vzc1tdO1xufVxuXG5leHBvcnQgY2xhc3MgQ3VycmVudENhdGVnb3J5IGV4dGVuZHMgQ2F0ZWdvcnkge1xuICBwYXJlbnRzOiBDYXRlZ29yeVtdO1xufVxuXG5leHBvcnQgY2xhc3MgVmF1bHRDYXRlZ29yeSB7XG4gIGNhdGVnb3J5PzogQ3VycmVudENhdGVnb3J5O1xuICBzdWJDYXRlZ29yaWVzPzogQ2F0ZWdvcnlbXTtcbiAgcmVjb3Jkcz86IFZhdWx0UmVjb3JkW107XG59XG5cbmV4cG9ydCBjbGFzcyBOZXdDYXRlZ29yeSB7XG4gIG5hbWU6IHN0cmluZztcbiAgY29kZT86IHN0cmluZztcbiAgaXNDdXN0b206IGJvb2xlYW47XG4gIGFsbG93UmVjb3JkczogYm9vbGVhbjtcbiAgYWxsb3dDdXN0b21DYXRlZ29yaWVzOiBib29sZWFuO1xuICBjYXRlZ29yeUlkcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgVXBkYXRlZENhdGVnb3J5IHtcbiAgbmFtZTogc3RyaW5nO1xuICBjb2RlPzogc3RyaW5nO1xuICBpc0N1c3RvbTogYm9vbGVhbjtcbiAgYWxsb3dSZWNvcmRzOiBib29sZWFuO1xuICBhbGxvd0N1c3RvbUNhdGVnb3JpZXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBWYXVsdCB7XG4gIGlkOiBzdHJpbmc7XG4gIGtleUlkOiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export var NodeType;
|
|
2
|
-
(function (NodeType) {
|
|
3
|
-
NodeType["Key"] = "key";
|
|
4
|
-
NodeType["PassKey"] = "passKey";
|
|
5
|
-
})(NodeType || (NodeType = {}));
|
|
6
|
-
export var EdgeType;
|
|
7
|
-
(function (EdgeType) {
|
|
8
|
-
EdgeType["KeyLink"] = "keyLink";
|
|
9
|
-
EdgeType["PassKeyLink"] = "passKeyLink";
|
|
10
|
-
})(EdgeType || (EdgeType = {}));
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export var NodeType;
|
|
2
|
+
(function (NodeType) {
|
|
3
|
+
NodeType["Key"] = "key";
|
|
4
|
+
NodeType["PassKey"] = "passKey";
|
|
5
|
+
})(NodeType || (NodeType = {}));
|
|
6
|
+
export var EdgeType;
|
|
7
|
+
(function (EdgeType) {
|
|
8
|
+
EdgeType["KeyLink"] = "keyLink";
|
|
9
|
+
EdgeType["PassKeyLink"] = "passKeyLink";
|
|
10
|
+
})(EdgeType || (EdgeType = {}));
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J5cHRvZ3JhcGh5LnR5cGVzLmpzIiwic291cmNlUm9vdCI6Ii9vcHQvYXRsYXNzaWFuL3BpcGVsaW5lcy9hZ2VudC9idWlsZC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jcnlwdG9ncmFwaHkvY3J5cHRvZ3JhcGh5LnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVEQSxNQUFNLENBQU4sSUFBWSxRQUdYO0FBSEQsV0FBWSxRQUFRO0lBQ2xCLHVCQUFXLENBQUE7SUFDWCwrQkFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBSFcsUUFBUSxLQUFSLFFBQVEsUUFHbkI7QUFPRCxNQUFNLENBQU4sSUFBWSxRQUdYO0FBSEQsV0FBWSxRQUFRO0lBQ2xCLCtCQUFtQixDQUFBO0lBQ25CLHVDQUEyQixDQUFBO0FBQzdCLENBQUMsRUFIVyxRQUFRLEtBQVIsUUFBUSxRQUduQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEpXSyB9IGZyb20gJ25vZGUtam9zZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5IHtcbiAgaWQ6IHN0cmluZztcbiAgcGJrPzogc3RyaW5nO1xuICBqd2s/OiBKV0suS2V5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhc3NLZXlQYXJhbXMge1xuICBraWQ6IHN0cmluZztcbiAgc2FsdDogc3RyaW5nO1xuICBpdGVyYXRpb25zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc0lkcFBhcmFtcyB7XG4gIHNhbHQ6IHN0cmluZztcbiAgaXRlcmF0aW9uczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExib3BLZXlQYXJhbXMge1xuICBraWQ6IHN0cmluZztcbiAgc2FsdDogc3RyaW5nO1xuICBpdGVyYXRpb25zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc0lkcFZlcmlmaWVyIHtcbiAgd3JhcHBlZFBySzogb2JqZWN0O1xuICBwYms6IG9iamVjdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYm9wS2V5VmVyaWZpZXIge1xuICB3cmFwcGVkS2V5OiBvYmplY3Q7XG4gIGtleTogb2JqZWN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhc3NLZXkge1xuICBpZDogc3RyaW5nO1xuICBwYXNzS2V5UGFyYW1zPzogUGFzc0tleVBhcmFtcztcbiAgcGFzc0lkcFBhcmFtcz86IFBhc3NJZHBQYXJhbXM7XG4gIHdyYXBwZWRQYXNzSWRwVmVyaWZpZXJQcms/OiBvYmplY3Q7XG4gIGNyZWF0ZWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5TGluayB7XG4gIGtleUlkOiBzdHJpbmc7XG4gIHdyYXBwaW5nS2V5SWQ6IHN0cmluZztcbiAgd3JhcHBlZEtleTogc3RyaW5nOyAvLyBKV0UganNvbiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXNzS2V5TGluayB7XG4gIGtleUlkOiBzdHJpbmc7XG4gIHBhc3NLZXlJZDogc3RyaW5nO1xuICB3cmFwcGVkS2V5OiBzdHJpbmc7IC8vIEpXRSBqc29uIHN0cmluZ1xufVxuXG5leHBvcnQgZW51bSBOb2RlVHlwZSB7XG4gIEtleSA9ICdrZXknLFxuICBQYXNzS2V5ID0gJ3Bhc3NLZXknLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGUge1xuICB0eXBlOiBOb2RlVHlwZTtcbiAgZGF0YTogS2V5IHwgUGFzc0tleTtcbn1cblxuZXhwb3J0IGVudW0gRWRnZVR5cGUge1xuICBLZXlMaW5rID0gJ2tleUxpbmsnLFxuICBQYXNzS2V5TGluayA9ICdwYXNzS2V5TGluaycsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWRnZSB7XG4gIHR5cGU6IEVkZ2VUeXBlO1xuICBkYXRhOiBLZXlMaW5rIHwgUGFzc0tleUxpbms7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5R3JhcGhSZXNwb25zZSB7XG4gIGtleXM/OiBLZXlbXTtcbiAga2V5TGlua3M/OiBLZXlMaW5rW107XG4gIHBhc3NLZXlzPzogUGFzc0tleVtdO1xuICBwYXNzS2V5TGlua3M/OiBQYXNzS2V5TGlua1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhc0tleUdyYXBoIHtcbiAgLy8gVGhlIG5hbWUgb2YgdGhlIGtleUdyYXBoIGZpZWxkIHJldHVybmVkIGZyb20gYm90aCBxdWVyaWVzIGFuZCBtdXRhdGlvbnMgYXJlIHRoZSBzYW1lXG4gIGtleUdyYXBoPzogS2V5R3JhcGhSZXNwb25zZTtcbn1cblxuLy8gZXhwb3J0IGVudW0gUGF5bG9hZFR5cGUge1xuLy8gICBKU09OID0gJ0pTT04nLFxuLy8gICBBcnJheUJ1ZmZlciA9ICdBcnJheUJ1ZmZlcicsXG4vLyB9XG5leHBvcnQgdHlwZSBQYXlsb2FkVHlwZSA9ICdqc29uJyB8ICdBcnJheUJ1ZmZlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVyaXZlS2V5UmVzdWx0IHtcbiAgandrOiBKV0suS2V5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcml2ZVBhc3NJZHBQYXJhbXMgZXh0ZW5kcyBQYXNzSWRwUGFyYW1zIHtcbiAgcGFzc3dvcmQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXJpdmVQYXNzS2V5UGFyYW1zIGV4dGVuZHMgUGFzc0tleVBhcmFtcyB7XG4gIHBhc3N3b3JkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVyaXZlTGJvcEtleVBhcmFtcyBleHRlbmRzIFBhc3NLZXlQYXJhbXMge1xuICBwYXNzd29yZDogc3RyaW5nO1xufVxuIl19
|
|
@@ -1,189 +1,189 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { LrException, LrErrorCode, LrBadArgumentException, } from './../_common/exceptions';
|
|
3
|
-
import { Injectable } from '@angular/core';
|
|
4
|
-
import { JWE, JWS } from 'node-jose';
|
|
5
|
-
import { TimeService } from '../api/time.service';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "../api/time.service";
|
|
8
|
-
export var JoseSerialization;
|
|
9
|
-
(function (JoseSerialization) {
|
|
10
|
-
JoseSerialization["JSON"] = "JSON";
|
|
11
|
-
JoseSerialization["COMPACT"] = "COMPACT";
|
|
12
|
-
})(JoseSerialization || (JoseSerialization = {}));
|
|
13
|
-
export const VERIFY_OPTIONS_DEFAULT = {
|
|
14
|
-
payloadType: 'json',
|
|
15
|
-
returnOnlyPayload: true,
|
|
16
|
-
};
|
|
17
|
-
export const DECRYPT_OPTIONS_DEFAULT = {
|
|
18
|
-
payloadType: 'json',
|
|
19
|
-
returnOnlyPayload: true,
|
|
20
|
-
serializations: [JoseSerialization.JSON],
|
|
21
|
-
};
|
|
22
|
-
export function isSymmetricKey(key) {
|
|
23
|
-
// TODO: make sure this covers all cases.
|
|
24
|
-
return key.kty === 'oct';
|
|
25
|
-
}
|
|
26
|
-
export function asJwk(key) {
|
|
27
|
-
// TODO: make sure this covers all cases.
|
|
28
|
-
// Excluded:
|
|
29
|
-
// key.use - only for public keys, Ref: https://tools.ietf.org/html/rfc7517#section-4.2
|
|
30
|
-
if (key.id && key.jwk) {
|
|
31
|
-
return key.jwk;
|
|
32
|
-
}
|
|
33
|
-
else if (key.keystore && key.length && key.kty && key.kid && key.alg) {
|
|
34
|
-
return key;
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
export class EncryptionService {
|
|
41
|
-
constructor(timeService) {
|
|
42
|
-
this.timeService = timeService;
|
|
43
|
-
}
|
|
44
|
-
decrypt(key, // string is assumed to be key.id, will unwrap key.
|
|
45
|
-
jwe, // string will be JSON.parsed
|
|
46
|
-
options) {
|
|
47
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
-
const opt = {
|
|
49
|
-
algorithms: ['dir', 'A*GCM', 'RSA-OAEP-*'],
|
|
50
|
-
};
|
|
51
|
-
options = Object.assign(Object.assign({}, DECRYPT_OPTIONS_DEFAULT), options);
|
|
52
|
-
if (key.jwk) {
|
|
53
|
-
key = key.jwk;
|
|
54
|
-
}
|
|
55
|
-
if (typeof jwe === 'string') {
|
|
56
|
-
if (options.serializations.includes(JoseSerialization.JSON)) {
|
|
57
|
-
try {
|
|
58
|
-
jwe = JSON.parse(jwe);
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
if (options.serializations.includes(JoseSerialization.COMPACT)) {
|
|
62
|
-
console.log('Not a JSON-formatted JWE, it maybe compact serialisation format.');
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
throw error;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// {result} is a Object with:
|
|
71
|
-
// * header: the combined 'protected' and 'unprotected' header members
|
|
72
|
-
// * protected: an array of the member names from the "protected" member
|
|
73
|
-
// * key: Key used to decrypt
|
|
74
|
-
// * payload: Buffer of the decrypted content
|
|
75
|
-
// * plaintext: Buffer of the decrypted content (alternate), just a reference to payload
|
|
76
|
-
const res = yield JWE.createDecrypt(key, opt).decrypt(jwe);
|
|
77
|
-
res.payload = this.decodePayload(options.payloadType, res.payload);
|
|
78
|
-
if (options.returnOnlyPayload) {
|
|
79
|
-
return res.payload;
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
return res;
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
// TODO rename this to encrypt() and use as the most common usecase
|
|
87
|
-
encryptToString(key, content) {
|
|
88
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
89
|
-
return JSON.stringify(yield this.encrypt(key, content));
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
// TODO rename this to encryptToJSON() and use this when required.
|
|
93
|
-
encrypt(key, content) {
|
|
94
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
95
|
-
if (content == null) {
|
|
96
|
-
throw new Error('Encrypting null/undefined content.');
|
|
97
|
-
}
|
|
98
|
-
if (!(content instanceof ArrayBuffer)) {
|
|
99
|
-
content = new TextEncoder().encode(JSON.stringify(content));
|
|
100
|
-
}
|
|
101
|
-
return JWE.createEncrypt({
|
|
102
|
-
contentAlg: 'A256GCM',
|
|
103
|
-
fields: {
|
|
104
|
-
timestamp: yield this.timeService.serverNow(),
|
|
105
|
-
},
|
|
106
|
-
}, key)
|
|
107
|
-
.update(content)
|
|
108
|
-
.final();
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
// <AZ> Unlike signContent, the serialised "content" variable is contained inside
|
|
112
|
-
// the result. So ordering of fields within "content" is not an issue.
|
|
113
|
-
sign(key, content) {
|
|
114
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
115
|
-
const signer = JWS.createSign({
|
|
116
|
-
fields: {
|
|
117
|
-
timestamp: yield this.timeService.serverNow(),
|
|
118
|
-
},
|
|
119
|
-
}, key);
|
|
120
|
-
if (content instanceof Buffer) {
|
|
121
|
-
signer.update(content);
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
signer.update(JSON.stringify(content), 'utf8');
|
|
125
|
-
}
|
|
126
|
-
return signer.final();
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
signToString(key, content) {
|
|
130
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
-
return JSON.stringify(yield this.sign(key, content));
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
verify(key, jws, options) {
|
|
135
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
-
const opt = {
|
|
137
|
-
algorithms: ['RS*'],
|
|
138
|
-
};
|
|
139
|
-
options = Object.assign(Object.assign({}, VERIFY_OPTIONS_DEFAULT), options);
|
|
140
|
-
try {
|
|
141
|
-
const res = yield JWS.createVerify(key, opt).verify(jws);
|
|
142
|
-
res.payload = this.decodePayload(options.payloadType, res.payload);
|
|
143
|
-
if (options.returnOnlyPayload) {
|
|
144
|
-
return res.payload;
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
return res;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
throw new LrException({
|
|
152
|
-
code: LrErrorCode.BadSignature,
|
|
153
|
-
message: `Bad signature: ${error}`,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
encryptThenSign({ key, sigPrk, }, content) {
|
|
159
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
160
|
-
const cipher = JSON.stringify(yield this.encrypt(key, content));
|
|
161
|
-
const sig = yield this.sign(sigPrk, cipher);
|
|
162
|
-
delete sig.payload;
|
|
163
|
-
return {
|
|
164
|
-
cipher,
|
|
165
|
-
sig: JSON.stringify(sig),
|
|
166
|
-
};
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
decodePayload(payloadType, payload) {
|
|
170
|
-
switch (payloadType) {
|
|
171
|
-
case 'json':
|
|
172
|
-
return JSON.parse(new TextDecoder().decode(payload));
|
|
173
|
-
case 'ArrayBuffer':
|
|
174
|
-
return payload;
|
|
175
|
-
default:
|
|
176
|
-
throw new LrBadArgumentException(`Unknown payloadType: ${payloadType}`);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
EncryptionService.ɵprov = i0.ɵɵdefineInjectable({ factory: function EncryptionService_Factory() { return new EncryptionService(i0.ɵɵinject(i1.TimeService)); }, token: EncryptionService, providedIn: "root" });
|
|
181
|
-
EncryptionService.decorators = [
|
|
182
|
-
{ type: Injectable, args: [{
|
|
183
|
-
providedIn: 'root',
|
|
184
|
-
},] }
|
|
185
|
-
];
|
|
186
|
-
EncryptionService.ctorParameters = () => [
|
|
187
|
-
{ type: TimeService }
|
|
188
|
-
];
|
|
189
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IkM6L1Byb2plY3RzL2tjLWNsaWVudC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jcnlwdG9ncmFwaHkvZW5jcnlwdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLFdBQVcsRUFDWCxzQkFBc0IsR0FDdkIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQTRCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsR0FBRyxFQUFPLEdBQUcsRUFBUSxNQUFNLFdBQVcsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQUVsRCxNQUFNLENBQU4sSUFBWSxpQkFHWDtBQUhELFdBQVksaUJBQWlCO0lBQzNCLGtDQUFhLENBQUE7SUFDYix3Q0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBSFcsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUc1QjtBQWFELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFrQjtJQUNuRCxXQUFXLEVBQUUsTUFBTTtJQUNuQixpQkFBaUIsRUFBRSxJQUFJO0NBQ3hCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBbUI7SUFDckQsV0FBVyxFQUFFLE1BQU07SUFDbkIsaUJBQWlCLEVBQUUsSUFBSTtJQUN2QixjQUFjLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Q0FDekMsQ0FBQztBQUVGLE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBWTtJQUN6Qyx5Q0FBeUM7SUFDekMsT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxHQUF3QjtJQUM1Qyx5Q0FBeUM7SUFDekMsWUFBWTtJQUNaLHlGQUF5RjtJQUV6RixJQUFJLEdBQUcsQ0FB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LENBQUMsQ0FBQyxDQUFDO1lBQ3ZELEtBQUssYUFBYTtnQkFDaEIsT0FBTyxPQUFPLENBQUM7WUFDakI7Z0JBQ0UsTUFBTSxJQUFJLHNCQUFzQixDQUFDLHdCQUF3QixXQUFXLEVBQUUsQ0FBQyxDQUFDO1NBQzNFO0lBQ0gsQ0FBQzs7OztZQXpMRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQWxEUSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBMckV4Y2VwdGlvbixcclxuICBMckVycm9yQ29kZSxcclxuICBMckJhZEFyZ3VtZW50RXhjZXB0aW9uLFxyXG59IGZyb20gJy4vLi4vX2NvbW1vbi9leGNlcHRpb25zJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEpXRSwgSldLLCBKV1MsIHV0aWwgfSBmcm9tICdub2RlLWpvc2UnO1xyXG5pbXBvcnQgeyBLZXksIFBheWxvYWRUeXBlIH0gZnJvbSAnLi9jcnlwdG9ncmFwaHkudHlwZXMnO1xyXG5pbXBvcnQgeyBUaW1lU2VydmljZSB9IGZyb20gJy4uL2FwaS90aW1lLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGVudW0gSm9zZVNlcmlhbGl6YXRpb24ge1xyXG4gIEpTT04gPSAnSlNPTicsXHJcbiAgQ09NUEFDVCA9ICdDT01QQUNUJyxcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlPcHRpb25zIHtcclxuICBwYXlsb2FkVHlwZT86IFBheWxvYWRUeXBlO1xyXG4gIHJldHVybk9ubHlQYXlsb2FkPzogYm9vbGVhbjsgLy8gSWYgdHJ1ZSwgcmV0dXJuIG9ubHkgdGhlIGRlY29kZWQgcGF5bG9hZC5cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEZWNyeXB0T3B0aW9ucyB7XHJcbiAgcGF5bG9hZFR5cGU/OiBQYXlsb2FkVHlwZTtcclxuICByZXR1cm5Pbmx5UGF5bG9hZD86IGJvb2xlYW47IC8vIElmIHRydWUsIHJldHVybiBvbmx5IHRoZSBkZWNvZGVkIHBheWxvYWQuXHJcbiAgc2VyaWFsaXphdGlvbnM/OiBKb3NlU2VyaWFsaXphdGlvbltdO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgVkVSSUZZX09QVElPTlNfREVGQVVMVDogVmVyaWZ5T3B0aW9ucyA9IHtcclxuICBwYXlsb2FkVHlwZTogJ2pzb24nLFxyXG4gIHJldHVybk9ubHlQYXlsb2FkOiB0cnVlLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IERFQ1JZUFRfT1BUSU9OU19ERUZBVUxUOiBEZWNyeXB0T3B0aW9ucyA9IHtcclxuICBwYXlsb2FkVHlwZTogJ2pzb24nLFxyXG4gIHJldHVybk9ubHlQYXlsb2FkOiB0cnVlLFxyXG4gIHNlcmlhbGl6YXRpb25zOiBbSm9zZVNlcmlhbGl6YXRpb24uSlNPTl0sXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNTeW1tZXRyaWNLZXkoa2V5OiBKV0suS2V5KSB7XHJcbiAgLy8gVE9ETzogbWFrZSBzdXJlIHRoaXMgY292ZXJzIGFsbCBjYXNlcy5cclxuICByZXR1cm4ga2V5Lmt0eSA9PT0gJ29jdCc7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhc0p3ayhrZXk6IEpXSy5LZXkgfCBLZXkgfCBhbnkpOiBKV0suS2V5IHwgbnVsbCB7XHJcbiAgLy8gVE9ETzogbWFrZSBzdXJlIHRoaXMgY292ZXJzIGFsbCBjYXNlcy5cclxuICAvLyBFeGNsdWRlZDpcclxuICAvLyAgIGtleS51c2UgLSBvbmx5IGZvciBwdWJsaWMga2V5cywgUmVmOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzUxNyNzZWN0aW9uLTQuMlxyXG5cclxuICBpZiAoa2V5LmlkICYmIGtleS5qd2spIHtcclxuICAgIHJldHVybiBrZXkuandrO1xyXG4gIH0gZWxzZSBpZiAoa2V5LmtleXN0b3JlICYmIGtleS5sZW5ndGggJiYga2V5Lmt0eSAmJiBrZXkua2lkICYmIGtleS5hbGcpIHtcclxuICAgIHJldHVybiBrZXk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEVuY3J5cHRpb25TZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRpbWVTZXJ2aWNlOiBUaW1lU2VydmljZSkge31cclxuXHJcbiAgYXN5bmMgZGVjcnlwdChcclxuICAgIGtleTogSldLLktleSB8IEtleSwgLy8gc3RyaW5nIGlzIGFzc3VtZWQgdG8gYmUga2V5LmlkLCB3aWxsIHVud3JhcCBrZXkuXHJcbiAgICBqd2U6IG9iamVjdCB8IHN0cmluZywgLy8gc3RyaW5nIHdpbGwgYmUgSlNPTi5wYXJzZWRcclxuICAgIG9wdGlvbnM/OiBEZWNyeXB0T3B0aW9uc1xyXG4gICk6IFByb21pc2U8SldFLkRlY3J5cHRSZXN1bHQgfCBhbnk+IHtcclxuICAgIGNvbnN0IG9wdCA9IHtcclxuICAgICAgYWxnb3JpdGhtczogWydkaXInLCAnQSpHQ00nLCAnUlNBLU9BRVAtKiddLFxyXG4gICAgfTtcclxuXHJcbiAgICBvcHRpb25zID0ge1xyXG4gICAgICAuLi5ERUNSWVBUX09QVElPTlNfREVGQVVMVCxcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKChrZXkgYXMgS2V5KS5qd2spIHtcclxuICAgICAga2V5ID0gKGtleSBhcyBLZXkpLmp3aztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGp3ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgaWYgKG9wdGlvbnMuc2VyaWFsaXphdGlvbnMuaW5jbHVkZXMoSm9zZVNlcmlhbGl6YXRpb24uSlNPTikpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgandlID0gSlNPTi5wYXJzZShqd2UpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICBpZiAob3B0aW9ucy5zZXJpYWxpemF0aW9ucy5pbmNsdWRlcyhKb3NlU2VyaWFsaXphdGlvbi5DT01QQUNUKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAnTm90IGEgSlNPTi1mb3JtYXR0ZWQgSldFLCBpdCBtYXliZSBjb21wYWN0IHNlcmlhbGlzYXRpb24gZm9ybWF0LidcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHtyZXN1bHR9IGlzIGEgT2JqZWN0IHdpdGg6XHJcbiAgICAvLyAqICBoZWFkZXI6IHRoZSBjb21iaW5lZCAncHJvdGVjdGVkJyBhbmQgJ3VucHJvdGVjdGVkJyBoZWFkZXIgbWVtYmVyc1xyXG4gICAgLy8gKiAgcHJvdGVjdGVkOiBhbiBhcnJheSBvZiB0aGUgbWVtYmVyIG5hbWVzIGZyb20gdGhlIFwicHJvdGVjdGVkXCIgbWVtYmVyXHJcbiAgICAvLyAqICBrZXk6IEtleSB1c2VkIHRvIGRlY3J5cHRcclxuICAgIC8vICogIHBheWxvYWQ6IEJ1ZmZlciBvZiB0aGUgZGVjcnlwdGVkIGNvbnRlbnRcclxuICAgIC8vICogIHBsYWludGV4dDogQnVmZmVyIG9mIHRoZSBkZWNyeXB0ZWQgY29udGVudCAoYWx0ZXJuYXRlKSwganVzdCBhIHJlZmVyZW5jZSB0byBwYXlsb2FkXHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCBKV0UuY3JlYXRlRGVjcnlwdChrZXkgYXMgSldLLktleSwgb3B0KS5kZWNyeXB0KFxyXG4gICAgICBqd2UgYXMgYW55XHJcbiAgICApO1xyXG5cclxuICAgIHJlcy5wYXlsb2FkID0gdGhpcy5kZWNvZGVQYXlsb2FkKG9wdGlvbnMucGF5bG9hZFR5cGUsIHJlcy5wYXlsb2FkKTtcclxuXHJcbiAgICBpZiAob3B0aW9ucy5yZXR1cm5Pbmx5UGF5bG9hZCkge1xyXG4gICAgICByZXR1cm4gcmVzLnBheWxvYWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVE9ETyByZW5hbWUgdGhpcyB0byBlbmNyeXB0KCkgYW5kIHVzZSBhcyB0aGUgbW9zdCBjb21tb24gdXNlY2FzZVxyXG4gIGFzeW5jIGVuY3J5cHRUb1N0cmluZyhcclxuICAgIGtleTogSldLLktleSxcclxuICAgIGNvbnRlbnQ6IEFycmF5QnVmZmVyIHwgc3RyaW5nIHwgb2JqZWN0XHJcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhd2FpdCB0aGlzLmVuY3J5cHQoa2V5LCBjb250ZW50KSk7XHJcbiAgfVxyXG5cclxuICAvLyBUT0RPIHJlbmFtZSB0aGlzIHRvIGVuY3J5cHRUb0pTT04oKSBhbmQgdXNlIHRoaXMgd2hlbiByZXF1aXJlZC5cclxuICBhc3luYyBlbmNyeXB0KFxyXG4gICAga2V5OiBKV0suS2V5LFxyXG4gICAgY29udGVudDogQXJyYXlCdWZmZXIgfCBzdHJpbmcgfCBvYmplY3RcclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY3J5cHRpbmcgbnVsbC91bmRlZmluZWQgY29udGVudC4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIShjb250ZW50IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XHJcbiAgICAgIGNvbnRlbnQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoY29udGVudCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBKV0UuY3JlYXRlRW5jcnlwdChcclxuICAgICAge1xyXG4gICAgICAgIGNvbnRlbnRBbGc6ICdBMjU2R0NNJyxcclxuICAgICAgICBmaWVsZHM6IHtcclxuICAgICAgICAgIHRpbWVzdGFtcDogYXdhaXQgdGhpcy50aW1lU2VydmljZS5zZXJ2ZXJOb3coKSxcclxuICAgICAgICB9LFxyXG4gICAgICB9IGFzIGFueSxcclxuICAgICAga2V5XHJcbiAgICApXHJcbiAgICAgIC51cGRhdGUoY29udGVudClcclxuICAgICAgLmZpbmFsKCkgYXMgYW55O1xyXG4gIH1cclxuXHJcbiAgLy8gPEFaPiBVbmxpa2Ugc2lnbkNvbnRlbnQsIHRoZSBzZXJpYWxpc2VkIFwiY29udGVudFwiIHZhcmlhYmxlIGlzIGNvbnRhaW5lZCBpbnNpZGVcclxuICAvLyB0aGUgcmVzdWx0LiBTbyBvcmRlcmluZyBvZiBmaWVsZHMgd2l0aGluIFwiY29udGVudFwiIGlzIG5vdCBhbiBpc3N1ZS5cclxuICBhc3luYyBzaWduKGtleTogSldLLktleSwgY29udGVudDogQnVmZmVyIHwgc3RyaW5nIHwgb2JqZWN0KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IHNpZ25lciA9IEpXUy5jcmVhdGVTaWduKFxyXG4gICAgICB7XHJcbiAgICAgICAgZmllbGRzOiB7XHJcbiAgICAgICAgICB0aW1lc3RhbXA6IGF3YWl0IHRoaXMudGltZVNlcnZpY2Uuc2VydmVyTm93KCksXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAga2V5XHJcbiAgICApO1xyXG5cclxuICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgQnVmZmVyKSB7XHJcbiAgICAgIHNpZ25lci51cGRhdGUoY29udGVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzaWduZXIudXBkYXRlKEpTT04uc3RyaW5naWZ5KGNvbnRlbnQpLCAndXRmOCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzaWduZXIuZmluYWwoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNpZ25Ub1N0cmluZyhcclxuICAgIGtleTogSldLLktleSxcclxuICAgIGNvbnRlbnQ6IEJ1ZmZlciB8IHN0cmluZyB8IG9iamVjdFxyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGhpcy5zaWduKGtleSwgY29udGVudCkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgdmVyaWZ5KFxyXG4gICAga2V5OiBKV0suS2V5LFxyXG4gICAgandzOiBvYmplY3QsXHJcbiAgICBvcHRpb25zPzogVmVyaWZ5T3B0aW9uc1xyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBvcHQgPSB7XHJcbiAgICAgIGFsZ29yaXRobXM6IFsnUlMqJ10sXHJcbiAgICB9O1xyXG5cclxuICAgIG9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLlZFUklGWV9PUFRJT05TX0RFRkFVTFQsXHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICB9O1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IEpXUy5jcmVhdGVWZXJpZnkoa2V5LCBvcHQpLnZlcmlmeShqd3MgYXMgYW55KTtcclxuXHJcbiAgICAgIHJlcy5wYXlsb2FkID0gdGhpcy5kZWNvZGVQYXlsb2FkKG9wdGlvbnMucGF5bG9hZFR5cGUsIHJlcy5wYXlsb2FkKTtcclxuXHJcbiAgICAgIGlmIChvcHRpb25zLnJldHVybk9ubHlQYXlsb2FkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcy5wYXlsb2FkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRocm93IG5ldyBMckV4Y2VwdGlvbih7XHJcbiAgICAgICAgY29kZTogTHJFcnJvckNvZGUuQmFkU2lnbmF0dXJlLFxyXG4gICAgICAgIG1lc3NhZ2U6IGBCYWQgc2lnbmF0dXJlOiAke2Vycm9yfWAsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZW5jcnlwdFRoZW5TaWduKFxyXG4gICAge1xyXG4gICAgICBrZXksXHJcbiAgICAgIHNpZ1ByayxcclxuICAgIH06IHtcclxuICAgICAga2V5OiBKV0suS2V5O1xyXG4gICAgICBzaWdQcms6IEpXSy5LZXk7XHJcbiAgICB9LFxyXG4gICAgY29udGVudDogQXJyYXlCdWZmZXIgfCBzdHJpbmcgfCBvYmplY3RcclxuICApOiBQcm9taXNlPHsgY2lwaGVyOiBzdHJpbmc7IHNpZzogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IGNpcGhlciA9IEpTT04uc3RyaW5naWZ5KGF3YWl0IHRoaXMuZW5jcnlwdChrZXksIGNvbnRlbnQpKTtcclxuICAgIGNvbnN0IHNpZyA9IGF3YWl0IHRoaXMuc2lnbihzaWdQcmssIGNpcGhlcik7XHJcbiAgICBkZWxldGUgc2lnLnBheWxvYWQ7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY2lwaGVyLFxyXG4gICAgICBzaWc6IEpTT04uc3RyaW5naWZ5KHNpZyksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWNvZGVQYXlsb2FkKFxyXG4gICAgcGF5bG9hZFR5cGU6IFBheWxvYWRUeXBlLFxyXG4gICAgcGF5bG9hZDogQXJyYXlCdWZmZXJcclxuICApOiBBcnJheUJ1ZmZlciB8IGFueSB7XHJcbiAgICBzd2l0Y2ggKHBheWxvYWRUeXBlKSB7XHJcbiAgICAgIGNhc2UgJ2pzb24nOlxyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkKSk7XHJcbiAgICAgIGNhc2UgJ0FycmF5QnVmZmVyJzpcclxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgTHJCYWRBcmd1bWVudEV4Y2VwdGlvbihgVW5rbm93biBwYXlsb2FkVHlwZTogJHtwYXlsb2FkVHlwZX1gKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { LrException, LrErrorCode, LrBadArgumentException, } from './../_common/exceptions';
|
|
3
|
+
import { Injectable } from '@angular/core';
|
|
4
|
+
import { JWE, JWS } from 'node-jose';
|
|
5
|
+
import { TimeService } from '../api/time.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../api/time.service";
|
|
8
|
+
export var JoseSerialization;
|
|
9
|
+
(function (JoseSerialization) {
|
|
10
|
+
JoseSerialization["JSON"] = "JSON";
|
|
11
|
+
JoseSerialization["COMPACT"] = "COMPACT";
|
|
12
|
+
})(JoseSerialization || (JoseSerialization = {}));
|
|
13
|
+
export const VERIFY_OPTIONS_DEFAULT = {
|
|
14
|
+
payloadType: 'json',
|
|
15
|
+
returnOnlyPayload: true,
|
|
16
|
+
};
|
|
17
|
+
export const DECRYPT_OPTIONS_DEFAULT = {
|
|
18
|
+
payloadType: 'json',
|
|
19
|
+
returnOnlyPayload: true,
|
|
20
|
+
serializations: [JoseSerialization.JSON],
|
|
21
|
+
};
|
|
22
|
+
export function isSymmetricKey(key) {
|
|
23
|
+
// TODO: make sure this covers all cases.
|
|
24
|
+
return key.kty === 'oct';
|
|
25
|
+
}
|
|
26
|
+
export function asJwk(key) {
|
|
27
|
+
// TODO: make sure this covers all cases.
|
|
28
|
+
// Excluded:
|
|
29
|
+
// key.use - only for public keys, Ref: https://tools.ietf.org/html/rfc7517#section-4.2
|
|
30
|
+
if (key.id && key.jwk) {
|
|
31
|
+
return key.jwk;
|
|
32
|
+
}
|
|
33
|
+
else if (key.keystore && key.length && key.kty && key.kid && key.alg) {
|
|
34
|
+
return key;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class EncryptionService {
|
|
41
|
+
constructor(timeService) {
|
|
42
|
+
this.timeService = timeService;
|
|
43
|
+
}
|
|
44
|
+
decrypt(key, // string is assumed to be key.id, will unwrap key.
|
|
45
|
+
jwe, // string will be JSON.parsed
|
|
46
|
+
options) {
|
|
47
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
+
const opt = {
|
|
49
|
+
algorithms: ['dir', 'A*GCM', 'RSA-OAEP-*'],
|
|
50
|
+
};
|
|
51
|
+
options = Object.assign(Object.assign({}, DECRYPT_OPTIONS_DEFAULT), options);
|
|
52
|
+
if (key.jwk) {
|
|
53
|
+
key = key.jwk;
|
|
54
|
+
}
|
|
55
|
+
if (typeof jwe === 'string') {
|
|
56
|
+
if (options.serializations.includes(JoseSerialization.JSON)) {
|
|
57
|
+
try {
|
|
58
|
+
jwe = JSON.parse(jwe);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (options.serializations.includes(JoseSerialization.COMPACT)) {
|
|
62
|
+
console.log('Not a JSON-formatted JWE, it maybe compact serialisation format.');
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// {result} is a Object with:
|
|
71
|
+
// * header: the combined 'protected' and 'unprotected' header members
|
|
72
|
+
// * protected: an array of the member names from the "protected" member
|
|
73
|
+
// * key: Key used to decrypt
|
|
74
|
+
// * payload: Buffer of the decrypted content
|
|
75
|
+
// * plaintext: Buffer of the decrypted content (alternate), just a reference to payload
|
|
76
|
+
const res = yield JWE.createDecrypt(key, opt).decrypt(jwe);
|
|
77
|
+
res.payload = this.decodePayload(options.payloadType, res.payload);
|
|
78
|
+
if (options.returnOnlyPayload) {
|
|
79
|
+
return res.payload;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
return res;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// TODO rename this to encrypt() and use as the most common usecase
|
|
87
|
+
encryptToString(key, content) {
|
|
88
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
89
|
+
return JSON.stringify(yield this.encrypt(key, content));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// TODO rename this to encryptToJSON() and use this when required.
|
|
93
|
+
encrypt(key, content) {
|
|
94
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
95
|
+
if (content == null) {
|
|
96
|
+
throw new Error('Encrypting null/undefined content.');
|
|
97
|
+
}
|
|
98
|
+
if (!(content instanceof ArrayBuffer)) {
|
|
99
|
+
content = new TextEncoder().encode(JSON.stringify(content));
|
|
100
|
+
}
|
|
101
|
+
return JWE.createEncrypt({
|
|
102
|
+
contentAlg: 'A256GCM',
|
|
103
|
+
fields: {
|
|
104
|
+
timestamp: yield this.timeService.serverNow(),
|
|
105
|
+
},
|
|
106
|
+
}, key)
|
|
107
|
+
.update(content)
|
|
108
|
+
.final();
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// <AZ> Unlike signContent, the serialised "content" variable is contained inside
|
|
112
|
+
// the result. So ordering of fields within "content" is not an issue.
|
|
113
|
+
sign(key, content) {
|
|
114
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
115
|
+
const signer = JWS.createSign({
|
|
116
|
+
fields: {
|
|
117
|
+
timestamp: yield this.timeService.serverNow(),
|
|
118
|
+
},
|
|
119
|
+
}, key);
|
|
120
|
+
if (content instanceof Buffer) {
|
|
121
|
+
signer.update(content);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
signer.update(JSON.stringify(content), 'utf8');
|
|
125
|
+
}
|
|
126
|
+
return signer.final();
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
signToString(key, content) {
|
|
130
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
+
return JSON.stringify(yield this.sign(key, content));
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
verify(key, jws, options) {
|
|
135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
const opt = {
|
|
137
|
+
algorithms: ['RS*'],
|
|
138
|
+
};
|
|
139
|
+
options = Object.assign(Object.assign({}, VERIFY_OPTIONS_DEFAULT), options);
|
|
140
|
+
try {
|
|
141
|
+
const res = yield JWS.createVerify(key, opt).verify(jws);
|
|
142
|
+
res.payload = this.decodePayload(options.payloadType, res.payload);
|
|
143
|
+
if (options.returnOnlyPayload) {
|
|
144
|
+
return res.payload;
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
return res;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
throw new LrException({
|
|
152
|
+
code: LrErrorCode.BadSignature,
|
|
153
|
+
message: `Bad signature: ${error}`,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
encryptThenSign({ key, sigPrk, }, content) {
|
|
159
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
160
|
+
const cipher = JSON.stringify(yield this.encrypt(key, content));
|
|
161
|
+
const sig = yield this.sign(sigPrk, cipher);
|
|
162
|
+
delete sig.payload;
|
|
163
|
+
return {
|
|
164
|
+
cipher,
|
|
165
|
+
sig: JSON.stringify(sig),
|
|
166
|
+
};
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
decodePayload(payloadType, payload) {
|
|
170
|
+
switch (payloadType) {
|
|
171
|
+
case 'json':
|
|
172
|
+
return JSON.parse(new TextDecoder().decode(payload));
|
|
173
|
+
case 'ArrayBuffer':
|
|
174
|
+
return payload;
|
|
175
|
+
default:
|
|
176
|
+
throw new LrBadArgumentException(`Unknown payloadType: ${payloadType}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
EncryptionService.ɵprov = i0.ɵɵdefineInjectable({ factory: function EncryptionService_Factory() { return new EncryptionService(i0.ɵɵinject(i1.TimeService)); }, token: EncryptionService, providedIn: "root" });
|
|
181
|
+
EncryptionService.decorators = [
|
|
182
|
+
{ type: Injectable, args: [{
|
|
183
|
+
providedIn: 'root',
|
|
184
|
+
},] }
|
|
185
|
+
];
|
|
186
|
+
EncryptionService.ctorParameters = () => [
|
|
187
|
+
{ type: TimeService }
|
|
188
|
+
];
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9vcHQvYXRsYXNzaWFuL3BpcGVsaW5lcy9hZ2VudC9idWlsZC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jcnlwdG9ncmFwaHkvZW5jcnlwdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLFdBQVcsRUFDWCxzQkFBc0IsR0FDdkIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQTRCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsR0FBRyxFQUFPLEdBQUcsRUFBUSxNQUFNLFdBQVcsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQUVsRCxNQUFNLENBQU4sSUFBWSxpQkFHWDtBQUhELFdBQVksaUJBQWlCO0lBQzNCLGtDQUFhLENBQUE7SUFDYix3Q0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBSFcsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUc1QjtBQWFELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFrQjtJQUNuRCxXQUFXLEVBQUUsTUFBTTtJQUNuQixpQkFBaUIsRUFBRSxJQUFJO0NBQ3hCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBbUI7SUFDckQsV0FBVyxFQUFFLE1BQU07SUFDbkIsaUJBQWlCLEVBQUUsSUFBSTtJQUN2QixjQUFjLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Q0FDekMsQ0FBQztBQUVGLE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBWTtJQUN6Qyx5Q0FBeUM7SUFDekMsT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxHQUF3QjtJQUM1Qyx5Q0FBeUM7SUFDekMsWUFBWTtJQUNaLHlGQUF5RjtJQUV6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LE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELEtBQUssYUFBYTtnQkFDaEIsT0FBTyxPQUFPLENBQUM7WUFDakI7Z0JBQ0UsTUFBTSxJQUFJLHNCQUFzQixDQUFDLHdCQUF3QixXQUFXLEVBQUUsQ0FBQyxDQUFDO1NBQzNFO0lBQ0gsQ0FBQzs7OztZQXpMRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQWxEUSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgTHJFeGNlcHRpb24sXG4gIExyRXJyb3JDb2RlLFxuICBMckJhZEFyZ3VtZW50RXhjZXB0aW9uLFxufSBmcm9tICcuLy4uL19jb21tb24vZXhjZXB0aW9ucyc7XG5pbXBvcnQgeyBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEpXRSwgSldLLCBKV1MsIHV0aWwgfSBmcm9tICdub2RlLWpvc2UnO1xuaW1wb3J0IHsgS2V5LCBQYXlsb2FkVHlwZSB9IGZyb20gJy4vY3J5cHRvZ3JhcGh5LnR5cGVzJztcbmltcG9ydCB7IFRpbWVTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL3RpbWUuc2VydmljZSc7XG5cbmV4cG9ydCBlbnVtIEpvc2VTZXJpYWxpemF0aW9uIHtcbiAgSlNPTiA9ICdKU09OJyxcbiAgQ09NUEFDVCA9ICdDT01QQUNUJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlPcHRpb25zIHtcbiAgcGF5bG9hZFR5cGU/OiBQYXlsb2FkVHlwZTtcbiAgcmV0dXJuT25seVBheWxvYWQ/OiBib29sZWFuOyAvLyBJZiB0cnVlLCByZXR1cm4gb25seSB0aGUgZGVjb2RlZCBwYXlsb2FkLlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlY3J5cHRPcHRpb25zIHtcbiAgcGF5bG9hZFR5cGU/OiBQYXlsb2FkVHlwZTtcbiAgcmV0dXJuT25seVBheWxvYWQ/OiBib29sZWFuOyAvLyBJZiB0cnVlLCByZXR1cm4gb25seSB0aGUgZGVjb2RlZCBwYXlsb2FkLlxuICBzZXJpYWxpemF0aW9ucz86IEpvc2VTZXJpYWxpemF0aW9uW107XG59XG5cbmV4cG9ydCBjb25zdCBWRVJJRllfT1BUSU9OU19ERUZBVUxUOiBWZXJpZnlPcHRpb25zID0ge1xuICBwYXlsb2FkVHlwZTogJ2pzb24nLFxuICByZXR1cm5Pbmx5UGF5bG9hZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBjb25zdCBERUNSWVBUX09QVElPTlNfREVGQVVMVDogRGVjcnlwdE9wdGlvbnMgPSB7XG4gIHBheWxvYWRUeXBlOiAnanNvbicsXG4gIHJldHVybk9ubHlQYXlsb2FkOiB0cnVlLFxuICBzZXJpYWxpemF0aW9uczogW0pvc2VTZXJpYWxpemF0aW9uLkpTT05dLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3ltbWV0cmljS2V5KGtleTogSldLLktleSkge1xuICAvLyBUT0RPOiBtYWtlIHN1cmUgdGhpcyBjb3ZlcnMgYWxsIGNhc2VzLlxuICByZXR1cm4ga2V5Lmt0eSA9PT0gJ29jdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc0p3ayhrZXk6IEpXSy5LZXkgfCBLZXkgfCBhbnkpOiBKV0suS2V5IHwgbnVsbCB7XG4gIC8vIFRPRE86IG1ha2Ugc3VyZSB0aGlzIGNvdmVycyBhbGwgY2FzZXMuXG4gIC8vIEV4Y2x1ZGVkOlxuICAvLyAgIGtleS51c2UgLSBvbmx5IGZvciBwdWJsaWMga2V5cywgUmVmOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzUxNyNzZWN0aW9uLTQuMlxuXG4gIGlmIChrZXkuaWQgJiYga2V5Lmp3aykge1xuICAgIHJldHVybiBrZXkuandrO1xuICB9IGVsc2UgaWYgKGtleS5rZXlzdG9yZSAmJiBrZXkubGVuZ3RoICYmIGtleS5rdHkgJiYga2V5LmtpZCAmJiBrZXkuYWxnKSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRW5jcnlwdGlvblNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRpbWVTZXJ2aWNlOiBUaW1lU2VydmljZSkge31cblxuICBhc3luYyBkZWNyeXB0KFxuICAgIGtleTogSldLLktleSB8IEtleSwgLy8gc3RyaW5nIGlzIGFzc3VtZWQgdG8gYmUga2V5LmlkLCB3aWxsIHVud3JhcCBrZXkuXG4gICAgandlOiBvYmplY3QgfCBzdHJpbmcsIC8vIHN0cmluZyB3aWxsIGJlIEpTT04ucGFyc2VkXG4gICAgb3B0aW9ucz86IERlY3J5cHRPcHRpb25zXG4gICk6IFByb21pc2U8SldFLkRlY3J5cHRSZXN1bHQgfCBhbnk+IHtcbiAgICBjb25zdCBvcHQgPSB7XG4gICAgICBhbGdvcml0aG1zOiBbJ2RpcicsICdBKkdDTScsICdSU0EtT0FFUC0qJ10sXG4gICAgfTtcblxuICAgIG9wdGlvbnMgPSB7XG4gICAgICAuLi5ERUNSWVBUX09QVElPTlNfREVGQVVMVCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGlmICgoa2V5IGFzIEtleSkuandrKSB7XG4gICAgICBrZXkgPSAoa2V5IGFzIEtleSkuandrO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgandlID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKG9wdGlvbnMuc2VyaWFsaXphdGlvbnMuaW5jbHVkZXMoSm9zZVNlcmlhbGl6YXRpb24uSlNPTikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBqd2UgPSBKU09OLnBhcnNlKGp3ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWFsaXphdGlvbnMuaW5jbHVkZXMoSm9zZVNlcmlhbGl6YXRpb24uQ09NUEFDVCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAnTm90IGEgSlNPTi1mb3JtYXR0ZWQgSldFLCBpdCBtYXliZSBjb21wYWN0IHNlcmlhbGlzYXRpb24gZm9ybWF0LidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHtyZXN1bHR9IGlzIGEgT2JqZWN0IHdpdGg6XG4gICAgLy8gKiAgaGVhZGVyOiB0aGUgY29tYmluZWQgJ3Byb3RlY3RlZCcgYW5kICd1bnByb3RlY3RlZCcgaGVhZGVyIG1lbWJlcnNcbiAgICAvLyAqICBwcm90ZWN0ZWQ6IGFuIGFycmF5IG9mIHRoZSBtZW1iZXIgbmFtZXMgZnJvbSB0aGUgXCJwcm90ZWN0ZWRcIiBtZW1iZXJcbiAgICAvLyAqICBrZXk6IEtleSB1c2VkIHRvIGRlY3J5cHRcbiAgICAvLyAqICBwYXlsb2FkOiBCdWZmZXIgb2YgdGhlIGRlY3J5cHRlZCBjb250ZW50XG4gICAgLy8gKiAgcGxhaW50ZXh0OiBCdWZmZXIgb2YgdGhlIGRlY3J5cHRlZCBjb250ZW50IChhbHRlcm5hdGUpLCBqdXN0IGEgcmVmZXJlbmNlIHRvIHBheWxvYWRcbiAgICBjb25zdCByZXMgPSBhd2FpdCBKV0UuY3JlYXRlRGVjcnlwdChrZXkgYXMgSldLLktleSwgb3B0KS5kZWNyeXB0KFxuICAgICAgandlIGFzIGFueVxuICAgICk7XG5cbiAgICByZXMucGF5bG9hZCA9IHRoaXMuZGVjb2RlUGF5bG9hZChvcHRpb25zLnBheWxvYWRUeXBlLCByZXMucGF5bG9hZCk7XG5cbiAgICBpZiAob3B0aW9ucy5yZXR1cm5Pbmx5UGF5bG9hZCkge1xuICAgICAgcmV0dXJuIHJlcy5wYXlsb2FkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gcmVuYW1lIHRoaXMgdG8gZW5jcnlwdCgpIGFuZCB1c2UgYXMgdGhlIG1vc3QgY29tbW9uIHVzZWNhc2VcbiAgYXN5bmMgZW5jcnlwdFRvU3RyaW5nKFxuICAgIGtleTogSldLLktleSxcbiAgICBjb250ZW50OiBBcnJheUJ1ZmZlciB8IHN0cmluZyB8IG9iamVjdFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhd2FpdCB0aGlzLmVuY3J5cHQoa2V5LCBjb250ZW50KSk7XG4gIH1cblxuICAvLyBUT0RPIHJlbmFtZSB0aGlzIHRvIGVuY3J5cHRUb0pTT04oKSBhbmQgdXNlIHRoaXMgd2hlbiByZXF1aXJlZC5cbiAgYXN5bmMgZW5jcnlwdChcbiAgICBrZXk6IEpXSy5LZXksXG4gICAgY29udGVudDogQXJyYXlCdWZmZXIgfCBzdHJpbmcgfCBvYmplY3RcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoY29udGVudCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY3J5cHRpbmcgbnVsbC91bmRlZmluZWQgY29udGVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIShjb250ZW50IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgICBjb250ZW50ID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gSldFLmNyZWF0ZUVuY3J5cHQoXG4gICAgICB7XG4gICAgICAgIGNvbnRlbnRBbGc6ICdBMjU2R0NNJyxcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgdGltZXN0YW1wOiBhd2FpdCB0aGlzLnRpbWVTZXJ2aWNlLnNlcnZlck5vdygpLFxuICAgICAgICB9LFxuICAgICAgfSBhcyBhbnksXG4gICAgICBrZXlcbiAgICApXG4gICAgICAudXBkYXRlKGNvbnRlbnQpXG4gICAgICAuZmluYWwoKSBhcyBhbnk7XG4gIH1cblxuICAvLyA8QVo+IFVubGlrZSBzaWduQ29udGVudCwgdGhlIHNlcmlhbGlzZWQgXCJjb250ZW50XCIgdmFyaWFibGUgaXMgY29udGFpbmVkIGluc2lkZVxuICAvLyB0aGUgcmVzdWx0LiBTbyBvcmRlcmluZyBvZiBmaWVsZHMgd2l0aGluIFwiY29udGVudFwiIGlzIG5vdCBhbiBpc3N1ZS5cbiAgYXN5bmMgc2lnbihrZXk6IEpXSy5LZXksIGNvbnRlbnQ6IEJ1ZmZlciB8IHN0cmluZyB8IG9iamVjdCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc2lnbmVyID0gSldTLmNyZWF0ZVNpZ24oXG4gICAgICB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIHRpbWVzdGFtcDogYXdhaXQgdGhpcy50aW1lU2VydmljZS5zZXJ2ZXJOb3coKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBrZXlcbiAgICApO1xuXG4gICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgIHNpZ25lci51cGRhdGUoY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNpZ25lci51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY29udGVudCksICd1dGY4Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpZ25lci5maW5hbCgpO1xuICB9XG5cbiAgYXN5bmMgc2lnblRvU3RyaW5nKFxuICAgIGtleTogSldLLktleSxcbiAgICBjb250ZW50OiBCdWZmZXIgfCBzdHJpbmcgfCBvYmplY3RcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGhpcy5zaWduKGtleSwgY29udGVudCkpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5KFxuICAgIGtleTogSldLLktleSxcbiAgICBqd3M6IG9iamVjdCxcbiAgICBvcHRpb25zPzogVmVyaWZ5T3B0aW9uc1xuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IG9wdCA9IHtcbiAgICAgIGFsZ29yaXRobXM6IFsnUlMqJ10sXG4gICAgfTtcblxuICAgIG9wdGlvbnMgPSB7XG4gICAgICAuLi5WRVJJRllfT1BUSU9OU19ERUZBVUxULFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IEpXUy5jcmVhdGVWZXJpZnkoa2V5LCBvcHQpLnZlcmlmeShqd3MgYXMgYW55KTtcblxuICAgICAgcmVzLnBheWxvYWQgPSB0aGlzLmRlY29kZVBheWxvYWQob3B0aW9ucy5wYXlsb2FkVHlwZSwgcmVzLnBheWxvYWQpO1xuXG4gICAgICBpZiAob3B0aW9ucy5yZXR1cm5Pbmx5UGF5bG9hZCkge1xuICAgICAgICByZXR1cm4gcmVzLnBheWxvYWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgTHJFeGNlcHRpb24oe1xuICAgICAgICBjb2RlOiBMckVycm9yQ29kZS5CYWRTaWduYXR1cmUsXG4gICAgICAgIG1lc3NhZ2U6IGBCYWQgc2lnbmF0dXJlOiAke2Vycm9yfWAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBlbmNyeXB0VGhlblNpZ24oXG4gICAge1xuICAgICAga2V5LFxuICAgICAgc2lnUHJrLFxuICAgIH06IHtcbiAgICAgIGtleTogSldLLktleTtcbiAgICAgIHNpZ1ByazogSldLLktleTtcbiAgICB9LFxuICAgIGNvbnRlbnQ6IEFycmF5QnVmZmVyIHwgc3RyaW5nIHwgb2JqZWN0XG4gICk6IFByb21pc2U8eyBjaXBoZXI6IHN0cmluZzsgc2lnOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IGNpcGhlciA9IEpTT04uc3RyaW5naWZ5KGF3YWl0IHRoaXMuZW5jcnlwdChrZXksIGNvbnRlbnQpKTtcbiAgICBjb25zdCBzaWcgPSBhd2FpdCB0aGlzLnNpZ24oc2lnUHJrLCBjaXBoZXIpO1xuICAgIGRlbGV0ZSBzaWcucGF5bG9hZDtcblxuICAgIHJldHVybiB7XG4gICAgICBjaXBoZXIsXG4gICAgICBzaWc6IEpTT04uc3RyaW5naWZ5KHNpZyksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZGVjb2RlUGF5bG9hZChcbiAgICBwYXlsb2FkVHlwZTogUGF5bG9hZFR5cGUsXG4gICAgcGF5bG9hZDogQXJyYXlCdWZmZXJcbiAgKTogQXJyYXlCdWZmZXIgfCBhbnkge1xuICAgIHN3aXRjaCAocGF5bG9hZFR5cGUpIHtcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZCkpO1xuICAgICAgY2FzZSAnQXJyYXlCdWZmZXInOlxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBMckJhZEFyZ3VtZW50RXhjZXB0aW9uKGBVbmtub3duIHBheWxvYWRUeXBlOiAke3BheWxvYWRUeXBlfWApO1xuICAgIH1cbiAgfVxufVxuIl19
|