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