@lifeready/core 9.0.7 → 10.0.0
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/fesm2022/lifeready-core.mjs +10522 -0
- package/fesm2022/lifeready-core.mjs.map +1 -0
- package/package.json +21 -16
- package/types/lifeready-core.d.ts +5329 -0
- package/bundles/lifeready-core.umd.js +0 -13231
- package/bundles/lifeready-core.umd.js.map +0 -1
- package/bundles/lifeready-core.umd.min.js +0 -2
- package/bundles/lifeready-core.umd.min.js.map +0 -1
- package/esm2015/lib/_common/ast.js +0 -41
- package/esm2015/lib/_common/deferred-promise.js +0 -24
- package/esm2015/lib/_common/exceptions.js +0 -186
- package/esm2015/lib/_common/index.js +0 -3
- package/esm2015/lib/_common/kc-lodash.js +0 -11
- package/esm2015/lib/_common/key.js +0 -28
- package/esm2015/lib/_common/queries.gql.js +0 -43
- package/esm2015/lib/_common/run-outside-angular.js +0 -80
- package/esm2015/lib/_common/storage.js +0 -28
- package/esm2015/lib/_common/types.js +0 -2
- package/esm2015/lib/_common/utils.js +0 -73
- package/esm2015/lib/api/lr-apollo.service.js +0 -47
- package/esm2015/lib/api/lr-graphql/index.js +0 -6
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +0 -170
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +0 -216
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +0 -51
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +0 -91
- package/esm2015/lib/api/lr-graphql/lr.service.js +0 -18
- package/esm2015/lib/api/query-processor/common-processors.service.js +0 -94
- package/esm2015/lib/api/query-processor/index.js +0 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +0 -307
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +0 -110
- package/esm2015/lib/api/types/graphql.types.js +0 -8
- package/esm2015/lib/api/types/index.js +0 -3
- package/esm2015/lib/api/types/lr-graphql.types.js +0 -182
- package/esm2015/lib/auth/auth.config.js +0 -57
- package/esm2015/lib/auth/auth.gql.private.js +0 -85
- package/esm2015/lib/auth/auth.service.js +0 -616
- package/esm2015/lib/auth/auth.types.js +0 -19
- package/esm2015/lib/contact-card/contact-card.gql.js +0 -79
- package/esm2015/lib/contact-card/contact-card.service.js +0 -156
- package/esm2015/lib/contact-card/contact-card2.gql.js +0 -29
- package/esm2015/lib/contact-card/contact-card2.service.js +0 -103
- package/esm2015/lib/encryption/encryption.service.js +0 -188
- package/esm2015/lib/file-upload/file-upload.service.js +0 -70
- package/esm2015/lib/file-upload/file-upload.types.js +0 -2
- package/esm2015/lib/idle/idle.service.js +0 -159
- package/esm2015/lib/idle/idle.types.js +0 -7
- package/esm2015/lib/item/item.gql.js +0 -166
- package/esm2015/lib/item/item.gql.private.js +0 -41
- package/esm2015/lib/item/item.service.js +0 -662
- package/esm2015/lib/item/item.types.js +0 -2
- package/esm2015/lib/key/key-factory.service.js +0 -226
- package/esm2015/lib/key/key-graph.service.js +0 -314
- package/esm2015/lib/key/key-meta.service.js +0 -153
- package/esm2015/lib/key/key.service.js +0 -124
- package/esm2015/lib/key/key.types.js +0 -16
- package/esm2015/lib/key-exchange/key-exchange.gql.js +0 -174
- package/esm2015/lib/key-exchange/key-exchange.service.js +0 -496
- package/esm2015/lib/lbop/lbop.service.js +0 -351
- package/esm2015/lib/life-ready.config.js +0 -96
- package/esm2015/lib/life-ready.module.js +0 -42
- package/esm2015/lib/lock/lock.gql.js +0 -40
- package/esm2015/lib/lock/lock.service.js +0 -64
- package/esm2015/lib/notification/notification.gql.js +0 -43
- package/esm2015/lib/notification/notification.service.js +0 -118
- package/esm2015/lib/password/password.gql.js +0 -28
- package/esm2015/lib/password/password.service.js +0 -309
- package/esm2015/lib/persist/persist.service.js +0 -181
- package/esm2015/lib/plan/plan.gql.js +0 -91
- package/esm2015/lib/plan/plan.service.js +0 -191
- package/esm2015/lib/plan/plan.types.js +0 -2
- package/esm2015/lib/profile/profile-details.service.js +0 -261
- package/esm2015/lib/profile/profile.gql.js +0 -170
- package/esm2015/lib/profile/profile.service.js +0 -166
- package/esm2015/lib/profile/profile.types.js +0 -45
- package/esm2015/lib/register/register.service.js +0 -173
- package/esm2015/lib/register/register.types.js +0 -3
- package/esm2015/lib/reminder/reminder.gql.js +0 -27
- package/esm2015/lib/reminder/reminder.service.js +0 -85
- package/esm2015/lib/reminder/reminder.types.js +0 -2
- package/esm2015/lib/scenario/scenario.constants.js +0 -2
- package/esm2015/lib/scenario/scenario.controller.js +0 -34
- package/esm2015/lib/scenario/scenario.gql.js +0 -90
- package/esm2015/lib/scenario/scenario.private.gql.js +0 -200
- package/esm2015/lib/scenario/scenario.service.js +0 -679
- package/esm2015/lib/scenario/scenario.types.js +0 -2
- package/esm2015/lib/server-config/server-config.gql.js +0 -9
- package/esm2015/lib/server-config/server-config.service.js +0 -41
- package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +0 -119
- package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +0 -41
- package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +0 -117
- package/esm2015/lib/slip39/slip39.service.js +0 -167
- package/esm2015/lib/time/time.service.js +0 -152
- package/esm2015/lib/tp-assembly/tp-assembly.js +0 -363
- package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +0 -22
- package/esm2015/lib/tp-assembly/tp-assembly.types.js +0 -2
- package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +0 -98
- package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +0 -121
- package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +0 -4
- package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +0 -34
- package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +0 -74
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +0 -166
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +0 -54
- package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +0 -110
- package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +0 -2
- package/esm2015/lib/trusted-party/trusted-party.gql.js +0 -96
- package/esm2015/lib/trusted-party/trusted-party.gql.private.js +0 -51
- package/esm2015/lib/trusted-party/trusted-party.service.js +0 -461
- package/esm2015/lib/trusted-party/trusted-party.types.js +0 -2
- package/esm2015/lib/two-factor/two-factor.service.js +0 -74
- package/esm2015/lib/user/user.gql.js +0 -32
- package/esm2015/lib/user/user.service.js +0 -58
- package/esm2015/lib/user/user.types.js +0 -2
- package/esm2015/lib/web-crypto/web-crypto.service.js +0 -29
- package/esm2015/lifeready-core.js +0 -17
- package/esm2015/public-api.js +0 -60
- package/fesm2015/lifeready-core.js +0 -10970
- package/fesm2015/lifeready-core.js.map +0 -1
- package/lib/_common/ast.d.ts +0 -11
- package/lib/_common/deferred-promise.d.ts +0 -12
- package/lib/_common/exceptions.d.ts +0 -126
- package/lib/_common/index.d.ts +0 -2
- package/lib/_common/kc-lodash.d.ts +0 -5
- package/lib/_common/key.d.ts +0 -14
- package/lib/_common/queries.gql.d.ts +0 -4
- package/lib/_common/run-outside-angular.d.ts +0 -14
- package/lib/_common/storage.d.ts +0 -13
- package/lib/_common/types.d.ts +0 -15
- package/lib/_common/utils.d.ts +0 -12
- package/lib/api/lr-apollo.service.d.ts +0 -15
- package/lib/api/lr-graphql/index.d.ts +0 -5
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +0 -81
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +0 -46
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +0 -28
- package/lib/api/lr-graphql/lr-mutation.d.ts +0 -48
- package/lib/api/lr-graphql/lr.service.d.ts +0 -9
- package/lib/api/query-processor/common-processors.service.d.ts +0 -36
- package/lib/api/query-processor/index.d.ts +0 -2
- package/lib/api/query-processor/query-processor.service.d.ts +0 -18
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +0 -15
- package/lib/api/types/graphql.types.d.ts +0 -30
- package/lib/api/types/index.d.ts +0 -2
- package/lib/api/types/lr-graphql.types.d.ts +0 -807
- package/lib/auth/auth.config.d.ts +0 -5
- package/lib/auth/auth.gql.private.d.ts +0 -25
- package/lib/auth/auth.service.d.ts +0 -72
- package/lib/auth/auth.types.d.ts +0 -70
- package/lib/contact-card/contact-card.gql.d.ts +0 -7
- package/lib/contact-card/contact-card.service.d.ts +0 -53
- package/lib/contact-card/contact-card2.gql.d.ts +0 -25
- package/lib/contact-card/contact-card2.service.d.ts +0 -64
- package/lib/encryption/encryption.service.d.ts +0 -42
- package/lib/file-upload/file-upload.service.d.ts +0 -15
- package/lib/file-upload/file-upload.types.d.ts +0 -5
- package/lib/idle/idle.service.d.ts +0 -47
- package/lib/idle/idle.types.d.ts +0 -10
- package/lib/item/item.gql.d.ts +0 -134
- package/lib/item/item.gql.private.d.ts +0 -35
- package/lib/item/item.service.d.ts +0 -201
- package/lib/item/item.types.d.ts +0 -95
- package/lib/key/key-factory.service.d.ts +0 -40
- package/lib/key/key-graph.service.d.ts +0 -41
- package/lib/key/key-meta.service.d.ts +0 -51
- package/lib/key/key.service.d.ts +0 -36
- package/lib/key/key.types.d.ts +0 -86
- package/lib/key-exchange/key-exchange.gql.d.ts +0 -141
- package/lib/key-exchange/key-exchange.service.d.ts +0 -179
- package/lib/lbop/lbop.service.d.ts +0 -99
- package/lib/life-ready.config.d.ts +0 -26
- package/lib/life-ready.module.d.ts +0 -5
- package/lib/lock/lock.gql.d.ts +0 -27
- package/lib/lock/lock.service.d.ts +0 -34
- package/lib/notification/notification.gql.d.ts +0 -37
- package/lib/notification/notification.service.d.ts +0 -64
- package/lib/password/password.gql.d.ts +0 -3
- package/lib/password/password.service.d.ts +0 -79
- package/lib/persist/persist.service.d.ts +0 -31
- package/lib/plan/plan.gql.d.ts +0 -69
- package/lib/plan/plan.service.d.ts +0 -111
- package/lib/plan/plan.types.d.ts +0 -16
- package/lib/profile/profile-details.service.d.ts +0 -20
- package/lib/profile/profile.gql.d.ts +0 -21
- package/lib/profile/profile.service.d.ts +0 -32
- package/lib/profile/profile.types.d.ts +0 -121
- package/lib/register/register.service.d.ts +0 -25
- package/lib/register/register.types.d.ts +0 -6
- package/lib/reminder/reminder.gql.d.ts +0 -23
- package/lib/reminder/reminder.service.d.ts +0 -33
- package/lib/reminder/reminder.types.d.ts +0 -17
- package/lib/scenario/scenario.constants.d.ts +0 -1
- package/lib/scenario/scenario.controller.d.ts +0 -10
- package/lib/scenario/scenario.gql.d.ts +0 -78
- package/lib/scenario/scenario.private.gql.d.ts +0 -16
- package/lib/scenario/scenario.service.d.ts +0 -655
- package/lib/scenario/scenario.types.d.ts +0 -64
- package/lib/server-config/server-config.gql.d.ts +0 -5
- package/lib/server-config/server-config.service.d.ts +0 -9
- package/lib/shared-contact-card/shared-contact-card.service.d.ts +0 -33
- package/lib/shared-contact-card/shared-contact-card2.gql.d.ts +0 -36
- package/lib/shared-contact-card/shared-contact-card2.service.d.ts +0 -45
- package/lib/slip39/slip39.service.d.ts +0 -42
- package/lib/time/time.service.d.ts +0 -26
- package/lib/tp-assembly/tp-assembly.d.ts +0 -177
- package/lib/tp-assembly/tp-assembly.private.gql.d.ts +0 -5
- package/lib/tp-assembly/tp-assembly.types.d.ts +0 -40
- package/lib/tp-password-reset/tp-password-reset-request.service.d.ts +0 -16
- package/lib/tp-password-reset/tp-password-reset-user.service.d.ts +0 -29
- package/lib/tp-password-reset/tp-password-reset.constants.d.ts +0 -3
- package/lib/tp-password-reset/tp-password-reset.controller.d.ts +0 -10
- package/lib/tp-password-reset/tp-password-reset.gql.d.ts +0 -63
- package/lib/tp-password-reset/tp-password-reset.private.gql.d.ts +0 -163
- package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +0 -59
- package/lib/tp-password-reset/tp-password-reset.service.d.ts +0 -112
- package/lib/tp-password-reset/tp-password-reset.types.d.ts +0 -40
- package/lib/trusted-party/trusted-party.gql.d.ts +0 -85
- package/lib/trusted-party/trusted-party.gql.private.d.ts +0 -40
- package/lib/trusted-party/trusted-party.service.d.ts +0 -192
- package/lib/trusted-party/trusted-party.types.d.ts +0 -31
- package/lib/two-factor/two-factor.service.d.ts +0 -15
- package/lib/user/user.gql.d.ts +0 -8
- package/lib/user/user.service.d.ts +0 -9
- package/lib/user/user.types.d.ts +0 -16
- package/lib/web-crypto/web-crypto.service.d.ts +0 -5
- package/lifeready-core.d.ts +0 -16
- package/lifeready-core.metadata.json +0 -1
- package/public-api.d.ts +0 -56
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9pdGVtL2l0ZW0udHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEpTT05PYmplY3QsIExpbmtUeXBlRmllbGQsIExyUmVsYXlJZElucHV0IH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IFNvbWVSZXF1aXJlZCB9IGZyb20gJy4uL19jb21tb24vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElkS2V5UGFpciB7XG4gIGlkOiBzdHJpbmc7XG4gIGtleUlkOiBzdHJpbmc7XG59XG5cbi8vIFN1ZmZpeCBcIk9wdGlvbnNcIiBhcmUgd2hhdCdzIG5lZWQgYnkgdGhlIEtDIGNsaWVudC5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyZW50RGlyZWN0b3J5T3B0aW9ucyB7XG4gIGRpcmVjdG9yeT86IElkS2V5UGFpcjtcbiAgbGlua1R5cGU/OiBMaW5rVHlwZUZpZWxkO1xuXG4gIC8vIFRoZXNlIHdpbGwgYmUgZGVwcmVjYXRlZFxuICBkaXJlY3RvcnlJZD86IExyUmVsYXlJZElucHV0O1xuICAvLyBJZiB3cmFwcGluZyBrZXkgcHJvdmlkZWQsIHRoZW4gd2UgY2FuIHRyeSBmZXRjaGluZyBpdCBmcm9tIHRoZVxuICAvLyBrZXkgZ3JhcGguIElmIG5vdCBmb3VuZCBpbiBrZXkgZ3JhcGgsIHRoZW4gZmV0Y2ggdGhlIGRpcmVjdG9yeS5cbiAgd3JhcHBpbmdLZXlJZD86IExyUmVsYXlJZElucHV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFJvb3REaXJlY3RvcnlJbnB1dCB7XG4gIHdyYXBwZWRLZXk6IHN0cmluZztcbiAgd3JhcHBpbmdLZXlJZDogTHJSZWxheUlkSW5wdXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyZW50RGlyZWN0b3J5SW5wdXQge1xuICBkaXJlY3RvcnlJZDogTHJSZWxheUlkSW5wdXQ7XG4gIHdyYXBwaW5nS2V5SWQ/OiBMclJlbGF5SWRJbnB1dDtcbiAgd3JhcHBlZEtleT86IHN0cmluZztcbiAgbGlua1R5cGU/OiBMaW5rVHlwZUZpZWxkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERvd25sb2FkRmlsZUNvbnRlbnRPcHRpb25zIHtcbiAgZmlsZVN0YXRlTm9kZUlkOiBMclJlbGF5SWRJbnB1dDtcbiAgZmlsZVN0YXRlS2V5SWQ/OiBMclJlbGF5SWRJbnB1dDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21tb25EaXJlY3RvcnlPcHRpb25zIHtcbiAgcGxhaW5NZXRhSnNvbj86IEpTT05PYmplY3Q7XG4gIGNpcGhlck1ldGFDbGVhckpzb24/OiBKU09OT2JqZWN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZURpcmVjdG9yeU9wdGlvbnMgZXh0ZW5kcyBDb21tb25EaXJlY3RvcnlPcHRpb25zIHtcbiAgYXNSb290RGlyZWN0b3J5PzogYm9vbGVhbjtcbiAgcGFyZW50RGlyZWN0b3JpZXM/OiBQYXJlbnREaXJlY3RvcnlPcHRpb25zW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRGlyZWN0b3J5T3B0aW9ucyBleHRlbmRzIENvbW1vbkRpcmVjdG9yeU9wdGlvbnMge1xuICBkaXJlY3RvcnlJZDogTHJSZWxheUlkSW5wdXQ7XG4gIGRpcmVjdG9yeUtleUlkPzogTHJSZWxheUlkSW5wdXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uRmlsZU9wdGlvbnMge1xuICBwbGFpbk1ldGFKc29uPzogSlNPTk9iamVjdDtcbiAgY2lwaGVyTWV0YUNsZWFySnNvbj86IEpTT05PYmplY3Q7XG4gIGZpbGU/OiBGaWxlIHwgQXJyYXlCdWZmZXI7XG4gIC8vIGN1c3RvbSB1cGxvYWRlclxuICB1cGxvYWQ/OiAoY2lwaGVyRmlsZUNvbnRlbnQ6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUZpbGVPcHRpb25zIGV4dGVuZHMgQ29tbW9uRmlsZU9wdGlvbnMge1xuICBwYXJlbnREaXJlY3RvcmllczogUGFyZW50RGlyZWN0b3J5T3B0aW9uc1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUZpbGVPcHRpb25zIGV4dGVuZHMgQ29tbW9uRmlsZU9wdGlvbnMge1xuICBmaWxlSWQ6IExyUmVsYXlJZElucHV0O1xuICBmaWxlS2V5SWQ/OiBMclJlbGF5SWRJbnB1dDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXZlcnRGaWxlT3B0aW9ucyB7XG4gIGZpbGVJZDogTHJSZWxheUlkSW5wdXQ7XG4gIHZlcnNpb25JZDogTHJSZWxheUlkSW5wdXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbmdlSXRlbVBhcmVudHNPcHRpb25zIHtcbiAgcGFyZW50c1RvUmVtb3ZlPzogTHJSZWxheUlkSW5wdXRbXTtcbiAgcGFyZW50c1RvQWRkPzogUGFyZW50RGlyZWN0b3J5T3B0aW9uc1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYW5nZURpcmVjdG9yeVBhcmVudHNPcHRpb25zXG4gIGV4dGVuZHMgQ2hhbmdlSXRlbVBhcmVudHNPcHRpb25zIHtcbiAgZGlyZWN0b3J5PzogSWRLZXlQYWlyO1xuICAvLyBUaGVzZSB3aWxsIGJlIGRlcHJlY2F0ZWRcbiAgZGlyZWN0b3J5SWQ/OiBMclJlbGF5SWRJbnB1dDtcbiAgZGlyZWN0b3J5S2V5SWQ/OiBMclJlbGF5SWRJbnB1dDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2VGaWxlUGFyZW50c09wdGlvbnMgZXh0ZW5kcyBDaGFuZ2VJdGVtUGFyZW50c09wdGlvbnMge1xuICBmaWxlPzogSWRLZXlQYWlyO1xuICAvLyBUaGVzZSB3aWxsIGJlIGRlcHJlY2F0ZWRcbiAgZmlsZUlkPzogTHJSZWxheUlkSW5wdXQ7XG4gIGZpbGVLZXlJZD86IExyUmVsYXlJZElucHV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJlZ2luRGVsZXRlQ2hpbGRJdGVtTGlua3NXaW5kb3dPcHRpb25zIHtcbiAgZGlyZWN0b3J5SWQ6IExyUmVsYXlJZElucHV0O1xuICByZXF1ZXN0V2luZG93TXM6IG51bWJlcjtcbn1cblxuLy8gQ3JlYXRpbmcgZGlyZWN0b3J5IHdpdGggc3RhZ2luZyBhcyByb290IGRpcmVjdG9yeSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCwgaGVuY2Ugb21pdHRpbmcgYXNSb290RGlyZWN0b3J5XG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZURpcmVjdG9yeVdpdGhTdGFnaW5nT3B0aW9uc1xuICBleHRlbmRzIE9taXQ8XG4gICAgU29tZVJlcXVpcmVkPENyZWF0ZURpcmVjdG9yeU9wdGlvbnMsICdwYXJlbnREaXJlY3Rvcmllcyc+LFxuICAgICdhc1Jvb3REaXJlY3RvcnknXG4gID4ge1xuICByZXF1ZXN0V2luZG93TXM6IG51bWJlcjtcbiAgb25DcmVhdGVkSW5TdGFnaW5nOiAoZGlyZWN0b3J5OiBJZEtleVBhaXIpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRmlsZVdpdGhTdGFnaW5nT3B0aW9ucyBleHRlbmRzIENyZWF0ZUZpbGVPcHRpb25zIHtcbiAgcmVxdWVzdFdpbmRvd01zOiBudW1iZXI7XG4gIG9uQ3JlYXRlZEluU3RhZ2luZzogKGZpbGU6IElkS2V5UGFpcikgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXRGaWxlQ29uZmlkZW50aWFsT3B0aW9ucyB7XG4gIGZpbGVJZDogTHJSZWxheUlkSW5wdXQ7XG4gIGNvbmZpZGVudGlhbDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXREaXJlY3RvcnlDb25maWRlbnRpYWxPcHRpb25zIHtcbiAgZGlyZWN0b3J5SWQ6IExyUmVsYXlJZElucHV0O1xuICBjb25maWRlbnRpYWw6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJjaGl2ZURpcmVjdG9yeU9wdGlvbnMge1xuICByZWN1cnNpdmU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVW5hcmNoaXZlRGlyZWN0b3J5T3B0aW9ucyB7XG4gIHJlY3Vyc2l2ZTogYm9vbGVhbjtcbn1cbiJdfQ==
|
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { JWK } from 'node-jose';
|
|
4
|
-
import { WebCryptoService } from '../web-crypto/web-crypto.service';
|
|
5
|
-
import { KcBadArgumentException, KcSuspiciousOperationException, } from '../_common/exceptions';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "../web-crypto/web-crypto.service";
|
|
8
|
-
export class KeyFactoryService {
|
|
9
|
-
constructor(webCryptoService) {
|
|
10
|
-
this.webCryptoService = webCryptoService;
|
|
11
|
-
// Global keys store. Otherwise, each call to asKey creates a new keyStore.
|
|
12
|
-
// <AZ> Did not seem to improve speed.
|
|
13
|
-
// public static keyStore = JWK.createKeyStore();
|
|
14
|
-
// AZ: This can't be change easily. It's basically a PassK or PassIdp rotation.
|
|
15
|
-
// todo: we should eventually increase this periodically to match with Moore's law.
|
|
16
|
-
// The iterations for each key are kept by the server as well but we assume the value
|
|
17
|
-
// from the server is not trustworthy, so need to have minimum thresholds here.
|
|
18
|
-
// If creating new keys, these minimum are used.
|
|
19
|
-
this.MIN_PASS_IDP_PBKDF_ITER = 100000;
|
|
20
|
-
this.MIN_PASS_KEY_PBKDF_ITER = 100000;
|
|
21
|
-
this.MIN_LBOP_KEY_PBKDF_ITER = 100000;
|
|
22
|
-
// These are used as the default values. They must be larger than the minimum values.
|
|
23
|
-
this.DEFAULT_PASS_IDP_PBKDF_ITER = this.MIN_PASS_IDP_PBKDF_ITER;
|
|
24
|
-
this.DEFAULT_PASS_KEY_PBKDF_ITER = this.MIN_PASS_KEY_PBKDF_ITER;
|
|
25
|
-
this.DEFAULT_LBOP_KEY_PBKDF_ITER = this.MIN_LBOP_KEY_PBKDF_ITER;
|
|
26
|
-
this.kcCrypto = this.webCryptoService.kcCrypto;
|
|
27
|
-
}
|
|
28
|
-
static asKey(key, form, extras) {
|
|
29
|
-
// <AZ> Using a single global key store did not seem to improve speed.
|
|
30
|
-
// return KeyFactoryService.keyStore.add(key, form, extras);
|
|
31
|
-
return JWK.asKey(key, form, extras);
|
|
32
|
-
}
|
|
33
|
-
randomString(digits) {
|
|
34
|
-
if (digits <= 0) {
|
|
35
|
-
throw new KcBadArgumentException('digits <= 0');
|
|
36
|
-
}
|
|
37
|
-
const validChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
38
|
-
let array = new Uint32Array(digits);
|
|
39
|
-
this.kcCrypto.getRandomValues(array);
|
|
40
|
-
array = array.map((x) => validChars.charCodeAt(x % validChars.length));
|
|
41
|
-
return String.fromCharCode.apply(null, array);
|
|
42
|
-
}
|
|
43
|
-
randomDigitsNoZeros(digits) {
|
|
44
|
-
return this.randomChoices([1, 2, 3, 4, 5, 6, 7, 8, 9], digits).join('');
|
|
45
|
-
}
|
|
46
|
-
randomChoices(array, chooseN) {
|
|
47
|
-
if (array.length <= 1) {
|
|
48
|
-
throw new KcBadArgumentException('array.length <= 0');
|
|
49
|
-
}
|
|
50
|
-
if (chooseN <= 0) {
|
|
51
|
-
throw new KcBadArgumentException('chooseN <= 0');
|
|
52
|
-
}
|
|
53
|
-
const values = new Uint32Array(chooseN);
|
|
54
|
-
this.kcCrypto.getRandomValues(values);
|
|
55
|
-
const ret = [];
|
|
56
|
-
values.forEach((v) => ret.push(array[v % array.length]));
|
|
57
|
-
return ret;
|
|
58
|
-
}
|
|
59
|
-
createSalt() {
|
|
60
|
-
return this.randomString(16);
|
|
61
|
-
}
|
|
62
|
-
createKey() {
|
|
63
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
-
const key = yield this.kcCrypto.subtle.generateKey({
|
|
65
|
-
name: 'AES-GCM',
|
|
66
|
-
length: 256,
|
|
67
|
-
}, true, // whether the key is extractable (i.e. can be used in exportKey)
|
|
68
|
-
['encrypt', 'decrypt'] // must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"]
|
|
69
|
-
);
|
|
70
|
-
const jwk = yield this.kcCrypto.subtle.exportKey('jwk', key);
|
|
71
|
-
// Removing the fields not needed by node-jose
|
|
72
|
-
delete jwk.ext;
|
|
73
|
-
delete jwk.key_ops;
|
|
74
|
-
return KeyFactoryService.asKey(jwk);
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
createSignKey() {
|
|
78
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
-
const key = yield this.kcCrypto.subtle.generateKey({
|
|
80
|
-
name: 'HMAC',
|
|
81
|
-
hash: { name: 'SHA-512' },
|
|
82
|
-
}, true, ['sign', 'verify']);
|
|
83
|
-
const jwk = yield this.kcCrypto.subtle.exportKey('jwk', key);
|
|
84
|
-
// Removing the fields not needed by node-jose
|
|
85
|
-
delete jwk.key_ops;
|
|
86
|
-
delete jwk.ext;
|
|
87
|
-
return KeyFactoryService.asKey(jwk);
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
createPkcKey() {
|
|
91
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
-
// node-jose is not using Forge properly. It should be calling the async version of
|
|
93
|
-
// pki.rsa.generateKeyPair() with a callback. Instead it calls the sync version. Webcrypto
|
|
94
|
-
// does not support sync version, so it uses the javascript implementation, which is way too slow.
|
|
95
|
-
// So we generate using webcrypto and import the key.
|
|
96
|
-
// Unfortunately Elliptical Curve is not supported by Webcrypto. So we have to settle for RSA.
|
|
97
|
-
const key = yield this.kcCrypto.subtle.generateKey({
|
|
98
|
-
name: 'RSA-OAEP',
|
|
99
|
-
modulusLength: 2048,
|
|
100
|
-
// As per suggestion: https://developer.mozilla.org/en-US/docs/Web/API/RsaHashedKeyGenParams
|
|
101
|
-
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
|
|
102
|
-
hash: { name: 'SHA-256' },
|
|
103
|
-
}, true, // whether the key is extractable (i.e. can be used in exportKey)
|
|
104
|
-
['encrypt', 'decrypt'] // must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"]
|
|
105
|
-
);
|
|
106
|
-
const jwk = yield this.kcCrypto.subtle.exportKey('jwk', key.privateKey);
|
|
107
|
-
// Removing the fields not needed by node-jose
|
|
108
|
-
delete jwk.key_ops;
|
|
109
|
-
delete jwk.ext;
|
|
110
|
-
return KeyFactoryService.asKey(jwk);
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
createPkcSignKey() {
|
|
114
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
115
|
-
const key = yield this.kcCrypto.subtle.generateKey({
|
|
116
|
-
name: 'RSASSA-PKCS1-v1_5',
|
|
117
|
-
modulusLength: 2048,
|
|
118
|
-
// As per suggestion: https://developer.mozilla.org/en-US/docs/Web/API/RsaHashedKeyGenParams
|
|
119
|
-
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
|
|
120
|
-
hash: { name: 'SHA-256' },
|
|
121
|
-
}, true, // whether the key is extractable (i.e. can be used in exportKey)
|
|
122
|
-
['sign', 'verify'] // can be any combination of "sign" and "verify"
|
|
123
|
-
);
|
|
124
|
-
const jwk = yield this.kcCrypto.subtle.exportKey('jwk', key.privateKey);
|
|
125
|
-
// Removing the fields not needed by node-jose
|
|
126
|
-
delete jwk.key_ops;
|
|
127
|
-
delete jwk.ext;
|
|
128
|
-
return KeyFactoryService.asKey(jwk);
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
importPassword(plainPassword) {
|
|
132
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
-
const enc = new TextEncoder();
|
|
134
|
-
return this.kcCrypto.subtle.importKey('raw', enc.encode(plainPassword), 'PBKDF2', false, ['deriveKey']);
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
deriveKey({ password, salt, iterations, kid, }) {
|
|
138
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
139
|
-
const passKey = yield this.kcCrypto.subtle.deriveKey({
|
|
140
|
-
name: 'PBKDF2',
|
|
141
|
-
salt: new TextEncoder().encode(salt),
|
|
142
|
-
iterations,
|
|
143
|
-
hash: 'SHA-256',
|
|
144
|
-
}, password, { name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt']);
|
|
145
|
-
const passKeyJson = yield this.kcCrypto.subtle.exportKey('jwk', passKey);
|
|
146
|
-
if (kid) {
|
|
147
|
-
passKeyJson.kid = kid;
|
|
148
|
-
}
|
|
149
|
-
const jwk = yield KeyFactoryService.asKey(passKeyJson);
|
|
150
|
-
return { jwk };
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
derivePassIdp(params) {
|
|
154
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
155
|
-
if (params.iterations < this.MIN_PASS_IDP_PBKDF_ITER) {
|
|
156
|
-
throw new KcSuspiciousOperationException(`The number of PassIdp key derivation iterations sent from the server (${params.iterations}) is lower than the minimum (${this.MIN_PASS_IDP_PBKDF_ITER})`);
|
|
157
|
-
}
|
|
158
|
-
return this.deriveKey(params);
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
derivePassKey(params) {
|
|
162
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
163
|
-
if (params.iterations < this.MIN_PASS_KEY_PBKDF_ITER) {
|
|
164
|
-
throw new KcSuspiciousOperationException(`The number of PassKey key derivation iterations sent from the server(${params.iterations}) is lower than the minimum(${this.MIN_PASS_KEY_PBKDF_ITER})`);
|
|
165
|
-
}
|
|
166
|
-
return this.deriveKey(params);
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
deriveLbopKey(params) {
|
|
170
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
171
|
-
if (params.iterations < this.MIN_LBOP_KEY_PBKDF_ITER) {
|
|
172
|
-
throw new KcSuspiciousOperationException(`The number of LbopKey key derivation iterations sent from the server(${params.iterations}) is lower than the minimum(${this.MIN_LBOP_KEY_PBKDF_ITER})`);
|
|
173
|
-
}
|
|
174
|
-
return this.deriveKey(params);
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
createKid() {
|
|
178
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
179
|
-
// todo: AZ: node-jose source uses node's default UUID() function for kid, so just change to use that.
|
|
180
|
-
// for now, we are just creating a new key to use it's kid.
|
|
181
|
-
// The kid is a part of the JWK system. LR backend maintains the key hierarchy separately with it's own
|
|
182
|
-
// key id. But we just use it here as a double check.
|
|
183
|
-
return (yield this.createKey()).kid;
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
createPassIdpParams() {
|
|
187
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
188
|
-
return {
|
|
189
|
-
salt: this.createSalt(),
|
|
190
|
-
iterations: this.DEFAULT_PASS_IDP_PBKDF_ITER,
|
|
191
|
-
};
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
createPassKeyParams() {
|
|
195
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
196
|
-
return {
|
|
197
|
-
salt: this.createSalt(),
|
|
198
|
-
kid: yield this.createKid(),
|
|
199
|
-
iterations: this.DEFAULT_PASS_KEY_PBKDF_ITER,
|
|
200
|
-
};
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
createLbopKeyParams() {
|
|
204
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
205
|
-
return {
|
|
206
|
-
salt: this.createSalt(),
|
|
207
|
-
// todo: AZ: node-jose source uses node's default UUID() function for kid, so just change to use that.
|
|
208
|
-
// for now, we are just creating a new key to use it's kid.
|
|
209
|
-
// The kid is a part of the JWK system. LR backend maintains the key hierarchy separately with it's own
|
|
210
|
-
// key id. But we just use it here as a double check.
|
|
211
|
-
kid: yield this.createKid(),
|
|
212
|
-
iterations: this.DEFAULT_PASS_KEY_PBKDF_ITER,
|
|
213
|
-
};
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
KeyFactoryService.ɵprov = i0.ɵɵdefineInjectable({ factory: function KeyFactoryService_Factory() { return new KeyFactoryService(i0.ɵɵinject(i1.WebCryptoService)); }, token: KeyFactoryService, providedIn: "root" });
|
|
218
|
-
KeyFactoryService.decorators = [
|
|
219
|
-
{ type: Injectable, args: [{
|
|
220
|
-
providedIn: 'root',
|
|
221
|
-
},] }
|
|
222
|
-
];
|
|
223
|
-
KeyFactoryService.ctorParameters = () => [
|
|
224
|
-
{ type: WebCryptoService }
|
|
225
|
-
];
|
|
226
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWZhY3Rvcnkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9rZXkva2V5LWZhY3Rvcnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWhDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsOEJBQThCLEdBQy9CLE1BQU0sdUJBQXVCLENBQUM7OztBQWMvQixNQUFNLE9BQU8saUJBQWlCO0lBQzVCLFlBQW9CLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBS3RELDJFQUEyRTtRQUMzRSxzQ0FBc0M7UUFDdEMsaURBQWlEO1FBRWpELCtFQUErRTtRQUMvRSxtRkFBbUY7UUFDbkYscUZBQXFGO1FBQ3JGLCtFQUErRTtRQUMvRSxnREFBZ0Q7UUFDaEMsNEJBQXVCLEdBQUcsTUFBTSxDQUFDO1FBQ2pDLDRCQUF1QixHQUFHLE1BQU0sQ0FBQztRQUNqQyw0QkFBdUIsR0FBRyxNQUFNLENBQUM7UUFFakQscUZBQXFGO1FBQ3JFLGdDQUEyQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUMzRCxnQ0FBMkIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDM0QsZ0NBQTJCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBcEJ6RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7SUFDakQsQ0FBQztJQXFCRCxNQUFNLENBQUMsS0FBSyxDQUNWLEdBQThELEVBQzlELElBUVMsRUFDVCxNQUFnQztRQUVoQyxzRUFBc0U7UUFDdEUsNERBQTREO1FB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Z0JBQ3JELEdBQUcsRUFBRSxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQzNCLFVBQVUsRUFBRSxJQUFJLENBQUMsMkJBQTJCO2FBQzdDLENBQUM7UUFDSixDQUFDO0tBQUE7Ozs7WUFqUkYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUFqQlEsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSldLIH0gZnJvbSAnbm9kZS1qb3NlJztcbmltcG9ydCB7IEpTT05PYmplY3QgfSBmcm9tICcuLi9hcGkvdHlwZXMnO1xuaW1wb3J0IHsgV2ViQ3J5cHRvU2VydmljZSB9IGZyb20gJy4uL3dlYi1jcnlwdG8vd2ViLWNyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEtjQmFkQXJndW1lbnRFeGNlcHRpb24sXG4gIEtjU3VzcGljaW91c09wZXJhdGlvbkV4Y2VwdGlvbixcbn0gZnJvbSAnLi4vX2NvbW1vbi9leGNlcHRpb25zJztcbmltcG9ydCB7XG4gIERlcml2ZUtleVJlc3VsdCxcbiAgRGVyaXZlTGJvcEtleVBhcmFtcyxcbiAgRGVyaXZlUGFzc0lkcFBhcmFtcyxcbiAgRGVyaXZlUGFzc0tleVBhcmFtcyxcbiAgTGJvcEtleVBhcmFtcyxcbiAgUGFzc0lkcFBhcmFtcyxcbiAgUGFzc0tleVBhcmFtcyxcbn0gZnJvbSAnLi9rZXkudHlwZXMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgS2V5RmFjdG9yeVNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHdlYkNyeXB0b1NlcnZpY2U6IFdlYkNyeXB0b1NlcnZpY2UpIHtcbiAgICB0aGlzLmtjQ3J5cHRvID0gdGhpcy53ZWJDcnlwdG9TZXJ2aWNlLmtjQ3J5cHRvO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkga2NDcnlwdG86IENyeXB0bztcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZTogW107XG4gIC8vIEdsb2JhbCBrZXlzIHN0b3JlLiBPdGhlcndpc2UsIGVhY2ggY2FsbCB0byBhc0tleSBjcmVhdGVzIGEgbmV3IGtleVN0b3JlLlxuICAvLyA8QVo+IERpZCBub3Qgc2VlbSB0byBpbXByb3ZlIHNwZWVkLlxuICAvLyBwdWJsaWMgc3RhdGljIGtleVN0b3JlID0gSldLLmNyZWF0ZUtleVN0b3JlKCk7XG5cbiAgLy8gQVo6IFRoaXMgY2FuJ3QgYmUgY2hhbmdlIGVhc2lseS4gSXQncyBiYXNpY2FsbHkgYSBQYXNzSyBvciBQYXNzSWRwIHJvdGF0aW9uLlxuICAvLyB0b2RvOiB3ZSBzaG91bGQgZXZlbnR1YWxseSBpbmNyZWFzZSB0aGlzIHBlcmlvZGljYWxseSB0byBtYXRjaCB3aXRoIE1vb3JlJ3MgbGF3LlxuICAvLyBUaGUgaXRlcmF0aW9ucyBmb3IgZWFjaCBrZXkgYXJlIGtlcHQgYnkgdGhlIHNlcnZlciBhcyB3ZWxsIGJ1dCB3ZSBhc3N1bWUgdGhlIHZhbHVlXG4gIC8vIGZyb20gdGhlIHNlcnZlciBpcyBub3QgdHJ1c3R3b3J0aHksIHNvIG5lZWQgdG8gaGF2ZSBtaW5pbXVtIHRocmVzaG9sZHMgaGVyZS5cbiAgLy8gSWYgY3JlYXRpbmcgbmV3IGtleXMsIHRoZXNlIG1pbmltdW0gYXJlIHVzZWQuXG4gIHB1YmxpYyByZWFkb25seSBNSU5fUEFTU19JRFBfUEJLREZfSVRFUiA9IDEwMDAwMDtcbiAgcHVibGljIHJlYWRvbmx5IE1JTl9QQVNTX0tFWV9QQktERl9JVEVSID0gMTAwMDAwO1xuICBwdWJsaWMgcmVhZG9ubHkgTUlOX0xCT1BfS0VZX1BCS0RGX0lURVIgPSAxMDAwMDA7XG5cbiAgLy8gVGhlc2UgYXJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWVzLiBUaGV5IG11c3QgYmUgbGFyZ2VyIHRoYW4gdGhlIG1pbmltdW0gdmFsdWVzLlxuICBwdWJsaWMgcmVhZG9ubHkgREVGQVVMVF9QQVNTX0lEUF9QQktERl9JVEVSID0gdGhpcy5NSU5fUEFTU19JRFBfUEJLREZfSVRFUjtcbiAgcHVibGljIHJlYWRvbmx5IERFRkFVTFRfUEFTU19LRVlfUEJLREZfSVRFUiA9IHRoaXMuTUlOX1BBU1NfS0VZX1BCS0RGX0lURVI7XG4gIHB1YmxpYyByZWFkb25seSBERUZBVUxUX0xCT1BfS0VZX1BCS0RGX0lURVIgPSB0aGlzLk1JTl9MQk9QX0tFWV9QQktERl9JVEVSO1xuXG4gIHN0YXRpYyBhc0tleShcbiAgICBrZXk6IHN0cmluZyB8IEJ1ZmZlciB8IFJlY29yZDxzdHJpbmcsIEpTT05PYmplY3Q+IHwgSldLLlJhd0tleSxcbiAgICBmb3JtPzpcbiAgICAgIHwgJ2pzb24nXG4gICAgICB8ICdwcml2YXRlJ1xuICAgICAgfCAncGtjczgnXG4gICAgICB8ICdwdWJsaWMnXG4gICAgICB8ICdzcGtpJ1xuICAgICAgfCAncGtpeCdcbiAgICAgIHwgJ3g1MDknXG4gICAgICB8ICdwZW0nLFxuICAgIGV4dHJhcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8SldLLktleT4ge1xuICAgIC8vIDxBWj4gVXNpbmcgYSBzaW5nbGUgZ2xvYmFsIGtleSBzdG9yZSBkaWQgbm90IHNlZW0gdG8gaW1wcm92ZSBzcGVlZC5cbiAgICAvLyByZXR1cm4gS2V5RmFjdG9yeVNlcnZpY2Uua2V5U3RvcmUuYWRkKGtleSwgZm9ybSwgZXh0cmFzKTtcbiAgICByZXR1cm4gSldLLmFzS2V5KGtleSwgZm9ybSwgZXh0cmFzKTtcbiAgfVxuXG4gIHJhbmRvbVN0cmluZyhkaWdpdHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGRpZ2l0cyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgS2NCYWRBcmd1bWVudEV4Y2VwdGlvbignZGlnaXRzIDw9IDAnKTtcbiAgICB9XG4gICAgY29uc3QgdmFsaWRDaGFycyA9XG4gICAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xuICAgIGxldCBhcnJheSA9IG5ldyBVaW50MzJBcnJheShkaWdpdHMpO1xuICAgIHRoaXMua2NDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgICBhcnJheSA9IGFycmF5Lm1hcCgoeCkgPT4gdmFsaWRDaGFycy5jaGFyQ29kZUF0KHggJSB2YWxpZENoYXJzLmxlbmd0aCkpO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KTtcbiAgfVxuXG4gIHJhbmRvbURpZ2l0c05vWmVyb3MoZGlnaXRzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJhbmRvbUNob2ljZXMoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldLCBkaWdpdHMpLmpvaW4oJycpO1xuICB9XG5cbiAgcmFuZG9tQ2hvaWNlczxUPihhcnJheTogVFtdLCBjaG9vc2VOOiBudW1iZXIpOiBUW10ge1xuICAgIGlmIChhcnJheS5sZW5ndGggPD0gMSkge1xuICAgICAgdGhyb3cgbmV3IEtjQmFkQXJndW1lbnRFeGNlcHRpb24oJ2FycmF5Lmxlbmd0aCA8PSAwJyk7XG4gICAgfVxuICAgIGlmIChjaG9vc2VOIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBLY0JhZEFyZ3VtZW50RXhjZXB0aW9uKCdjaG9vc2VOIDw9IDAnKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFVpbnQzMkFycmF5KGNob29zZU4pO1xuICAgIHRoaXMua2NDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHZhbHVlcyk7XG4gICAgY29uc3QgcmV0OiBUW10gPSBbXTtcbiAgICB2YWx1ZXMuZm9yRWFjaCgodikgPT4gcmV0LnB1c2goYXJyYXlbdiAlIGFycmF5Lmxlbmd0aF0pKTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgY3JlYXRlU2FsdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJhbmRvbVN0cmluZygxNik7XG4gIH1cblxuICBhc3luYyBjcmVhdGVLZXkoKTogUHJvbWlzZTxKV0suS2V5PiB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5rY0NyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdBRVMtR0NNJyxcbiAgICAgICAgbGVuZ3RoOiAyNTYsIC8vIGNhbiBiZSAgMTI4LCAxOTIsIG9yIDI1NlxuICAgICAgfSxcbiAgICAgIHRydWUsIC8vIHdoZXRoZXIgdGhlIGtleSBpcyBleHRyYWN0YWJsZSAoaS5lLiBjYW4gYmUgdXNlZCBpbiBleHBvcnRLZXkpXG4gICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddIC8vIG11c3QgYmUgW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIl0gb3IgW1wid3JhcEtleVwiLCBcInVud3JhcEtleVwiXVxuICAgICk7XG5cbiAgICBjb25zdCBqd2sgPSBhd2FpdCB0aGlzLmtjQ3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoJ2p3aycsIGtleSk7XG5cbiAgICAvLyBSZW1vdmluZyB0aGUgZmllbGRzIG5vdCBuZWVkZWQgYnkgbm9kZS1qb3NlXG4gICAgZGVsZXRlIGp3ay5leHQ7XG4gICAgZGVsZXRlIGp3ay5rZXlfb3BzO1xuXG4gICAgcmV0dXJuIEtleUZhY3RvcnlTZXJ2aWNlLmFzS2V5KGp3ayk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTaWduS2V5KCk6IFByb21pc2U8SldLLktleT4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMua2NDcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KFxuICAgICAge1xuICAgICAgICBuYW1lOiAnSE1BQycsXG4gICAgICAgIGhhc2g6IHsgbmFtZTogJ1NIQS01MTInIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICAgIFsnc2lnbicsICd2ZXJpZnknXVxuICAgICk7XG5cbiAgICBjb25zdCBqd2sgPSBhd2FpdCB0aGlzLmtjQ3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoJ2p3aycsIGtleSk7XG5cbiAgICAvLyBSZW1vdmluZyB0aGUgZmllbGRzIG5vdCBuZWVkZWQgYnkgbm9kZS1qb3NlXG4gICAgZGVsZXRlIGp3ay5rZXlfb3BzO1xuICAgIGRlbGV0ZSBqd2suZXh0O1xuXG4gICAgcmV0dXJuIEtleUZhY3RvcnlTZXJ2aWNlLmFzS2V5KGp3ayk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQa2NLZXkoKTogUHJvbWlzZTxKV0suS2V5PiB7XG4gICAgLy8gbm9kZS1qb3NlIGlzIG5vdCB1c2luZyBGb3JnZSBwcm9wZXJseS4gSXQgc2hvdWxkIGJlIGNhbGxpbmcgdGhlIGFzeW5jIHZlcnNpb24gb2ZcbiAgICAvLyBwa2kucnNhLmdlbmVyYXRlS2V5UGFpcigpIHdpdGggYSBjYWxsYmFjay4gSW5zdGVhZCBpdCBjYWxscyB0aGUgc3luYyB2ZXJzaW9uLiBXZWJjcnlwdG9cbiAgICAvLyBkb2VzIG5vdCBzdXBwb3J0IHN5bmMgdmVyc2lvbiwgc28gaXQgdXNlcyB0aGUgamF2YXNjcmlwdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgd2F5IHRvbyBzbG93LlxuICAgIC8vIFNvIHdlIGdlbmVyYXRlIHVzaW5nIHdlYmNyeXB0byBhbmQgaW1wb3J0IHRoZSBrZXkuXG4gICAgLy8gVW5mb3J0dW5hdGVseSBFbGxpcHRpY2FsIEN1cnZlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgV2ViY3J5cHRvLiBTbyB3ZSBoYXZlIHRvIHNldHRsZSBmb3IgUlNBLlxuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMua2NDcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KFxuICAgICAge1xuICAgICAgICBuYW1lOiAnUlNBLU9BRVAnLFxuICAgICAgICBtb2R1bHVzTGVuZ3RoOiAyMDQ4LCAvLyBjYW4gYmUgMTAyNCwgMjA0OCwgMzA3MiwgNDA5NiAuLi4gMTYzODRcbiAgICAgICAgLy8gQXMgcGVyIHN1Z2dlc3Rpb246IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Sc2FIYXNoZWRLZXlHZW5QYXJhbXNcbiAgICAgICAgcHVibGljRXhwb25lbnQ6IG5ldyBVaW50OEFycmF5KFsweDAxLCAweDAwLCAweDAxXSksXG4gICAgICAgIGhhc2g6IHsgbmFtZTogJ1NIQS0yNTYnIH0sIC8vIGNhbiBiZSBcIlNIQS0xXCIsIFwiU0hBLTI1NlwiLCBcIlNIQS0zODRcIiwgb3IgXCJTSEEtNTEyXCJcbiAgICAgIH0sXG4gICAgICB0cnVlLCAvLyB3aGV0aGVyIHRoZSBrZXkgaXMgZXh0cmFjdGFibGUgKGkuZS4gY2FuIGJlIHVzZWQgaW4gZXhwb3J0S2V5KVxuICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSAvLyBtdXN0IGJlIFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCJdIG9yIFtcIndyYXBLZXlcIiwgXCJ1bndyYXBLZXlcIl1cbiAgICApO1xuXG4gICAgY29uc3QgandrID0gYXdhaXQgdGhpcy5rY0NyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdqd2snLCBrZXkucHJpdmF0ZUtleSk7XG4gICAgLy8gUmVtb3ZpbmcgdGhlIGZpZWxkcyBub3QgbmVlZGVkIGJ5IG5vZGUtam9zZVxuICAgIGRlbGV0ZSBqd2sua2V5X29wcztcbiAgICBkZWxldGUgandrLmV4dDtcblxuICAgIHJldHVybiBLZXlGYWN0b3J5U2VydmljZS5hc0tleShqd2spO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUGtjU2lnbktleSgpOiBQcm9taXNlPEpXSy5LZXk+IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmtjQ3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1JTQVNTQS1QS0NTMS12MV81JyxcbiAgICAgICAgbW9kdWx1c0xlbmd0aDogMjA0OCwgLy8gY2FuIGJlIDEwMjQsIDIwNDgsIG9yIDQwOTZcbiAgICAgICAgLy8gQXMgcGVyIHN1Z2dlc3Rpb246IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Sc2FIYXNoZWRLZXlHZW5QYXJhbXNcbiAgICAgICAgcHVibGljRXhwb25lbnQ6IG5ldyBVaW50OEFycmF5KFsweDAxLCAweDAwLCAweDAxXSksXG4gICAgICAgIGhhc2g6IHsgbmFtZTogJ1NIQS0yNTYnIH0sIC8vIGNhbiBiZSBcIlNIQS0xXCIsIFwiU0hBLTI1NlwiLCBcIlNIQS0zODRcIiwgb3IgXCJTSEEtNTEyXCJcbiAgICAgIH0sXG4gICAgICB0cnVlLCAvLyB3aGV0aGVyIHRoZSBrZXkgaXMgZXh0cmFjdGFibGUgKGkuZS4gY2FuIGJlIHVzZWQgaW4gZXhwb3J0S2V5KVxuICAgICAgWydzaWduJywgJ3ZlcmlmeSddIC8vIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgXCJzaWduXCIgYW5kIFwidmVyaWZ5XCJcbiAgICApO1xuXG4gICAgY29uc3QgandrID0gYXdhaXQgdGhpcy5rY0NyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdqd2snLCBrZXkucHJpdmF0ZUtleSk7XG5cbiAgICAvLyBSZW1vdmluZyB0aGUgZmllbGRzIG5vdCBuZWVkZWQgYnkgbm9kZS1qb3NlXG4gICAgZGVsZXRlIGp3ay5rZXlfb3BzO1xuICAgIGRlbGV0ZSBqd2suZXh0O1xuXG4gICAgcmV0dXJuIEtleUZhY3RvcnlTZXJ2aWNlLmFzS2V5KGp3ayk7XG4gIH1cblxuICBhc3luYyBpbXBvcnRQYXNzd29yZChwbGFpblBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPENyeXB0b0tleT4ge1xuICAgIGNvbnN0IGVuYyA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIHJldHVybiB0aGlzLmtjQ3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICAncmF3JyxcbiAgICAgIGVuYy5lbmNvZGUocGxhaW5QYXNzd29yZCksXG4gICAgICAnUEJLREYyJyxcbiAgICAgIGZhbHNlLFxuICAgICAgWydkZXJpdmVLZXknXVxuICAgICk7XG4gIH1cblxuICBhc3luYyBkZXJpdmVLZXkoe1xuICAgIHBhc3N3b3JkLFxuICAgIHNhbHQsXG4gICAgaXRlcmF0aW9ucyxcbiAgICBraWQsXG4gIH06IHtcbiAgICBwYXNzd29yZDogQ3J5cHRvS2V5O1xuICAgIHNhbHQ6IHN0cmluZztcbiAgICBpdGVyYXRpb25zOiBudW1iZXI7XG4gICAga2lkPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxEZXJpdmVLZXlSZXN1bHQ+IHtcbiAgICBjb25zdCBwYXNzS2V5ID0gYXdhaXQgdGhpcy5rY0NyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KFxuICAgICAge1xuICAgICAgICBuYW1lOiAnUEJLREYyJyxcbiAgICAgICAgc2FsdDogbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHNhbHQpLFxuICAgICAgICBpdGVyYXRpb25zLFxuICAgICAgICBoYXNoOiAnU0hBLTI1NicsXG4gICAgICB9LFxuICAgICAgcGFzc3dvcmQsXG4gICAgICB7IG5hbWU6ICdBRVMtR0NNJywgbGVuZ3RoOiAyNTYgfSxcbiAgICAgIHRydWUsXG4gICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddXG4gICAgKTtcblxuICAgIGNvbnN0IHBhc3NLZXlKc29uOiBKU09OT2JqZWN0ID0gYXdhaXQgdGhpcy5rY0NyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KFxuICAgICAgJ2p3aycsXG4gICAgICBwYXNzS2V5XG4gICAgKTtcbiAgICBpZiAoa2lkKSB7XG4gICAgICBwYXNzS2V5SnNvbi5raWQgPSBraWQ7XG4gICAgfVxuXG4gICAgY29uc3QgandrID0gYXdhaXQgS2V5RmFjdG9yeVNlcnZpY2UuYXNLZXkocGFzc0tleUpzb24pO1xuXG4gICAgcmV0dXJuIHsgandrIH07XG4gIH1cblxuICBhc3luYyBkZXJpdmVQYXNzSWRwKHBhcmFtczogRGVyaXZlUGFzc0lkcFBhcmFtcyk6IFByb21pc2U8RGVyaXZlS2V5UmVzdWx0PiB7XG4gICAgaWYgKHBhcmFtcy5pdGVyYXRpb25zIDwgdGhpcy5NSU5fUEFTU19JRFBfUEJLREZfSVRFUikge1xuICAgICAgdGhyb3cgbmV3IEtjU3VzcGljaW91c09wZXJhdGlvbkV4Y2VwdGlvbihcbiAgICAgICAgYFRoZSBudW1iZXIgb2YgUGFzc0lkcCBrZXkgZGVyaXZhdGlvbiBpdGVyYXRpb25zIHNlbnQgZnJvbSB0aGUgc2VydmVyICgke3BhcmFtcy5pdGVyYXRpb25zfSkgaXMgbG93ZXIgdGhhbiB0aGUgbWluaW11bSAoJHt0aGlzLk1JTl9QQVNTX0lEUF9QQktERl9JVEVSfSlgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kZXJpdmVLZXkocGFyYW1zKTtcbiAgfVxuXG4gIGFzeW5jIGRlcml2ZVBhc3NLZXkocGFyYW1zOiBEZXJpdmVQYXNzS2V5UGFyYW1zKTogUHJvbWlzZTxEZXJpdmVLZXlSZXN1bHQ+IHtcbiAgICBpZiAocGFyYW1zLml0ZXJhdGlvbnMgPCB0aGlzLk1JTl9QQVNTX0tFWV9QQktERl9JVEVSKSB7XG4gICAgICB0aHJvdyBuZXcgS2NTdXNwaWNpb3VzT3BlcmF0aW9uRXhjZXB0aW9uKFxuICAgICAgICBgVGhlIG51bWJlciBvZiBQYXNzS2V5IGtleSBkZXJpdmF0aW9uIGl0ZXJhdGlvbnMgc2VudCBmcm9tIHRoZSBzZXJ2ZXIoJHtwYXJhbXMuaXRlcmF0aW9uc30pIGlzIGxvd2VyIHRoYW4gdGhlIG1pbmltdW0oJHt0aGlzLk1JTl9QQVNTX0tFWV9QQktERl9JVEVSfSlgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kZXJpdmVLZXkocGFyYW1zKTtcbiAgfVxuXG4gIGFzeW5jIGRlcml2ZUxib3BLZXkocGFyYW1zOiBEZXJpdmVMYm9wS2V5UGFyYW1zKTogUHJvbWlzZTxEZXJpdmVLZXlSZXN1bHQ+IHtcbiAgICBpZiAocGFyYW1zLml0ZXJhdGlvbnMgPCB0aGlzLk1JTl9MQk9QX0tFWV9QQktERl9JVEVSKSB7XG4gICAgICB0aHJvdyBuZXcgS2NTdXNwaWNpb3VzT3BlcmF0aW9uRXhjZXB0aW9uKFxuICAgICAgICBgVGhlIG51bWJlciBvZiBMYm9wS2V5IGtleSBkZXJpdmF0aW9uIGl0ZXJhdGlvbnMgc2VudCBmcm9tIHRoZSBzZXJ2ZXIoJHtwYXJhbXMuaXRlcmF0aW9uc30pIGlzIGxvd2VyIHRoYW4gdGhlIG1pbmltdW0oJHt0aGlzLk1JTl9MQk9QX0tFWV9QQktERl9JVEVSfSlgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kZXJpdmVLZXkocGFyYW1zKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUtpZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIHRvZG86IEFaOiBub2RlLWpvc2Ugc291cmNlIHVzZXMgbm9kZSdzIGRlZmF1bHQgVVVJRCgpIGZ1bmN0aW9uIGZvciBraWQsIHNvIGp1c3QgY2hhbmdlIHRvIHVzZSB0aGF0LlxuICAgIC8vIGZvciBub3csIHdlIGFyZSBqdXN0IGNyZWF0aW5nIGEgbmV3IGtleSB0byB1c2UgaXQncyBraWQuXG4gICAgLy8gVGhlIGtpZCBpcyBhIHBhcnQgb2YgdGhlIEpXSyBzeXN0ZW0uIExSIGJhY2tlbmQgbWFpbnRhaW5zIHRoZSBrZXkgaGllcmFyY2h5IHNlcGFyYXRlbHkgd2l0aCBpdCdzIG93blxuICAgIC8vIGtleSBpZC4gQnV0IHdlIGp1c3QgdXNlIGl0IGhlcmUgYXMgYSBkb3VibGUgY2hlY2suXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmNyZWF0ZUtleSgpKS5raWQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQYXNzSWRwUGFyYW1zKCk6IFByb21pc2U8UGFzc0lkcFBhcmFtcz4ge1xuICAgIHJldHVybiB7XG4gICAgICBzYWx0OiB0aGlzLmNyZWF0ZVNhbHQoKSxcbiAgICAgIGl0ZXJhdGlvbnM6IHRoaXMuREVGQVVMVF9QQVNTX0lEUF9QQktERl9JVEVSLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVQYXNzS2V5UGFyYW1zKCk6IFByb21pc2U8UGFzc0tleVBhcmFtcz4ge1xuICAgIHJldHVybiB7XG4gICAgICBzYWx0OiB0aGlzLmNyZWF0ZVNhbHQoKSxcbiAgICAgIGtpZDogYXdhaXQgdGhpcy5jcmVhdGVLaWQoKSxcbiAgICAgIGl0ZXJhdGlvbnM6IHRoaXMuREVGQVVMVF9QQVNTX0tFWV9QQktERl9JVEVSLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVMYm9wS2V5UGFyYW1zKCk6IFByb21pc2U8TGJvcEtleVBhcmFtcz4ge1xuICAgIHJldHVybiB7XG4gICAgICBzYWx0OiB0aGlzLmNyZWF0ZVNhbHQoKSxcbiAgICAgIC8vIHRvZG86IEFaOiBub2RlLWpvc2Ugc291cmNlIHVzZXMgbm9kZSdzIGRlZmF1bHQgVVVJRCgpIGZ1bmN0aW9uIGZvciBraWQsIHNvIGp1c3QgY2hhbmdlIHRvIHVzZSB0aGF0LlxuICAgICAgLy8gZm9yIG5vdywgd2UgYXJlIGp1c3QgY3JlYXRpbmcgYSBuZXcga2V5IHRvIHVzZSBpdCdzIGtpZC5cbiAgICAgIC8vIFRoZSBraWQgaXMgYSBwYXJ0IG9mIHRoZSBKV0sgc3lzdGVtLiBMUiBiYWNrZW5kIG1haW50YWlucyB0aGUga2V5IGhpZXJhcmNoeSBzZXBhcmF0ZWx5IHdpdGggaXQncyBvd25cbiAgICAgIC8vIGtleSBpZC4gQnV0IHdlIGp1c3QgdXNlIGl0IGhlcmUgYXMgYSBkb3VibGUgY2hlY2suXG4gICAgICBraWQ6IGF3YWl0IHRoaXMuY3JlYXRlS2lkKCksXG4gICAgICBpdGVyYXRpb25zOiB0aGlzLkRFRkFVTFRfUEFTU19LRVlfUEJLREZfSVRFUixcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
-
import { Injectable } from '@angular/core';
|
|
4
|
-
import graphlib, { Graph } from '@dagrejs/graphlib';
|
|
5
|
-
import { asJwk, EncryptionService, isSymmetricKey, } from '../encryption/encryption.service';
|
|
6
|
-
import { lodash } from '../_common';
|
|
7
|
-
import { KcBadArgumentException, KcBadLogicException, KcBadStateException, KcEncryptionException, KcNotFoundException, } from '../_common/exceptions';
|
|
8
|
-
import { KeyFactoryService, KeyFactoryService as KFS, } from './key-factory.service';
|
|
9
|
-
import { KeyService } from './key.service';
|
|
10
|
-
import { KeyGraphEdgeType, KeyGraphNodeType, PayloadType, } from './key.types';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "../encryption/encryption.service";
|
|
13
|
-
import * as i2 from "./key.service";
|
|
14
|
-
import * as i3 from "./key-factory.service";
|
|
15
|
-
export class KeyGraphService {
|
|
16
|
-
// private keyCache: {
|
|
17
|
-
// [id: string]: Key;
|
|
18
|
-
// };
|
|
19
|
-
constructor(encryptionService, keyService, keyFactory) {
|
|
20
|
-
this.encryptionService = encryptionService;
|
|
21
|
-
this.keyService = keyService;
|
|
22
|
-
this.keyFactory = keyFactory;
|
|
23
|
-
this.purgeKeys();
|
|
24
|
-
}
|
|
25
|
-
purgeKeys() {
|
|
26
|
-
this.graph = new Graph();
|
|
27
|
-
// this.keyCache = null;
|
|
28
|
-
}
|
|
29
|
-
populateKeys(userKey) {
|
|
30
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
-
this.keyService.setKeys({
|
|
32
|
-
passKey: userKey.passKey,
|
|
33
|
-
masterKey: yield this.keyService.loadMasterKey(userKey.masterKey.id),
|
|
34
|
-
rootKey: yield this.unwrapKey(userKey.masterKey.id, userKey.rootKey.id),
|
|
35
|
-
pxk: yield this.unwrapKey(userKey.masterKey.id, userKey.pxk.id),
|
|
36
|
-
sigPxk: yield this.unwrapKey(userKey.masterKey.id, userKey.sigPxk.id),
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
hasKey(keyId) {
|
|
41
|
-
return !!this.graph.node(keyId);
|
|
42
|
-
}
|
|
43
|
-
getNode(id, type) {
|
|
44
|
-
const node = this.graph.node(id);
|
|
45
|
-
if (!node) {
|
|
46
|
-
throw new KcNotFoundException(`Key graphs does not contain key id: ${id}`);
|
|
47
|
-
}
|
|
48
|
-
if (node.type !== type) {
|
|
49
|
-
throw new KcBadStateException(`Key with id ${id} is not of type ${type}`);
|
|
50
|
-
}
|
|
51
|
-
return node.data;
|
|
52
|
-
}
|
|
53
|
-
key(id) {
|
|
54
|
-
return this.getNode(id, KeyGraphNodeType.Key);
|
|
55
|
-
}
|
|
56
|
-
passKey(id) {
|
|
57
|
-
return this.getNode(id, KeyGraphNodeType.PassKey);
|
|
58
|
-
}
|
|
59
|
-
addKeys(src) {
|
|
60
|
-
// Keys
|
|
61
|
-
if (src.keys) {
|
|
62
|
-
// What key graph returns can not be customized. So keys are essentially immutable.
|
|
63
|
-
// Therefore, if a key exists, there's no reason to update it.
|
|
64
|
-
for (const key of src.keys) {
|
|
65
|
-
// Note using Relay global id allows us to not worry about clashing node id
|
|
66
|
-
if (this.graph.hasNode(key.id)) {
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
const node = {
|
|
70
|
-
type: KeyGraphNodeType.Key,
|
|
71
|
-
data: lodash.cloneDeep(key),
|
|
72
|
-
};
|
|
73
|
-
this.graph.setNode(key.id, node);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// KeyLinks
|
|
77
|
-
if (src.keyLinks) {
|
|
78
|
-
for (const keyLink of src.keyLinks) {
|
|
79
|
-
if (this.graph.hasEdge(keyLink.wrappingKeyId, keyLink.keyId)) {
|
|
80
|
-
continue;
|
|
81
|
-
}
|
|
82
|
-
const edge = {
|
|
83
|
-
type: KeyGraphEdgeType.KeyLink,
|
|
84
|
-
data: lodash.cloneDeep(keyLink),
|
|
85
|
-
};
|
|
86
|
-
// Edge goes from wrapping key to wrapped key.
|
|
87
|
-
this.graph.setEdge(keyLink.wrappingKeyId, keyLink.keyId, edge);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
// PassKeyLinks
|
|
91
|
-
if (src.passKeyLinks) {
|
|
92
|
-
for (const passKeyLink of src.passKeyLinks) {
|
|
93
|
-
if (this.graph.hasEdge(passKeyLink.passKeyId, passKeyLink.keyId)) {
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
const edge = {
|
|
97
|
-
type: KeyGraphEdgeType.PassKeyLink,
|
|
98
|
-
data: lodash.cloneDeep(passKeyLink),
|
|
99
|
-
};
|
|
100
|
-
// Edge goes from wrapping key to wrapped key.
|
|
101
|
-
this.graph.setEdge(passKeyLink.passKeyId, passKeyLink.keyId, edge);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
// The graph is the single source of truth. These are lazily calculated.
|
|
105
|
-
// this.keyCache = null;
|
|
106
|
-
}
|
|
107
|
-
tracePath(distances, keyId) {
|
|
108
|
-
// The node label is the same as the id of the key nodes.
|
|
109
|
-
const ret = [];
|
|
110
|
-
let node = keyId;
|
|
111
|
-
if (!distances[node].predecessor) {
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
while (distances[node].predecessor) {
|
|
115
|
-
const child = distances[node].predecessor;
|
|
116
|
-
ret.push(this.graph.edge(child, node));
|
|
117
|
-
node = child;
|
|
118
|
-
}
|
|
119
|
-
// After reverse, the first element is the passkey
|
|
120
|
-
ret.reverse();
|
|
121
|
-
return ret;
|
|
122
|
-
}
|
|
123
|
-
getPath(knownKeyId, keyId) {
|
|
124
|
-
if (!knownKeyId || typeof knownKeyId !== 'string') {
|
|
125
|
-
throw new KcEncryptionException(`Param knownKeyId wrong format: ${knownKeyId}`);
|
|
126
|
-
}
|
|
127
|
-
if (!keyId || typeof keyId !== 'string') {
|
|
128
|
-
throw new KcEncryptionException(`Param keyId wrong format: ${keyId}`);
|
|
129
|
-
}
|
|
130
|
-
// => { A: { distance: 0 },
|
|
131
|
-
// B: { distance: 6, predecessor: 'C' },
|
|
132
|
-
// C: { distance: 4, predecessor: 'A' },
|
|
133
|
-
// D: { distance: 2, predecessor: 'A' },
|
|
134
|
-
// E: { distance: 8, predecessor: 'F' },
|
|
135
|
-
// F: { distance: 4, predecessor: 'D' } }
|
|
136
|
-
const distances = graphlib.alg.dijkstra(this.graph, knownKeyId);
|
|
137
|
-
// Trace path from keyId to knownKeyId
|
|
138
|
-
return this.tracePath(distances, keyId);
|
|
139
|
-
}
|
|
140
|
-
getJwkKey(keyOrId, getKeyIdCallback) {
|
|
141
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
142
|
-
return (yield this.getKey(keyOrId, getKeyIdCallback)).jwk;
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
// We assume that when a keyId is fetched, the key graph
|
|
146
|
-
// for the key is also returned and merged into the client-side
|
|
147
|
-
// key graph. By insisting a keyId is returned instead of the
|
|
148
|
-
// actual key we ensure key-graph is consistent.
|
|
149
|
-
getKey(keyOrId, getKeyIdCallback) {
|
|
150
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
151
|
-
let keyId = typeof keyOrId === 'string' ? keyOrId : keyOrId === null || keyOrId === void 0 ? void 0 : keyOrId.id;
|
|
152
|
-
if (!this.hasKey(keyId) && getKeyIdCallback) {
|
|
153
|
-
const keyIdFromCallback = yield getKeyIdCallback();
|
|
154
|
-
if (keyId != null && keyId != keyIdFromCallback) {
|
|
155
|
-
throw new KcBadLogicException('Requested keyId is not in the key cache, so an API request was made to populate the key cache.' +
|
|
156
|
-
'But the key returned by the API does NOT match the requested keyId.' +
|
|
157
|
-
'This is a programming logic error.');
|
|
158
|
-
}
|
|
159
|
-
keyId = keyIdFromCallback;
|
|
160
|
-
}
|
|
161
|
-
// else, continue and let it fail.
|
|
162
|
-
const key = this.key(keyId);
|
|
163
|
-
if (key.jwk) {
|
|
164
|
-
return key;
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
return this.unwrapKey(this.keyService.currentMasterKey.id, keyId);
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
_unwrapLink(wrappingKey, link, dstKey) {
|
|
172
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
173
|
-
const wrappedKey = JSON.parse(link.data.wrappedKey);
|
|
174
|
-
// Signatures of keys contain the key itself. This way we only need
|
|
175
|
-
// to access the KeyLinks to decrypt/verify keys.
|
|
176
|
-
let nextRawKey;
|
|
177
|
-
if (wrappedKey.signatures) {
|
|
178
|
-
nextRawKey = yield this.encryptionService.verify(wrappingKey, wrappedKey);
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
nextRawKey = yield this.encryptionService.decrypt(wrappingKey, wrappedKey);
|
|
182
|
-
}
|
|
183
|
-
// Handle nested keys. i.e. Enc{K1}{K2}{K3}(raw key 4), where:
|
|
184
|
-
// K1: link.wrappingKey
|
|
185
|
-
// K2: link.nestedWrappingKey[0]
|
|
186
|
-
// K3: link.nestedWrappingKey[1]
|
|
187
|
-
if (link.type == KeyGraphEdgeType.KeyLink) {
|
|
188
|
-
const data = link.data;
|
|
189
|
-
if (data.nestedWrappingKeyIds) {
|
|
190
|
-
for (const nestedWrappingKeyId of data.nestedWrappingKeyIds) {
|
|
191
|
-
const key = yield this.getKey(nestedWrappingKeyId);
|
|
192
|
-
nextRawKey = yield this.encryptionService.decrypt(key.jwk, nextRawKey);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
dstKey.jwk = yield KFS.asKey(nextRawKey);
|
|
197
|
-
dstKey.task = null;
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
_unwrap(key, path) {
|
|
201
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
202
|
-
for (const link of path) {
|
|
203
|
-
const dstKey = this.key(link.data.keyId);
|
|
204
|
-
if (dstKey.jwk) {
|
|
205
|
-
key = dstKey.jwk;
|
|
206
|
-
continue;
|
|
207
|
-
}
|
|
208
|
-
if (!dstKey.task) {
|
|
209
|
-
dstKey.task = this._unwrapLink(key, link, dstKey);
|
|
210
|
-
}
|
|
211
|
-
yield dstKey.task;
|
|
212
|
-
key = dstKey.jwk;
|
|
213
|
-
}
|
|
214
|
-
return key;
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
unwrapWithPassKey(passKeyId, passKey, keyId) {
|
|
218
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
219
|
-
// Get path of the directory key.
|
|
220
|
-
const path = this.getPath(passKeyId, keyId);
|
|
221
|
-
return {
|
|
222
|
-
id: keyId,
|
|
223
|
-
jwk: yield this._unwrap(passKey, path),
|
|
224
|
-
};
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
unwrapKey(masterKeyId, keyId) {
|
|
228
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
229
|
-
// The first key should be a masterKey
|
|
230
|
-
const masterKey = yield this.keyService.loadMasterKey(masterKeyId);
|
|
231
|
-
if (masterKeyId === keyId) {
|
|
232
|
-
return masterKey;
|
|
233
|
-
}
|
|
234
|
-
// Get path of the directory key.
|
|
235
|
-
const path = this.getPath(masterKey.id, keyId);
|
|
236
|
-
return {
|
|
237
|
-
id: keyId,
|
|
238
|
-
jwk: yield this._unwrap(masterKey.jwk, path),
|
|
239
|
-
};
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
decryptFromString(keyOrId, cipherData, options) {
|
|
243
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
244
|
-
if (cipherData) {
|
|
245
|
-
const key = yield this.getJwkKey(keyOrId);
|
|
246
|
-
return (yield this.encryptionService.decrypt(key, JSON.parse(cipherData), options));
|
|
247
|
-
}
|
|
248
|
-
return null;
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
decryptFile(keyId, file) {
|
|
252
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
253
|
-
const key = yield this.getJwkKey(keyId);
|
|
254
|
-
return (yield this.encryptionService.decrypt(key, file, {
|
|
255
|
-
payloadType: PayloadType.UINT_8_ARRAY,
|
|
256
|
-
}));
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
// TODO rename this to encrypt() and use as the most common usecase
|
|
260
|
-
encryptToString(key, content) {
|
|
261
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
262
|
-
// Empty string should be encrypted since you want to clear the field.
|
|
263
|
-
// Null is not encrypted because it's not valid JSON in the old JSON spec. Use
|
|
264
|
-
// empty string instead. It'll function as a logic false as well.
|
|
265
|
-
// Note that passing in empty string means it'll be encrypted which verifies
|
|
266
|
-
// it's integrity. But we still want to have a way to set the DB field
|
|
267
|
-
// to NULL, so we explicitly return null when content == null. A null
|
|
268
|
-
// variable in graphql mutation on KC server clears the field to NULL.
|
|
269
|
-
if (content == null) {
|
|
270
|
-
return null;
|
|
271
|
-
}
|
|
272
|
-
const jwk = asJwk(key) || (yield this.getJwkKey(key));
|
|
273
|
-
return this.encryptionService.encryptToString(jwk, content);
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
// Wraps a symmetric encryption key.
|
|
277
|
-
// Throws exception if wrapping public keys.
|
|
278
|
-
wrapKey(wrappingKey, key) {
|
|
279
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
280
|
-
if (!isSymmetricKey(key)) {
|
|
281
|
-
throw new KcBadArgumentException('Only allowing wrapping of symmetric keys.');
|
|
282
|
-
}
|
|
283
|
-
return this.encryptToString(wrappingKey, key.toJSON(true));
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
// TODO
|
|
287
|
-
// async wrapPublicKey<T>();
|
|
288
|
-
// async wrapPrivateKey<T>();
|
|
289
|
-
encryptWithNewKey(wrappingKeyId, cipherClearJson) {
|
|
290
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
291
|
-
const key = yield this.keyFactory.createKey();
|
|
292
|
-
const wrappedKey = yield this.encryptToString(wrappingKeyId, key.toJSON(true));
|
|
293
|
-
const cipher = yield this.encryptToString(key, cipherClearJson);
|
|
294
|
-
return {
|
|
295
|
-
key,
|
|
296
|
-
wrappingKeyId,
|
|
297
|
-
wrappedKey,
|
|
298
|
-
cipher,
|
|
299
|
-
};
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
KeyGraphService.ɵprov = i0.ɵɵdefineInjectable({ factory: function KeyGraphService_Factory() { return new KeyGraphService(i0.ɵɵinject(i1.EncryptionService), i0.ɵɵinject(i2.KeyService), i0.ɵɵinject(i3.KeyFactoryService)); }, token: KeyGraphService, providedIn: "root" });
|
|
304
|
-
KeyGraphService.decorators = [
|
|
305
|
-
{ type: Injectable, args: [{
|
|
306
|
-
providedIn: 'root',
|
|
307
|
-
},] }
|
|
308
|
-
];
|
|
309
|
-
KeyGraphService.ctorParameters = () => [
|
|
310
|
-
{ type: EncryptionService },
|
|
311
|
-
{ type: KeyService },
|
|
312
|
-
{ type: KeyFactoryService }
|
|
313
|
-
];
|
|
314
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWdyYXBoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIva2V5L2tleS1ncmFwaC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR3BELE9BQU8sRUFDTCxLQUFLLEVBRUwsaUJBQWlCLEVBQ2pCLGNBQWMsR0FDZixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixtQkFBbUIsR0FDcEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGlCQUFpQixJQUFJLEdBQUcsR0FDekIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFHTCxnQkFBZ0IsRUFFaEIsZ0JBQWdCLEVBSWhCLFdBQVcsR0FDWixNQUFNLGFBQWEsQ0FBQzs7Ozs7QUFTckIsTUFBTSxPQUFPLGVBQWU7SUFFMUIsc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixLQUFLO0lBRUwsWUFDVSxpQkFBb0MsRUFDcEMsVUFBc0IsRUFDdEIsVUFBNkI7UUFGN0Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBRXJDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUks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QUFPLENBQUMsQ0FBQztRQUM5RCxDQUFDO0tBQUE7SUFFRCxvQ0FBb0M7SUFDcEMsNENBQTRDO0lBQ3RDLE9BQU8sQ0FDWCxXQUFtQyxFQUNuQyxHQUFZOztZQUVaLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3hCLE1BQU0sSUFBSSxzQkFBc0IsQ0FDOUIsMkNBQTJDLENBQzVDLENBQUM7YUFDSDtZQUVELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7S0FBQTtJQUVELE9BQU87SUFDUCw0QkFBNEI7SUFDNUIsNkJBQTZCO0lBRXZCLGlCQUFpQixDQUFDLGFBQXFCLEVBQUUsZUFBMkI7O1lBQ3hFLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5QyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQzNDLGFBQWEsRUFDYixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUNqQixDQUFDO1lBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUVoRSxPQUFPO2dCQUNMLEdBQUc7Z0JBQ0gsYUFBYTtnQkFDYixVQUFVO2dCQUNWLE1BQU07YUFDUCxDQUFDO1FBQ0osQ0FBQztLQUFBOzs7O1lBeldGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBbENDLGlCQUFpQjtZQWVWLFVBQVU7WUFIakIsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IGdyYXBobGliLCB7IEdyYXBoIH0gZnJvbSAnQGRhZ3JlanMvZ3JhcGhsaWInO1xuaW1wb3J0IHsgSldLIH0gZnJvbSAnbm9kZS1qb3NlJztcbmltcG9ydCB7IEpTT05PYmplY3QgfSBmcm9tICcuLi9hcGkvdHlwZXMnO1xuaW1wb3J0IHtcbiAgYXNKd2ssXG4gIERlY3J5cHRPcHRpb25zLFxuICBFbmNyeXB0aW9uU2VydmljZSxcbiAgaXNTeW1tZXRyaWNLZXksXG59IGZyb20gJy4uL2VuY3J5cHRpb24vZW5jcnlwdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGxvZGFzaCB9IGZyb20gJy4uL19jb21tb24nO1xuaW1wb3J0IHtcbiAgS2NCYWRBcmd1bWVudEV4Y2VwdGlvbixcbiAgS2NCYWRMb2dpY0V4Y2VwdGlvbixcbiAgS2NCYWRTdGF0ZUV4Y2VwdGlvbixcbiAgS2NFbmNyeXB0aW9uRXhjZXB0aW9uLFxuICBLY05vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tICcuLi9fY29tbW9uL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtcbiAgS2V5RmFjdG9yeVNlcnZpY2UsXG4gIEtleUZhY3RvcnlTZXJ2aWNlIGFzIEtGUyxcbn0gZnJvbSAnLi9rZXktZmFjdG9yeS5zZXJ2aWNlJztcbmltcG9ydCB7IEtleVNlcnZpY2UsIFVzZXJLZXlzIH0gZnJvbSAnLi9rZXkuc2VydmljZSc7XG5pbXBvcnQge1xuICBLZXksXG4gIEtleUdyYXBoRWRnZSxcbiAgS2V5R3JhcGhFZGdlVHlwZSxcbiAgS2V5R3JhcGhOb2RlLFxuICBLZXlHcmFwaE5vZGVUeXBlLFxuICBLZXlHcmFwaFJlc3BvbnNlLFxuICBLZXlMaW5rLFxuICBQYXNzS2V5LFxuICBQYXlsb2FkVHlwZSxcbn0gZnJvbSAnLi9rZXkudHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyYXBoS2V5IGV4dGVuZHMgS2V5IHtcbiAgdGFzaz86IFByb21pc2U8YW55Pjtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEtleUdyYXBoU2VydmljZSB7XG4gIHByaXZhdGUgZ3JhcGg6IEdyYXBoO1xuICAvLyBwcml2YXRlIGtleUNhY2hlOiB7XG4gIC8vICAgW2lkOiBzdHJpbmddOiBLZXk7XG4gIC8vIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbmNyeXB0aW9uU2VydmljZTogRW5jcnlwdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuICAgIHByaXZhdGUga2V5RmFjdG9yeTogS2V5RmFjdG9yeVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5wdXJnZUtleXMoKTtcbiAgfVxuXG4gIHB1cmdlS2V5cygpIHtcbiAgICB0aGlzLmdyYXBoID0gbmV3IEdyYXBoKCk7XG4gICAgLy8gdGhpcy5rZXlDYWNoZSA9IG51bGw7XG4gIH1cblxuICBhc3luYyBwb3B1bGF0ZUtleXModXNlcktleTogVXNlcktleXMpIHtcbiAgICB0aGlzLmtleVNlcnZpY2Uuc2V0S2V5cyh7XG4gICAgICBwYXNzS2V5OiB1c2VyS2V5LnBhc3NLZXksXG4gICAgICBtYXN0ZXJLZXk6IGF3YWl0IHRoaXMua2V5U2VydmljZS5sb2FkTWFzdGVyS2V5KHVzZXJLZXkubWFzdGVyS2V5LmlkKSxcbiAgICAgIHJvb3RLZXk6IGF3YWl0IHRoaXMudW53cmFwS2V5KHVzZXJLZXkubWFzdGVyS2V5LmlkLCB1c2VyS2V5LnJvb3RLZXkuaWQpLFxuICAgICAgcHhrOiBhd2FpdCB0aGlzLnVud3JhcEtleSh1c2VyS2V5Lm1hc3RlcktleS5pZCwgdXNlcktleS5weGsuaWQpLFxuICAgICAgc2lnUHhrOiBhd2FpdCB0aGlzLnVud3JhcEtleSh1c2VyS2V5Lm1hc3RlcktleS5pZCwgdXNlcktleS5zaWdQeGsuaWQpLFxuICAgIH0pO1xuICB9XG5cbiAgaGFzS2V5KGtleUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gISF0aGlzLmdyYXBoLm5vZGUoa2V5SWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROb2RlKGlkLCB0eXBlKTogR3JhcGhLZXkgfCBQYXNzS2V5IHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5ncmFwaC5ub2RlKGlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHRocm93IG5ldyBLY05vdEZvdW5kRXhjZXB0aW9uKFxuICAgICAgICBgS2V5IGdyYXBocyBkb2VzIG5vdCBjb250YWluIGtleSBpZDogJHtpZH1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobm9kZS50eXBlICE9PSB0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgS2NCYWRTdGF0ZUV4Y2VwdGlvbihgS2V5IHdpdGggaWQgJHtpZH0gaXMgbm90IG9mIHR5cGUgJHt0eXBlfWApO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5kYXRhO1xuICB9XG5cbiAga2V5KGlkKTogR3JhcGhLZXkge1xuICAgIHJldHVybiB0aGlzLmdldE5vZGUoaWQsIEtleUdyYXBoTm9kZVR5cGUuS2V5KTtcbiAgfVxuXG4gIHBhc3NLZXkoaWQpOiBQYXNzS2V5IHtcbiAgICByZXR1cm4gdGhpcy5nZXROb2RlKGlkLCBLZXlHcmFwaE5vZGVUeXBlLlBhc3NLZXkpO1xuICB9XG5cbiAgYWRkS2V5cyhzcmM6IEtleUdyYXBoUmVzcG9uc2UpIHtcbiAgICAvLyBLZXlzXG4gICAgaWYgKHNyYy5rZXlzKSB7XG4gICAgICAvLyBXaGF0IGtleSBncmFwaCByZXR1cm5zIGNhbiBub3QgYmUgY3VzdG9taXplZC4gU28ga2V5cyBhcmUgZXNzZW50aWFsbHkgaW1tdXRhYmxlLlxuICAgICAgLy8gVGhlcmVmb3JlLCBpZiBhIGtleSBleGlzdHMsIHRoZXJlJ3Mgbm8gcmVhc29uIHRvIHVwZGF0ZSBpdC5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNyYy5rZXlzKSB7XG4gICAgICAgIC8vIE5vdGUgdXNpbmcgUmVsYXkgZ2xvYmFsIGlkIGFsbG93cyB1cyB0byBub3Qgd29ycnkgYWJvdXQgY2xhc2hpbmcgbm9kZSBpZFxuICAgICAgICBpZiAodGhpcy5ncmFwaC5oYXNOb2RlKGtleS5pZCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGU6IEtleUdyYXBoTm9kZSA9IHtcbiAgICAgICAgICB0eXBlOiBLZXlHcmFwaE5vZGVUeXBlLktleSxcbiAgICAgICAgICBkYXRhOiBsb2Rhc2guY2xvbmVEZWVwKGtleSksXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5ncmFwaC5zZXROb2RlKGtleS5pZCwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gS2V5TGlua3NcbiAgICBpZiAoc3JjLmtleUxpbmtzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleUxpbmsgb2Ygc3JjLmtleUxpbmtzKSB7XG4gICAgICAgIGlmICh0aGlzLmdyYXBoLmhhc0VkZ2Uoa2V5TGluay53cmFwcGluZ0tleUlkLCBrZXlMaW5rLmtleUlkKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWRnZTogS2V5R3JhcGhFZGdlID0ge1xuICAgICAgICAgIHR5cGU6IEtleUdyYXBoRWRnZVR5cGUuS2V5TGluayxcbiAgICAgICAgICBkYXRhOiBsb2Rhc2guY2xvbmVEZWVwKGtleUxpbmspLFxuICAgICAgICB9O1xuICAgICAgICAvLyBFZGdlIGdvZXMgZnJvbSB3cmFwcGluZyBrZXkgdG8gd3JhcHBlZCBrZXkuXG4gICAgICAgIHRoaXMuZ3JhcGguc2V0RWRnZShrZXlMaW5rLndyYXBwaW5nS2V5SWQsIGtleUxpbmsua2V5SWQsIGVkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBhc3NLZXlMaW5rc1xuICAgIGlmIChzcmMucGFzc0tleUxpbmtzKSB7XG4gICAgICBmb3IgKGNvbnN0IHBhc3NLZXlMaW5rIG9mIHNyYy5wYXNzS2V5TGlua3MpIHtcbiAgICAgICAgaWYgKHRoaXMuZ3JhcGguaGFzRWRnZShwYXNzS2V5TGluay5wYXNzS2V5SWQsIHBhc3NLZXlMaW5rLmtleUlkKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWRnZTogS2V5R3JhcGhFZGdlID0ge1xuICAgICAgICAgIHR5cGU6IEtleUdyYXBoRWRnZVR5cGUuUGFzc0tleUxpbmssXG4gICAgICAgICAgZGF0YTogbG9kYXNoLmNsb25lRGVlcChwYXNzS2V5TGluayksXG4gICAgICAgIH07XG4gICAgICAgIC8vIEVkZ2UgZ29lcyBmcm9tIHdyYXBwaW5nIGtleSB0byB3cmFwcGVkIGtleS5cbiAgICAgICAgdGhpcy5ncmFwaC5zZXRFZGdlKHBhc3NLZXlMaW5rLnBhc3NLZXlJZCwgcGFzc0tleUxpbmsua2V5SWQsIGVkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBncmFwaCBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC4gVGhlc2UgYXJlIGxhemlseSBjYWxjdWxhdGVkLlxuICAgIC8vIHRoaXMua2V5Q2FjaGUgPSBudWxsO1xuICB9XG5cbiAgdHJhY2VQYXRoKGRpc3RhbmNlcywga2V5SWQ6IHN0cmluZyk6IEtleUdyYXBoRWRnZVtdIHtcbiAgICAvLyBUaGUgbm9kZSBsYWJlbCBpcyB0aGUgc2FtZSBhcyB0aGUgaWQgb2YgdGhlIGtleSBub2Rlcy5cbiAgICBjb25zdCByZXQ6IEtleUdyYXBoRWRnZVtdID0gW107XG4gICAgbGV0IG5vZGUgPSBrZXlJZDtcbiAgICBpZiAoIWRpc3RhbmNlc1tub2RlXS5wcmVkZWNlc3Nvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKGRpc3RhbmNlc1tub2RlXS5wcmVkZWNlc3Nvcikge1xuICAgICAgY29uc3QgY2hpbGQgPSBkaXN0YW5jZXNbbm9kZV0ucHJlZGVjZXNzb3I7XG4gICAgICByZXQucHVzaCh0aGlzLmdyYXBoLmVkZ2UoY2hpbGQsIG5vZGUpKTtcbiAgICAgIG5vZGUgPSBjaGlsZDtcbiAgICB9XG5cbiAgICAvLyBBZnRlciByZXZlcnNlLCB0aGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgcGFzc2tleVxuICAgIHJldC5yZXZlcnNlKCk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgZ2V0UGF0aChrbm93bktleUlkOiBzdHJpbmcsIGtleUlkOiBzdHJpbmcpOiBLZXlHcmFwaEVkZ2VbXSB7XG4gICAgaWYgKCFrbm93bktleUlkIHx8IHR5cGVvZiBrbm93bktleUlkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEtjRW5jcnlwdGlvbkV4Y2VwdGlvbihcbiAgICAgICAgYFBhcmFtIGtub3duS2V5SWQgd3JvbmcgZm9ybWF0OiAke2tub3duS2V5SWR9YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFrZXlJZCB8fCB0eXBlb2Yga2V5SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgS2NFbmNyeXB0aW9uRXhjZXB0aW9uKGBQYXJhbSBrZXlJZCB3cm9uZyBmb3JtYXQ6ICR7a2V5SWR9YCk7XG4gICAgfVxuXG4gICAgLy8gPT4geyBBOiB7IGRpc3RhbmNlOiAwIH0sXG4gICAgLy8gICAgICBCOiB7IGRpc3RhbmNlOiA2LCBwcmVkZWNlc3NvcjogJ0MnIH0sXG4gICAgLy8gICAgICBDOiB7IGRpc3RhbmNlOiA0LCBwcmVkZWNlc3NvcjogJ0EnIH0sXG4gICAgLy8gICAgICBEOiB7IGRpc3RhbmNlOiAyLCBwcmVkZWNlc3NvcjogJ0EnIH0sXG4gICAgLy8gICAgICBFOiB7IGRpc3RhbmNlOiA4LCBwcmVkZWNlc3NvcjogJ0YnIH0sXG4gICAgLy8gICAgICBGOiB7IGRpc3RhbmNlOiA0LCBwcmVkZWNlc3NvcjogJ0QnIH0gfVxuICAgIGNvbnN0IGRpc3RhbmNlcyA9IGdyYXBobGliLmFsZy5kaWprc3RyYSh0aGlzLmdyYXBoLCBrbm93bktleUlkKTtcblxuICAgIC8vIFRyYWNlIHBhdGggZnJvbSBrZXlJZCB0byBrbm93bktleUlkXG4gICAgcmV0dXJuIHRoaXMudHJhY2VQYXRoKGRpc3RhbmNlcywga2V5SWQpO1xuICB9XG5cbiAgYXN5bmMgZ2V0SndrS2V5KFxuICAgIGtleU9ySWQ6IHN0cmluZyB8IEtleSxcbiAgICBnZXRLZXlJZENhbGxiYWNrPzogKCkgPT4gUHJvbWlzZTxzdHJpbmc+IHwgc3RyaW5nXG4gICk6IFByb21pc2U8SldLLktleT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRLZXkoa2V5T3JJZCwgZ2V0S2V5SWRDYWxsYmFjaykpLmp3aztcbiAgfVxuXG4gIC8vIFdlIGFzc3VtZSB0aGF0IHdoZW4gYSBrZXlJZCBpcyBmZXRjaGVkLCB0aGUga2V5IGdyYXBoXG4gIC8vIGZvciB0aGUga2V5IGlzIGFsc28gcmV0dXJuZWQgYW5kIG1lcmdlZCBpbnRvIHRoZSBjbGllbnQtc2lkZVxuICAvLyBrZXkgZ3JhcGguIEJ5IGluc2lzdGluZyBhIGtleUlkIGlzIHJldHVybmVkIGluc3RlYWQgb2YgdGhlXG4gIC8vIGFjdHVhbCBrZXkgd2UgZW5zdXJlIGtleS1ncmFwaCBpcyBjb25zaXN0ZW50LlxuICBhc3luYyBnZXRLZXkoXG4gICAga2V5T3JJZDogc3RyaW5nIHwgS2V5LFxuICAgIGdldEtleUlkQ2FsbGJhY2s/OiAoKSA9PiBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXk+IHtcbiAgICBsZXQga2V5SWQgPSB0eXBlb2Yga2V5T3JJZCA9PT0gJ3N0cmluZycgPyBrZXlPcklkIDoga2V5T3JJZD8uaWQ7XG5cbiAgICBpZiAoIXRoaXMuaGFzS2V5KGtleUlkKSAmJiBnZXRLZXlJZENhbGxiYWNrKSB7XG4gICAgICBjb25zdCBrZXlJZEZyb21DYWxsYmFjayA9IGF3YWl0IGdldEtleUlkQ2FsbGJhY2soKTtcblxuICAgICAgaWYgKGtleUlkICE9IG51bGwgJiYga2V5SWQgIT0ga2V5SWRGcm9tQ2FsbGJhY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEtjQmFkTG9naWNFeGNlcHRpb24oXG4gICAgICAgICAgJ1JlcXVlc3RlZCBrZXlJZCBpcyBub3QgaW4gdGhlIGtleSBjYWNoZSwgc28gYW4gQVBJIHJlcXVlc3Qgd2FzIG1hZGUgdG8gcG9wdWxhdGUgdGhlIGtleSBjYWNoZS4nICtcbiAgICAgICAgICAgICdCdXQgdGhlIGtleSByZXR1cm5lZCBieSB0aGUgQVBJIGRvZXMgTk9UIG1hdGNoIHRoZSByZXF1ZXN0ZWQga2V5SWQuJyArXG4gICAgICAgICAgICAnVGhpcyBpcyBhIHByb2dyYW1taW5nIGxvZ2ljIGVycm9yLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAga2V5SWQgPSBrZXlJZEZyb21DYWxsYmFjaztcbiAgICB9XG4gICAgLy8gZWxzZSwgY29udGludWUgYW5kIGxldCBpdCBmYWlsLlxuXG4gICAgY29uc3Qga2V5ID0gdGhpcy5rZXkoa2V5SWQpO1xuICAgIGlmIChrZXkuandrKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy51bndyYXBLZXkodGhpcy5rZXlTZXJ2aWNlLmN1cnJlbnRNYXN0ZXJLZXkuaWQsIGtleUlkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF91bndyYXBMaW5rKFxuICAgIHdyYXBwaW5nS2V5OiBKV0suS2V5LFxuICAgIGxpbms6IEtleUdyYXBoRWRnZSxcbiAgICBkc3RLZXk6IEdyYXBoS2V5XG4gICkge1xuICAgIGNvbnN0IHdyYXBwZWRLZXkgPSBKU09OLnBhcnNlKGxpbmsuZGF0YS53cmFwcGVkS2V5KTtcblxuICAgIC8vIFNpZ25hdHVyZXMgb2Yga2V5cyBjb250YWluIHRoZSBrZXkgaXRzZWxmLiBUaGlzIHdheSB3ZSBvbmx5IG5lZWRcbiAgICAvLyB0byBhY2Nlc3MgdGhlIEtleUxpbmtzIHRvIGRlY3J5cHQvdmVyaWZ5IGtleXMuXG4gICAgbGV0IG5leHRSYXdLZXk7XG4gICAgaWYgKHdyYXBwZWRLZXkuc2lnbmF0dXJlcykge1xuICAgICAgbmV4dFJhd0tleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UudmVyaWZ5KHdyYXBwaW5nS2V5LCB3cmFwcGVkS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dFJhd0tleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcbiAgICAgICAgd3JhcHBpbmdLZXksXG4gICAgICAgIHdyYXBwZWRLZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG5lc3RlZCBrZXlzLiBpLmUuIEVuY3tLMX17SzJ9e0szfShyYXcga2V5IDQpLCB3aGVyZTpcbiAgICAvLyAgIEsxOiBsaW5rLndyYXBwaW5nS2V5XG4gICAgLy8gICBLMjogbGluay5uZXN0ZWRXcmFwcGluZ0tleVswXVxuICAgIC8vICAgSzM6IGxpbmsubmVzdGVkV3JhcHBpbmdLZXlbMV1cbiAgICBpZiAobGluay50eXBlID09IEtleUdyYXBoRWRnZVR5cGUuS2V5TGluaykge1xuICAgICAgY29uc3QgZGF0YSA9IGxpbmsuZGF0YSBhcyBLZXlMaW5rO1xuICAgICAgaWYgKGRhdGEubmVzdGVkV3JhcHBpbmdLZXlJZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBuZXN0ZWRXcmFwcGluZ0tleUlkIG9mIGRhdGEubmVzdGVkV3JhcHBpbmdLZXlJZHMpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmdldEtleShuZXN0ZWRXcmFwcGluZ0tleUlkKTtcbiAgICAgICAgICBuZXh0UmF3S2V5ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KFxuICAgICAgICAgICAga2V5Lmp3ayxcbiAgICAgICAgICAgIG5leHRSYXdLZXlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZHN0S2V5Lmp3ayA9IGF3YWl0IEtGUy5hc0tleShuZXh0UmF3S2V5KTtcbiAgICBkc3RLZXkudGFzayA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF91bndyYXAoa2V5OiBKV0suS2V5LCBwYXRoOiBLZXlHcmFwaEVkZ2VbXSk6IFByb21pc2U8SldLLktleT4ge1xuICAgIGZvciAoY29uc3QgbGluayBvZiBwYXRoKSB7XG4gICAgICBjb25zdCBkc3RLZXkgPSB0aGlzLmtleShsaW5rLmRhdGEua2V5SWQpO1xuICAgICAgaWYgKGRzdEtleS5qd2spIHtcbiAgICAgICAga2V5ID0gZHN0S2V5Lmp3aztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghZHN0S2V5LnRhc2spIHtcbiAgICAgICAgZHN0S2V5LnRhc2sgPSB0aGlzLl91bndyYXBMaW5rKGtleSwgbGluaywgZHN0S2V5KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZHN0S2V5LnRhc2s7XG4gICAgICBrZXkgPSBkc3RLZXkuandrO1xuICAgIH1cblxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdW53cmFwV2l0aFBhc3NLZXkoXG4gICAgcGFzc0tleUlkOiBzdHJpbmcsXG4gICAgcGFzc0tleTogSldLLktleSxcbiAgICBrZXlJZDogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5PiB7XG4gICAgLy8gR2V0IHBhdGggb2YgdGhlIGRpcmVjdG9yeSBrZXkuXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuZ2V0UGF0aChwYXNzS2V5SWQsIGtleUlkKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDoga2V5SWQsXG4gICAgICBqd2s6IGF3YWl0IHRoaXMuX3Vud3JhcChwYXNzS2V5LCBwYXRoKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdW53cmFwS2V5KG1hc3RlcktleUlkOiBzdHJpbmcsIGtleUlkOiBzdHJpbmcpOiBQcm9taXNlPEtleT4ge1xuICAgIC8vIFRoZSBmaXJzdCBrZXkgc2hvdWxkIGJlIGEgbWFzdGVyS2V5XG4gICAgY29uc3QgbWFzdGVyS2V5ID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmxvYWRNYXN0ZXJLZXkobWFzdGVyS2V5SWQpO1xuXG4gICAgaWYgKG1hc3RlcktleUlkID09PSBrZXlJZCkge1xuICAgICAgcmV0dXJuIG1hc3RlcktleTtcbiAgICB9XG5cbiAgICAvLyBHZXQgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IGtleS5cbiAgICBjb25zdCBwYXRoID0gdGhpcy5nZXRQYXRoKG1hc3RlcktleS5pZCwga2V5SWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBrZXlJZCxcbiAgICAgIGp3azogYXdhaXQgdGhpcy5fdW53cmFwKG1hc3RlcktleS5qd2ssIHBhdGgpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWNyeXB0RnJvbVN0cmluZzxUPihcbiAgICBrZXlPcklkOiBzdHJpbmcgfCBLZXksXG4gICAgY2lwaGVyRGF0YTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBEZWNyeXB0T3B0aW9uc1xuICApOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoY2lwaGVyRGF0YSkge1xuICAgICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5nZXRKd2tLZXkoa2V5T3JJZCk7XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcbiAgICAgICAga2V5LFxuICAgICAgICBKU09OLnBhcnNlKGNpcGhlckRhdGEpLFxuICAgICAgICBvcHRpb25zXG4gICAgICApKSBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgZGVjcnlwdEZpbGUoa2V5SWQ6IHN0cmluZywgZmlsZTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmdldEp3a0tleShrZXlJZCk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoa2V5LCBmaWxlLCB7XG4gICAgICBwYXlsb2FkVHlwZTogUGF5bG9hZFR5cGUuVUlOVF84X0FSUkFZLFxuICAgIH0pKSBhcyBhbnk7XG4gIH1cblxuICAvLyBUT0RPIHJlbmFtZSB0aGlzIHRvIGVuY3J5cHQoKSBhbmQgdXNlIGFzIHRoZSBtb3N0IGNvbW1vbiB1c2VjYXNlXG4gIGFzeW5jIGVuY3J5cHRUb1N0cmluZyhcbiAgICBrZXk6IHN0cmluZyB8IEtleSB8IEpXSy5LZXksXG4gICAgY29udGVudDogYW55XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gRW1wdHkgc3RyaW5nIHNob3VsZCBiZSBlbmNyeXB0ZWQgc2luY2UgeW91IHdhbnQgdG8gY2xlYXIgdGhlIGZpZWxkLlxuICAgIC8vIE51bGwgaXMgbm90IGVuY3J5cHRlZCBiZWNhdXNlIGl0J3Mgbm90IHZhbGlkIEpTT04gaW4gdGhlIG9sZCBKU09OIHNwZWMuIFVzZVxuICAgIC8vIGVtcHR5IHN0cmluZyBpbnN0ZWFkLiBJdCdsbCBmdW5jdGlvbiBhcyBhIGxvZ2ljIGZhbHNlIGFzIHdlbGwuXG4gICAgLy8gTm90ZSB0aGF0IHBhc3NpbmcgaW4gZW1wdHkgc3RyaW5nIG1lYW5zIGl0J2xsIGJlIGVuY3J5cHRlZCB3aGljaCB2ZXJpZmllc1xuICAgIC8vIGl0J3MgaW50ZWdyaXR5LiBCdXQgd2Ugc3RpbGwgd2FudCB0byBoYXZlIGEgd2F5IHRvIHNldCB0aGUgREIgZmllbGRcbiAgICAvLyB0byBOVUxMLCBzbyB3ZSBleHBsaWNpdGx5IHJldHVybiBudWxsIHdoZW4gY29udGVudCA9PSBudWxsLiBBIG51bGxcbiAgICAvLyB2YXJpYWJsZSBpbiBncmFwaHFsIG11dGF0aW9uIG9uIEtDIHNlcnZlciBjbGVhcnMgdGhlIGZpZWxkIHRvIE5VTEwuXG4gICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgandrID0gYXNKd2soa2V5KSB8fCAoYXdhaXQgdGhpcy5nZXRKd2tLZXkoa2V5IGFzIHN0cmluZyB8IEtleSkpO1xuICAgIHJldHVybiB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhqd2ssIGNvbnRlbnQpO1xuICB9XG5cbiAgLy8gV3JhcHMgYSBzeW1tZXRyaWMgZW5jcnlwdGlvbiBrZXkuXG4gIC8vIFRocm93cyBleGNlcHRpb24gaWYgd3JhcHBpbmcgcHVibGljIGtleXMuXG4gIGFzeW5jIHdyYXBLZXkoXG4gICAgd3JhcHBpbmdLZXk6IHN0cmluZyB8IEtleSB8IEpXSy5LZXksXG4gICAga2V5OiBKV0suS2V5XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc1N5bW1ldHJpY0tleShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgS2NCYWRBcmd1bWVudEV4Y2VwdGlvbihcbiAgICAgICAgJ09ubHkgYWxsb3dpbmcgd3JhcHBpbmcgb2Ygc3ltbWV0cmljIGtleXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lbmNyeXB0VG9TdHJpbmcod3JhcHBpbmdLZXksIGtleS50b0pTT04odHJ1ZSkpO1xuICB9XG5cbiAgLy8gVE9ET1xuICAvLyBhc3luYyB3cmFwUHVibGljS2V5PFQ+KCk7XG4gIC8vIGFzeW5jIHdyYXBQcml2YXRlS2V5PFQ+KCk7XG5cbiAgYXN5bmMgZW5jcnlwdFdpdGhOZXdLZXkod3JhcHBpbmdLZXlJZDogc3RyaW5nLCBjaXBoZXJDbGVhckpzb246IEpTT05PYmplY3QpIHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XG4gICAgY29uc3Qgd3JhcHBlZEtleSA9IGF3YWl0IHRoaXMuZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgd3JhcHBpbmdLZXlJZCxcbiAgICAgIGtleS50b0pTT04odHJ1ZSlcbiAgICApO1xuICAgIGNvbnN0IGNpcGhlciA9IGF3YWl0IHRoaXMuZW5jcnlwdFRvU3RyaW5nKGtleSwgY2lwaGVyQ2xlYXJKc29uKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICB3cmFwcGluZ0tleUlkLFxuICAgICAgd3JhcHBlZEtleSxcbiAgICAgIGNpcGhlcixcbiAgICB9O1xuICB9XG59XG4iXX0=
|