@lifeready/core 1.0.1 → 1.0.3
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/bundles/lifeready-core.umd.js +15939 -0
- package/bundles/lifeready-core.umd.js.map +1 -0
- package/bundles/lifeready-core.umd.min.js +16 -0
- package/bundles/lifeready-core.umd.min.js.map +1 -0
- package/esm2015/lib/_common/ast.js +40 -0
- package/esm2015/lib/_common/deferred-promise.js +24 -0
- package/esm2015/lib/_common/exceptions.js +157 -0
- package/esm2015/lib/_common/queries.gql.js +190 -0
- package/esm2015/lib/_common/run-outside-angular.js +79 -0
- package/esm2015/lib/_common/types.js +1 -0
- package/esm2015/lib/_common/utils.js +44 -0
- package/esm2015/lib/api/contact-card.gql.js +79 -0
- package/esm2015/lib/api/contact-card.service.js +154 -0
- package/esm2015/lib/api/contact-card2.gql.js +60 -0
- package/esm2015/lib/api/contact-card2.service.js +103 -0
- package/esm2015/lib/api/file.service.js +74 -0
- package/esm2015/lib/api/item2.gql.js +110 -0
- package/esm2015/lib/api/item2.service.js +311 -0
- package/esm2015/lib/api/key-exchange.gql.js +188 -0
- package/esm2015/lib/api/key-exchange.service.js +442 -0
- package/esm2015/lib/api/key-exchange.types.js +18 -0
- package/esm2015/lib/api/key-exchange2.gql.js +171 -0
- package/esm2015/lib/api/key-exchange2.service.js +479 -0
- package/esm2015/lib/api/lock.gql.js +40 -0
- package/esm2015/lib/api/lock.service.js +64 -0
- package/esm2015/lib/api/lr-apollo.service.js +46 -0
- package/esm2015/lib/api/lr-graphql/index.js +6 -0
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -0
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -0
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -0
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -0
- package/esm2015/lib/api/lr-graphql/lr.service.js +18 -0
- package/esm2015/lib/api/message.service.js +138 -0
- package/esm2015/lib/api/persist.service.js +181 -0
- package/esm2015/lib/api/query-processor/common-processors.service.js +93 -0
- package/esm2015/lib/api/query-processor/index.js +3 -0
- package/esm2015/lib/api/query-processor/query-processor.service.js +192 -0
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -0
- package/esm2015/lib/api/shared-contact-card.service.js +119 -0
- package/esm2015/lib/api/shared-contact-card2.gql.js +41 -0
- package/esm2015/lib/api/shared-contact-card2.service.js +117 -0
- package/esm2015/lib/api/time.service.js +146 -0
- package/esm2015/lib/api/types/graphql.types.js +7 -0
- package/esm2015/lib/api/types/index.js +3 -0
- package/esm2015/lib/api/types/lr-graphql.types.js +71 -0
- package/esm2015/lib/auth/auth.config.js +57 -0
- package/esm2015/lib/auth/auth.gql.js +48 -0
- package/esm2015/lib/auth/auth.types.js +27 -0
- package/esm2015/lib/auth/idle.service.js +168 -0
- package/esm2015/lib/auth/idle.types.js +7 -0
- package/esm2015/lib/auth/lbop.service.js +355 -0
- package/esm2015/lib/auth/life-ready-auth.service.js +500 -0
- package/esm2015/lib/auth/password.service.js +320 -0
- package/esm2015/lib/auth/register.service.js +172 -0
- package/esm2015/lib/auth/two-factor.service.js +74 -0
- package/esm2015/lib/category/category-meta.service.js +99 -0
- package/esm2015/lib/category/category.gql.js +406 -0
- package/esm2015/lib/category/category.service.js +390 -0
- package/esm2015/lib/category/category.types.js +29 -0
- package/esm2015/lib/cryptography/cryptography.types.js +11 -0
- package/esm2015/lib/cryptography/encryption.service.js +189 -0
- package/esm2015/lib/cryptography/key-factory.service.js +237 -0
- package/esm2015/lib/cryptography/key-graph.service.js +280 -0
- package/esm2015/lib/cryptography/key-meta.service.js +200 -0
- package/esm2015/lib/cryptography/key.service.js +124 -0
- package/esm2015/lib/cryptography/slip39.service.js +169 -0
- package/esm2015/lib/cryptography/web-crypto.service.js +29 -0
- package/esm2015/lib/life-ready.config.js +84 -0
- package/esm2015/lib/life-ready.module.js +74 -0
- package/esm2015/lib/plan/plan.gql.js +123 -0
- package/esm2015/lib/plan/plan.service.js +149 -0
- package/esm2015/lib/plan/plan.types.js +11 -0
- package/esm2015/lib/record/record-attachment.service.js +101 -0
- package/esm2015/lib/record/record.gql.js +179 -0
- package/esm2015/lib/record/record.service.js +206 -0
- package/esm2015/lib/record/record.types.js +15 -0
- package/esm2015/lib/record-type/record-type.service.js +75 -0
- package/esm2015/lib/record-type/record-type.types.js +28 -0
- package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +105 -0
- package/esm2015/lib/scenario/approvals/scenario-approval.types.js +1 -0
- package/esm2015/lib/scenario/approvals/scenario-approver.service.js +300 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +52 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +97 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +1 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +150 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +229 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +1 -0
- package/esm2015/lib/scenario/scenario-setup.service.js +269 -0
- package/esm2015/lib/scenario/scenario.gql.js +368 -0
- package/esm2015/lib/scenario/scenario.service.js +611 -0
- package/esm2015/lib/scenario/scenario.types.js +64 -0
- package/esm2015/lib/search/search.gql.js +62 -0
- package/esm2015/lib/search/search.service.js +156 -0
- package/esm2015/lib/search/search.types.js +6 -0
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +112 -0
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +129 -0
- package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +4 -0
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +232 -0
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +299 -0
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -0
- package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -0
- package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -0
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -0
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -0
- package/esm2015/lib/users/profile-details.service.js +214 -0
- package/esm2015/lib/users/profile.gql.js +97 -0
- package/esm2015/lib/users/profile.service.js +169 -0
- package/esm2015/lib/users/profile.types.js +34 -0
- package/esm2015/lib/users/user.gql.js +60 -0
- package/esm2015/lib/users/user.service.js +79 -0
- package/esm2015/lib/users/user.types.js +5 -0
- package/esm2015/lifeready-core.js +10 -0
- package/esm2015/public-api.js +81 -0
- package/fesm2015/lifeready-core.js +13314 -0
- package/fesm2015/lifeready-core.js.map +1 -0
- package/lib/_common/ast.d.ts +11 -0
- package/lib/_common/deferred-promise.d.ts +12 -0
- package/lib/_common/exceptions.d.ts +109 -0
- package/lib/_common/queries.gql.d.ts +10 -0
- package/lib/_common/run-outside-angular.d.ts +14 -0
- package/{src/lib/_common/types.ts → lib/_common/types.d.ts} +3 -6
- package/lib/_common/utils.d.ts +3 -0
- package/lib/api/contact-card.gql.d.ts +7 -0
- package/lib/api/contact-card.service.d.ts +52 -0
- package/lib/api/contact-card2.gql.d.ts +34 -0
- package/lib/api/contact-card2.service.d.ts +49 -0
- package/lib/api/file.service.d.ts +18 -0
- package/lib/api/item2.gql.d.ts +96 -0
- package/lib/api/item2.service.d.ts +177 -0
- package/lib/api/key-exchange.gql.d.ts +9 -0
- package/lib/api/key-exchange.service.d.ts +39 -0
- package/lib/api/key-exchange.types.d.ts +196 -0
- package/lib/api/key-exchange2.gql.d.ts +125 -0
- package/lib/api/key-exchange2.service.d.ts +187 -0
- package/lib/api/lock.gql.d.ts +27 -0
- package/lib/api/lock.service.d.ts +25 -0
- package/lib/api/lr-apollo.service.d.ts +15 -0
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -0
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +27 -0
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -0
- package/lib/api/lr-graphql/lr-mutation.d.ts +8 -0
- package/lib/api/lr-graphql/lr.service.d.ts +9 -0
- package/lib/api/message.service.d.ts +58 -0
- package/lib/api/persist.service.d.ts +31 -0
- package/lib/api/query-processor/common-processors.service.d.ts +36 -0
- package/lib/api/query-processor/query-processor.service.d.ts +18 -0
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -0
- package/lib/api/shared-contact-card.service.d.ts +33 -0
- package/lib/api/shared-contact-card2.gql.d.ts +36 -0
- package/lib/api/shared-contact-card2.service.d.ts +45 -0
- package/lib/api/time.service.d.ts +16 -0
- package/lib/api/types/graphql.types.d.ts +29 -0
- package/lib/api/types/lr-graphql.types.d.ts +385 -0
- package/lib/auth/auth.config.d.ts +5 -0
- package/lib/auth/auth.gql.d.ts +15 -0
- package/lib/auth/auth.types.d.ts +66 -0
- package/lib/auth/idle.service.d.ts +40 -0
- package/lib/auth/idle.types.d.ts +10 -0
- package/lib/auth/lbop.service.d.ts +91 -0
- package/lib/auth/life-ready-auth.service.d.ts +59 -0
- package/lib/auth/password.service.d.ts +78 -0
- package/lib/auth/register.service.d.ts +25 -0
- package/lib/auth/two-factor.service.d.ts +15 -0
- package/lib/category/category-meta.service.d.ts +23 -0
- package/lib/category/category.gql.d.ts +45 -0
- package/lib/category/category.service.d.ts +67 -0
- package/lib/category/category.types.d.ts +79 -0
- package/lib/cryptography/cryptography.types.d.ts +83 -0
- package/lib/cryptography/encryption.service.d.ts +41 -0
- package/lib/cryptography/key-factory.service.d.ts +38 -0
- package/lib/cryptography/key-graph.service.d.ts +33 -0
- package/lib/cryptography/key-meta.service.d.ts +44 -0
- package/lib/cryptography/key.service.d.ts +36 -0
- package/lib/cryptography/slip39.service.d.ts +43 -0
- package/lib/cryptography/web-crypto.service.d.ts +5 -0
- package/lib/life-ready.config.d.ts +14 -0
- package/lib/life-ready.module.d.ts +5 -0
- package/lib/plan/plan.gql.d.ts +11 -0
- package/lib/plan/plan.service.d.ts +33 -0
- package/lib/plan/plan.types.d.ts +31 -0
- package/lib/record/record-attachment.service.d.ts +16 -0
- package/lib/record/record.gql.d.ts +14 -0
- package/lib/record/record.service.d.ts +25 -0
- package/lib/record/record.types.d.ts +57 -0
- package/lib/record-type/record-type.service.d.ts +11 -0
- package/lib/record-type/record-type.types.d.ts +50 -0
- package/lib/scenario/approvals/scenario-approval.gql.d.ts +7 -0
- package/lib/scenario/approvals/scenario-approval.types.d.ts +63 -0
- package/lib/scenario/approvals/scenario-approver.service.d.ts +32 -0
- package/lib/scenario/claimants/scenario-claimant.gql.d.ts +5 -0
- package/lib/scenario/claimants/scenario-claimant.service.d.ts +17 -0
- package/lib/scenario/claimants/scenario-claimant.types.d.ts +18 -0
- package/lib/scenario/receivers/scenario-receiver.gql.d.ts +8 -0
- package/lib/scenario/receivers/scenario-receiver.service.d.ts +30 -0
- package/lib/scenario/receivers/scenario-receiver.types.d.ts +54 -0
- package/lib/scenario/scenario-setup.service.d.ts +22 -0
- package/lib/scenario/scenario.gql.d.ts +34 -0
- package/lib/scenario/scenario.service.d.ts +58 -0
- package/lib/scenario/scenario.types.d.ts +217 -0
- package/lib/search/search.gql.d.ts +1 -0
- package/lib/search/search.service.d.ts +25 -0
- package/lib/search/search.types.d.ts +20 -0
- package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -0
- package/lib/trusted-parties/tp-password-reset-user.service.d.ts +35 -0
- package/lib/trusted-parties/tp-password-reset.constants.d.ts +3 -0
- package/lib/trusted-parties/tp-password-reset.gql.d.ts +218 -0
- package/lib/trusted-parties/tp-password-reset.service.d.ts +130 -0
- package/lib/trusted-parties/trusted-party.gql.d.ts +9 -0
- package/lib/trusted-parties/trusted-party.service.d.ts +44 -0
- package/lib/trusted-parties/trusted-party.types.d.ts +102 -0
- package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -0
- package/lib/trusted-parties/trusted-party2.service.d.ts +114 -0
- package/lib/users/profile-details.service.d.ts +21 -0
- package/lib/users/profile.gql.d.ts +11 -0
- package/lib/users/profile.service.d.ts +35 -0
- package/lib/users/profile.types.d.ts +96 -0
- package/lib/users/user.gql.d.ts +9 -0
- package/lib/users/user.service.d.ts +12 -0
- package/lib/users/user.types.d.ts +23 -0
- package/lifeready-core.d.ts +9 -0
- package/lifeready-core.metadata.json +1 -0
- package/package.json +29 -21
- package/{src/public-api.ts → public-api.d.ts} +0 -19
- package/karma.conf.js +0 -32
- package/ng-package.json +0 -26
- package/src/lib/_common/ast.ts +0 -75
- package/src/lib/_common/deferred-promise.ts +0 -35
- package/src/lib/_common/exceptions.ts +0 -189
- package/src/lib/_common/queries.gql.ts +0 -200
- package/src/lib/_common/run-outside-angular.ts +0 -125
- package/src/lib/_common/tests.ts +0 -82
- package/src/lib/_common/utils.ts +0 -57
- package/src/lib/api/api-mutation.spec.ts +0 -547
- package/src/lib/api/api-query.spec.ts +0 -40
- package/src/lib/api/contact-card.gql.ts +0 -85
- package/src/lib/api/contact-card.service.spec.ts +0 -249
- package/src/lib/api/contact-card.service.ts +0 -228
- package/src/lib/api/contact-card2.gql.ts +0 -93
- package/src/lib/api/contact-card2.service.spec.ts +0 -297
- package/src/lib/api/contact-card2.service.ts +0 -139
- package/src/lib/api/file.service.spec.ts +0 -14
- package/src/lib/api/file.service.ts +0 -81
- package/src/lib/api/item2.gql.ts +0 -211
- package/src/lib/api/item2.service.spec.ts +0 -1043
- package/src/lib/api/item2.service.ts +0 -481
- package/src/lib/api/key-exchange.gql.ts +0 -196
- package/src/lib/api/key-exchange.service.spec.ts +0 -470
- package/src/lib/api/key-exchange.service.ts +0 -731
- package/src/lib/api/key-exchange.types.ts +0 -235
- package/src/lib/api/key-exchange2.gql.ts +0 -310
- package/src/lib/api/key-exchange2.service.spec.ts +0 -892
- package/src/lib/api/key-exchange2.service.ts +0 -875
- package/src/lib/api/lock.gql.ts +0 -67
- package/src/lib/api/lock.service.spec.ts +0 -549
- package/src/lib/api/lock.service.ts +0 -57
- package/src/lib/api/lr-apollo.service.spec.ts +0 -27
- package/src/lib/api/lr-apollo.service.ts +0 -43
- package/src/lib/api/lr-graphql/lr-graphql.service.ts +0 -313
- package/src/lib/api/lr-graphql/lr-merged-mutation.ts +0 -377
- package/src/lib/api/lr-graphql/lr-mutation-base.ts +0 -67
- package/src/lib/api/lr-graphql/lr-mutation.ts +0 -74
- package/src/lib/api/lr-graphql/lr.service.ts +0 -28
- package/src/lib/api/message.service.spec.ts +0 -20
- package/src/lib/api/message.service.ts +0 -210
- package/src/lib/api/persist.service.spec.ts +0 -209
- package/src/lib/api/persist.service.ts +0 -220
- package/src/lib/api/query-processor/common-processors.service.ts +0 -148
- package/src/lib/api/query-processor/query-processor.service.ts +0 -240
- package/src/lib/api/query-processor/tp-password-reset-processor.service.ts +0 -177
- package/src/lib/api/shared-contact-card.service.ts +0 -156
- package/src/lib/api/shared-contact-card2.gql.ts +0 -76
- package/src/lib/api/shared-contact-card2.service.ts +0 -154
- package/src/lib/api/time.service.spec.ts +0 -48
- package/src/lib/api/time.service.ts +0 -155
- package/src/lib/api/types/graphql.types.ts +0 -48
- package/src/lib/api/types/lr-graphql.types.ts +0 -467
- package/src/lib/auth/auth.config.ts +0 -83
- package/src/lib/auth/auth.gql.ts +0 -62
- package/src/lib/auth/auth.types.ts +0 -79
- package/src/lib/auth/idle.service.spec.ts +0 -119
- package/src/lib/auth/idle.service.ts +0 -208
- package/src/lib/auth/idle.types.ts +0 -11
- package/src/lib/auth/lbop.service.spec.ts +0 -56
- package/src/lib/auth/lbop.service.ts +0 -539
- package/src/lib/auth/life-ready-auth.service.spec.ts +0 -70
- package/src/lib/auth/life-ready-auth.service.ts +0 -454
- package/src/lib/auth/password.service.spec.ts +0 -51
- package/src/lib/auth/password.service.ts +0 -438
- package/src/lib/auth/register.service.spec.ts +0 -31
- package/src/lib/auth/register.service.ts +0 -181
- package/src/lib/auth/two-factor.service.spec.ts +0 -21
- package/src/lib/auth/two-factor.service.ts +0 -69
- package/src/lib/category/category-meta.service.spec.ts +0 -28
- package/src/lib/category/category-meta.service.ts +0 -125
- package/src/lib/category/category.gql.ts +0 -449
- package/src/lib/category/category.service.spec.ts +0 -26
- package/src/lib/category/category.service.ts +0 -498
- package/src/lib/category/category.types.ts +0 -89
- package/src/lib/cryptography/cryptography.types.ts +0 -108
- package/src/lib/cryptography/encryption.service.spec.ts +0 -125
- package/src/lib/cryptography/encryption.service.ts +0 -243
- package/src/lib/cryptography/key-factory.service.spec.ts +0 -15
- package/src/lib/cryptography/key-factory.service.ts +0 -303
- package/src/lib/cryptography/key-graph.service.spec.ts +0 -16
- package/src/lib/cryptography/key-graph.service.ts +0 -354
- package/src/lib/cryptography/key-meta.service.spec.ts +0 -40
- package/src/lib/cryptography/key-meta.service.ts +0 -254
- package/src/lib/cryptography/key.service.spec.ts +0 -16
- package/src/lib/cryptography/key.service.ts +0 -154
- package/src/lib/cryptography/slip39.service.spec.ts +0 -44
- package/src/lib/cryptography/slip39.service.ts +0 -204
- package/src/lib/cryptography/web-crypto.service.ts +0 -22
- package/src/lib/life-ready.config.ts +0 -127
- package/src/lib/life-ready.module.ts +0 -81
- package/src/lib/plan/plan.gql.ts +0 -133
- package/src/lib/plan/plan.service.spec.ts +0 -294
- package/src/lib/plan/plan.service.ts +0 -198
- package/src/lib/plan/plan.types.ts +0 -37
- package/src/lib/record/record-attachment.service.spec.ts +0 -31
- package/src/lib/record/record-attachment.service.ts +0 -101
- package/src/lib/record/record.gql.ts +0 -192
- package/src/lib/record/record.service.spec.ts +0 -598
- package/src/lib/record/record.service.ts +0 -236
- package/src/lib/record/record.types.ts +0 -86
- package/src/lib/record-type/record-type.service.spec.ts +0 -16
- package/src/lib/record-type/record-type.service.ts +0 -71
- package/src/lib/record-type/record-type.types.ts +0 -58
- package/src/lib/scenario/approvals/scenario-approval.gql.ts +0 -112
- package/src/lib/scenario/approvals/scenario-approval.types.ts +0 -85
- package/src/lib/scenario/approvals/scenario-approver.service.spec.ts +0 -16
- package/src/lib/scenario/approvals/scenario-approver.service.ts +0 -422
- package/src/lib/scenario/claimants/scenario-claimant.gql.ts +0 -56
- package/src/lib/scenario/claimants/scenario-claimant.service.spec.ts +0 -16
- package/src/lib/scenario/claimants/scenario-claimant.service.ts +0 -100
- package/src/lib/scenario/claimants/scenario-claimant.types.ts +0 -21
- package/src/lib/scenario/receivers/scenario-receiver.gql.ts +0 -157
- package/src/lib/scenario/receivers/scenario-receiver.service.spec.ts +0 -16
- package/src/lib/scenario/receivers/scenario-receiver.service.ts +0 -278
- package/src/lib/scenario/receivers/scenario-receiver.types.ts +0 -66
- package/src/lib/scenario/scenario-setup.service.spec.ts +0 -22
- package/src/lib/scenario/scenario-setup.service.ts +0 -369
- package/src/lib/scenario/scenario.gql.ts +0 -404
- package/src/lib/scenario/scenario.service.spec.ts +0 -1586
- package/src/lib/scenario/scenario.service.ts +0 -811
- package/src/lib/scenario/scenario.types.ts +0 -258
- package/src/lib/search/search.gql.ts +0 -62
- package/src/lib/search/search.service.spec.ts +0 -57
- package/src/lib/search/search.service.ts +0 -174
- package/src/lib/search/search.types.ts +0 -24
- package/src/lib/trusted-parties/tp-password-reset-request.service.ts +0 -140
- package/src/lib/trusted-parties/tp-password-reset-user.service.ts +0 -359
- package/src/lib/trusted-parties/tp-password-reset.gql.ts +0 -453
- package/src/lib/trusted-parties/tp-password-reset.service.spec.ts +0 -602
- package/src/lib/trusted-parties/tp-password-reset.service.ts +0 -482
- package/src/lib/trusted-parties/trusted-party.gql.ts +0 -159
- package/src/lib/trusted-parties/trusted-party.service.spec.ts +0 -1008
- package/src/lib/trusted-parties/trusted-party.service.ts +0 -394
- package/src/lib/trusted-parties/trusted-party.types.ts +0 -119
- package/src/lib/trusted-parties/trusted-party2.gql.ts +0 -165
- package/src/lib/trusted-parties/trusted-party2.service.spec.ts +0 -1782
- package/src/lib/trusted-parties/trusted-party2.service.ts +0 -272
- package/src/lib/users/profile-details.service.spec.ts +0 -45
- package/src/lib/users/profile-details.service.ts +0 -278
- package/src/lib/users/profile.gql.ts +0 -108
- package/src/lib/users/profile.service.spec.ts +0 -97
- package/src/lib/users/profile.service.ts +0 -224
- package/src/lib/users/profile.types.ts +0 -101
- package/src/lib/users/user.gql.ts +0 -69
- package/src/lib/users/user.service.spec.ts +0 -161
- package/src/lib/users/user.service.ts +0 -72
- package/src/lib/users/user.types.ts +0 -27
- package/src/test.ts +0 -21
- package/tsconfig.lib.json +0 -21
- package/tsconfig.lib.prod.json +0 -6
- package/tsconfig.spec.json +0 -10
- package/tslint.json +0 -17
- /package/{src/lib/api/lr-graphql/index.ts → lib/api/lr-graphql/index.d.ts} +0 -0
- /package/{src/lib/api/query-processor/index.ts → lib/api/query-processor/index.d.ts} +0 -0
- /package/{src/lib/api/types/index.ts → lib/api/types/index.d.ts} +0 -0
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { TestBed } from '@angular/core/testing';
|
|
2
|
-
import { EncryptionService } from './encryption.service';
|
|
3
|
-
import {
|
|
4
|
-
lrConfigureTestingModule,
|
|
5
|
-
lrExpectAsyncThrow,
|
|
6
|
-
lrit,
|
|
7
|
-
} from '../_common/tests';
|
|
8
|
-
import { util, JWK } from 'node-jose';
|
|
9
|
-
import { KeyFactoryService as KFS } from './key-factory.service';
|
|
10
|
-
|
|
11
|
-
describe('EncryptionService', () => {
|
|
12
|
-
let encService: EncryptionService;
|
|
13
|
-
let keyFactory: KFS;
|
|
14
|
-
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
lrConfigureTestingModule();
|
|
17
|
-
encService = TestBed.inject(EncryptionService);
|
|
18
|
-
keyFactory = TestBed.inject(KFS);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('should be created', () => {
|
|
22
|
-
expect(encService).toBeTruthy();
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
lrit('should verify public key signature', async () => {
|
|
26
|
-
const data = {
|
|
27
|
-
test: 123,
|
|
28
|
-
nested: {
|
|
29
|
-
str: 'xyz试用',
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const key = await keyFactory.createPkcSignKey();
|
|
34
|
-
|
|
35
|
-
const signed = await encService.sign(key, data);
|
|
36
|
-
|
|
37
|
-
// Wrong key
|
|
38
|
-
const wrongKey = await KFS.asKey({
|
|
39
|
-
...(await keyFactory.createPkcSignKey()).toJSON(true),
|
|
40
|
-
kid: key.kid,
|
|
41
|
-
});
|
|
42
|
-
(
|
|
43
|
-
await lrExpectAsyncThrow(encService.verify(wrongKey, signed))
|
|
44
|
-
).toBeTruthy();
|
|
45
|
-
|
|
46
|
-
// Wrong content
|
|
47
|
-
const wrongContent = {
|
|
48
|
-
...signed,
|
|
49
|
-
payload: util.base64url.encode(
|
|
50
|
-
util.asBuffer(JSON.stringify({ test: 456 }), 'utf8')
|
|
51
|
-
),
|
|
52
|
-
};
|
|
53
|
-
(
|
|
54
|
-
await lrExpectAsyncThrow(encService.verify(key, wrongContent))
|
|
55
|
-
).toBeTruthy();
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
lrit('should include protected timestamp header in signature', async () => {
|
|
59
|
-
const data = 'test';
|
|
60
|
-
const key = await keyFactory.createPkcSignKey();
|
|
61
|
-
const signed = (await encService.sign(key, data)) as any;
|
|
62
|
-
console.log('signed', signed);
|
|
63
|
-
|
|
64
|
-
const verified = await encService.verify(key, signed, {
|
|
65
|
-
returnOnlyPayload: false,
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
console.log(verified);
|
|
69
|
-
|
|
70
|
-
expect(verified.payload).toEqual(data);
|
|
71
|
-
expect(verified.protected.includes('timestamp')).toBeTrue();
|
|
72
|
-
expect(verified.header.timestamp).toBeTruthy();
|
|
73
|
-
|
|
74
|
-
// Modify the protected timestamp field and it should fail because timestamp is in the protected header.
|
|
75
|
-
const protect = JSON.parse(
|
|
76
|
-
new TextDecoder().decode(
|
|
77
|
-
util.base64url.decode(signed.signatures[0].protected) as any
|
|
78
|
-
)
|
|
79
|
-
);
|
|
80
|
-
protect.timestamp = protect.timestamp + 1;
|
|
81
|
-
console.log('protect', protect);
|
|
82
|
-
|
|
83
|
-
signed.signatures[0].protected = util.base64url.encode(
|
|
84
|
-
JSON.stringify(protect)
|
|
85
|
-
);
|
|
86
|
-
|
|
87
|
-
console.log('after modification', signed);
|
|
88
|
-
|
|
89
|
-
(await lrExpectAsyncThrow(encService.verify(key, signed))).toBeTruthy();
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
lrit('should include protected timestamp header in encryption', async () => {
|
|
93
|
-
const data = 'test';
|
|
94
|
-
const key = await keyFactory.createKey();
|
|
95
|
-
const encrypted = await encService.encrypt(key, data);
|
|
96
|
-
console.log('encrypted', encrypted);
|
|
97
|
-
|
|
98
|
-
let decrypted: any = await encService.decrypt(key, encrypted, {
|
|
99
|
-
returnOnlyPayload: false,
|
|
100
|
-
});
|
|
101
|
-
expect(decrypted.payload).toEqual(data);
|
|
102
|
-
|
|
103
|
-
// Test that we correctly understand the format of the header before modifying it.
|
|
104
|
-
const protect = JSON.parse(
|
|
105
|
-
new TextDecoder().decode(
|
|
106
|
-
util.base64url.decode(encrypted.protected) as any
|
|
107
|
-
)
|
|
108
|
-
);
|
|
109
|
-
console.log('protect', protect);
|
|
110
|
-
encrypted.protected = util.base64url.encode(JSON.stringify(protect));
|
|
111
|
-
|
|
112
|
-
decrypted = await encService.decrypt(key, encrypted, {
|
|
113
|
-
returnOnlyPayload: false,
|
|
114
|
-
});
|
|
115
|
-
expect(decrypted.payload).toEqual(data);
|
|
116
|
-
|
|
117
|
-
// Modify the protected timestamp field and it should fail because timestamp is in the protected header.
|
|
118
|
-
protect.timestamp = protect.timestamp + 1;
|
|
119
|
-
encrypted.protected = util.base64url.encode(JSON.stringify(protect));
|
|
120
|
-
|
|
121
|
-
console.log('after modification', encrypted);
|
|
122
|
-
|
|
123
|
-
(await lrExpectAsyncThrow(encService.decrypt(key, encrypted))).toBeTruthy();
|
|
124
|
-
});
|
|
125
|
-
});
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
LrException,
|
|
3
|
-
LrErrorCode,
|
|
4
|
-
LrBadArgumentException,
|
|
5
|
-
} from './../_common/exceptions';
|
|
6
|
-
import { ComponentFactoryResolver, Injectable } from '@angular/core';
|
|
7
|
-
import { JWE, JWK, JWS, util } from 'node-jose';
|
|
8
|
-
import { Key, PayloadType } from './cryptography.types';
|
|
9
|
-
import { TimeService } from '../api/time.service';
|
|
10
|
-
|
|
11
|
-
export enum JoseSerialization {
|
|
12
|
-
JSON = 'JSON',
|
|
13
|
-
COMPACT = 'COMPACT',
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface VerifyOptions {
|
|
17
|
-
payloadType?: PayloadType;
|
|
18
|
-
returnOnlyPayload?: boolean; // If true, return only the decoded payload.
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface DecryptOptions {
|
|
22
|
-
payloadType?: PayloadType;
|
|
23
|
-
returnOnlyPayload?: boolean; // If true, return only the decoded payload.
|
|
24
|
-
serializations?: JoseSerialization[];
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export const VERIFY_OPTIONS_DEFAULT: VerifyOptions = {
|
|
28
|
-
payloadType: 'json',
|
|
29
|
-
returnOnlyPayload: true,
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
export const DECRYPT_OPTIONS_DEFAULT: DecryptOptions = {
|
|
33
|
-
payloadType: 'json',
|
|
34
|
-
returnOnlyPayload: true,
|
|
35
|
-
serializations: [JoseSerialization.JSON],
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
export function isSymmetricKey(key: JWK.Key) {
|
|
39
|
-
// TODO: make sure this covers all cases.
|
|
40
|
-
return key.kty === 'oct';
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function asJwk(key: JWK.Key | Key | any): JWK.Key | null {
|
|
44
|
-
// TODO: make sure this covers all cases.
|
|
45
|
-
// Excluded:
|
|
46
|
-
// key.use - only for public keys, Ref: https://tools.ietf.org/html/rfc7517#section-4.2
|
|
47
|
-
|
|
48
|
-
if (key.id && key.jwk) {
|
|
49
|
-
return key.jwk;
|
|
50
|
-
} else if (key.keystore && key.length && key.kty && key.kid && key.alg) {
|
|
51
|
-
return key;
|
|
52
|
-
} else {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
@Injectable({
|
|
58
|
-
providedIn: 'root',
|
|
59
|
-
})
|
|
60
|
-
export class EncryptionService {
|
|
61
|
-
constructor(private timeService: TimeService) {}
|
|
62
|
-
|
|
63
|
-
async decrypt(
|
|
64
|
-
key: JWK.Key | Key, // string is assumed to be key.id, will unwrap key.
|
|
65
|
-
jwe: object | string, // string will be JSON.parsed
|
|
66
|
-
options?: DecryptOptions
|
|
67
|
-
): Promise<JWE.DecryptResult | any> {
|
|
68
|
-
const opt = {
|
|
69
|
-
algorithms: ['dir', 'A*GCM', 'RSA-OAEP-*'],
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
options = {
|
|
73
|
-
...DECRYPT_OPTIONS_DEFAULT,
|
|
74
|
-
...options,
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
if ((key as Key).jwk) {
|
|
78
|
-
key = (key as Key).jwk;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (typeof jwe === 'string') {
|
|
82
|
-
if (options.serializations.includes(JoseSerialization.JSON)) {
|
|
83
|
-
try {
|
|
84
|
-
jwe = JSON.parse(jwe);
|
|
85
|
-
} catch (error) {
|
|
86
|
-
if (options.serializations.includes(JoseSerialization.COMPACT)) {
|
|
87
|
-
console.log(
|
|
88
|
-
'Not a JSON-formatted JWE, it maybe compact serialisation format.'
|
|
89
|
-
);
|
|
90
|
-
} else {
|
|
91
|
-
throw error;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// {result} is a Object with:
|
|
98
|
-
// * header: the combined 'protected' and 'unprotected' header members
|
|
99
|
-
// * protected: an array of the member names from the "protected" member
|
|
100
|
-
// * key: Key used to decrypt
|
|
101
|
-
// * payload: Buffer of the decrypted content
|
|
102
|
-
// * plaintext: Buffer of the decrypted content (alternate), just a reference to payload
|
|
103
|
-
const res = await JWE.createDecrypt(key as JWK.Key, opt).decrypt(
|
|
104
|
-
jwe as any
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
res.payload = this.decodePayload(options.payloadType, res.payload);
|
|
108
|
-
|
|
109
|
-
if (options.returnOnlyPayload) {
|
|
110
|
-
return res.payload;
|
|
111
|
-
} else {
|
|
112
|
-
return res;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// TODO rename this to encrypt() and use as the most common usecase
|
|
117
|
-
async encryptToString(
|
|
118
|
-
key: JWK.Key,
|
|
119
|
-
content: ArrayBuffer | string | object
|
|
120
|
-
): Promise<string> {
|
|
121
|
-
return JSON.stringify(await this.encrypt(key, content));
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// TODO rename this to encryptToJSON() and use this when required.
|
|
125
|
-
async encrypt(
|
|
126
|
-
key: JWK.Key,
|
|
127
|
-
content: ArrayBuffer | string | object
|
|
128
|
-
): Promise<any> {
|
|
129
|
-
if (!content) {
|
|
130
|
-
throw new Error('Encrypting empty content.');
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (!(content instanceof ArrayBuffer)) {
|
|
134
|
-
content = new TextEncoder().encode(JSON.stringify(content));
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return JWE.createEncrypt(
|
|
138
|
-
{
|
|
139
|
-
contentAlg: 'A256GCM',
|
|
140
|
-
fields: {
|
|
141
|
-
timestamp: await this.timeService.serverNow(),
|
|
142
|
-
},
|
|
143
|
-
} as any,
|
|
144
|
-
key
|
|
145
|
-
)
|
|
146
|
-
.update(content)
|
|
147
|
-
.final() as any;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// <AZ> Unlike signContent, the serialised "content" variable is contained inside
|
|
151
|
-
// the result. So ordering of fields within "content" is not an issue.
|
|
152
|
-
async sign(key: JWK.Key, content: Buffer | string | object): Promise<any> {
|
|
153
|
-
const signer = JWS.createSign(
|
|
154
|
-
{
|
|
155
|
-
fields: {
|
|
156
|
-
timestamp: await this.timeService.serverNow(),
|
|
157
|
-
},
|
|
158
|
-
},
|
|
159
|
-
key
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
if (content instanceof Buffer) {
|
|
163
|
-
signer.update(content);
|
|
164
|
-
} else {
|
|
165
|
-
signer.update(JSON.stringify(content), 'utf8');
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
return signer.final();
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
async signToString(
|
|
172
|
-
key: JWK.Key,
|
|
173
|
-
content: Buffer | string | object
|
|
174
|
-
): Promise<string> {
|
|
175
|
-
return JSON.stringify(await this.sign(key, content));
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
async verify(
|
|
179
|
-
key: JWK.Key,
|
|
180
|
-
jws: object,
|
|
181
|
-
options?: VerifyOptions
|
|
182
|
-
): Promise<any> {
|
|
183
|
-
const opt = {
|
|
184
|
-
algorithms: ['RS*'],
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
options = {
|
|
188
|
-
...VERIFY_OPTIONS_DEFAULT,
|
|
189
|
-
...options,
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
try {
|
|
193
|
-
const res = await JWS.createVerify(key, opt).verify(jws as any);
|
|
194
|
-
|
|
195
|
-
res.payload = this.decodePayload(options.payloadType, res.payload);
|
|
196
|
-
|
|
197
|
-
if (options.returnOnlyPayload) {
|
|
198
|
-
return res.payload;
|
|
199
|
-
} else {
|
|
200
|
-
return res;
|
|
201
|
-
}
|
|
202
|
-
} catch (error) {
|
|
203
|
-
throw new LrException({
|
|
204
|
-
code: LrErrorCode.BadSignature,
|
|
205
|
-
message: `Bad signature: ${error}`,
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
async encryptThenSign(
|
|
211
|
-
{
|
|
212
|
-
key,
|
|
213
|
-
sigPrk,
|
|
214
|
-
}: {
|
|
215
|
-
key: JWK.Key;
|
|
216
|
-
sigPrk: JWK.Key;
|
|
217
|
-
},
|
|
218
|
-
content: ArrayBuffer | string | object
|
|
219
|
-
): Promise<{ cipher: string; sig: string }> {
|
|
220
|
-
const cipher = JSON.stringify(await this.encrypt(key, content));
|
|
221
|
-
const sig = await this.sign(sigPrk, cipher);
|
|
222
|
-
delete sig.payload;
|
|
223
|
-
|
|
224
|
-
return {
|
|
225
|
-
cipher,
|
|
226
|
-
sig: JSON.stringify(sig),
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
private decodePayload(
|
|
231
|
-
payloadType: PayloadType,
|
|
232
|
-
payload: ArrayBuffer
|
|
233
|
-
): ArrayBuffer | any {
|
|
234
|
-
switch (payloadType) {
|
|
235
|
-
case 'json':
|
|
236
|
-
return JSON.parse(new TextDecoder().decode(payload));
|
|
237
|
-
case 'ArrayBuffer':
|
|
238
|
-
return payload;
|
|
239
|
-
default:
|
|
240
|
-
throw new LrBadArgumentException(`Unknown payloadType: ${payloadType}`);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { TestBed } from '@angular/core/testing';
|
|
2
|
-
import { KeyFactoryService } from './key-factory.service';
|
|
3
|
-
|
|
4
|
-
describe('KeyFactoryService', () => {
|
|
5
|
-
let service: KeyFactoryService;
|
|
6
|
-
|
|
7
|
-
beforeEach(() => {
|
|
8
|
-
TestBed.configureTestingModule({});
|
|
9
|
-
service = TestBed.inject(KeyFactoryService);
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it('should be created', () => {
|
|
13
|
-
expect(service).toBeTruthy();
|
|
14
|
-
});
|
|
15
|
-
});
|
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { JWK } from 'node-jose';
|
|
3
|
-
import {
|
|
4
|
-
LbopKeyParams,
|
|
5
|
-
PassIdpParams,
|
|
6
|
-
PassKeyParams,
|
|
7
|
-
DeriveKeyResult,
|
|
8
|
-
DerivePassIdpParams,
|
|
9
|
-
DerivePassKeyParams,
|
|
10
|
-
DeriveLbopKeyParams,
|
|
11
|
-
} from './cryptography.types';
|
|
12
|
-
import { WebCryptoService } from './web-crypto.service';
|
|
13
|
-
import {
|
|
14
|
-
LrBadArgumentException,
|
|
15
|
-
LrSuspiciousException,
|
|
16
|
-
} from '../_common/exceptions';
|
|
17
|
-
|
|
18
|
-
export async function sha256(message) {
|
|
19
|
-
// encode as UTF-8
|
|
20
|
-
const msgBuffer = new TextEncoder().encode(message);
|
|
21
|
-
|
|
22
|
-
// hash the message
|
|
23
|
-
const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
|
|
24
|
-
|
|
25
|
-
// convert ArrayBuffer to Array
|
|
26
|
-
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
27
|
-
|
|
28
|
-
// convert bytes to hex string
|
|
29
|
-
const hashHex = hashArray
|
|
30
|
-
.map((b) => ('00' + b.toString(16)).slice(-2))
|
|
31
|
-
.join('');
|
|
32
|
-
return hashHex;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
@Injectable({
|
|
36
|
-
providedIn: 'root',
|
|
37
|
-
})
|
|
38
|
-
export class KeyFactoryService {
|
|
39
|
-
constructor(private webCryptoService: WebCryptoService) {
|
|
40
|
-
this.crypto = this.webCryptoService.crypto;
|
|
41
|
-
}
|
|
42
|
-
private readonly crypto;
|
|
43
|
-
// Global keys store. Otherwise, each call to asKey creates a new keyStore.
|
|
44
|
-
// <AZ> Did not seem to improve speed.
|
|
45
|
-
// public static keyStore = JWK.createKeyStore();
|
|
46
|
-
|
|
47
|
-
// AZ: This can't be change easily. It's basically a PassK or PassIdp rotation.
|
|
48
|
-
// todo: we should eventually increase this periodically to match with Moore's law.
|
|
49
|
-
// The iterations for each key are kept by the server as well but we assume the value
|
|
50
|
-
// from the server is not trustworthy, so need to have minimum thresholds here.
|
|
51
|
-
// If creating new keys, these minimum are used.
|
|
52
|
-
public readonly MIN_PASS_IDP_PBKDF_ITER = 100000;
|
|
53
|
-
public readonly MIN_PASS_KEY_PBKDF_ITER = 100000;
|
|
54
|
-
public readonly MIN_LBOP_KEY_PBKDF_ITER = 100000;
|
|
55
|
-
|
|
56
|
-
// These are used as the default values. They must be larger than the minimum values.
|
|
57
|
-
public readonly DEFAULT_PASS_IDP_PBKDF_ITER = this.MIN_PASS_IDP_PBKDF_ITER;
|
|
58
|
-
public readonly DEFAULT_PASS_KEY_PBKDF_ITER = this.MIN_PASS_KEY_PBKDF_ITER;
|
|
59
|
-
public readonly DEFAULT_LBOP_KEY_PBKDF_ITER = this.MIN_LBOP_KEY_PBKDF_ITER;
|
|
60
|
-
|
|
61
|
-
static asKey(
|
|
62
|
-
key: string | Buffer | object | JWK.RawKey,
|
|
63
|
-
form?:
|
|
64
|
-
| 'json'
|
|
65
|
-
| 'private'
|
|
66
|
-
| 'pkcs8'
|
|
67
|
-
| 'public'
|
|
68
|
-
| 'spki'
|
|
69
|
-
| 'pkix'
|
|
70
|
-
| 'x509'
|
|
71
|
-
| 'pem',
|
|
72
|
-
extras?: Record<string, unknown>
|
|
73
|
-
): Promise<JWK.Key> {
|
|
74
|
-
// <AZ> Using a single global key store did not seem to improve speed.
|
|
75
|
-
// return KeyFactoryService.keyStore.add(key, form, extras);
|
|
76
|
-
return JWK.asKey(key, form, extras);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
randomString(digits: number): string {
|
|
80
|
-
if (digits <= 0) {
|
|
81
|
-
throw new LrBadArgumentException('digits <= 0');
|
|
82
|
-
}
|
|
83
|
-
const validChars =
|
|
84
|
-
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
85
|
-
let array = new Uint32Array(digits);
|
|
86
|
-
this.crypto.getRandomValues(array);
|
|
87
|
-
array = array.map((x) => validChars.charCodeAt(x % validChars.length));
|
|
88
|
-
return String.fromCharCode.apply(null, array);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
randomDigitsNoZeros(digits: number): string {
|
|
92
|
-
return this.randomChoices([1, 2, 3, 4, 5, 6, 7, 8, 9], digits).join('');
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
randomChoices<T>(array: T[], chooseN: number): T[] {
|
|
96
|
-
if (array.length <= 1) {
|
|
97
|
-
throw new LrBadArgumentException('array.length <= 0');
|
|
98
|
-
}
|
|
99
|
-
if (chooseN <= 0) {
|
|
100
|
-
throw new LrBadArgumentException('chooseN <= 0');
|
|
101
|
-
}
|
|
102
|
-
const values = new Uint32Array(chooseN);
|
|
103
|
-
this.crypto.getRandomValues(values);
|
|
104
|
-
const ret: T[] = [];
|
|
105
|
-
values.forEach((v) => ret.push(array[v % array.length]));
|
|
106
|
-
return ret;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
createSalt(): string {
|
|
110
|
-
return this.randomString(16);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async createKey(): Promise<JWK.Key> {
|
|
114
|
-
const key = await this.crypto.subtle.generateKey(
|
|
115
|
-
{
|
|
116
|
-
name: 'AES-GCM',
|
|
117
|
-
length: 256, // can be 128, 192, or 256
|
|
118
|
-
},
|
|
119
|
-
true, // whether the key is extractable (i.e. can be used in exportKey)
|
|
120
|
-
['encrypt', 'decrypt'] // must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"]
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
const jwk = await this.crypto.subtle.exportKey('jwk', key);
|
|
124
|
-
|
|
125
|
-
// Removing the fields not needed by node-jose
|
|
126
|
-
delete jwk.ext;
|
|
127
|
-
delete jwk.key_ops;
|
|
128
|
-
|
|
129
|
-
return KeyFactoryService.asKey(jwk);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
async createSignKey(): Promise<JWK.Key> {
|
|
133
|
-
const key = await this.crypto.subtle.generateKey(
|
|
134
|
-
{
|
|
135
|
-
name: 'HMAC',
|
|
136
|
-
hash: { name: 'SHA-512' },
|
|
137
|
-
},
|
|
138
|
-
true,
|
|
139
|
-
['sign', 'verify']
|
|
140
|
-
);
|
|
141
|
-
|
|
142
|
-
const jwk = await this.crypto.subtle.exportKey('jwk', key);
|
|
143
|
-
|
|
144
|
-
// Removing the fields not needed by node-jose
|
|
145
|
-
delete jwk.key_ops;
|
|
146
|
-
delete jwk.ext;
|
|
147
|
-
|
|
148
|
-
return KeyFactoryService.asKey(jwk);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
async createPkcKey(): Promise<JWK.Key> {
|
|
152
|
-
// node-jose is not using Forge properly. It should be calling the async version of
|
|
153
|
-
// pki.rsa.generateKeyPair() with a callback. Instead it calls the sync version. Webcrypto
|
|
154
|
-
// does not support sync version, so it uses the javascript implementation, which is way too slow.
|
|
155
|
-
// So we generate using webcrypto and import the key.
|
|
156
|
-
// Unfortunately Elliptical Curve is not supported by Webcrypto. So we have to settle for RSA.
|
|
157
|
-
const key = await this.crypto.subtle.generateKey(
|
|
158
|
-
{
|
|
159
|
-
name: 'RSA-OAEP',
|
|
160
|
-
modulusLength: 2048, // can be 1024, 2048, 3072, 4096 ... 16384
|
|
161
|
-
// As per suggestion: https://developer.mozilla.org/en-US/docs/Web/API/RsaHashedKeyGenParams
|
|
162
|
-
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
|
|
163
|
-
hash: { name: 'SHA-256' }, // can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
|
|
164
|
-
},
|
|
165
|
-
true, // whether the key is extractable (i.e. can be used in exportKey)
|
|
166
|
-
['encrypt', 'decrypt'] // must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"]
|
|
167
|
-
);
|
|
168
|
-
|
|
169
|
-
const jwk = await this.crypto.subtle.exportKey('jwk', key.privateKey);
|
|
170
|
-
// Removing the fields not needed by node-jose
|
|
171
|
-
delete jwk.key_ops;
|
|
172
|
-
delete jwk.ext;
|
|
173
|
-
|
|
174
|
-
return KeyFactoryService.asKey(jwk);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
async createPkcSignKey(): Promise<JWK.Key> {
|
|
178
|
-
const key = await this.crypto.subtle.generateKey(
|
|
179
|
-
{
|
|
180
|
-
name: 'RSASSA-PKCS1-v1_5',
|
|
181
|
-
modulusLength: 2048, // can be 1024, 2048, or 4096
|
|
182
|
-
// As per suggestion: https://developer.mozilla.org/en-US/docs/Web/API/RsaHashedKeyGenParams
|
|
183
|
-
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
|
|
184
|
-
hash: { name: 'SHA-256' }, // can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
|
|
185
|
-
},
|
|
186
|
-
true, // whether the key is extractable (i.e. can be used in exportKey)
|
|
187
|
-
['sign', 'verify'] // can be any combination of "sign" and "verify"
|
|
188
|
-
);
|
|
189
|
-
|
|
190
|
-
const jwk = await this.crypto.subtle.exportKey('jwk', key.privateKey);
|
|
191
|
-
|
|
192
|
-
// Removing the fields not needed by node-jose
|
|
193
|
-
delete jwk.key_ops;
|
|
194
|
-
delete jwk.ext;
|
|
195
|
-
|
|
196
|
-
return KeyFactoryService.asKey(jwk);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
async deriveKey({
|
|
200
|
-
password,
|
|
201
|
-
salt,
|
|
202
|
-
iterations,
|
|
203
|
-
kid,
|
|
204
|
-
}: {
|
|
205
|
-
password: string;
|
|
206
|
-
salt: string;
|
|
207
|
-
iterations: number;
|
|
208
|
-
kid?: string;
|
|
209
|
-
}): Promise<DeriveKeyResult> {
|
|
210
|
-
const enc = new TextEncoder();
|
|
211
|
-
const rawKey = await this.crypto.subtle.importKey(
|
|
212
|
-
'raw',
|
|
213
|
-
enc.encode(password),
|
|
214
|
-
'PBKDF2',
|
|
215
|
-
false,
|
|
216
|
-
['deriveBits', 'deriveKey']
|
|
217
|
-
);
|
|
218
|
-
|
|
219
|
-
const passKey = await crypto.subtle.deriveKey(
|
|
220
|
-
{
|
|
221
|
-
name: 'PBKDF2',
|
|
222
|
-
salt: new TextEncoder().encode(salt),
|
|
223
|
-
iterations,
|
|
224
|
-
hash: 'SHA-256',
|
|
225
|
-
},
|
|
226
|
-
rawKey,
|
|
227
|
-
{ name: 'AES-GCM', length: 256 },
|
|
228
|
-
true,
|
|
229
|
-
['encrypt', 'decrypt']
|
|
230
|
-
);
|
|
231
|
-
|
|
232
|
-
const passKeyJson: any = await crypto.subtle.exportKey('jwk', passKey);
|
|
233
|
-
if (kid) {
|
|
234
|
-
passKeyJson.kid = kid;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
const jwk = await KeyFactoryService.asKey(passKeyJson);
|
|
238
|
-
|
|
239
|
-
return { jwk };
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
async derivePassIdp(params: DerivePassIdpParams): Promise<DeriveKeyResult> {
|
|
243
|
-
if (params.iterations < this.MIN_PASS_IDP_PBKDF_ITER) {
|
|
244
|
-
throw new LrSuspiciousException(
|
|
245
|
-
`The number of PassIdp key derivation iterations sent from the server (${params.iterations}) is lower than the minimum (${this.MIN_PASS_IDP_PBKDF_ITER})`
|
|
246
|
-
);
|
|
247
|
-
}
|
|
248
|
-
return this.deriveKey(params);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
async derivePassKey(params: DerivePassKeyParams): Promise<DeriveKeyResult> {
|
|
252
|
-
if (params.iterations < this.MIN_PASS_KEY_PBKDF_ITER) {
|
|
253
|
-
throw new LrSuspiciousException(
|
|
254
|
-
`The number of PassKey key derivation iterations sent from the server(${params.iterations}) is lower than the minimum(${this.MIN_PASS_KEY_PBKDF_ITER})`
|
|
255
|
-
);
|
|
256
|
-
}
|
|
257
|
-
return this.deriveKey(params);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
async deriveLbopKey(params: DeriveLbopKeyParams): Promise<DeriveKeyResult> {
|
|
261
|
-
if (params.iterations < this.MIN_LBOP_KEY_PBKDF_ITER) {
|
|
262
|
-
throw new LrSuspiciousException(
|
|
263
|
-
`The number of LbopKey key derivation iterations sent from the server(${params.iterations}) is lower than the minimum(${this.MIN_LBOP_KEY_PBKDF_ITER})`
|
|
264
|
-
);
|
|
265
|
-
}
|
|
266
|
-
return this.deriveKey(params);
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
async createKid(): Promise<string> {
|
|
270
|
-
// todo: AZ: node-jose source uses node's default UUID() function for kid, so just change to use that.
|
|
271
|
-
// for now, we are just creating a new key to use it's kid.
|
|
272
|
-
// The kid is a part of the JWK system. LR backend maintains the key hierarchy separately with it's own
|
|
273
|
-
// key id. But we just use it here as a double check.
|
|
274
|
-
return (await this.createKey()).kid;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
async createPassIdpParams(): Promise<PassIdpParams> {
|
|
278
|
-
return {
|
|
279
|
-
salt: this.createSalt(),
|
|
280
|
-
iterations: this.DEFAULT_PASS_IDP_PBKDF_ITER,
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
async createPassKeyParams(): Promise<PassKeyParams> {
|
|
285
|
-
return {
|
|
286
|
-
salt: this.createSalt(),
|
|
287
|
-
kid: await this.createKid(),
|
|
288
|
-
iterations: this.DEFAULT_PASS_KEY_PBKDF_ITER,
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
async createLbopKeyParams(): Promise<LbopKeyParams> {
|
|
293
|
-
return {
|
|
294
|
-
salt: this.createSalt(),
|
|
295
|
-
// todo: AZ: node-jose source uses node's default UUID() function for kid, so just change to use that.
|
|
296
|
-
// for now, we are just creating a new key to use it's kid.
|
|
297
|
-
// The kid is a part of the JWK system. LR backend maintains the key hierarchy separately with it's own
|
|
298
|
-
// key id. But we just use it here as a double check.
|
|
299
|
-
kid: await this.createKid(),
|
|
300
|
-
iterations: this.DEFAULT_PASS_KEY_PBKDF_ITER,
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { TestBed } from '@angular/core/testing';
|
|
2
|
-
import { lrConfigureTestingModule } from '../_common/tests';
|
|
3
|
-
import { KeyGraphService } from './key-graph.service';
|
|
4
|
-
|
|
5
|
-
describe('KeyGraph', () => {
|
|
6
|
-
let service: KeyGraphService;
|
|
7
|
-
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
lrConfigureTestingModule();
|
|
10
|
-
service = TestBed.inject(KeyGraphService);
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it('should be created', () => {
|
|
14
|
-
expect(service).toBeTruthy();
|
|
15
|
-
});
|
|
16
|
-
});
|