plugin-data-source-mssql 2.0.0 → 2.0.2

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 (409) hide show
  1. package/README.md +31 -10
  2. package/dist/externalVersion.js +6 -6
  3. package/dist/node_modules/tedious/245.index.js +741 -0
  4. package/dist/node_modules/tedious/LICENSE +21 -0
  5. package/dist/node_modules/tedious/appveyor.yml +67 -0
  6. package/dist/node_modules/tedious/benchmarks/bulk-load/iterable.js +61 -0
  7. package/dist/node_modules/tedious/benchmarks/common.js +287 -0
  8. package/dist/node_modules/tedious/benchmarks/connection/open.js +26 -0
  9. package/dist/node_modules/tedious/benchmarks/package-lock.json +21173 -0
  10. package/dist/node_modules/tedious/benchmarks/package.json +11 -0
  11. package/dist/node_modules/tedious/benchmarks/query/call-tvp.js +105 -0
  12. package/dist/node_modules/tedious/benchmarks/query/insert-varbinary.js +46 -0
  13. package/dist/node_modules/tedious/benchmarks/query/select-many-rows.js +63 -0
  14. package/dist/node_modules/tedious/benchmarks/query/select-nvarchar.js +50 -0
  15. package/dist/node_modules/tedious/benchmarks/query/select-varbinary.js +50 -0
  16. package/dist/node_modules/tedious/benchmarks/request/rpcrequest-payload-tvp.js +45 -0
  17. package/dist/node_modules/tedious/benchmarks/request/rpcrequest-payload-varbinary.js +37 -0
  18. package/dist/node_modules/tedious/benchmarks/token-parser/colmetadata-token.js +27 -0
  19. package/dist/node_modules/tedious/benchmarks/token-parser/done-token.js +28 -0
  20. package/dist/node_modules/tedious/benchmarks/token-parser/simple-tokens.js +363 -0
  21. package/dist/node_modules/tedious/lib/all-headers.d.ts +2 -0
  22. package/dist/node_modules/tedious/lib/all-headers.js +24 -0
  23. package/dist/node_modules/tedious/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js +82 -0
  24. package/dist/node_modules/tedious/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js +55 -0
  25. package/dist/node_modules/tedious/lib/always-encrypted/cek-entry.d.ts +11 -0
  26. package/dist/node_modules/tedious/lib/always-encrypted/cek-entry.js +42 -0
  27. package/dist/node_modules/tedious/lib/always-encrypted/get-parameter-encryption-metadata.js +90 -0
  28. package/dist/node_modules/tedious/lib/always-encrypted/key-crypto.js +94 -0
  29. package/dist/node_modules/tedious/lib/always-encrypted/keystore-provider-azure-key-vault.d.ts +21 -0
  30. package/dist/node_modules/tedious/lib/always-encrypted/keystore-provider-azure-key-vault.js +247 -0
  31. package/dist/node_modules/tedious/lib/always-encrypted/symmetric-key-cache.js +36 -0
  32. package/dist/node_modules/tedious/lib/always-encrypted/symmetric-key.js +25 -0
  33. package/dist/node_modules/tedious/lib/always-encrypted/types.d.ts +73 -0
  34. package/dist/node_modules/tedious/lib/always-encrypted/types.js +48 -0
  35. package/dist/node_modules/tedious/lib/always-encrypted/utils.js +23 -0
  36. package/dist/node_modules/tedious/lib/bulk-load-payload.d.ts +8 -0
  37. package/dist/node_modules/tedious/lib/bulk-load-payload.js +23 -0
  38. package/dist/node_modules/tedious/lib/bulk-load.d.ts +275 -0
  39. package/dist/node_modules/tedious/lib/bulk-load.js +516 -0
  40. package/dist/node_modules/tedious/lib/collation.d.ts +28 -0
  41. package/dist/node_modules/tedious/lib/collation.js +348 -0
  42. package/dist/node_modules/tedious/lib/connection.d.ts +1310 -0
  43. package/dist/node_modules/tedious/lib/connection.js +2730 -0
  44. package/dist/node_modules/tedious/lib/connector.d.ts +18 -0
  45. package/dist/node_modules/tedious/lib/connector.js +150 -0
  46. package/dist/node_modules/tedious/lib/data-type.d.ts +455 -0
  47. package/dist/node_modules/tedious/lib/data-type.js +428 -0
  48. package/dist/node_modules/tedious/lib/data-types/bigint.d.ts +3 -0
  49. package/dist/node_modules/tedious/lib/data-types/bigint.js +53 -0
  50. package/dist/node_modules/tedious/lib/data-types/binary.d.ts +5 -0
  51. package/dist/node_modules/tedious/lib/data-types/binary.js +67 -0
  52. package/dist/node_modules/tedious/lib/data-types/bit.d.ts +3 -0
  53. package/dist/node_modules/tedious/lib/data-types/bit.js +46 -0
  54. package/dist/node_modules/tedious/lib/data-types/bitn.d.ts +3 -0
  55. package/dist/node_modules/tedious/lib/data-types/bitn.js +29 -0
  56. package/dist/node_modules/tedious/lib/data-types/char.d.ts +5 -0
  57. package/dist/node_modules/tedious/lib/data-types/char.js +86 -0
  58. package/dist/node_modules/tedious/lib/data-types/date.d.ts +3 -0
  59. package/dist/node_modules/tedious/lib/data-types/date.js +72 -0
  60. package/dist/node_modules/tedious/lib/data-types/datetime.d.ts +3 -0
  61. package/dist/node_modules/tedious/lib/data-types/datetime.js +93 -0
  62. package/dist/node_modules/tedious/lib/data-types/datetime2.d.ts +5 -0
  63. package/dist/node_modules/tedious/lib/data-types/datetime2.js +118 -0
  64. package/dist/node_modules/tedious/lib/data-types/datetimen.d.ts +3 -0
  65. package/dist/node_modules/tedious/lib/data-types/datetimen.js +29 -0
  66. package/dist/node_modules/tedious/lib/data-types/datetimeoffset.d.ts +5 -0
  67. package/dist/node_modules/tedious/lib/data-types/datetimeoffset.js +111 -0
  68. package/dist/node_modules/tedious/lib/data-types/decimal.d.ts +6 -0
  69. package/dist/node_modules/tedious/lib/data-types/decimal.js +107 -0
  70. package/dist/node_modules/tedious/lib/data-types/decimaln.d.ts +3 -0
  71. package/dist/node_modules/tedious/lib/data-types/decimaln.js +29 -0
  72. package/dist/node_modules/tedious/lib/data-types/float.d.ts +3 -0
  73. package/dist/node_modules/tedious/lib/data-types/float.js +47 -0
  74. package/dist/node_modules/tedious/lib/data-types/floatn.d.ts +3 -0
  75. package/dist/node_modules/tedious/lib/data-types/floatn.js +29 -0
  76. package/dist/node_modules/tedious/lib/data-types/image.d.ts +3 -0
  77. package/dist/node_modules/tedious/lib/data-types/image.js +56 -0
  78. package/dist/node_modules/tedious/lib/data-types/int.d.ts +3 -0
  79. package/dist/node_modules/tedious/lib/data-types/int.js +53 -0
  80. package/dist/node_modules/tedious/lib/data-types/intn.d.ts +3 -0
  81. package/dist/node_modules/tedious/lib/data-types/intn.js +29 -0
  82. package/dist/node_modules/tedious/lib/data-types/money.d.ts +3 -0
  83. package/dist/node_modules/tedious/lib/data-types/money.js +59 -0
  84. package/dist/node_modules/tedious/lib/data-types/moneyn.d.ts +3 -0
  85. package/dist/node_modules/tedious/lib/data-types/moneyn.js +29 -0
  86. package/dist/node_modules/tedious/lib/data-types/nchar.d.ts +5 -0
  87. package/dist/node_modules/tedious/lib/data-types/nchar.js +100 -0
  88. package/dist/node_modules/tedious/lib/data-types/ntext.d.ts +3 -0
  89. package/dist/node_modules/tedious/lib/data-types/ntext.js +60 -0
  90. package/dist/node_modules/tedious/lib/data-types/null.d.ts +3 -0
  91. package/dist/node_modules/tedious/lib/data-types/null.js +29 -0
  92. package/dist/node_modules/tedious/lib/data-types/numeric.d.ts +6 -0
  93. package/dist/node_modules/tedious/lib/data-types/numeric.js +106 -0
  94. package/dist/node_modules/tedious/lib/data-types/numericn.d.ts +3 -0
  95. package/dist/node_modules/tedious/lib/data-types/numericn.js +29 -0
  96. package/dist/node_modules/tedious/lib/data-types/nvarchar.d.ts +5 -0
  97. package/dist/node_modules/tedious/lib/data-types/nvarchar.js +133 -0
  98. package/dist/node_modules/tedious/lib/data-types/real.d.ts +3 -0
  99. package/dist/node_modules/tedious/lib/data-types/real.js +48 -0
  100. package/dist/node_modules/tedious/lib/data-types/smalldatetime.d.ts +3 -0
  101. package/dist/node_modules/tedious/lib/data-types/smalldatetime.js +83 -0
  102. package/dist/node_modules/tedious/lib/data-types/smallint.d.ts +3 -0
  103. package/dist/node_modules/tedious/lib/data-types/smallint.js +53 -0
  104. package/dist/node_modules/tedious/lib/data-types/smallmoney.d.ts +3 -0
  105. package/dist/node_modules/tedious/lib/data-types/smallmoney.js +51 -0
  106. package/dist/node_modules/tedious/lib/data-types/sql-variant.d.ts +3 -0
  107. package/dist/node_modules/tedious/lib/data-types/sql-variant.js +29 -0
  108. package/dist/node_modules/tedious/lib/data-types/text.d.ts +3 -0
  109. package/dist/node_modules/tedious/lib/data-types/text.js +69 -0
  110. package/dist/node_modules/tedious/lib/data-types/time.d.ts +3 -0
  111. package/dist/node_modules/tedious/lib/data-types/time.js +96 -0
  112. package/dist/node_modules/tedious/lib/data-types/tinyint.d.ts +3 -0
  113. package/dist/node_modules/tedious/lib/data-types/tinyint.js +53 -0
  114. package/dist/node_modules/tedious/lib/data-types/tvp.d.ts +3 -0
  115. package/dist/node_modules/tedious/lib/data-types/tvp.js +117 -0
  116. package/dist/node_modules/tedious/lib/data-types/udt.d.ts +3 -0
  117. package/dist/node_modules/tedious/lib/data-types/udt.js +29 -0
  118. package/dist/node_modules/tedious/lib/data-types/uniqueidentifier.d.ts +3 -0
  119. package/dist/node_modules/tedious/lib/data-types/uniqueidentifier.js +50 -0
  120. package/dist/node_modules/tedious/lib/data-types/varbinary.d.ts +5 -0
  121. package/dist/node_modules/tedious/lib/data-types/varbinary.js +119 -0
  122. package/dist/node_modules/tedious/lib/data-types/varchar.d.ts +5 -0
  123. package/dist/node_modules/tedious/lib/data-types/varchar.js +112 -0
  124. package/dist/node_modules/tedious/lib/data-types/xml.d.ts +3 -0
  125. package/dist/node_modules/tedious/lib/data-types/xml.js +29 -0
  126. package/dist/node_modules/tedious/lib/debug.d.ts +25 -0
  127. package/dist/node_modules/tedious/lib/debug.js +67 -0
  128. package/dist/node_modules/tedious/lib/errors/abort-error.d.ts +4 -0
  129. package/dist/node_modules/tedious/lib/errors/abort-error.js +15 -0
  130. package/dist/node_modules/tedious/lib/errors/timeout-error.d.ts +4 -0
  131. package/dist/node_modules/tedious/lib/errors/timeout-error.js +15 -0
  132. package/dist/node_modules/tedious/lib/errors.d.ts +17 -0
  133. package/dist/node_modules/tedious/lib/errors.js +23 -0
  134. package/dist/node_modules/tedious/lib/guid-parser.d.ts +3 -0
  135. package/dist/node_modules/tedious/lib/guid-parser.js +30 -0
  136. package/dist/node_modules/tedious/lib/incoming-message-stream.d.ts +19 -0
  137. package/dist/node_modules/tedious/lib/incoming-message-stream.js +97 -0
  138. package/dist/node_modules/tedious/lib/instance-lookup.d.ts +13 -0
  139. package/dist/node_modules/tedious/lib/instance-lookup.js +96 -0
  140. package/dist/node_modules/tedious/lib/library.d.ts +1 -0
  141. package/dist/node_modules/tedious/lib/library.js +8 -0
  142. package/dist/node_modules/tedious/lib/login7-payload.d.ts +51 -0
  143. package/dist/node_modules/tedious/lib/login7-payload.js +402 -0
  144. package/dist/node_modules/tedious/lib/message-io.d.ts +28 -0
  145. package/dist/node_modules/tedious/lib/message-io.js +153 -0
  146. package/dist/node_modules/tedious/lib/message.d.ts +11 -0
  147. package/dist/node_modules/tedious/lib/message.js +21 -0
  148. package/dist/node_modules/tedious/lib/metadata-parser.d.ts +48 -0
  149. package/dist/node_modules/tedious/lib/metadata-parser.js +380 -0
  150. package/dist/node_modules/tedious/lib/ntlm-payload.d.ts +23 -0
  151. package/dist/node_modules/tedious/lib/ntlm-payload.js +136 -0
  152. package/dist/node_modules/tedious/lib/ntlm.d.ts +4 -0
  153. package/dist/node_modules/tedious/lib/ntlm.js +72 -0
  154. package/dist/node_modules/tedious/lib/outgoing-message-stream.d.ts +15 -0
  155. package/dist/node_modules/tedious/lib/outgoing-message-stream.js +81 -0
  156. package/dist/node_modules/tedious/lib/packet.d.ts +33 -0
  157. package/dist/node_modules/tedious/lib/packet.js +191 -0
  158. package/dist/node_modules/tedious/lib/prelogin-payload.d.ts +61 -0
  159. package/dist/node_modules/tedious/lib/prelogin-payload.js +209 -0
  160. package/dist/node_modules/tedious/lib/request.d.ts +370 -0
  161. package/dist/node_modules/tedious/lib/request.js +387 -0
  162. package/dist/node_modules/tedious/lib/rpcrequest-payload.d.ts +16 -0
  163. package/dist/node_modules/tedious/lib/rpcrequest-payload.js +109 -0
  164. package/dist/node_modules/tedious/lib/sender.d.ts +5 -0
  165. package/dist/node_modules/tedious/lib/sender.js +83 -0
  166. package/dist/node_modules/tedious/lib/special-stored-procedure.d.ts +18 -0
  167. package/dist/node_modules/tedious/lib/special-stored-procedure.js +26 -0
  168. package/dist/node_modules/tedious/lib/sqlbatch-payload.d.ts +13 -0
  169. package/dist/node_modules/tedious/lib/sqlbatch-payload.js +34 -0
  170. package/dist/node_modules/tedious/lib/tds-versions.d.ts +6 -0
  171. package/dist/node_modules/tedious/lib/tds-versions.js +19 -0
  172. package/dist/node_modules/tedious/lib/tedious.d.ts +13 -0
  173. package/dist/node_modules/tedious/lib/tedious.js +249 -0
  174. package/dist/node_modules/tedious/lib/token/colmetadata-token-parser.d.ts +12 -0
  175. package/dist/node_modules/tedious/lib/token/colmetadata-token-parser.js +124 -0
  176. package/dist/node_modules/tedious/lib/token/done-token-parser.d.ts +6 -0
  177. package/dist/node_modules/tedious/lib/token/done-token-parser.js +76 -0
  178. package/dist/node_modules/tedious/lib/token/env-change-token-parser.d.ts +5 -0
  179. package/dist/node_modules/tedious/lib/token/env-change-token-parser.js +190 -0
  180. package/dist/node_modules/tedious/lib/token/feature-ext-ack-parser.d.ts +5 -0
  181. package/dist/node_modules/tedious/lib/token/feature-ext-ack-parser.js +52 -0
  182. package/dist/node_modules/tedious/lib/token/fedauth-info-parser.d.ts +5 -0
  183. package/dist/node_modules/tedious/lib/token/fedauth-info-parser.js +62 -0
  184. package/dist/node_modules/tedious/lib/token/handler.d.ts +135 -0
  185. package/dist/node_modules/tedious/lib/token/handler.js +444 -0
  186. package/dist/node_modules/tedious/lib/token/helpers.d.ts +28 -0
  187. package/dist/node_modules/tedious/lib/token/helpers.js +205 -0
  188. package/dist/node_modules/tedious/lib/token/infoerror-token-parser.d.ts +5 -0
  189. package/dist/node_modules/tedious/lib/token/infoerror-token-parser.js +80 -0
  190. package/dist/node_modules/tedious/lib/token/loginack-token-parser.d.ts +5 -0
  191. package/dist/node_modules/tedious/lib/token/loginack-token-parser.js +75 -0
  192. package/dist/node_modules/tedious/lib/token/nbcrow-token-parser.d.ts +4 -0
  193. package/dist/node_modules/tedious/lib/token/nbcrow-token-parser.js +104 -0
  194. package/dist/node_modules/tedious/lib/token/order-token-parser.d.ts +5 -0
  195. package/dist/node_modules/tedious/lib/token/order-token-parser.js +34 -0
  196. package/dist/node_modules/tedious/lib/token/returnstatus-token-parser.d.ts +5 -0
  197. package/dist/node_modules/tedious/lib/token/returnstatus-token-parser.js +21 -0
  198. package/dist/node_modules/tedious/lib/token/returnvalue-token-parser.d.ts +4 -0
  199. package/dist/node_modules/tedious/lib/token/returnvalue-token-parser.js +94 -0
  200. package/dist/node_modules/tedious/lib/token/row-token-parser.d.ts +4 -0
  201. package/dist/node_modules/tedious/lib/token/row-token-parser.js +77 -0
  202. package/dist/node_modules/tedious/lib/token/sspi-token-parser.d.ts +5 -0
  203. package/dist/node_modules/tedious/lib/token/sspi-token-parser.js +42 -0
  204. package/dist/node_modules/tedious/lib/token/stream-parser.d.ts +34 -0
  205. package/dist/node_modules/tedious/lib/token/stream-parser.js +341 -0
  206. package/dist/node_modules/tedious/lib/token/token-stream-parser.d.ts +15 -0
  207. package/dist/node_modules/tedious/lib/token/token-stream-parser.js +36 -0
  208. package/dist/node_modules/tedious/lib/token/token.d.ts +312 -0
  209. package/dist/node_modules/tedious/lib/token/token.js +328 -0
  210. package/dist/node_modules/tedious/lib/tracking-buffer/writable-tracking-buffer.d.ts +47 -0
  211. package/dist/node_modules/tedious/lib/tracking-buffer/writable-tracking-buffer.js +249 -0
  212. package/dist/node_modules/tedious/lib/transaction.d.ts +39 -0
  213. package/dist/node_modules/tedious/lib/transaction.js +137 -0
  214. package/dist/node_modules/tedious/lib/transient-error-lookup.d.ts +3 -0
  215. package/dist/node_modules/tedious/lib/transient-error-lookup.js +19 -0
  216. package/dist/node_modules/tedious/lib/utils/with-timeout.d.ts +7 -0
  217. package/dist/node_modules/tedious/lib/utils/with-timeout.js +36 -0
  218. package/dist/node_modules/tedious/lib/value-parser.d.ts +7 -0
  219. package/dist/node_modules/tedious/lib/value-parser.js +813 -0
  220. package/dist/node_modules/tedious/node_modules/@types/node/assert/strict.d.ts +105 -0
  221. package/dist/node_modules/tedious/node_modules/@types/node/assert.d.ts +955 -0
  222. package/dist/node_modules/tedious/node_modules/@types/node/async_hooks.d.ts +623 -0
  223. package/dist/node_modules/tedious/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  224. package/dist/node_modules/tedious/node_modules/@types/node/buffer.d.ts +1810 -0
  225. package/dist/node_modules/tedious/node_modules/@types/node/child_process.d.ts +1428 -0
  226. package/dist/node_modules/tedious/node_modules/@types/node/cluster.d.ts +486 -0
  227. package/dist/node_modules/tedious/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  228. package/dist/node_modules/tedious/node_modules/@types/node/console.d.ts +151 -0
  229. package/dist/node_modules/tedious/node_modules/@types/node/constants.d.ts +20 -0
  230. package/dist/node_modules/tedious/node_modules/@types/node/crypto.d.ts +4065 -0
  231. package/dist/node_modules/tedious/node_modules/@types/node/dgram.d.ts +564 -0
  232. package/dist/node_modules/tedious/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  233. package/dist/node_modules/tedious/node_modules/@types/node/dns/promises.d.ts +503 -0
  234. package/dist/node_modules/tedious/node_modules/@types/node/dns.d.ts +922 -0
  235. package/dist/node_modules/tedious/node_modules/@types/node/domain.d.ts +166 -0
  236. package/dist/node_modules/tedious/node_modules/@types/node/events.d.ts +1054 -0
  237. package/dist/node_modules/tedious/node_modules/@types/node/fs/promises.d.ts +1329 -0
  238. package/dist/node_modules/tedious/node_modules/@types/node/fs.d.ts +4676 -0
  239. package/dist/node_modules/tedious/node_modules/@types/node/globals.d.ts +150 -0
  240. package/dist/node_modules/tedious/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  241. package/dist/node_modules/tedious/node_modules/@types/node/http.d.ts +2167 -0
  242. package/dist/node_modules/tedious/node_modules/@types/node/http2.d.ts +2480 -0
  243. package/dist/node_modules/tedious/node_modules/@types/node/https.d.ts +405 -0
  244. package/dist/node_modules/tedious/node_modules/@types/node/index.d.ts +115 -0
  245. package/dist/node_modules/tedious/node_modules/@types/node/inspector/promises.d.ts +41 -0
  246. package/dist/node_modules/tedious/node_modules/@types/node/inspector.d.ts +224 -0
  247. package/dist/node_modules/tedious/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  248. package/dist/node_modules/tedious/node_modules/@types/node/module.d.ts +819 -0
  249. package/dist/node_modules/tedious/node_modules/@types/node/net.d.ts +933 -0
  250. package/dist/node_modules/tedious/node_modules/@types/node/os.d.ts +507 -0
  251. package/dist/node_modules/tedious/node_modules/@types/node/package.json +155 -0
  252. package/dist/node_modules/tedious/node_modules/@types/node/path/posix.d.ts +8 -0
  253. package/dist/node_modules/tedious/node_modules/@types/node/path/win32.d.ts +8 -0
  254. package/dist/node_modules/tedious/node_modules/@types/node/path.d.ts +187 -0
  255. package/dist/node_modules/tedious/node_modules/@types/node/perf_hooks.d.ts +643 -0
  256. package/dist/node_modules/tedious/node_modules/@types/node/process.d.ts +2161 -0
  257. package/dist/node_modules/tedious/node_modules/@types/node/punycode.d.ts +117 -0
  258. package/dist/node_modules/tedious/node_modules/@types/node/querystring.d.ts +152 -0
  259. package/dist/node_modules/tedious/node_modules/@types/node/quic.d.ts +910 -0
  260. package/dist/node_modules/tedious/node_modules/@types/node/readline/promises.d.ts +161 -0
  261. package/dist/node_modules/tedious/node_modules/@types/node/readline.d.ts +541 -0
  262. package/dist/node_modules/tedious/node_modules/@types/node/repl.d.ts +415 -0
  263. package/dist/node_modules/tedious/node_modules/@types/node/sea.d.ts +162 -0
  264. package/dist/node_modules/tedious/node_modules/@types/node/sqlite.d.ts +955 -0
  265. package/dist/node_modules/tedious/node_modules/@types/node/stream/consumers.d.ts +38 -0
  266. package/dist/node_modules/tedious/node_modules/@types/node/stream/promises.d.ts +211 -0
  267. package/dist/node_modules/tedious/node_modules/@types/node/stream/web.d.ts +296 -0
  268. package/dist/node_modules/tedious/node_modules/@types/node/stream.d.ts +1760 -0
  269. package/dist/node_modules/tedious/node_modules/@types/node/string_decoder.d.ts +67 -0
  270. package/dist/node_modules/tedious/node_modules/@types/node/test/reporters.d.ts +96 -0
  271. package/dist/node_modules/tedious/node_modules/@types/node/test.d.ts +2240 -0
  272. package/dist/node_modules/tedious/node_modules/@types/node/timers/promises.d.ts +108 -0
  273. package/dist/node_modules/tedious/node_modules/@types/node/timers.d.ts +159 -0
  274. package/dist/node_modules/tedious/node_modules/@types/node/tls.d.ts +1198 -0
  275. package/dist/node_modules/tedious/node_modules/@types/node/trace_events.d.ts +197 -0
  276. package/dist/node_modules/tedious/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  277. package/dist/node_modules/tedious/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  278. package/dist/node_modules/tedious/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  279. package/dist/node_modules/tedious/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  280. package/dist/node_modules/tedious/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  281. package/dist/node_modules/tedious/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  282. package/dist/node_modules/tedious/node_modules/@types/node/tty.d.ts +250 -0
  283. package/dist/node_modules/tedious/node_modules/@types/node/url.d.ts +519 -0
  284. package/dist/node_modules/tedious/node_modules/@types/node/util/types.d.ts +558 -0
  285. package/dist/node_modules/tedious/node_modules/@types/node/util.d.ts +1662 -0
  286. package/dist/node_modules/tedious/node_modules/@types/node/v8.d.ts +983 -0
  287. package/dist/node_modules/tedious/node_modules/@types/node/vm.d.ts +1208 -0
  288. package/dist/node_modules/tedious/node_modules/@types/node/wasi.d.ts +202 -0
  289. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  290. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  291. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/console.d.ts +9 -0
  292. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  293. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  294. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  295. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/events.d.ts +106 -0
  296. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  297. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  298. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  299. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  300. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  301. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  302. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  303. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  304. package/dist/node_modules/tedious/node_modules/@types/node/web-globals/url.d.ts +24 -0
  305. package/dist/node_modules/tedious/node_modules/@types/node/worker_threads.d.ts +717 -0
  306. package/dist/node_modules/tedious/node_modules/@types/node/zlib.d.ts +618 -0
  307. package/dist/node_modules/tedious/node_modules/bl/.github/dependabot.yml +16 -0
  308. package/dist/node_modules/tedious/node_modules/bl/.github/workflows/test-and-release.yml +61 -0
  309. package/dist/node_modules/tedious/node_modules/bl/BufferList.d.ts +431 -0
  310. package/dist/node_modules/tedious/node_modules/bl/BufferList.js +421 -0
  311. package/dist/node_modules/tedious/node_modules/bl/bl.js +84 -0
  312. package/dist/node_modules/tedious/node_modules/bl/index.d.ts +88 -0
  313. package/dist/node_modules/tedious/node_modules/bl/package.json +123 -0
  314. package/dist/node_modules/tedious/node_modules/bl/test/convert.js +21 -0
  315. package/dist/node_modules/tedious/node_modules/bl/test/indexOf.js +492 -0
  316. package/dist/node_modules/tedious/node_modules/bl/test/isBufferList.js +32 -0
  317. package/dist/node_modules/tedious/node_modules/bl/test/test.js +1032 -0
  318. package/dist/node_modules/tedious/node_modules/buffer/index.d.ts +194 -0
  319. package/dist/node_modules/tedious/node_modules/buffer/index.js +2106 -0
  320. package/dist/node_modules/tedious/node_modules/buffer/package.json +93 -0
  321. package/dist/node_modules/tedious/node_modules/readable-stream/lib/_stream_duplex.js +4 -0
  322. package/dist/node_modules/tedious/node_modules/readable-stream/lib/_stream_passthrough.js +4 -0
  323. package/dist/node_modules/tedious/node_modules/readable-stream/lib/_stream_readable.js +4 -0
  324. package/dist/node_modules/tedious/node_modules/readable-stream/lib/_stream_transform.js +4 -0
  325. package/dist/node_modules/tedious/node_modules/readable-stream/lib/_stream_writable.js +4 -0
  326. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/add-abort-signal.js +52 -0
  327. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/buffer_list.js +157 -0
  328. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/compose.js +194 -0
  329. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/destroy.js +290 -0
  330. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/duplex.js +143 -0
  331. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/duplexify.js +378 -0
  332. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +286 -0
  333. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/from.js +98 -0
  334. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/lazy_transform.js +51 -0
  335. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/legacy.js +89 -0
  336. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/operators.js +457 -0
  337. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/passthrough.js +39 -0
  338. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/pipeline.js +471 -0
  339. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/readable.js +1290 -0
  340. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/state.js +39 -0
  341. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/transform.js +180 -0
  342. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/utils.js +327 -0
  343. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/streams/writable.js +819 -0
  344. package/dist/node_modules/tedious/node_modules/readable-stream/lib/internal/validators.js +530 -0
  345. package/dist/node_modules/tedious/node_modules/readable-stream/lib/ours/browser.js +35 -0
  346. package/dist/node_modules/tedious/node_modules/readable-stream/lib/ours/errors.js +343 -0
  347. package/dist/node_modules/tedious/node_modules/readable-stream/lib/ours/index.js +65 -0
  348. package/dist/node_modules/tedious/node_modules/readable-stream/lib/ours/primordials.js +124 -0
  349. package/dist/node_modules/tedious/node_modules/readable-stream/lib/ours/util/inspect.js +55 -0
  350. package/dist/node_modules/tedious/node_modules/readable-stream/lib/ours/util.js +148 -0
  351. package/dist/node_modules/tedious/node_modules/readable-stream/lib/stream/promises.js +43 -0
  352. package/dist/node_modules/tedious/node_modules/readable-stream/lib/stream.js +143 -0
  353. package/dist/node_modules/tedious/node_modules/readable-stream/package.json +88 -0
  354. package/dist/node_modules/tedious/node_modules/sprintf-js/dist/.gitattributes +4 -0
  355. package/dist/node_modules/tedious/node_modules/sprintf-js/dist/angular-sprintf.min.js +3 -0
  356. package/dist/node_modules/tedious/node_modules/sprintf-js/dist/sprintf.min.js +3 -0
  357. package/dist/node_modules/tedious/node_modules/sprintf-js/package.json +35 -0
  358. package/dist/node_modules/tedious/node_modules/sprintf-js/src/angular-sprintf.js +24 -0
  359. package/dist/node_modules/tedious/node_modules/sprintf-js/src/sprintf.js +231 -0
  360. package/dist/node_modules/tedious/node_modules/undici-types/agent.d.ts +32 -0
  361. package/dist/node_modules/tedious/node_modules/undici-types/api.d.ts +43 -0
  362. package/dist/node_modules/tedious/node_modules/undici-types/balanced-pool.d.ts +29 -0
  363. package/dist/node_modules/tedious/node_modules/undici-types/cache-interceptor.d.ts +172 -0
  364. package/dist/node_modules/tedious/node_modules/undici-types/cache.d.ts +36 -0
  365. package/dist/node_modules/tedious/node_modules/undici-types/client-stats.d.ts +15 -0
  366. package/dist/node_modules/tedious/node_modules/undici-types/client.d.ts +108 -0
  367. package/dist/node_modules/tedious/node_modules/undici-types/connector.d.ts +34 -0
  368. package/dist/node_modules/tedious/node_modules/undici-types/content-type.d.ts +21 -0
  369. package/dist/node_modules/tedious/node_modules/undici-types/cookies.d.ts +30 -0
  370. package/dist/node_modules/tedious/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  371. package/dist/node_modules/tedious/node_modules/undici-types/dispatcher.d.ts +276 -0
  372. package/dist/node_modules/tedious/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  373. package/dist/node_modules/tedious/node_modules/undici-types/errors.d.ts +161 -0
  374. package/dist/node_modules/tedious/node_modules/undici-types/eventsource.d.ts +66 -0
  375. package/dist/node_modules/tedious/node_modules/undici-types/fetch.d.ts +211 -0
  376. package/dist/node_modules/tedious/node_modules/undici-types/formdata.d.ts +108 -0
  377. package/dist/node_modules/tedious/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  378. package/dist/node_modules/tedious/node_modules/undici-types/global-origin.d.ts +7 -0
  379. package/dist/node_modules/tedious/node_modules/undici-types/h2c-client.d.ts +73 -0
  380. package/dist/node_modules/tedious/node_modules/undici-types/handlers.d.ts +15 -0
  381. package/dist/node_modules/tedious/node_modules/undici-types/header.d.ts +160 -0
  382. package/dist/node_modules/tedious/node_modules/undici-types/index.d.ts +80 -0
  383. package/dist/node_modules/tedious/node_modules/undici-types/interceptors.d.ts +39 -0
  384. package/dist/node_modules/tedious/node_modules/undici-types/mock-agent.d.ts +68 -0
  385. package/dist/node_modules/tedious/node_modules/undici-types/mock-call-history.d.ts +111 -0
  386. package/dist/node_modules/tedious/node_modules/undici-types/mock-client.d.ts +27 -0
  387. package/dist/node_modules/tedious/node_modules/undici-types/mock-errors.d.ts +12 -0
  388. package/dist/node_modules/tedious/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  389. package/dist/node_modules/tedious/node_modules/undici-types/mock-pool.d.ts +27 -0
  390. package/dist/node_modules/tedious/node_modules/undici-types/package.json +55 -0
  391. package/dist/node_modules/tedious/node_modules/undici-types/patch.d.ts +29 -0
  392. package/dist/node_modules/tedious/node_modules/undici-types/pool-stats.d.ts +19 -0
  393. package/dist/node_modules/tedious/node_modules/undici-types/pool.d.ts +41 -0
  394. package/dist/node_modules/tedious/node_modules/undici-types/proxy-agent.d.ts +29 -0
  395. package/dist/node_modules/tedious/node_modules/undici-types/readable.d.ts +68 -0
  396. package/dist/node_modules/tedious/node_modules/undici-types/retry-agent.d.ts +8 -0
  397. package/dist/node_modules/tedious/node_modules/undici-types/retry-handler.d.ts +125 -0
  398. package/dist/node_modules/tedious/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  399. package/dist/node_modules/tedious/node_modules/undici-types/util.d.ts +18 -0
  400. package/dist/node_modules/tedious/node_modules/undici-types/utility.d.ts +7 -0
  401. package/dist/node_modules/tedious/node_modules/undici-types/webidl.d.ts +341 -0
  402. package/dist/node_modules/tedious/node_modules/undici-types/websocket.d.ts +186 -0
  403. package/dist/node_modules/tedious/package.json +1 -0
  404. package/dist/node_modules/tedious/tsconfig.build-types.json +15 -0
  405. package/dist/node_modules/tedious/tsconfig.json +29 -0
  406. package/dist/node_modules/tedious/types/js-md4.d.ts +7 -0
  407. package/dist/node_modules/tedious/types/native-duplexpair.d.ts +12 -0
  408. package/dist/server/data-source/MssqlExternalDataSource.js +23 -2
  409. package/package.json +1 -1
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getParameterEncryptionMetadata = void 0;
7
+ var _types = require("./types");
8
+ var _cekEntry = require("./cek-entry");
9
+ var _keyCrypto = require("./key-crypto");
10
+ var _dataType = require("../data-type");
11
+ var _request = _interopRequireDefault(require("../request"));
12
+ var _rpcrequestPayload = _interopRequireDefault(require("../rpcrequest-payload"));
13
+ var _packet = require("../packet");
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+ // This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
16
+ // Copyright (c) 2019 Microsoft Corporation
17
+
18
+ const getParameterEncryptionMetadata = (connection, request, callback) => {
19
+ if (request.cryptoMetadataLoaded === true) {
20
+ return callback();
21
+ }
22
+ const metadataRequest = new _request.default('sp_describe_parameter_encryption', error => {
23
+ if (error) {
24
+ return callback(error);
25
+ }
26
+ const decryptSymmetricKeyPromises = [];
27
+ const cekList = [];
28
+ let paramCount = 0;
29
+ for (const columns of resultRows) {
30
+ try {
31
+ const isFirstRecordSet = columns.some(col => (col && col.metadata && col.metadata.colName) === 'database_id');
32
+ if (isFirstRecordSet === true) {
33
+ const currentOrdinal = columns[_types.DescribeParameterEncryptionResultSet1.KeyOrdinal].value;
34
+ let cekEntry;
35
+ if (!cekList[currentOrdinal]) {
36
+ cekEntry = new _cekEntry.CEKEntry(currentOrdinal);
37
+ cekList[cekEntry.ordinal] = cekEntry;
38
+ } else {
39
+ cekEntry = cekList[currentOrdinal];
40
+ }
41
+ cekEntry.add(columns[_types.DescribeParameterEncryptionResultSet1.EncryptedKey].value, columns[_types.DescribeParameterEncryptionResultSet1.DbId].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyId].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyVersion].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyMdVersion].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyPath].value, columns[_types.DescribeParameterEncryptionResultSet1.ProviderName].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyEncryptionAlgorithm].value);
42
+ } else {
43
+ paramCount++;
44
+ const paramName = columns[_types.DescribeParameterEncryptionResultSet2.ParameterName].value;
45
+ const paramIndex = request.parameters.findIndex(param => paramName === `@${param.name}`);
46
+ const cekOrdinal = columns[_types.DescribeParameterEncryptionResultSet2.ColumnEncryptionKeyOrdinal].value;
47
+ const cekEntry = cekList[cekOrdinal];
48
+ if (cekEntry && cekList.length < cekOrdinal) {
49
+ return callback(new Error(`Internal error. The referenced column encryption key ordinal "${cekOrdinal}" is missing in the encryption metadata returned by sp_describe_parameter_encryption. Max ordinal is "${cekList.length}".`));
50
+ }
51
+ const encType = columns[_types.DescribeParameterEncryptionResultSet2.ColumnEncrytionType].value;
52
+ if (_types.SQLServerEncryptionType.PlainText !== encType) {
53
+ request.parameters[paramIndex].cryptoMetadata = {
54
+ cekEntry: cekEntry,
55
+ ordinal: cekOrdinal,
56
+ cipherAlgorithmId: columns[_types.DescribeParameterEncryptionResultSet2.ColumnEncryptionAlgorithm].value,
57
+ encryptionType: encType,
58
+ normalizationRuleVersion: Buffer.from([columns[_types.DescribeParameterEncryptionResultSet2.NormalizationRuleVersion].value])
59
+ };
60
+ decryptSymmetricKeyPromises.push((0, _keyCrypto.decryptSymmetricKey)(request.parameters[paramIndex].cryptoMetadata, connection.config.options));
61
+ } else if (request.parameters[paramIndex].forceEncrypt === true) {
62
+ return callback(new Error(`Cannot execute statement or procedure ${request.sqlTextOrProcedure} because Force Encryption was set as true for parameter ${paramIndex + 1} and the database expects this parameter to be sent as plaintext. This may be due to a configuration error.`));
63
+ }
64
+ }
65
+ } catch {
66
+ return callback(new Error(`Internal error. Unable to parse parameter encryption metadata in statement or procedure "${request.sqlTextOrProcedure}"`));
67
+ }
68
+ }
69
+ if (paramCount !== request.parameters.length) {
70
+ return callback(new Error(`Internal error. Metadata for some parameters in statement or procedure "${request.sqlTextOrProcedure}" is missing in the resultset returned by sp_describe_parameter_encryption.`));
71
+ }
72
+ return Promise.all(decryptSymmetricKeyPromises).then(() => {
73
+ request.cryptoMetadataLoaded = true;
74
+ process.nextTick(callback);
75
+ }, error => {
76
+ process.nextTick(callback, error);
77
+ });
78
+ });
79
+ metadataRequest.addParameter('tsql', _dataType.typeByName.NVarChar, request.sqlTextOrProcedure);
80
+ if (request.parameters.length) {
81
+ metadataRequest.addParameter('params', _dataType.typeByName.NVarChar, metadataRequest.makeParamsParameter(request.parameters));
82
+ }
83
+ const resultRows = [];
84
+ metadataRequest.on('row', columns => {
85
+ resultRows.push(columns);
86
+ });
87
+ connection.makeRequest(metadataRequest, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(metadataRequest.sqlTextOrProcedure, metadataRequest.parameters, connection.currentTransactionDescriptor(), connection.config.options, connection.databaseCollation));
88
+ };
89
+ exports.getParameterEncryptionMetadata = getParameterEncryptionMetadata;
90
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZXMiLCJyZXF1aXJlIiwiX2Nla0VudHJ5IiwiX2tleUNyeXB0byIsIl9kYXRhVHlwZSIsIl9yZXF1ZXN0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9ycGNyZXF1ZXN0UGF5bG9hZCIsIl9wYWNrZXQiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImdldFBhcmFtZXRlckVuY3J5cHRpb25NZXRhZGF0YSIsImNvbm5lY3Rpb24iLCJyZXF1ZXN0IiwiY2FsbGJhY2siLCJjcnlwdG9NZXRhZGF0YUxvYWRlZCIsIm1ldGFkYXRhUmVxdWVzdCIsIlJlcXVlc3QiLCJlcnJvciIsImRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlcyIsImNla0xpc3QiLCJwYXJhbUNvdW50IiwiY29sdW1ucyIsInJlc3VsdFJvd3MiLCJpc0ZpcnN0UmVjb3JkU2V0Iiwic29tZSIsImNvbCIsIm1ldGFkYXRhIiwiY29sTmFtZSIsImN1cnJlbnRPcmRpbmFsIiwiRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MSIsIktleU9yZGluYWwiLCJ2YWx1ZSIsImNla0VudHJ5IiwiQ0VLRW50cnkiLCJvcmRpbmFsIiwiYWRkIiwiRW5jcnlwdGVkS2V5IiwiRGJJZCIsIktleUlkIiwiS2V5VmVyc2lvbiIsIktleU1kVmVyc2lvbiIsIktleVBhdGgiLCJQcm92aWRlck5hbWUiLCJLZXlFbmNyeXB0aW9uQWxnb3JpdGhtIiwicGFyYW1OYW1lIiwiRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MiIsIlBhcmFtZXRlck5hbWUiLCJwYXJhbUluZGV4IiwicGFyYW1ldGVycyIsImZpbmRJbmRleCIsInBhcmFtIiwibmFtZSIsImNla09yZGluYWwiLCJDb2x1bW5FbmNyeXB0aW9uS2V5T3JkaW5hbCIsImxlbmd0aCIsIkVycm9yIiwiZW5jVHlwZSIsIkNvbHVtbkVuY3J5dGlvblR5cGUiLCJTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSIsIlBsYWluVGV4dCIsImNyeXB0b01ldGFkYXRhIiwiY2lwaGVyQWxnb3JpdGhtSWQiLCJDb2x1bW5FbmNyeXB0aW9uQWxnb3JpdGhtIiwiZW5jcnlwdGlvblR5cGUiLCJub3JtYWxpemF0aW9uUnVsZVZlcnNpb24iLCJCdWZmZXIiLCJmcm9tIiwiTm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uIiwicHVzaCIsImRlY3J5cHRTeW1tZXRyaWNLZXkiLCJjb25maWciLCJvcHRpb25zIiwiZm9yY2VFbmNyeXB0Iiwic3FsVGV4dE9yUHJvY2VkdXJlIiwiUHJvbWlzZSIsImFsbCIsInRoZW4iLCJwcm9jZXNzIiwibmV4dFRpY2siLCJhZGRQYXJhbWV0ZXIiLCJUWVBFUyIsIk5WYXJDaGFyIiwibWFrZVBhcmFtc1BhcmFtZXRlciIsIm9uIiwibWFrZVJlcXVlc3QiLCJUWVBFIiwiUlBDX1JFUVVFU1QiLCJScGNSZXF1ZXN0UGF5bG9hZCIsImN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IiLCJkYXRhYmFzZUNvbGxhdGlvbiIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC9nZXQtcGFyYW1ldGVyLWVuY3J5cHRpb24tbWV0YWRhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IFNRTFNlcnZlckVuY3J5cHRpb25UeXBlLCB0eXBlIENyeXB0b01ldGFkYXRhLCBEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLCBEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBDRUtFbnRyeSB9IGZyb20gJy4vY2VrLWVudHJ5JztcbmltcG9ydCB7IGRlY3J5cHRTeW1tZXRyaWNLZXkgfSBmcm9tICcuL2tleS1jcnlwdG8nO1xuaW1wb3J0IHsgdHlwZUJ5TmFtZSBhcyBUWVBFUywgdHlwZSBQYXJhbWV0ZXIgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi4vcmVxdWVzdCc7XG5pbXBvcnQgQ29ubmVjdGlvbiBmcm9tICcuLi9jb25uZWN0aW9uJztcbmltcG9ydCBScGNSZXF1ZXN0UGF5bG9hZCBmcm9tICcuLi9ycGNyZXF1ZXN0LXBheWxvYWQnO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gJy4uL3BhY2tldCc7XG5cbmV4cG9ydCBjb25zdCBnZXRQYXJhbWV0ZXJFbmNyeXB0aW9uTWV0YWRhdGEgPSAoY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgcmVxdWVzdDogUmVxdWVzdCwgY2FsbGJhY2s6IChlcnJvcj86IEVycm9yKSA9PiB2b2lkKSA9PiB7XG4gIGlmIChyZXF1ZXN0LmNyeXB0b01ldGFkYXRhTG9hZGVkID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gIH1cblxuICBjb25zdCBtZXRhZGF0YVJlcXVlc3QgPSBuZXcgUmVxdWVzdCgnc3BfZGVzY3JpYmVfcGFyYW1ldGVyX2VuY3J5cHRpb24nLCAoZXJyb3IpID0+IHtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnJvcik7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjcnlwdFN5bW1ldHJpY0tleVByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBjb25zdCBjZWtMaXN0OiBDRUtFbnRyeVtdID0gW107XG4gICAgbGV0IHBhcmFtQ291bnQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW5zIG9mIHJlc3VsdFJvd3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGlzRmlyc3RSZWNvcmRTZXQgPSBjb2x1bW5zLnNvbWUoKGNvbDogYW55KSA9PiAoY29sICYmIGNvbC5tZXRhZGF0YSAmJiBjb2wubWV0YWRhdGEuY29sTmFtZSkgPT09ICdkYXRhYmFzZV9pZCcpO1xuICAgICAgICBpZiAoaXNGaXJzdFJlY29yZFNldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRPcmRpbmFsID0gY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleU9yZGluYWxdLnZhbHVlO1xuICAgICAgICAgIGxldCBjZWtFbnRyeTogQ0VLRW50cnk7XG4gICAgICAgICAgaWYgKCFjZWtMaXN0W2N1cnJlbnRPcmRpbmFsXSkge1xuICAgICAgICAgICAgY2VrRW50cnkgPSBuZXcgQ0VLRW50cnkoY3VycmVudE9yZGluYWwpO1xuICAgICAgICAgICAgY2VrTGlzdFtjZWtFbnRyeS5vcmRpbmFsXSA9IGNla0VudHJ5O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjZWtFbnRyeSA9IGNla0xpc3RbY3VycmVudE9yZGluYWxdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjZWtFbnRyeS5hZGQoY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLkVuY3J5cHRlZEtleV0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5EYklkXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleUlkXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleVZlcnNpb25dLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5TWRWZXJzaW9uXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleVBhdGhdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuUHJvdmlkZXJOYW1lXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleUVuY3J5cHRpb25BbGdvcml0aG1dLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJhbUNvdW50Kys7XG4gICAgICAgICAgY29uc3QgcGFyYW1OYW1lOiBzdHJpbmcgPSBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuUGFyYW1ldGVyTmFtZV0udmFsdWU7XG4gICAgICAgICAgY29uc3QgcGFyYW1JbmRleDogbnVtYmVyID0gcmVxdWVzdC5wYXJhbWV0ZXJzLmZpbmRJbmRleCgocGFyYW06IFBhcmFtZXRlcikgPT4gcGFyYW1OYW1lID09PSBgQCR7cGFyYW0ubmFtZX1gKTtcbiAgICAgICAgICBjb25zdCBjZWtPcmRpbmFsOiBudW1iZXIgPSBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuQ29sdW1uRW5jcnlwdGlvbktleU9yZGluYWxdLnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGNla0VudHJ5OiBDRUtFbnRyeSA9IGNla0xpc3RbY2VrT3JkaW5hbF07XG5cbiAgICAgICAgICBpZiAoY2VrRW50cnkgJiYgY2VrTGlzdC5sZW5ndGggPCBjZWtPcmRpbmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvci4gVGhlIHJlZmVyZW5jZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IG9yZGluYWwgXCIke2Nla09yZGluYWx9XCIgaXMgbWlzc2luZyBpbiB0aGUgZW5jcnlwdGlvbiBtZXRhZGF0YSByZXR1cm5lZCBieSBzcF9kZXNjcmliZV9wYXJhbWV0ZXJfZW5jcnlwdGlvbi4gTWF4IG9yZGluYWwgaXMgXCIke2Nla0xpc3QubGVuZ3RofVwiLmApKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbmNUeXBlID0gY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyLkNvbHVtbkVuY3J5dGlvblR5cGVdLnZhbHVlO1xuICAgICAgICAgIGlmIChTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZS5QbGFpblRleHQgIT09IGVuY1R5cGUpIHtcbiAgICAgICAgICAgIHJlcXVlc3QucGFyYW1ldGVyc1twYXJhbUluZGV4XS5jcnlwdG9NZXRhZGF0YSA9IHtcbiAgICAgICAgICAgICAgY2VrRW50cnk6IGNla0VudHJ5LFxuICAgICAgICAgICAgICBvcmRpbmFsOiBjZWtPcmRpbmFsLFxuICAgICAgICAgICAgICBjaXBoZXJBbGdvcml0aG1JZDogY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyLkNvbHVtbkVuY3J5cHRpb25BbGdvcml0aG1dLnZhbHVlLFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uVHlwZTogZW5jVHlwZSxcbiAgICAgICAgICAgICAgbm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uOiBCdWZmZXIuZnJvbShbY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyLk5vcm1hbGl6YXRpb25SdWxlVmVyc2lvbl0udmFsdWVdKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkZWNyeXB0U3ltbWV0cmljS2V5UHJvbWlzZXMucHVzaChkZWNyeXB0U3ltbWV0cmljS2V5KHJlcXVlc3QucGFyYW1ldGVyc1twYXJhbUluZGV4XS5jcnlwdG9NZXRhZGF0YSBhcyBDcnlwdG9NZXRhZGF0YSwgY29ubmVjdGlvbi5jb25maWcub3B0aW9ucykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5wYXJhbWV0ZXJzW3BhcmFtSW5kZXhdLmZvcmNlRW5jcnlwdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgQ2Fubm90IGV4ZWN1dGUgc3RhdGVtZW50IG9yIHByb2NlZHVyZSAke3JlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlfSBiZWNhdXNlIEZvcmNlIEVuY3J5cHRpb24gd2FzIHNldCBhcyB0cnVlIGZvciBwYXJhbWV0ZXIgJHtwYXJhbUluZGV4ICsgMX0gYW5kIHRoZSBkYXRhYmFzZSBleHBlY3RzIHRoaXMgcGFyYW1ldGVyIHRvIGJlIHNlbnQgYXMgcGxhaW50ZXh0LiBUaGlzIG1heSBiZSBkdWUgdG8gYSBjb25maWd1cmF0aW9uIGVycm9yLmApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvci4gVW5hYmxlIHRvIHBhcnNlIHBhcmFtZXRlciBlbmNyeXB0aW9uIG1ldGFkYXRhIGluIHN0YXRlbWVudCBvciBwcm9jZWR1cmUgXCIke3JlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlfVwiYCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbUNvdW50ICE9PSByZXF1ZXN0LnBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvci4gTWV0YWRhdGEgZm9yIHNvbWUgcGFyYW1ldGVycyBpbiBzdGF0ZW1lbnQgb3IgcHJvY2VkdXJlIFwiJHtyZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZX1cIiBpcyBtaXNzaW5nIGluIHRoZSByZXN1bHRzZXQgcmV0dXJuZWQgYnkgc3BfZGVzY3JpYmVfcGFyYW1ldGVyX2VuY3J5cHRpb24uYCkpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbChkZWNyeXB0U3ltbWV0cmljS2V5UHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmVxdWVzdC5jcnlwdG9NZXRhZGF0YUxvYWRlZCA9IHRydWU7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKTtcbiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2ssIGVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgbWV0YWRhdGFSZXF1ZXN0LmFkZFBhcmFtZXRlcigndHNxbCcsIFRZUEVTLk5WYXJDaGFyLCByZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSk7XG4gIGlmIChyZXF1ZXN0LnBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgbWV0YWRhdGFSZXF1ZXN0LmFkZFBhcmFtZXRlcigncGFyYW1zJywgVFlQRVMuTlZhckNoYXIsIG1ldGFkYXRhUmVxdWVzdC5tYWtlUGFyYW1zUGFyYW1ldGVyKHJlcXVlc3QucGFyYW1ldGVycykpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0Um93czogYW55W10gPSBbXTtcblxuICBtZXRhZGF0YVJlcXVlc3Qub24oJ3JvdycsIChjb2x1bW5zOiBhbnkpID0+IHtcbiAgICByZXN1bHRSb3dzLnB1c2goY29sdW1ucyk7XG4gIH0pO1xuXG4gIGNvbm5lY3Rpb24ubWFrZVJlcXVlc3QobWV0YWRhdGFSZXF1ZXN0LCBUWVBFLlJQQ19SRVFVRVNULCBuZXcgUnBjUmVxdWVzdFBheWxvYWQobWV0YWRhdGFSZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSEsIG1ldGFkYXRhUmVxdWVzdC5wYXJhbWV0ZXJzLCBjb25uZWN0aW9uLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgY29ubmVjdGlvbi5jb25maWcub3B0aW9ucywgY29ubmVjdGlvbi5kYXRhYmFzZUNvbGxhdGlvbikpO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBRCxPQUFBO0FB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
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.validateAndGetEncryptionAlgorithmName = exports.encryptWithKey = exports.decryptWithKey = exports.decryptSymmetricKey = void 0;
7
+ var _symmetricKeyCache = require("./symmetric-key-cache");
8
+ var _aeadAes256CbcHmacAlgorithm = require("./aead-aes-256-cbc-hmac-algorithm");
9
+ var _aeadAes256CbcHmacEncryptionKey = require("./aead-aes-256-cbc-hmac-encryption-key");
10
+ // This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
11
+ // Copyright (c) 2019 Microsoft Corporation
12
+
13
+ const validateAndGetEncryptionAlgorithmName = (cipherAlgorithmId, cipherAlgorithmName) => {
14
+ if (cipherAlgorithmId !== 2) {
15
+ throw new Error('Custom cipher algorithm not supported.');
16
+ }
17
+ return _aeadAes256CbcHmacAlgorithm.algorithmName;
18
+ };
19
+ exports.validateAndGetEncryptionAlgorithmName = validateAndGetEncryptionAlgorithmName;
20
+ const encryptWithKey = async (plaintext, md, options) => {
21
+ if (!options.trustedServerNameAE) {
22
+ throw new Error('Server name should not be null in EncryptWithKey');
23
+ }
24
+ if (!md.cipherAlgorithm) {
25
+ await decryptSymmetricKey(md, options);
26
+ }
27
+ if (!md.cipherAlgorithm) {
28
+ throw new Error('Cipher Algorithm should not be null in EncryptWithKey');
29
+ }
30
+ const cipherText = md.cipherAlgorithm.encryptData(plaintext);
31
+ if (!cipherText) {
32
+ throw new Error('Internal error. Ciphertext value cannot be null.');
33
+ }
34
+ return cipherText;
35
+ };
36
+ exports.encryptWithKey = encryptWithKey;
37
+ const decryptWithKey = (cipherText, md, options) => {
38
+ if (!options.trustedServerNameAE) {
39
+ throw new Error('Server name should not be null in DecryptWithKey');
40
+ }
41
+
42
+ // if (!md.cipherAlgorithm) {
43
+ // await decryptSymmetricKey(md, options);
44
+ // }
45
+
46
+ if (!md.cipherAlgorithm) {
47
+ throw new Error('Cipher Algorithm should not be null in DecryptWithKey');
48
+ }
49
+ const plainText = md.cipherAlgorithm.decryptData(cipherText);
50
+ if (!plainText) {
51
+ throw new Error('Internal error. Plaintext value cannot be null.');
52
+ }
53
+ return plainText;
54
+ };
55
+ exports.decryptWithKey = decryptWithKey;
56
+ const decryptSymmetricKey = async (md, options) => {
57
+ if (!md) {
58
+ throw new Error('md should not be null in DecryptSymmetricKey.');
59
+ }
60
+ if (!md.cekEntry) {
61
+ throw new Error('md.EncryptionInfo should not be null in DecryptSymmetricKey.');
62
+ }
63
+ if (!md.cekEntry.columnEncryptionKeyValues) {
64
+ throw new Error('md.EncryptionInfo.ColumnEncryptionKeyValues should not be null in DecryptSymmetricKey.');
65
+ }
66
+ let symKey;
67
+ let encryptionKeyInfoChosen;
68
+ const CEKValues = md.cekEntry.columnEncryptionKeyValues;
69
+ let lastError;
70
+ for (const CEKValue of CEKValues) {
71
+ try {
72
+ symKey = await (0, _symmetricKeyCache.getKey)(CEKValue, options);
73
+ if (symKey) {
74
+ encryptionKeyInfoChosen = CEKValue;
75
+ break;
76
+ }
77
+ } catch (error) {
78
+ lastError = error;
79
+ }
80
+ }
81
+ if (!symKey) {
82
+ if (lastError) {
83
+ throw lastError;
84
+ } else {
85
+ throw new Error('Exception while decryption of encrypted column encryption key.');
86
+ }
87
+ }
88
+ const algorithmName = validateAndGetEncryptionAlgorithmName(md.cipherAlgorithmId, md.cipherAlgorithmName);
89
+ const cipherAlgorithm = new _aeadAes256CbcHmacAlgorithm.AeadAes256CbcHmac256Algorithm(new _aeadAes256CbcHmacEncryptionKey.AeadAes256CbcHmac256EncryptionKey(symKey.rootKey, algorithmName), md.encryptionType);
90
+ md.cipherAlgorithm = cipherAlgorithm;
91
+ md.encryptionKeyInfo = encryptionKeyInfoChosen;
92
+ };
93
+ exports.decryptSymmetricKey = decryptSymmetricKey;
94
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3ltbWV0cmljS2V5Q2FjaGUiLCJyZXF1aXJlIiwiX2FlYWRBZXMyNTZDYmNIbWFjQWxnb3JpdGhtIiwiX2FlYWRBZXMyNTZDYmNIbWFjRW5jcnlwdGlvbktleSIsInZhbGlkYXRlQW5kR2V0RW5jcnlwdGlvbkFsZ29yaXRobU5hbWUiLCJjaXBoZXJBbGdvcml0aG1JZCIsImNpcGhlckFsZ29yaXRobU5hbWUiLCJFcnJvciIsImFsZ29yaXRobU5hbWUiLCJleHBvcnRzIiwiZW5jcnlwdFdpdGhLZXkiLCJwbGFpbnRleHQiLCJtZCIsIm9wdGlvbnMiLCJ0cnVzdGVkU2VydmVyTmFtZUFFIiwiY2lwaGVyQWxnb3JpdGhtIiwiZGVjcnlwdFN5bW1ldHJpY0tleSIsImNpcGhlclRleHQiLCJlbmNyeXB0RGF0YSIsImRlY3J5cHRXaXRoS2V5IiwicGxhaW5UZXh0IiwiZGVjcnlwdERhdGEiLCJjZWtFbnRyeSIsImNvbHVtbkVuY3J5cHRpb25LZXlWYWx1ZXMiLCJzeW1LZXkiLCJlbmNyeXB0aW9uS2V5SW5mb0Nob3NlbiIsIkNFS1ZhbHVlcyIsImxhc3RFcnJvciIsIkNFS1ZhbHVlIiwiZ2V0S2V5IiwiZXJyb3IiLCJBZWFkQWVzMjU2Q2JjSG1hYzI1NkFsZ29yaXRobSIsIkFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSIsInJvb3RLZXkiLCJlbmNyeXB0aW9uVHlwZSIsImVuY3J5cHRpb25LZXlJbmZvIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fsd2F5cy1lbmNyeXB0ZWQva2V5LWNyeXB0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgdHlwZSBDcnlwdG9NZXRhZGF0YSwgdHlwZSBFbmNyeXB0aW9uS2V5SW5mbyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgdHlwZSBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zIGFzIENvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgU3ltbWV0cmljS2V5IGZyb20gJy4vc3ltbWV0cmljLWtleSc7XG5pbXBvcnQgeyBnZXRLZXkgfSBmcm9tICcuL3N5bW1ldHJpYy1rZXktY2FjaGUnO1xuaW1wb3J0IHsgQWVhZEFlczI1NkNiY0htYWMyNTZBbGdvcml0aG0sIGFsZ29yaXRobU5hbWUgfSBmcm9tICcuL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1hbGdvcml0aG0nO1xuaW1wb3J0IHsgQWVhZEFlczI1NkNiY0htYWMyNTZFbmNyeXB0aW9uS2V5IH0gZnJvbSAnLi9hZWFkLWFlcy0yNTYtY2JjLWhtYWMtZW5jcnlwdGlvbi1rZXknO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBbmRHZXRFbmNyeXB0aW9uQWxnb3JpdGhtTmFtZSA9IChjaXBoZXJBbGdvcml0aG1JZDogbnVtYmVyLCBjaXBoZXJBbGdvcml0aG1OYW1lPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKGNpcGhlckFsZ29yaXRobUlkICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDdXN0b20gY2lwaGVyIGFsZ29yaXRobSBub3Qgc3VwcG9ydGVkLicpO1xuICB9XG5cbiAgcmV0dXJuIGFsZ29yaXRobU5hbWU7XG59O1xuXG5leHBvcnQgY29uc3QgZW5jcnlwdFdpdGhLZXkgPSBhc3luYyAocGxhaW50ZXh0OiBCdWZmZXIsIG1kOiBDcnlwdG9NZXRhZGF0YSwgb3B0aW9uczogQ29ubmVjdGlvbk9wdGlvbnMpOiBQcm9taXNlPEJ1ZmZlcj4gPT4ge1xuICBpZiAoIW9wdGlvbnMudHJ1c3RlZFNlcnZlck5hbWVBRSkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2VydmVyIG5hbWUgc2hvdWxkIG5vdCBiZSBudWxsIGluIEVuY3J5cHRXaXRoS2V5Jyk7XG4gIH1cblxuICBpZiAoIW1kLmNpcGhlckFsZ29yaXRobSkge1xuICAgIGF3YWl0IGRlY3J5cHRTeW1tZXRyaWNLZXkobWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKCFtZC5jaXBoZXJBbGdvcml0aG0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NpcGhlciBBbGdvcml0aG0gc2hvdWxkIG5vdCBiZSBudWxsIGluIEVuY3J5cHRXaXRoS2V5Jyk7XG4gIH1cblxuICBjb25zdCBjaXBoZXJUZXh0OiBCdWZmZXIgPSBtZC5jaXBoZXJBbGdvcml0aG0uZW5jcnlwdERhdGEocGxhaW50ZXh0KTtcblxuICBpZiAoIWNpcGhlclRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIGVycm9yLiBDaXBoZXJ0ZXh0IHZhbHVlIGNhbm5vdCBiZSBudWxsLicpO1xuICB9XG5cbiAgcmV0dXJuIGNpcGhlclRleHQ7XG59O1xuXG5leHBvcnQgY29uc3QgZGVjcnlwdFdpdGhLZXkgPSAoY2lwaGVyVGV4dDogQnVmZmVyLCBtZDogQ3J5cHRvTWV0YWRhdGEsIG9wdGlvbnM6IENvbm5lY3Rpb25PcHRpb25zKTogQnVmZmVyID0+IHtcbiAgaWYgKCFvcHRpb25zLnRydXN0ZWRTZXJ2ZXJOYW1lQUUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBuYW1lIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0V2l0aEtleScpO1xuICB9XG5cbiAgLy8gaWYgKCFtZC5jaXBoZXJBbGdvcml0aG0pIHtcbiAgLy8gICBhd2FpdCBkZWNyeXB0U3ltbWV0cmljS2V5KG1kLCBvcHRpb25zKTtcbiAgLy8gfVxuXG4gIGlmICghbWQuY2lwaGVyQWxnb3JpdGhtKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDaXBoZXIgQWxnb3JpdGhtIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0V2l0aEtleScpO1xuICB9XG5cbiAgY29uc3QgcGxhaW5UZXh0OiBCdWZmZXIgPSBtZC5jaXBoZXJBbGdvcml0aG0uZGVjcnlwdERhdGEoY2lwaGVyVGV4dCk7XG5cbiAgaWYgKCFwbGFpblRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIGVycm9yLiBQbGFpbnRleHQgdmFsdWUgY2Fubm90IGJlIG51bGwuJyk7XG4gIH1cblxuICByZXR1cm4gcGxhaW5UZXh0O1xufTtcblxuZXhwb3J0IGNvbnN0IGRlY3J5cHRTeW1tZXRyaWNLZXkgPSBhc3luYyAobWQ6IENyeXB0b01ldGFkYXRhLCBvcHRpb25zOiBDb25uZWN0aW9uT3B0aW9ucyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZiAoIW1kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtZCBzaG91bGQgbm90IGJlIG51bGwgaW4gRGVjcnlwdFN5bW1ldHJpY0tleS4nKTtcbiAgfVxuXG4gIGlmICghbWQuY2VrRW50cnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21kLkVuY3J5cHRpb25JbmZvIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0U3ltbWV0cmljS2V5LicpO1xuICB9XG5cbiAgaWYgKCFtZC5jZWtFbnRyeS5jb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtZC5FbmNyeXB0aW9uSW5mby5Db2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0U3ltbWV0cmljS2V5LicpO1xuICB9XG5cbiAgbGV0IHN5bUtleTogU3ltbWV0cmljS2V5IHwgdW5kZWZpbmVkO1xuICBsZXQgZW5jcnlwdGlvbktleUluZm9DaG9zZW46IEVuY3J5cHRpb25LZXlJbmZvIHwgdW5kZWZpbmVkO1xuICBjb25zdCBDRUtWYWx1ZXM6IEVuY3J5cHRpb25LZXlJbmZvW10gPSBtZC5jZWtFbnRyeS5jb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzO1xuICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IENFS1ZhbHVlIG9mIENFS1ZhbHVlcykge1xuICAgIHRyeSB7XG4gICAgICBzeW1LZXkgPSBhd2FpdCBnZXRLZXkoQ0VLVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgaWYgKHN5bUtleSkge1xuICAgICAgICBlbmNyeXB0aW9uS2V5SW5mb0Nob3NlbiA9IENFS1ZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBpZiAoIXN5bUtleSkge1xuICAgIGlmIChsYXN0RXJyb3IpIHtcbiAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeGNlcHRpb24gd2hpbGUgZGVjcnlwdGlvbiBvZiBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5LicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFsZ29yaXRobU5hbWUgPSB2YWxpZGF0ZUFuZEdldEVuY3J5cHRpb25BbGdvcml0aG1OYW1lKG1kLmNpcGhlckFsZ29yaXRobUlkLCBtZC5jaXBoZXJBbGdvcml0aG1OYW1lKTtcbiAgY29uc3QgY2lwaGVyQWxnb3JpdGhtID0gbmV3IEFlYWRBZXMyNTZDYmNIbWFjMjU2QWxnb3JpdGhtKG5ldyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXkoc3ltS2V5LnJvb3RLZXksIGFsZ29yaXRobU5hbWUpLCBtZC5lbmNyeXB0aW9uVHlwZSk7XG5cbiAgbWQuY2lwaGVyQWxnb3JpdGhtID0gY2lwaGVyQWxnb3JpdGhtO1xuICBtZC5lbmNyeXB0aW9uS2V5SW5mbyA9IGVuY3J5cHRpb25LZXlJbmZvQ2hvc2VuIGFzIEVuY3J5cHRpb25LZXlJbmZvO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBTUEsSUFBQUEsa0JBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLDJCQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSwrQkFBQSxHQUFB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
@@ -0,0 +1,21 @@
1
+ export declare class ColumnEncryptionAzureKeyVaultProvider {
2
+ readonly name: string;
3
+ private url;
4
+ private readonly rsaEncryptionAlgorithmWithOAEPForAKV;
5
+ private readonly firstVersion;
6
+ private credentials;
7
+ private readonly azureKeyVaultDomainName;
8
+ private keyClient;
9
+ constructor(clientId: string, clientKey: string, tenantId: string);
10
+ decryptColumnEncryptionKey(masterKeyPath: string, encryptionAlgorithm: string, encryptedColumnEncryptionKey: Buffer): Promise<Buffer>;
11
+ encryptColumnEncryptionKey(masterKeyPath: string, encryptionAlgorithm: string, columnEncryptionKey: Buffer): Promise<Buffer>;
12
+ private getMasterKey;
13
+ private createKeyClient;
14
+ private createCryptoClient;
15
+ private parsePath;
16
+ private azureKeyVaultSignedHashedData;
17
+ private azureKeyVaultWrap;
18
+ private azureKeyVaultUnWrap;
19
+ private getAKVKeySize;
20
+ private validateEncryptionAlgorithm;
21
+ }
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ColumnEncryptionAzureKeyVaultProvider = void 0;
7
+ var _identity = require("@azure/identity");
8
+ var _keyvaultKeys = require("@azure/keyvault-keys");
9
+ var _crypto = require("crypto");
10
+ var _url = require("url");
11
+ // This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
12
+ // Copyright (c) 2019 Microsoft Corporation
13
+
14
+ class ColumnEncryptionAzureKeyVaultProvider {
15
+ constructor(clientId, clientKey, tenantId) {
16
+ this.name = 'AZURE_KEY_VAULT';
17
+ this.azureKeyVaultDomainName = 'vault.azure.net';
18
+ this.rsaEncryptionAlgorithmWithOAEPForAKV = 'RSA-OAEP';
19
+ this.firstVersion = Buffer.from([0x01]);
20
+ this.credentials = new _identity.ClientSecretCredential(tenantId, clientId, clientKey);
21
+ }
22
+ async decryptColumnEncryptionKey(masterKeyPath, encryptionAlgorithm, encryptedColumnEncryptionKey) {
23
+ if (!encryptedColumnEncryptionKey) {
24
+ throw new Error('Internal error. Encrypted column encryption key cannot be null.');
25
+ }
26
+ if (encryptedColumnEncryptionKey.length === 0) {
27
+ throw new Error('Internal error. Empty encrypted column encryption key specified.');
28
+ }
29
+ encryptionAlgorithm = this.validateEncryptionAlgorithm(encryptionAlgorithm);
30
+ const masterKey = await this.getMasterKey(masterKeyPath);
31
+ const keySizeInBytes = this.getAKVKeySize(masterKey);
32
+ const cryptoClient = this.createCryptoClient(masterKey);
33
+ if (encryptedColumnEncryptionKey[0] !== this.firstVersion[0]) {
34
+ throw new Error(`Specified encrypted column encryption key contains an invalid encryption algorithm version ${Buffer.from([encryptedColumnEncryptionKey[0]]).toString('hex')}. Expected version is ${Buffer.from([this.firstVersion[0]]).toString('hex')}.`);
35
+ }
36
+ let currentIndex = this.firstVersion.length;
37
+ const keyPathLength = encryptedColumnEncryptionKey.readInt16LE(currentIndex);
38
+ currentIndex += 2;
39
+ const cipherTextLength = encryptedColumnEncryptionKey.readInt16LE(currentIndex);
40
+ currentIndex += 2;
41
+ currentIndex += keyPathLength;
42
+ if (cipherTextLength !== keySizeInBytes) {
43
+ throw new Error(`The specified encrypted column encryption key's ciphertext length: ${cipherTextLength} does not match the ciphertext length: ${keySizeInBytes} when using column master key (Azure Key Vault key) in ${masterKeyPath}. The encrypted column encryption key may be corrupt, or the specified Azure Key Vault key path may be incorrect.`);
44
+ }
45
+ const signatureLength = encryptedColumnEncryptionKey.length - currentIndex - cipherTextLength;
46
+ if (signatureLength !== keySizeInBytes) {
47
+ throw new Error(`The specified encrypted column encryption key's signature length: ${signatureLength} does not match the signature length: ${keySizeInBytes} when using column master key (Azure Key Vault key) in ${masterKeyPath}. The encrypted column encryption key may be corrupt, or the specified Azure Key Vault key path may be incorrect.`);
48
+ }
49
+ const cipherText = Buffer.alloc(cipherTextLength);
50
+ encryptedColumnEncryptionKey.copy(cipherText, 0, currentIndex, currentIndex + cipherTextLength);
51
+ currentIndex += cipherTextLength;
52
+ const signature = Buffer.alloc(signatureLength);
53
+ encryptedColumnEncryptionKey.copy(signature, 0, currentIndex, currentIndex + signatureLength);
54
+ const hash = Buffer.alloc(encryptedColumnEncryptionKey.length - signature.length);
55
+ encryptedColumnEncryptionKey.copy(hash, 0, 0, encryptedColumnEncryptionKey.length - signature.length);
56
+ const messageDigest = (0, _crypto.createHash)('sha256');
57
+ messageDigest.update(hash);
58
+ const dataToVerify = messageDigest.digest();
59
+ if (!dataToVerify) {
60
+ throw new Error('Hash should not be null while decrypting encrypted column encryption key.');
61
+ }
62
+ const verifyKey = await cryptoClient.verify('RS256', dataToVerify, signature);
63
+ if (!verifyKey.result) {
64
+ throw new Error(`The specified encrypted column encryption key signature does not match the signature computed with the column master key (Asymmetric key in Azure Key Vault) in ${masterKeyPath}. The encrypted column encryption key may be corrupt, or the specified path may be incorrect.`);
65
+ }
66
+ const decryptedCEK = await this.azureKeyVaultUnWrap(cryptoClient, encryptionAlgorithm, cipherText);
67
+ return decryptedCEK;
68
+ }
69
+ async encryptColumnEncryptionKey(masterKeyPath, encryptionAlgorithm, columnEncryptionKey) {
70
+ if (!columnEncryptionKey) {
71
+ throw new Error('Column encryption key cannot be null.');
72
+ }
73
+ if (columnEncryptionKey.length === 0) {
74
+ throw new Error('Empty column encryption key specified.');
75
+ }
76
+ encryptionAlgorithm = this.validateEncryptionAlgorithm(encryptionAlgorithm);
77
+ const masterKey = await this.getMasterKey(masterKeyPath);
78
+ const keySizeInBytes = this.getAKVKeySize(masterKey);
79
+ const cryptoClient = this.createCryptoClient(masterKey);
80
+ const version = Buffer.from([this.firstVersion[0]]);
81
+ const masterKeyPathBytes = Buffer.from(masterKeyPath.toLowerCase(), 'utf8');
82
+ const keyPathLength = Buffer.alloc(2);
83
+ keyPathLength[0] = masterKeyPathBytes.length & 0xff;
84
+ keyPathLength[1] = masterKeyPathBytes.length >> 8 & 0xff;
85
+ const cipherText = await this.azureKeyVaultWrap(cryptoClient, encryptionAlgorithm, columnEncryptionKey);
86
+ const cipherTextLength = Buffer.alloc(2);
87
+ cipherTextLength[0] = cipherText.length & 0xff;
88
+ cipherTextLength[1] = cipherText.length >> 8 & 0xff;
89
+ if (cipherText.length !== keySizeInBytes) {
90
+ throw new Error('CipherText length does not match the RSA key size.');
91
+ }
92
+ const dataToHash = Buffer.alloc(version.length + keyPathLength.length + cipherTextLength.length + masterKeyPathBytes.length + cipherText.length);
93
+ let destinationPosition = version.length;
94
+ version.copy(dataToHash, 0, 0, version.length);
95
+ keyPathLength.copy(dataToHash, destinationPosition, 0, keyPathLength.length);
96
+ destinationPosition += keyPathLength.length;
97
+ cipherTextLength.copy(dataToHash, destinationPosition, 0, cipherTextLength.length);
98
+ destinationPosition += cipherTextLength.length;
99
+ masterKeyPathBytes.copy(dataToHash, destinationPosition, 0, masterKeyPathBytes.length);
100
+ destinationPosition += masterKeyPathBytes.length;
101
+ cipherText.copy(dataToHash, destinationPosition, 0, cipherText.length);
102
+ const messageDigest = (0, _crypto.createHash)('sha256');
103
+ messageDigest.update(dataToHash);
104
+ const dataToSign = messageDigest.digest();
105
+ const signedHash = await this.azureKeyVaultSignedHashedData(cryptoClient, dataToSign);
106
+ if (signedHash.length !== keySizeInBytes) {
107
+ throw new Error('Signed hash length does not match the RSA key size.');
108
+ }
109
+ const verifyKey = await cryptoClient.verify('RS256', dataToSign, signedHash);
110
+ if (!verifyKey.result) {
111
+ throw new Error('Invalid signature of the encrypted column encryption key computed.');
112
+ }
113
+ const encryptedColumnEncryptionKeyLength = version.length + cipherTextLength.length + keyPathLength.length + cipherText.length + masterKeyPathBytes.length + signedHash.length;
114
+ const encryptedColumnEncryptionKey = Buffer.alloc(encryptedColumnEncryptionKeyLength);
115
+ let currentIndex = 0;
116
+ version.copy(encryptedColumnEncryptionKey, currentIndex, 0, version.length);
117
+ currentIndex += version.length;
118
+ keyPathLength.copy(encryptedColumnEncryptionKey, currentIndex, 0, keyPathLength.length);
119
+ currentIndex += keyPathLength.length;
120
+ cipherTextLength.copy(encryptedColumnEncryptionKey, currentIndex, 0, cipherTextLength.length);
121
+ currentIndex += cipherTextLength.length;
122
+ masterKeyPathBytes.copy(encryptedColumnEncryptionKey, currentIndex, 0, masterKeyPathBytes.length);
123
+ currentIndex += masterKeyPathBytes.length;
124
+ cipherText.copy(encryptedColumnEncryptionKey, currentIndex, 0, cipherText.length);
125
+ currentIndex += cipherText.length;
126
+ signedHash.copy(encryptedColumnEncryptionKey, currentIndex, 0, signedHash.length);
127
+ return encryptedColumnEncryptionKey;
128
+ }
129
+ async getMasterKey(masterKeyPath) {
130
+ if (!masterKeyPath) {
131
+ throw new Error('Master key path cannot be null or undefined');
132
+ }
133
+ const keyParts = this.parsePath(masterKeyPath);
134
+ this.createKeyClient(keyParts.vaultUrl);
135
+ return await this.keyClient.getKey(keyParts.name, keyParts.version ? {
136
+ version: keyParts.version
137
+ } : {});
138
+ }
139
+ createKeyClient(keyVaultUrl) {
140
+ if (!keyVaultUrl) {
141
+ throw new Error('Cannot create key client with null or undefined keyVaultUrl');
142
+ }
143
+ if (!this.keyClient) {
144
+ this.url = keyVaultUrl;
145
+ this.keyClient = new _keyvaultKeys.KeyClient(keyVaultUrl, this.credentials);
146
+ }
147
+ }
148
+ createCryptoClient(masterKey) {
149
+ if (!masterKey) {
150
+ throw new Error('Cannot create CryptographyClient with null or undefined masterKey');
151
+ }
152
+ return new _keyvaultKeys.CryptographyClient(masterKey, this.credentials);
153
+ }
154
+ parsePath(masterKeyPath) {
155
+ if (!masterKeyPath || masterKeyPath.trim() === '') {
156
+ throw new Error('Azure Key Vault key path cannot be null.');
157
+ }
158
+ let baseUri;
159
+ try {
160
+ baseUri = (0, _url.parse)(masterKeyPath, true, true);
161
+ } catch {
162
+ throw new Error(`Invalid keys identifier: ${masterKeyPath}. Not a valid URI`);
163
+ }
164
+ if (!baseUri.hostname || !baseUri.hostname.toLowerCase().endsWith(this.azureKeyVaultDomainName)) {
165
+ throw new Error(`Invalid Azure Key Vault key path specified: ${masterKeyPath}.`);
166
+ }
167
+
168
+ // Path is of the form '/collection/name[/version]'
169
+ const segments = (baseUri.pathname || '').split('/');
170
+ if (segments.length !== 3 && segments.length !== 4) {
171
+ throw new Error(`Invalid keys identifier: ${masterKeyPath}. Bad number of segments: ${segments.length}`);
172
+ }
173
+ if ('keys' !== segments[1]) {
174
+ throw new Error(`Invalid keys identifier: ${masterKeyPath}. segment [1] should be "keys", found "${segments[1]}"`);
175
+ }
176
+ const vaultUrl = `${baseUri.protocol}//${baseUri.host}`;
177
+ const name = segments[2];
178
+ const version = segments.length === 4 ? segments[3] : undefined;
179
+ return {
180
+ vaultUrl,
181
+ name,
182
+ version
183
+ };
184
+ }
185
+ async azureKeyVaultSignedHashedData(cryptoClient, dataToSign) {
186
+ if (!cryptoClient) {
187
+ throw new Error('Azure KVS Crypto Client is not defined.');
188
+ }
189
+ const signedData = await cryptoClient.sign('RS256', dataToSign);
190
+ return Buffer.from(signedData.result);
191
+ }
192
+ async azureKeyVaultWrap(cryptoClient, encryptionAlgorithm, columnEncryptionKey) {
193
+ if (!cryptoClient) {
194
+ throw new Error('Azure KVS Crypto Client is not defined.');
195
+ }
196
+ if (!columnEncryptionKey) {
197
+ throw new Error('Column encryption key cannot be null.');
198
+ }
199
+ const wrappedKey = await cryptoClient.wrapKey(encryptionAlgorithm, columnEncryptionKey);
200
+ return Buffer.from(wrappedKey.result);
201
+ }
202
+ async azureKeyVaultUnWrap(cryptoClient, encryptionAlgorithm, encryptedColumnEncryptionKey) {
203
+ if (!cryptoClient) {
204
+ throw new Error('Azure KVS Crypto Client is not defined.');
205
+ }
206
+ if (!encryptionAlgorithm) {
207
+ throw new Error('Encryption Algorithm cannot be null or undefined');
208
+ }
209
+ if (!encryptedColumnEncryptionKey) {
210
+ throw new Error('Encrypted column encryption key cannot be null.');
211
+ }
212
+ if (encryptedColumnEncryptionKey.length === 0) {
213
+ throw new Error('Encrypted Column Encryption Key length should not be zero.');
214
+ }
215
+ const unwrappedKey = await cryptoClient.unwrapKey(encryptionAlgorithm, encryptedColumnEncryptionKey);
216
+ return Buffer.from(unwrappedKey.result);
217
+ }
218
+ getAKVKeySize(retrievedKey) {
219
+ if (!retrievedKey) {
220
+ throw new Error('Retrieved key cannot be null or undefined');
221
+ }
222
+ const key = retrievedKey.key;
223
+ if (!key) {
224
+ throw new Error(`Key does not exist ${retrievedKey.name}`);
225
+ }
226
+ const kty = key && key.kty && key.kty.toString().toUpperCase();
227
+ if (!kty || 'RSA'.localeCompare(kty, 'en') !== 0) {
228
+ throw new Error(`Cannot use a non-RSA key: ${kty}.`);
229
+ }
230
+ const keyLength = key && key.n && key.n.length;
231
+ return keyLength || 0;
232
+ }
233
+ validateEncryptionAlgorithm(encryptionAlgorithm) {
234
+ if (!encryptionAlgorithm) {
235
+ throw new Error('Key encryption algorithm cannot be null.');
236
+ }
237
+ if ('RSA_OAEP'.localeCompare(encryptionAlgorithm.toUpperCase(), 'en') === 0) {
238
+ encryptionAlgorithm = 'RSA-OAEP';
239
+ }
240
+ if (this.rsaEncryptionAlgorithmWithOAEPForAKV.localeCompare(encryptionAlgorithm.trim().toUpperCase(), 'en') !== 0) {
241
+ throw new Error(`Invalid key encryption algorithm specified: ${encryptionAlgorithm}. Expected value: ${this.rsaEncryptionAlgorithmWithOAEPForAKV}.`);
242
+ }
243
+ return encryptionAlgorithm;
244
+ }
245
+ }
246
+ exports.ColumnEncryptionAzureKeyVaultProvider = ColumnEncryptionAzureKeyVaultProvider;
247
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaWRlbnRpdHkiLCJyZXF1aXJlIiwiX2tleXZhdWx0S2V5cyIsIl9jcnlwdG8iLCJfdXJsIiwiQ29sdW1uRW5jcnlwdGlvbkF6dXJlS2V5VmF1bHRQcm92aWRlciIsImNvbnN0cnVjdG9yIiwiY2xpZW50SWQiLCJjbGllbnRLZXkiLCJ0ZW5hbnRJZCIsIm5hbWUiLCJhenVyZUtleVZhdWx0RG9tYWluTmFtZSIsInJzYUVuY3J5cHRpb25BbGdvcml0aG1XaXRoT0FFUEZvckFLViIsImZpcnN0VmVyc2lvbiIsIkJ1ZmZlciIsImZyb20iLCJjcmVkZW50aWFscyIsIkNsaWVudFNlY3JldENyZWRlbnRpYWwiLCJkZWNyeXB0Q29sdW1uRW5jcnlwdGlvbktleSIsIm1hc3RlcktleVBhdGgiLCJlbmNyeXB0aW9uQWxnb3JpdGhtIiwiZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSIsIkVycm9yIiwibGVuZ3RoIiwidmFsaWRhdGVFbmNyeXB0aW9uQWxnb3JpdGhtIiwibWFzdGVyS2V5IiwiZ2V0TWFzdGVyS2V5Iiwia2V5U2l6ZUluQnl0ZXMiLCJnZXRBS1ZLZXlTaXplIiwiY3J5cHRvQ2xpZW50IiwiY3JlYXRlQ3J5cHRvQ2xpZW50IiwidG9TdHJpbmciLCJjdXJyZW50SW5kZXgiLCJrZXlQYXRoTGVuZ3RoIiwicmVhZEludDE2TEUiLCJjaXBoZXJUZXh0TGVuZ3RoIiwic2lnbmF0dXJlTGVuZ3RoIiwiY2lwaGVyVGV4dCIsImFsbG9jIiwiY29weSIsInNpZ25hdHVyZSIsImhhc2giLCJtZXNzYWdlRGlnZXN0IiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsImRhdGFUb1ZlcmlmeSIsImRpZ2VzdCIsInZlcmlmeUtleSIsInZlcmlmeSIsInJlc3VsdCIsImRlY3J5cHRlZENFSyIsImF6dXJlS2V5VmF1bHRVbldyYXAiLCJlbmNyeXB0Q29sdW1uRW5jcnlwdGlvbktleSIsImNvbHVtbkVuY3J5cHRpb25LZXkiLCJ2ZXJzaW9uIiwibWFzdGVyS2V5UGF0aEJ5dGVzIiwidG9Mb3dlckNhc2UiLCJhenVyZUtleVZhdWx0V3JhcCIsImRhdGFUb0hhc2giLCJkZXN0aW5hdGlvblBvc2l0aW9uIiwiZGF0YVRvU2lnbiIsInNpZ25lZEhhc2giLCJhenVyZUtleVZhdWx0U2lnbmVkSGFzaGVkRGF0YSIsImVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXlMZW5ndGgiLCJrZXlQYXJ0cyIsInBhcnNlUGF0aCIsImNyZWF0ZUtleUNsaWVudCIsInZhdWx0VXJsIiwia2V5Q2xpZW50IiwiZ2V0S2V5Iiwia2V5VmF1bHRVcmwiLCJ1cmwiLCJLZXlDbGllbnQiLCJDcnlwdG9ncmFwaHlDbGllbnQiLCJ0cmltIiwiYmFzZVVyaSIsInBhcnNlIiwiaG9zdG5hbWUiLCJlbmRzV2l0aCIsInNlZ21lbnRzIiwicGF0aG5hbWUiLCJzcGxpdCIsInByb3RvY29sIiwiaG9zdCIsInVuZGVmaW5lZCIsInNpZ25lZERhdGEiLCJzaWduIiwid3JhcHBlZEtleSIsIndyYXBLZXkiLCJ1bndyYXBwZWRLZXkiLCJ1bndyYXBLZXkiLCJyZXRyaWV2ZWRLZXkiLCJrZXkiLCJrdHkiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJrZXlMZW5ndGgiLCJuIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2tleXN0b3JlLXByb3ZpZGVyLWF6dXJlLWtleS12YXVsdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgQ2xpZW50U2VjcmV0Q3JlZGVudGlhbCB9IGZyb20gJ0BhenVyZS9pZGVudGl0eSc7XG5pbXBvcnQgeyBDcnlwdG9ncmFwaHlDbGllbnQsIHR5cGUgS2V5V3JhcEFsZ29yaXRobSwgS2V5Q2xpZW50LCB0eXBlIEtleVZhdWx0S2V5IH0gZnJvbSAnQGF6dXJlL2tleXZhdWx0LWtleXMnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3VybCc7XG5cbmludGVyZmFjZSBQYXJzZWRLZXlQYXRoIHtcbiAgdmF1bHRVcmw6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgQ29sdW1uRW5jcnlwdGlvbkF6dXJlS2V5VmF1bHRQcm92aWRlciB7XG4gIGRlY2xhcmUgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgZGVjbGFyZSBwcml2YXRlIHVybDogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBkZWNsYXJlIHByaXZhdGUgcmVhZG9ubHkgcnNhRW5jcnlwdGlvbkFsZ29yaXRobVdpdGhPQUVQRm9yQUtWOiBzdHJpbmc7XG4gIGRlY2xhcmUgcHJpdmF0ZSByZWFkb25seSBmaXJzdFZlcnNpb246IEJ1ZmZlcjtcbiAgZGVjbGFyZSBwcml2YXRlIGNyZWRlbnRpYWxzOiBDbGllbnRTZWNyZXRDcmVkZW50aWFsO1xuICBkZWNsYXJlIHByaXZhdGUgcmVhZG9ubHkgYXp1cmVLZXlWYXVsdERvbWFpbk5hbWU6IHN0cmluZztcbiAgZGVjbGFyZSBwcml2YXRlIGtleUNsaWVudDogdW5kZWZpbmVkIHwgS2V5Q2xpZW50O1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudElkOiBzdHJpbmcsIGNsaWVudEtleTogc3RyaW5nLCB0ZW5hbnRJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gJ0FaVVJFX0tFWV9WQVVMVCc7XG4gICAgdGhpcy5henVyZUtleVZhdWx0RG9tYWluTmFtZSA9ICd2YXVsdC5henVyZS5uZXQnO1xuICAgIHRoaXMucnNhRW5jcnlwdGlvbkFsZ29yaXRobVdpdGhPQUVQRm9yQUtWID0gJ1JTQS1PQUVQJztcbiAgICB0aGlzLmZpcnN0VmVyc2lvbiA9IEJ1ZmZlci5mcm9tKFsweDAxXSk7XG4gICAgdGhpcy5jcmVkZW50aWFscyA9IG5ldyBDbGllbnRTZWNyZXRDcmVkZW50aWFsKHRlbmFudElkLCBjbGllbnRJZCwgY2xpZW50S2V5KTtcbiAgfVxuXG4gIGFzeW5jIGRlY3J5cHRDb2x1bW5FbmNyeXB0aW9uS2V5KG1hc3RlcktleVBhdGg6IHN0cmluZywgZW5jcnlwdGlvbkFsZ29yaXRobTogc3RyaW5nLCBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5OiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICghZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBlcnJvci4gRW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgZXJyb3IuIEVtcHR5IGVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgc3BlY2lmaWVkLicpO1xuICAgIH1cblxuICAgIGVuY3J5cHRpb25BbGdvcml0aG0gPSB0aGlzLnZhbGlkYXRlRW5jcnlwdGlvbkFsZ29yaXRobShlbmNyeXB0aW9uQWxnb3JpdGhtKTtcblxuICAgIGNvbnN0IG1hc3RlcktleSA9IGF3YWl0IHRoaXMuZ2V0TWFzdGVyS2V5KG1hc3RlcktleVBhdGgpO1xuXG4gICAgY29uc3Qga2V5U2l6ZUluQnl0ZXMgPSB0aGlzLmdldEFLVktleVNpemUobWFzdGVyS2V5KTtcblxuICAgIGNvbnN0IGNyeXB0b0NsaWVudCA9IHRoaXMuY3JlYXRlQ3J5cHRvQ2xpZW50KG1hc3RlcktleSk7XG5cbiAgICBpZiAoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleVswXSAhPT0gdGhpcy5maXJzdFZlcnNpb25bMF0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3BlY2lmaWVkIGVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgY29udGFpbnMgYW4gaW52YWxpZCBlbmNyeXB0aW9uIGFsZ29yaXRobSB2ZXJzaW9uICR7QnVmZmVyLmZyb20oW2VuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXlbMF1dKS50b1N0cmluZygnaGV4Jyl9LiBFeHBlY3RlZCB2ZXJzaW9uIGlzICR7QnVmZmVyLmZyb20oW3RoaXMuZmlyc3RWZXJzaW9uWzBdXSkudG9TdHJpbmcoJ2hleCcpfS5gKTtcbiAgICB9XG5cbiAgICBsZXQgY3VycmVudEluZGV4ID0gdGhpcy5maXJzdFZlcnNpb24ubGVuZ3RoO1xuICAgIGNvbnN0IGtleVBhdGhMZW5ndGg6IG51bWJlciA9IGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkucmVhZEludDE2TEUoY3VycmVudEluZGV4KTtcblxuICAgIGN1cnJlbnRJbmRleCArPSAyO1xuXG4gICAgY29uc3QgY2lwaGVyVGV4dExlbmd0aDogbnVtYmVyID0gZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5yZWFkSW50MTZMRShjdXJyZW50SW5kZXgpO1xuXG4gICAgY3VycmVudEluZGV4ICs9IDI7XG5cbiAgICBjdXJyZW50SW5kZXggKz0ga2V5UGF0aExlbmd0aDtcblxuICAgIGlmIChjaXBoZXJUZXh0TGVuZ3RoICE9PSBrZXlTaXplSW5CeXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3BlY2lmaWVkIGVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkncyBjaXBoZXJ0ZXh0IGxlbmd0aDogJHtjaXBoZXJUZXh0TGVuZ3RofSBkb2VzIG5vdCBtYXRjaCB0aGUgY2lwaGVydGV4dCBsZW5ndGg6ICR7a2V5U2l6ZUluQnl0ZXN9IHdoZW4gdXNpbmcgY29sdW1uIG1hc3RlciBrZXkgKEF6dXJlIEtleSBWYXVsdCBrZXkpIGluICR7bWFzdGVyS2V5UGF0aH0uIFRoZSBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IG1heSBiZSBjb3JydXB0LCBvciB0aGUgc3BlY2lmaWVkIEF6dXJlIEtleSBWYXVsdCBrZXkgcGF0aCBtYXkgYmUgaW5jb3JyZWN0LmApO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25hdHVyZUxlbmd0aDogbnVtYmVyID0gZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5sZW5ndGggLSBjdXJyZW50SW5kZXggLSBjaXBoZXJUZXh0TGVuZ3RoO1xuXG4gICAgaWYgKHNpZ25hdHVyZUxlbmd0aCAhPT0ga2V5U2l6ZUluQnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNwZWNpZmllZCBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5J3Mgc2lnbmF0dXJlIGxlbmd0aDogJHtzaWduYXR1cmVMZW5ndGh9IGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgbGVuZ3RoOiAke2tleVNpemVJbkJ5dGVzfSB3aGVuIHVzaW5nIGNvbHVtbiBtYXN0ZXIga2V5IChBenVyZSBLZXkgVmF1bHQga2V5KSBpbiAke21hc3RlcktleVBhdGh9LiBUaGUgZW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBtYXkgYmUgY29ycnVwdCwgb3IgdGhlIHNwZWNpZmllZCBBenVyZSBLZXkgVmF1bHQga2V5IHBhdGggbWF5IGJlIGluY29ycmVjdC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaXBoZXJUZXh0ID0gQnVmZmVyLmFsbG9jKGNpcGhlclRleHRMZW5ndGgpO1xuICAgIGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkuY29weShjaXBoZXJUZXh0LCAwLCBjdXJyZW50SW5kZXgsIGN1cnJlbnRJbmRleCArIGNpcGhlclRleHRMZW5ndGgpO1xuICAgIGN1cnJlbnRJbmRleCArPSBjaXBoZXJUZXh0TGVuZ3RoO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gQnVmZmVyLmFsbG9jKHNpZ25hdHVyZUxlbmd0aCk7XG4gICAgZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5jb3B5KHNpZ25hdHVyZSwgMCwgY3VycmVudEluZGV4LCBjdXJyZW50SW5kZXggKyBzaWduYXR1cmVMZW5ndGgpO1xuXG4gICAgY29uc3QgaGFzaCA9IEJ1ZmZlci5hbGxvYyhlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5Lmxlbmd0aCAtIHNpZ25hdHVyZS5sZW5ndGgpO1xuICAgIGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkuY29weShoYXNoLCAwLCAwLCBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5Lmxlbmd0aCAtIHNpZ25hdHVyZS5sZW5ndGgpO1xuXG4gICAgY29uc3QgbWVzc2FnZURpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICAgIG1lc3NhZ2VEaWdlc3QudXBkYXRlKGhhc2gpO1xuXG4gICAgY29uc3QgZGF0YVRvVmVyaWZ5OiBCdWZmZXIgPSBtZXNzYWdlRGlnZXN0LmRpZ2VzdCgpO1xuXG4gICAgaWYgKCFkYXRhVG9WZXJpZnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSGFzaCBzaG91bGQgbm90IGJlIG51bGwgd2hpbGUgZGVjcnlwdGluZyBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5LicpO1xuICAgIH1cblxuICAgIGNvbnN0IHZlcmlmeUtleSA9IGF3YWl0IGNyeXB0b0NsaWVudC52ZXJpZnkoJ1JTMjU2JywgZGF0YVRvVmVyaWZ5LCBzaWduYXR1cmUpO1xuICAgIGlmICghdmVyaWZ5S2V5LnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3BlY2lmaWVkIGVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgY29tcHV0ZWQgd2l0aCB0aGUgY29sdW1uIG1hc3RlciBrZXkgKEFzeW1tZXRyaWMga2V5IGluIEF6dXJlIEtleSBWYXVsdCkgaW4gJHttYXN0ZXJLZXlQYXRofS4gVGhlIGVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgbWF5IGJlIGNvcnJ1cHQsIG9yIHRoZSBzcGVjaWZpZWQgcGF0aCBtYXkgYmUgaW5jb3JyZWN0LmApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3J5cHRlZENFSzogQnVmZmVyID0gYXdhaXQgdGhpcy5henVyZUtleVZhdWx0VW5XcmFwKGNyeXB0b0NsaWVudCwgZW5jcnlwdGlvbkFsZ29yaXRobSwgY2lwaGVyVGV4dCk7XG5cbiAgICByZXR1cm4gZGVjcnlwdGVkQ0VLO1xuICB9XG5cbiAgYXN5bmMgZW5jcnlwdENvbHVtbkVuY3J5cHRpb25LZXkobWFzdGVyS2V5UGF0aDogc3RyaW5nLCBlbmNyeXB0aW9uQWxnb3JpdGhtOiBzdHJpbmcsIGNvbHVtbkVuY3J5cHRpb25LZXk6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgaWYgKCFjb2x1bW5FbmNyeXB0aW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbiBlbmNyeXB0aW9uIGtleSBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBpZiAoY29sdW1uRW5jcnlwdGlvbktleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW1wdHkgY29sdW1uIGVuY3J5cHRpb24ga2V5IHNwZWNpZmllZC4nKTtcbiAgICB9XG5cbiAgICBlbmNyeXB0aW9uQWxnb3JpdGhtID0gdGhpcy52YWxpZGF0ZUVuY3J5cHRpb25BbGdvcml0aG0oZW5jcnlwdGlvbkFsZ29yaXRobSk7XG5cbiAgICBjb25zdCBtYXN0ZXJLZXkgPSBhd2FpdCB0aGlzLmdldE1hc3RlcktleShtYXN0ZXJLZXlQYXRoKTtcblxuICAgIGNvbnN0IGtleVNpemVJbkJ5dGVzID0gdGhpcy5nZXRBS1ZLZXlTaXplKG1hc3RlcktleSk7XG5cbiAgICBjb25zdCBjcnlwdG9DbGllbnQgPSB0aGlzLmNyZWF0ZUNyeXB0b0NsaWVudChtYXN0ZXJLZXkpO1xuXG4gICAgY29uc3QgdmVyc2lvbiA9IEJ1ZmZlci5mcm9tKFt0aGlzLmZpcnN0VmVyc2lvblswXV0pO1xuXG4gICAgY29uc3QgbWFzdGVyS2V5UGF0aEJ5dGVzOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShtYXN0ZXJLZXlQYXRoLnRvTG93ZXJDYXNlKCksICd1dGY4Jyk7XG5cbiAgICBjb25zdCBrZXlQYXRoTGVuZ3RoOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMik7XG5cbiAgICBrZXlQYXRoTGVuZ3RoWzBdID0gbWFzdGVyS2V5UGF0aEJ5dGVzLmxlbmd0aCAmIDB4ZmY7XG4gICAga2V5UGF0aExlbmd0aFsxXSA9IG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGggPj4gOCAmIDB4ZmY7XG5cbiAgICBjb25zdCBjaXBoZXJUZXh0OiBCdWZmZXIgPSBhd2FpdCB0aGlzLmF6dXJlS2V5VmF1bHRXcmFwKGNyeXB0b0NsaWVudCwgZW5jcnlwdGlvbkFsZ29yaXRobSwgY29sdW1uRW5jcnlwdGlvbktleSk7XG5cbiAgICBjb25zdCBjaXBoZXJUZXh0TGVuZ3RoOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMik7XG5cbiAgICBjaXBoZXJUZXh0TGVuZ3RoWzBdID0gY2lwaGVyVGV4dC5sZW5ndGggJiAweGZmO1xuICAgIGNpcGhlclRleHRMZW5ndGhbMV0gPSBjaXBoZXJUZXh0Lmxlbmd0aCA+PiA4ICYgMHhmZjtcblxuICAgIGlmIChjaXBoZXJUZXh0Lmxlbmd0aCAhPT0ga2V5U2l6ZUluQnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2lwaGVyVGV4dCBsZW5ndGggZG9lcyBub3QgbWF0Y2ggdGhlIFJTQSBrZXkgc2l6ZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhVG9IYXNoOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2ModmVyc2lvbi5sZW5ndGggKyBrZXlQYXRoTGVuZ3RoLmxlbmd0aCArIGNpcGhlclRleHRMZW5ndGgubGVuZ3RoICsgbWFzdGVyS2V5UGF0aEJ5dGVzLmxlbmd0aCArIGNpcGhlclRleHQubGVuZ3RoKTtcbiAgICBsZXQgZGVzdGluYXRpb25Qb3NpdGlvbjogbnVtYmVyID0gdmVyc2lvbi5sZW5ndGg7XG4gICAgdmVyc2lvbi5jb3B5KGRhdGFUb0hhc2gsIDAsIDAsIHZlcnNpb24ubGVuZ3RoKTtcblxuICAgIGtleVBhdGhMZW5ndGguY29weShkYXRhVG9IYXNoLCBkZXN0aW5hdGlvblBvc2l0aW9uLCAwLCBrZXlQYXRoTGVuZ3RoLmxlbmd0aCk7XG4gICAgZGVzdGluYXRpb25Qb3NpdGlvbiArPSBrZXlQYXRoTGVuZ3RoLmxlbmd0aDtcblxuICAgIGNpcGhlclRleHRMZW5ndGguY29weShkYXRhVG9IYXNoLCBkZXN0aW5hdGlvblBvc2l0aW9uLCAwLCBjaXBoZXJUZXh0TGVuZ3RoLmxlbmd0aCk7XG4gICAgZGVzdGluYXRpb25Qb3NpdGlvbiArPSBjaXBoZXJUZXh0TGVuZ3RoLmxlbmd0aDtcblxuICAgIG1hc3RlcktleVBhdGhCeXRlcy5jb3B5KGRhdGFUb0hhc2gsIGRlc3RpbmF0aW9uUG9zaXRpb24sIDAsIG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGgpO1xuICAgIGRlc3RpbmF0aW9uUG9zaXRpb24gKz0gbWFzdGVyS2V5UGF0aEJ5dGVzLmxlbmd0aDtcblxuICAgIGNpcGhlclRleHQuY29weShkYXRhVG9IYXNoLCBkZXN0aW5hdGlvblBvc2l0aW9uLCAwLCBjaXBoZXJUZXh0Lmxlbmd0aCk7XG5cbiAgICBjb25zdCBtZXNzYWdlRGlnZXN0ID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgICBtZXNzYWdlRGlnZXN0LnVwZGF0ZShkYXRhVG9IYXNoKTtcblxuICAgIGNvbnN0IGRhdGFUb1NpZ246IEJ1ZmZlciA9IG1lc3NhZ2VEaWdlc3QuZGlnZXN0KCk7XG5cbiAgICBjb25zdCBzaWduZWRIYXNoOiBCdWZmZXIgPSBhd2FpdCB0aGlzLmF6dXJlS2V5VmF1bHRTaWduZWRIYXNoZWREYXRhKGNyeXB0b0NsaWVudCwgZGF0YVRvU2lnbik7XG4gICAgaWYgKHNpZ25lZEhhc2gubGVuZ3RoICE9PSBrZXlTaXplSW5CeXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaWduZWQgaGFzaCBsZW5ndGggZG9lcyBub3QgbWF0Y2ggdGhlIFJTQSBrZXkgc2l6ZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJpZnlLZXkgPSBhd2FpdCBjcnlwdG9DbGllbnQudmVyaWZ5KCdSUzI1NicsIGRhdGFUb1NpZ24sIHNpZ25lZEhhc2gpO1xuXG4gICAgaWYgKCF2ZXJpZnlLZXkucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlIG9mIHRoZSBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IGNvbXB1dGVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXlMZW5ndGg6IG51bWJlciA9IHZlcnNpb24ubGVuZ3RoICsgY2lwaGVyVGV4dExlbmd0aC5sZW5ndGggKyBrZXlQYXRoTGVuZ3RoLmxlbmd0aCArIGNpcGhlclRleHQubGVuZ3RoICsgbWFzdGVyS2V5UGF0aEJ5dGVzLmxlbmd0aCArIHNpZ25lZEhhc2gubGVuZ3RoO1xuICAgIGNvbnN0IGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXk6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5TGVuZ3RoKTtcblxuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgIHZlcnNpb24uY29weShlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LCBjdXJyZW50SW5kZXgsIDAsIHZlcnNpb24ubGVuZ3RoKTtcbiAgICBjdXJyZW50SW5kZXggKz0gdmVyc2lvbi5sZW5ndGg7XG5cbiAgICBrZXlQYXRoTGVuZ3RoLmNvcHkoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSwgY3VycmVudEluZGV4LCAwLCBrZXlQYXRoTGVuZ3RoLmxlbmd0aCk7XG4gICAgY3VycmVudEluZGV4ICs9IGtleVBhdGhMZW5ndGgubGVuZ3RoO1xuXG4gICAgY2lwaGVyVGV4dExlbmd0aC5jb3B5KGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXksIGN1cnJlbnRJbmRleCwgMCwgY2lwaGVyVGV4dExlbmd0aC5sZW5ndGgpO1xuICAgIGN1cnJlbnRJbmRleCArPSBjaXBoZXJUZXh0TGVuZ3RoLmxlbmd0aDtcblxuICAgIG1hc3RlcktleVBhdGhCeXRlcy5jb3B5KGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXksIGN1cnJlbnRJbmRleCwgMCwgbWFzdGVyS2V5UGF0aEJ5dGVzLmxlbmd0aCk7XG4gICAgY3VycmVudEluZGV4ICs9IG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGg7XG5cbiAgICBjaXBoZXJUZXh0LmNvcHkoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSwgY3VycmVudEluZGV4LCAwLCBjaXBoZXJUZXh0Lmxlbmd0aCk7XG4gICAgY3VycmVudEluZGV4ICs9IGNpcGhlclRleHQubGVuZ3RoO1xuXG4gICAgc2lnbmVkSGFzaC5jb3B5KGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXksIGN1cnJlbnRJbmRleCwgMCwgc2lnbmVkSGFzaC5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE1hc3RlcktleShtYXN0ZXJLZXlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEtleVZhdWx0S2V5PiB7XG4gICAgaWYgKCFtYXN0ZXJLZXlQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hc3RlciBrZXkgcGF0aCBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5UGFydHMgPSB0aGlzLnBhcnNlUGF0aChtYXN0ZXJLZXlQYXRoKTtcblxuICAgIHRoaXMuY3JlYXRlS2V5Q2xpZW50KGtleVBhcnRzLnZhdWx0VXJsKTtcblxuICAgIHJldHVybiBhd2FpdCAodGhpcy5rZXlDbGllbnQgYXMgS2V5Q2xpZW50KS5nZXRLZXkoa2V5UGFydHMubmFtZSwga2V5UGFydHMudmVyc2lvbiA/IHsgdmVyc2lvbjoga2V5UGFydHMudmVyc2lvbiB9IDoge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVLZXlDbGllbnQoa2V5VmF1bHRVcmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICgha2V5VmF1bHRVcmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBrZXkgY2xpZW50IHdpdGggbnVsbCBvciB1bmRlZmluZWQga2V5VmF1bHRVcmwnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmtleUNsaWVudCkge1xuICAgICAgdGhpcy51cmwgPSBrZXlWYXVsdFVybDtcbiAgICAgIHRoaXMua2V5Q2xpZW50ID0gbmV3IEtleUNsaWVudChrZXlWYXVsdFVybCwgdGhpcy5jcmVkZW50aWFscyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDcnlwdG9DbGllbnQobWFzdGVyS2V5OiBLZXlWYXVsdEtleSk6IENyeXB0b2dyYXBoeUNsaWVudCB7XG4gICAgaWYgKCFtYXN0ZXJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBDcnlwdG9ncmFwaHlDbGllbnQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCBtYXN0ZXJLZXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDcnlwdG9ncmFwaHlDbGllbnQobWFzdGVyS2V5LCB0aGlzLmNyZWRlbnRpYWxzKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VQYXRoKG1hc3RlcktleVBhdGg6IHN0cmluZyk6IFBhcnNlZEtleVBhdGgge1xuICAgIGlmICghbWFzdGVyS2V5UGF0aCB8fCBtYXN0ZXJLZXlQYXRoLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXp1cmUgS2V5IFZhdWx0IGtleSBwYXRoIGNhbm5vdCBiZSBudWxsLicpO1xuICAgIH1cblxuICAgIGxldCBiYXNlVXJpO1xuICAgIHRyeSB7XG4gICAgICBiYXNlVXJpID0gcGFyc2UobWFzdGVyS2V5UGF0aCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5cyBpZGVudGlmaWVyOiAke21hc3RlcktleVBhdGh9LiBOb3QgYSB2YWxpZCBVUklgKTtcbiAgICB9XG5cbiAgICBpZiAoIWJhc2VVcmkuaG9zdG5hbWUgfHwgIWJhc2VVcmkuaG9zdG5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCh0aGlzLmF6dXJlS2V5VmF1bHREb21haW5OYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEF6dXJlIEtleSBWYXVsdCBrZXkgcGF0aCBzcGVjaWZpZWQ6ICR7bWFzdGVyS2V5UGF0aH0uYCk7XG4gICAgfVxuXG4gICAgLy8gUGF0aCBpcyBvZiB0aGUgZm9ybSAnL2NvbGxlY3Rpb24vbmFtZVsvdmVyc2lvbl0nXG4gICAgY29uc3Qgc2VnbWVudHMgPSAoYmFzZVVyaS5wYXRobmFtZSB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoICE9PSAzICYmIHNlZ21lbnRzLmxlbmd0aCAhPT0gNCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBrZXlzIGlkZW50aWZpZXI6ICR7bWFzdGVyS2V5UGF0aH0uIEJhZCBudW1iZXIgb2Ygc2VnbWVudHM6ICR7c2VnbWVudHMubGVuZ3RofWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCdrZXlzJyAhPT0gc2VnbWVudHNbMV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQga2V5cyBpZGVudGlmaWVyOiAke21hc3RlcktleVBhdGh9LiBzZWdtZW50IFsxXSBzaG91bGQgYmUgXCJrZXlzXCIsIGZvdW5kIFwiJHtzZWdtZW50c1sxXX1cImBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdmF1bHRVcmwgPSBgJHtiYXNlVXJpLnByb3RvY29sfS8vJHtiYXNlVXJpLmhvc3R9YDtcbiAgICBjb25zdCBuYW1lID0gc2VnbWVudHNbMl07XG4gICAgY29uc3QgdmVyc2lvbiA9IHNlZ21lbnRzLmxlbmd0aCA9PT0gNCA/IHNlZ21lbnRzWzNdIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICB2YXVsdFVybCxcbiAgICAgIG5hbWUsXG4gICAgICB2ZXJzaW9uXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXp1cmVLZXlWYXVsdFNpZ25lZEhhc2hlZERhdGEoY3J5cHRvQ2xpZW50OiBDcnlwdG9ncmFwaHlDbGllbnQsIGRhdGFUb1NpZ246IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgaWYgKCFjcnlwdG9DbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXp1cmUgS1ZTIENyeXB0byBDbGllbnQgaXMgbm90IGRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmVkRGF0YSA9IGF3YWl0IGNyeXB0b0NsaWVudC5zaWduKCdSUzI1NicsIGRhdGFUb1NpZ24pO1xuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNpZ25lZERhdGEucmVzdWx0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXp1cmVLZXlWYXVsdFdyYXAoY3J5cHRvQ2xpZW50OiBDcnlwdG9ncmFwaHlDbGllbnQsIGVuY3J5cHRpb25BbGdvcml0aG06IHN0cmluZywgY29sdW1uRW5jcnlwdGlvbktleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBpZiAoIWNyeXB0b0NsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBenVyZSBLVlMgQ3J5cHRvIENsaWVudCBpcyBub3QgZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbHVtbkVuY3J5cHRpb25LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sdW1uIGVuY3J5cHRpb24ga2V5IGNhbm5vdCBiZSBudWxsLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHdyYXBwZWRLZXkgPSBhd2FpdCBjcnlwdG9DbGllbnQud3JhcEtleShlbmNyeXB0aW9uQWxnb3JpdGhtIGFzIEtleVdyYXBBbGdvcml0aG0sIGNvbHVtbkVuY3J5cHRpb25LZXkpO1xuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHdyYXBwZWRLZXkucmVzdWx0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXp1cmVLZXlWYXVsdFVuV3JhcChjcnlwdG9DbGllbnQ6IENyeXB0b2dyYXBoeUNsaWVudCwgZW5jcnlwdGlvbkFsZ29yaXRobTogc3RyaW5nLCBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5OiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICghY3J5cHRvQ2xpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F6dXJlIEtWUyBDcnlwdG8gQ2xpZW50IGlzIG5vdCBkZWZpbmVkLicpO1xuICAgIH1cblxuICAgIGlmICghZW5jcnlwdGlvbkFsZ29yaXRobSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0aW9uIEFsZ29yaXRobSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5jcnlwdGVkIENvbHVtbiBFbmNyeXB0aW9uIEtleSBsZW5ndGggc2hvdWxkIG5vdCBiZSB6ZXJvLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHVud3JhcHBlZEtleSA9IGF3YWl0IGNyeXB0b0NsaWVudC51bndyYXBLZXkoZW5jcnlwdGlvbkFsZ29yaXRobSBhcyBLZXlXcmFwQWxnb3JpdGhtLCBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5KTtcblxuICAgIHJldHVybiBCdWZmZXIuZnJvbSh1bndyYXBwZWRLZXkucmVzdWx0KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QUtWS2V5U2l6ZShyZXRyaWV2ZWRLZXk6IEtleVZhdWx0S2V5KTogbnVtYmVyIHtcbiAgICBpZiAoIXJldHJpZXZlZEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXRyaWV2ZWQga2V5IGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSByZXRyaWV2ZWRLZXkua2V5O1xuXG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgS2V5IGRvZXMgbm90IGV4aXN0ICR7cmV0cmlldmVkS2V5Lm5hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qga3R5OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBrZXkgJiYga2V5Lmt0eSAmJiBrZXkua3R5LnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKTtcblxuICAgIGlmICgha3R5IHx8ICdSU0EnLmxvY2FsZUNvbXBhcmUoa3R5LCAnZW4nKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlIGEgbm9uLVJTQSBrZXk6ICR7a3R5fS5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlMZW5ndGggPSBrZXkgJiYga2V5Lm4gJiYga2V5Lm4ubGVuZ3RoO1xuXG4gICAgcmV0dXJuIGtleUxlbmd0aCB8fCAwO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVuY3J5cHRpb25BbGdvcml0aG0oZW5jcnlwdGlvbkFsZ29yaXRobTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWVuY3J5cHRpb25BbGdvcml0aG0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS2V5IGVuY3J5cHRpb24gYWxnb3JpdGhtIGNhbm5vdCBiZSBudWxsLicpO1xuICAgIH1cblxuICAgIGlmICgnUlNBX09BRVAnLmxvY2FsZUNvbXBhcmUoZW5jcnlwdGlvbkFsZ29yaXRobS50b1VwcGVyQ2FzZSgpLCAnZW4nKSA9PT0gMCkge1xuICAgICAgZW5jcnlwdGlvbkFsZ29yaXRobSA9ICdSU0EtT0FFUCc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucnNhRW5jcnlwdGlvbkFsZ29yaXRobVdpdGhPQUVQRm9yQUtWLmxvY2FsZUNvbXBhcmUoZW5jcnlwdGlvbkFsZ29yaXRobS50cmltKCkudG9VcHBlckNhc2UoKSwgJ2VuJykgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXkgZW5jcnlwdGlvbiBhbGdvcml0aG0gc3BlY2lmaWVkOiAke2VuY3J5cHRpb25BbGdvcml0aG19LiBFeHBlY3RlZCB2YWx1ZTogJHt0aGlzLnJzYUVuY3J5cHRpb25BbGdvcml0aG1XaXRoT0FFUEZvckFLVn0uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuY3J5cHRpb25BbGdvcml0aG07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0EsSUFBQUEsU0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsYUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsSUFBQSxHQUFBSCxPQUFBO0FBTkE7QUFDQTs7QUFhTyxNQUFNSSxxQ0FBcUMsQ0FBQztFQVNqREMsV0FBV0EsQ0FBQ0MsUUFBZ0IsRUFBRUMsU0FBaUIsRUFBRUMsUUFBZ0IsRUFBRTtJQUNqRSxJQUFJLENBQUNDLElBQUksR0FBRyxpQkFBaUI7SUFDN0IsSUFBSSxDQUFDQyx1QkFBdUIsR0FBRyxpQkFBaUI7SUFDaEQsSUFBSSxDQUFDQyxvQ0FBb0MsR0FBRyxVQUFVO0lBQ3RELElBQUksQ0FBQ0MsWUFBWSxHQUFHQyxNQUFNLENBQUNDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLElBQUksQ0FBQ0MsV0FBVyxHQUFHLElBQUlDLGdDQUFzQixDQUFDUixRQUFRLEVBQUVGLFFBQVEsRUFBRUMsU0FBUyxDQUFDO0VBQzlFO0VBRUEsTUFBTVUsMEJBQTBCQSxDQUFDQyxhQUFxQixFQUFFQyxtQkFBMkIsRUFBRUMsNEJBQW9DLEVBQW1CO0lBQzFJLElBQUksQ0FBQ0EsNEJBQTRCLEVBQUU7TUFDakMsTUFBTSxJQUFJQyxLQUFLLENBQUMsaUVBQWlFLENBQUM7SUFDcEY7SUFFQSxJQUFJRCw0QkFBNEIsQ0FBQ0UsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUM3QyxNQUFNLElBQUlELEtBQUssQ0FBQyxrRUFBa0UsQ0FBQztJQUNyRjtJQUVBRixtQkFBbUIsR0FBRyxJQUFJLENBQUNJLDJCQUEyQixDQUFDSixtQkFBbUIsQ0FBQztJQUUzRSxNQUFNSyxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUNDLFlBQVksQ0FBQ1AsYUFBYSxDQUFDO0lBRXhELE1BQU1RLGNBQWMsR0FBRyxJQUFJLENBQUNDLGFBQWEsQ0FBQ0gsU0FBUyxDQUFDO0lBRXBELE1BQU1JLFlBQVksR0FBRyxJQUFJLENBQUNDLGtCQUFrQixDQUFDTCxTQUFTLENBQUM7SUFFdkQsSUFBSUosNEJBQTRCLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDUixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUU7TUFDNUQsTUFBTSxJQUFJUyxLQUFLLENBQUUsOEZBQTZGUixNQUFNLENBQUNDLElBQUksQ0FBQyxDQUFDTSw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNVLFFBQVEsQ0FBQyxLQUFLLENBQUUseUJBQXdCakIsTUFBTSxDQUFDQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUNGLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNrQixRQUFRLENBQUMsS0FBSyxDQUFFLEdBQUUsQ0FBQztJQUM5UDtJQUVBLElBQUlDLFlBQVksR0FBRyxJQUFJLENBQUNuQixZQUFZLENBQUNVLE1BQU07SUFDM0MsTUFBTVUsYUFBcUIsR0FBR1osNEJBQTRCLENBQUNhLFdBQVcsQ0FBQ0YsWUFBWSxDQUFDO0lBRXBGQSxZQUFZLElBQUksQ0FBQztJQUVqQixNQUFNRyxnQkFBd0IsR0FBR2QsNEJBQTRCLENBQUNhLFdBQVcsQ0FBQ0YsWUFBWSxDQUFDO0lBRXZGQSxZQUFZLElBQUksQ0FBQztJQUVqQkEsWUFBWSxJQUFJQyxhQUFhO0lBRTdCLElBQUlFLGdCQUFnQixLQUFLUixjQUFjLEVBQUU7TUFDdkMsTUFBTSxJQUFJTCxLQUFLLENBQUUsc0VBQXFFYSxnQkFBaUIsMENBQXlDUixjQUFlLDBEQUF5RFIsYUFBYyxtSEFBa0gsQ0FBQztJQUMzVjtJQUVBLE1BQU1pQixlQUF1QixHQUFHZiw0QkFBNEIsQ0FBQ0UsTUFBTSxHQUFHUyxZQUFZLEdBQUdHLGdCQUFnQjtJQUVyRyxJQUFJQyxlQUFlLEtBQUtULGNBQWMsRUFBRTtNQUN0QyxNQUFNLElBQUlMLEtBQUssQ0FBRSxxRUFBb0VjLGVBQWdCLHlDQUF3Q1QsY0FBZSwwREFBeURSLGFBQWMsbUhBQWtILENBQUM7SUFDeFY7SUFFQSxNQUFNa0IsVUFBVSxHQUFHdkIsTUFBTSxDQUFDd0IsS0FBSyxDQUFDSCxnQkFBZ0IsQ0FBQztJQUNqRGQsNEJBQTRCLENBQUNrQixJQUFJLENBQUNGLFVBQVUsRUFBRSxDQUFDLEVBQUVMLFlBQVksRUFBRUEsWUFBWSxHQUFHRyxnQkFBZ0IsQ0FBQztJQUMvRkgsWUFBWSxJQUFJRyxnQkFBZ0I7SUFFaEMsTUFBTUssU0FBUyxHQUFHMUIsTUFBTSxDQUFDd0IsS0FBSyxDQUFDRixlQUFlLENBQUM7SUFDL0NmLDRCQUE0QixDQUFDa0IsSUFBSSxDQUFDQyxTQUFTLEVBQUUsQ0FBQyxFQUFFUixZQUFZLEVBQUVBLFlBQVksR0FBR0ksZUFBZSxDQUFDO0lBRTdGLE1BQU1LLElBQUksR0FBRzNCLE1BQU0sQ0FBQ3dCLEtBQUssQ0FBQ2pCLDRCQUE0QixDQUFDRSxNQUFNLEdBQUdpQixTQUFTLENBQUNqQixNQUFNLENBQUM7SUFDakZGLDRCQUE0QixDQUFDa0IsSUFBSSxDQUFDRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRXBCLDRCQUE0QixDQUFDRSxNQUFNLEdBQUdpQixTQUFTLENBQUNqQixNQUFNLENBQUM7SUFFckcsTUFBTW1CLGFBQWEsR0FBRyxJQUFBQyxrQkFBVSxFQUFDLFFBQVEsQ0FBQztJQUMxQ0QsYUFBYSxDQUFDRSxNQUFNLENBQUNILElBQUksQ0FBQztJQUUxQixNQUFNSSxZQUFvQixHQUFHSCxhQUFhLENBQUNJLE1BQU0sQ0FBQyxDQUFDO0lBRW5ELElBQUksQ0FBQ0QsWUFBWSxFQUFFO01BQ2pCLE1BQU0sSUFBSXZCLEtBQUssQ0FBQywyRUFBMkUsQ0FBQztJQUM5RjtJQUVBLE1BQU15QixTQUFTLEdBQUcsTUFBTWxCLFlBQVksQ0FBQ21CLE1BQU0sQ0FBQyxPQUFPLEVBQUVILFlBQVksRUFBRUwsU0FBUyxDQUFDO0lBQzdFLElBQUksQ0FBQ08sU0FBUyxDQUFDRSxNQUFNLEVBQUU7TUFDckIsTUFBTSxJQUFJM0IsS0FBSyxDQUFFLG1LQUFrS0gsYUFBYywrRkFBOEYsQ0FBQztJQUNsUztJQUVBLE1BQU0rQixZQUFvQixHQUFHLE1BQU0sSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQ3RCLFlBQVksRUFBRVQsbUJBQW1CLEVBQUVpQixVQUFVLENBQUM7SUFFMUcsT0FBT2EsWUFBWTtFQUNyQjtFQUVBLE1BQU1FLDBCQUEwQkEsQ0FBQ2pDLGFBQXFCLEVBQUVDLG1CQUEyQixFQUFFaUMsbUJBQTJCLEVBQW1CO0lBQ2pJLElBQUksQ0FBQ0EsbUJBQW1CLEVBQUU7TUFDeEIsTUFBTSxJQUFJL0IsS0FBSyxDQUFDLHVDQUF1QyxDQUFDO0lBQzFEO0lBRUEsSUFBSStCLG1CQUFtQixDQUFDOUIsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNwQyxNQUFNLElBQUlELEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQztJQUMzRDtJQUVBRixtQkFBbUIsR0FBRyxJQUFJLENBQUNJLDJCQUEyQixDQUFDSixtQkFBbUIsQ0FBQztJQUUzRSxNQUFNSyxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUNDLFlBQVksQ0FBQ1AsYUFBYSxDQUFDO0lBRXhELE1BQU1RLGNBQWMsR0FBRyxJQUFJLENBQUNDLGFBQWEsQ0FBQ0gsU0FBUyxDQUFDO0lBRXBELE1BQU1JLFlBQVksR0FBRyxJQUFJLENBQUNDLGtCQUFrQixDQUFDTCxTQUFTLENBQUM7SUFFdkQsTUFBTTZCLE9BQU8sR0FBR3hDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDRixZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVuRCxNQUFNMEMsa0JBQTBCLEdBQUd6QyxNQUFNLENBQUNDLElBQUksQ0FBQ0ksYUFBYSxDQUFDcUMsV0FBVyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFbkYsTUFBTXZCLGFBQXFCLEdBQUduQixNQUFNLENBQUN3QixLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRTdDTCxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUdzQixrQkFBa0IsQ0FBQ2hDLE1BQU0sR0FBRyxJQUFJO0lBQ25EVSxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUdzQixrQkFBa0IsQ0FBQ2hDLE1BQU0sSUFBSSxDQUFDLEdBQUcsSUFBSTtJQUV4RCxNQUFNYyxVQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDb0IsaUJBQWlCLENBQUM1QixZQUFZLEVBQUVULG1CQUFtQixFQUFFaUMsbUJBQW1CLENBQUM7SUFFL0csTUFBTWxCLGdCQUF3QixHQUFHckIsTUFBTSxDQUFDd0IsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUVoREgsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUdFLFVBQVUsQ0FBQ2QsTUFBTSxHQUFHLElBQUk7SUFDOUNZLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHRSxVQUFVLENBQUNkLE1BQU0sSUFBSSxDQUFDLEdBQUcsSUFBSTtJQUVuRCxJQUFJYyxVQUFVLENBQUNkLE1BQU0sS0FBS0ksY0FBYyxFQUFFO01BQ3hDLE1BQU0sSUFBSUwsS0FBSyxDQUFDLG9EQUFvRCxDQUFDO0lBQ3ZFO0lBRUEsTUFBTW9DLFVBQWtCLEdBQUc1QyxNQUFNLENBQUN3QixLQUFLLENBQUNnQixPQUFPLENBQUMvQixNQUFNLEdBQUdVLGFBQWEsQ0FBQ1YsTUFBTSxHQUFHWSxnQkFBZ0IsQ0FBQ1osTUFBTSxHQUFHZ0Msa0JBQWtCLENBQUNoQyxNQUFNLEdBQUdjLFVBQVUsQ0FBQ2QsTUFBTSxDQUFDO0lBQ3hKLElBQUlvQyxtQkFBMkIsR0FBR0wsT0FBTyxDQUFDL0IsTUFBTTtJQUNoRCtCLE9BQU8sQ0FBQ2YsSUFBSSxDQUFDbUIsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUVKLE9BQU8sQ0FBQy9CLE1BQU0sQ0FBQztJQUU5Q1UsYUFBYSxDQUFDTSxJQUFJLENBQUNtQixVQUFVLEVBQUVDLG1CQUFtQixFQUFFLENBQUMsRUFBRTFCLGFBQWEsQ0FBQ1YsTUFBTSxDQUFDO0lBQzVFb0MsbUJBQW1CLElBQUkxQixhQUFhLENBQUNWLE1BQU07SUFFM0NZLGdCQUFnQixDQUFDSSxJQUFJLENBQUNtQixVQUFVLEVBQUVDLG1CQUFtQixFQUFFLENBQUMsRUFBRXhCLGdCQUFnQixDQUFDWixNQUFNLENBQUM7SUFDbEZvQyxtQkFBbUIsSUFBSXhCLGdCQUFnQixDQUFDWixNQUFNO0lBRTlDZ0Msa0JBQWtCLENBQUNoQixJQUFJLENBQUNtQixVQUFVLEVBQUVDLG1CQUFtQixFQUFFLENBQUMsRUFBRUosa0JBQWtCLENBQUNoQyxNQUFNLENBQUM7SUFDdEZvQyxtQkFBbUIsSUFBSUosa0JBQWtCLENBQUNoQyxNQUFNO0lBRWhEYyxVQUFVLENBQUNFLElBQUksQ0FBQ21CLFVBQVUsRUFBRUMsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFdEIsVUFBVSxDQUFDZCxNQUFNLENBQUM7SUFFdEUsTUFBTW1CLGFBQWEsR0FBRyxJQUFBQyxrQkFBVSxFQUFDLFFBQVEsQ0FBQztJQUUxQ0QsYUFBYSxDQUFDRSxNQUFNLENBQUNjLFVBQVUsQ0FBQztJQUVoQyxNQUFNRSxVQUFrQixHQUFHbEIsYUFBYSxDQUFDSSxNQUFNLENBQUMsQ0FBQztJQUVqRCxNQUFNZSxVQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDQyw2QkFBNkIsQ0FBQ2pDLFlBQVksRUFBRStCLFVBQVUsQ0FBQztJQUM3RixJQUFJQyxVQUFVLENBQUN0QyxNQUFNLEtBQUtJLGNBQWMsRUFBRTtNQUN4QyxNQUFNLElBQUlMLEtBQUssQ0FBQyxxREFBcUQsQ0FBQztJQUN4RTtJQUVBLE1BQU15QixTQUFTLEdBQUcsTUFBTWxCLFlBQVksQ0FBQ21CLE1BQU0sQ0FBQyxPQUFPLEVBQUVZLFVBQVUsRUFBRUMsVUFBVSxDQUFDO0lBRTVFLElBQUksQ0FBQ2QsU0FBUyxDQUFDRSxNQUFNLEVBQUU7TUFDckIsTUFBTSxJQUFJM0IsS0FBSyxDQUFDLG9FQUFvRSxDQUFDO0lBQ3ZGO0lBRUEsTUFBTXlDLGtDQUEwQyxHQUFHVCxPQUFPLENBQUMvQixNQUFNLEdBQUdZLGdCQUFnQixDQUFDWixNQUFNLEdBQUdVLGFBQWEsQ0FBQ1YsTUFBTSxHQUFHYyxVQUFVLENBQUNkLE1BQU0sR0FBR2dDLGtCQUFrQixDQUFDaEMsTUFBTSxHQUFHc0MsVUFBVSxDQUFDdEMsTUFBTTtJQUN0TCxNQUFNRiw0QkFBb0MsR0FBR1AsTUFBTSxDQUFDd0IsS0FBSyxDQUFDeUIsa0NBQWtDLENBQUM7SUFFN0YsSUFBSS9CLFlBQVksR0FBRyxDQUFDO0lBQ3BCc0IsT0FBTyxDQUFDZixJQUFJLENBQUNsQiw0QkFBNEIsRUFBRVcsWUFBWSxFQUFFLENBQUMsRUFBRXNCLE9BQU8sQ0FBQy9CLE1BQU0sQ0FBQztJQUMzRVMsWUFBWSxJQUFJc0IsT0FBTyxDQUFDL0IsTUFBTTtJQUU5QlUsYUFBYSxDQUFDTSxJQUFJLENBQUNsQiw0QkFBNEIsRUFBRVcsWUFBWSxFQUFFLENBQUMsRUFBRUMsYUFBYSxDQUFDVixNQUFNLENBQUM7SUFDdkZTLFlBQVksSUFBSUMsYUFBYSxDQUFDVixNQUFNO0lBRXBDWSxnQkFBZ0IsQ0FBQ0ksSUFBSSxDQUFDbEIsNEJBQTRCLEVBQUVXLFlBQVksRUFBRSxDQUFDLEVBQUVHLGdCQUFnQixDQUFDWixNQUFNLENBQUM7SUFDN0ZTLFlBQVksSUFBSUcsZ0JBQWdCLENBQUNaLE1BQU07SUFFdkNnQyxrQkFBa0IsQ0FBQ2hCLElBQUksQ0FBQ2xCLDRCQUE0QixFQUFFVyxZQUFZLEVBQUUsQ0FBQyxFQUFFdUIsa0JBQWtCLENBQUNoQyxNQUFNLENBQUM7SUFDakdTLFlBQVksSUFBSXVCLGtCQUFrQixDQUFDaEMsTUFBTTtJQUV6Q2MsVUFBVSxDQUFDRSxJQUFJLENBQUNsQiw0QkFBNEIsRUFBRVcsWUFBWSxFQUFFLENBQUMsRUFBRUssVUFBVSxDQUFDZCxNQUFNLENBQUM7SUFDakZTLFlBQVksSUFBSUssVUFBVSxDQUFDZCxNQUFNO0lBRWpDc0MsVUFBVSxDQUFDdEIsSUFBSSxDQUFDbEIsNEJBQTRCLEVBQUVXLFlBQVksRUFBRSxDQUFDLEVBQUU2QixVQUFVLENBQUN0QyxNQUFNLENBQUM7SUFFakYsT0FBT0YsNEJBQTRCO0VBQ3JDO0VBRUEsTUFBY0ssWUFBWUEsQ0FBQ1AsYUFBcUIsRUFBd0I7SUFDdEUsSUFBSSxDQUFDQSxhQUFhLEVBQUU7TUFDbEIsTUFBTSxJQUFJRyxLQUFLLENBQUMsNkNBQTZDLENBQUM7SUFDaEU7SUFDQSxNQUFNMEMsUUFBUSxHQUFHLElBQUksQ0FBQ0MsU0FBUyxDQUFDOUMsYUFBYSxDQUFDO0lBRTlDLElBQUksQ0FBQytDLGVBQWUsQ0FBQ0YsUUFBUSxDQUFDRyxRQUFRLENBQUM7SUFFdkMsT0FBTyxNQUFPLElBQUksQ0FBQ0MsU0FBUyxDQUFlQyxNQUFNLENBQUNMLFFBQVEsQ0FBQ3RELElBQUksRUFBRXNELFFBQVEsQ0FBQ1YsT0FBTyxHQUFHO01BQUVBLE9BQU8sRUFBRVUsUUFBUSxDQUFDVjtJQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN6SDtFQUVRWSxlQUFlQSxDQUFDSSxXQUFtQixFQUFRO0lBQ2pELElBQUksQ0FBQ0EsV0FBVyxFQUFFO01BQ2hCLE1BQU0sSUFBSWhELEtBQUssQ0FBQyw2REFBNkQsQ0FBQztJQUNoRjtJQUNBLElBQUksQ0FBQyxJQUFJLENBQUM4QyxTQUFTLEVBQUU7TUFDbkIsSUFBSSxDQUFDRyxHQUFHLEdBQUdELFdBQVc7TUFDdEIsSUFBSSxDQUFDRixTQUFTLEdBQUcsSUFBSUksdUJBQVMsQ0FBQ0YsV0FBVyxFQUFFLElBQUksQ0FBQ3RELFdBQVcsQ0FBQztJQUMvRDtFQUNGO0VBRVFjLGtCQUFrQkEsQ0FBQ0wsU0FBc0IsRUFBc0I7SUFDckUsSUFBSSxDQUFDQSxTQUFTLEVBQUU7TUFDZCxNQUFNLElBQUlILEtBQUssQ0FBQyxtRUFBbUUsQ0FBQztJQUN0RjtJQUNBLE9BQU8sSUFBSW1ELGdDQUFrQixDQUFDaEQsU0FBUyxFQUFFLElBQUksQ0FBQ1QsV0FBVyxDQUFDO0VBQzVEO0VBRVFpRCxTQUFTQSxDQUFDOUMsYUFBcUIsRUFBaUI7SUFDdEQsSUFBSSxDQUFDQSxhQUFhLElBQUlBLGFBQWEsQ0FBQ3VELElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO01BQ2pELE1BQU0sSUFBSXBELEtBQUssQ0FBQywwQ0FBMEMsQ0FBQztJQUM3RDtJQUVBLElBQUlxRCxPQUFPO0lBQ1gsSUFBSTtNQUNGQSxPQUFPLEdBQUcsSUFBQUMsVUFBSyxFQUFDekQsYUFBYSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7SUFDNUMsQ0FBQyxDQUFDLE1BQU07TUFDTixNQUFNLElBQUlHLEtBQUssQ0FBRSw0QkFBMkJILGFBQWMsbUJBQWtCLENBQUM7SUFDL0U7SUFFQSxJQUFJLENBQUN3RCxPQUFPLENBQUNFLFFBQVEsSUFBSSxDQUFDRixPQUFPLENBQUNFLFFBQVEsQ0FBQ3JCLFdBQVcsQ0FBQyxDQUFDLENBQUNzQixRQUFRLENBQUMsSUFBSSxDQUFDbkUsdUJBQXVCLENBQUMsRUFBRTtNQUMvRixNQUFNLElBQUlXLEtBQUssQ0FBRSwrQ0FBOENILGFBQWMsR0FBRSxDQUFDO0lBQ2xGOztJQUVBO0lBQ0EsTUFBTTRELFFBQVEsR0FBRyxDQUFDSixPQUFPLENBQUNLLFFBQVEsSUFBSSxFQUFFLEVBQUVDLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDcEQsSUFBSUYsUUFBUSxDQUFDeEQsTUFBTSxLQUFLLENBQUMsSUFBSXdELFFBQVEsQ0FBQ3hELE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFDbEQsTUFBTSxJQUFJRCxLQUFLLENBQ1osNEJBQTJCSCxhQUFjLDZCQUE0QjRELFFBQVEsQ0FBQ3hELE1BQU8sRUFDeEYsQ0FBQztJQUNIO0lBRUEsSUFBSSxNQUFNLEtBQUt3RCxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7TUFDMUIsTUFBTSxJQUFJekQsS0FBSyxDQUNaLDRCQUEyQkgsYUFBYywwQ0FBeUM0RCxRQUFRLENBQUMsQ0FBQyxDQUFFLEdBQ2pHLENBQUM7SUFDSDtJQUVBLE1BQU1aLFFBQVEsR0FBSSxHQUFFUSxPQUFPLENBQUNPLFFBQVMsS0FBSVAsT0FBTyxDQUFDUSxJQUFLLEVBQUM7SUFDdkQsTUFBTXpFLElBQUksR0FBR3FFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDeEIsTUFBTXpCLE9BQU8sR0FBR3lCLFFBQVEsQ0FBQ3hELE1BQU0sS0FBSyxDQUFDLEdBQUd3RCxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUdLLFNBQVM7SUFDL0QsT0FBTztNQUNMakIsUUFBUTtNQUNSekQsSUFBSTtNQUNKNEM7SUFDRixDQUFDO0VBQ0g7RUFFQSxNQUFjUSw2QkFBNkJBLENBQUNqQyxZQUFnQyxFQUFFK0IsVUFBa0IsRUFBbUI7SUFDakgsSUFBSSxDQUFDL0IsWUFBWSxFQUFFO01BQ2pCLE1BQU0sSUFBSVAsS0FBSyxDQUFDLHlDQUF5QyxDQUFDO0lBQzVEO0lBRUEsTUFBTStELFVBQVUsR0FBRyxNQUFNeEQsWUFBWSxDQUFDeUQsSUFBSSxDQUFDLE9BQU8sRUFBRTFCLFVBQVUsQ0FBQztJQUUvRCxPQUFPOUMsTUFBTSxDQUFDQyxJQUFJLENBQUNzRSxVQUFVLENBQUNwQyxNQUFNLENBQUM7RUFDdkM7RUFFQSxNQUFjUSxpQkFBaUJBLENBQUM1QixZQUFnQyxFQUFFVCxtQkFBMkIsRUFBRWlDLG1CQUEyQixFQUFtQjtJQUMzSSxJQUFJLENBQUN4QixZQUFZLEVBQUU7TUFDakIsTUFBTSxJQUFJUCxLQUFLLENBQUMseUNBQXlDLENBQUM7SUFDNUQ7SUFFQSxJQUFJLENBQUMrQixtQkFBbUIsRUFBRTtNQUN4QixNQUFNLElBQUkvQixLQUFLLENBQUMsdUNBQXVDLENBQUM7SUFDMUQ7SUFFQSxNQUFNaUUsVUFBVSxHQUFHLE1BQU0xRCxZQUFZLENBQUMyRCxPQUFPLENBQUNwRSxtQkFBbUIsRUFBc0JpQyxtQkFBbUIsQ0FBQztJQUUzRyxPQUFPdkMsTUFBTSxDQUFDQyxJQUFJLENBQUN3RSxVQUFVLENBQUN0QyxNQUFNLENBQUM7RUFDdkM7RUFFQSxNQUFjRSxtQkFBbUJBLENBQUN0QixZQUFnQyxFQUFFVCxtQkFBMkIsRUFBRUMsNEJBQW9DLEVBQW1CO0lBQ3RKLElBQUksQ0FBQ1EsWUFBWSxFQUFFO01BQ2pCLE1BQU0sSUFBSVAsS0FBSyxDQUFDLHlDQUF5QyxDQUFDO0lBQzVEO0lBRUEsSUFBSSxDQUFDRixtQkFBbUIsRUFBRTtNQUN4QixNQUFNLElBQUlFLEtBQUssQ0FBQyxrREFBa0QsQ0FBQztJQUNyRTtJQUVBLElBQUksQ0FBQ0QsNEJBQTRCLEVBQUU7TUFDakMsTUFBTSxJQUFJQyxLQUFLLENBQUMsaURBQWlELENBQUM7SUFDcEU7SUFFQSxJQUFJRCw0QkFBNEIsQ0FBQ0UsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUM3QyxNQUFNLElBQUlELEtBQUssQ0FBQyw0REFBNEQsQ0FBQztJQUMvRTtJQUVBLE1BQU1tRSxZQUFZLEdBQUcsTUFBTTVELFlBQVksQ0FBQzZELFNBQVMsQ0FBQ3RFLG1CQUFtQixFQUFzQkMsNEJBQTRCLENBQUM7SUFFeEgsT0FBT1AsTUFBTSxDQUFDQyxJQUFJLENBQUMwRSxZQUFZLENBQUN4QyxNQUFNLENBQUM7RUFDekM7RUFFUXJCLGFBQWFBLENBQUMrRCxZQUF5QixFQUFVO0lBQ3ZELElBQUksQ0FBQ0EsWUFBWSxFQUFFO01BQ2pCLE1BQU0sSUFBSXJFLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQztJQUM5RDtJQUNBLE1BQU1zRSxHQUFHLEdBQUdELFlBQVksQ0FBQ0MsR0FBRztJQUU1QixJQUFJLENBQUNBLEdBQUcsRUFBRTtNQUNSLE1BQU0sSUFBSXRFLEtBQUssQ0FBRSxzQkFBcUJxRSxZQUFZLENBQUNqRixJQUFLLEVBQUMsQ0FBQztJQUM1RDtJQUVBLE1BQU1tRixHQUF1QixHQUFHRCxHQUFHLElBQUlBLEdBQUcsQ0FBQ0MsR0FBRyxJQUFJRCxHQUFHLENBQUNDLEdBQUcsQ0FBQzlELFFBQVEsQ0FBQyxDQUFDLENBQUMrRCxXQUFXLENBQUMsQ0FBQztJQUVsRixJQUFJLENBQUNELEdBQUcsSUFBSSxLQUFLLENBQUNFLGFBQWEsQ0FBQ0YsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtNQUNoRCxNQUFNLElBQUl2RSxLQUFLLENBQUUsNkJBQTRCdUUsR0FBSSxHQUFFLENBQUM7SUFDdEQ7SUFFQSxNQUFNRyxTQUFTLEdBQUdKLEdBQUcsSUFBSUEsR0FBRyxDQUFDSyxDQUFDLElBQUlMLEdBQUcsQ0FBQ0ssQ0FBQyxDQUFDMUUsTUFBTTtJQUU5QyxPQUFPeUUsU0FBUyxJQUFJLENBQUM7RUFDdkI7RUFFUXhFLDJCQUEyQkEsQ0FBQ0osbUJBQTJCLEVBQVU7SUFDdkUsSUFBSSxDQUFDQSxtQkFBbUIsRUFBRTtNQUN4QixNQUFNLElBQUlFLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQztJQUM3RDtJQUVBLElBQUksVUFBVSxDQUFDeUUsYUFBYSxDQUFDM0UsbUJBQW1CLENBQUMwRSxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtNQUMzRTFFLG1CQUFtQixHQUFHLFVBQVU7SUFDbEM7SUFFQSxJQUFJLElBQUksQ0FBQ1Isb0NBQW9DLENBQUNtRixhQUFhLENBQUMzRSxtQkFBbUIsQ0FBQ3NELElBQUksQ0FBQyxDQUFDLENBQUNvQixXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtNQUNqSCxNQUFNLElBQUl4RSxLQUFLLENBQUUsK0NBQThDRixtQkFBb0IscUJBQW9CLElBQUksQ0FBQ1Isb0NBQXFDLEdBQUUsQ0FBQztJQUN0SjtJQUVBLE9BQU9RLG1CQUFtQjtFQUM1QjtBQUNGO0FBQUM4RSxPQUFBLENBQUE3RixxQ0FBQSxHQUFBQSxxQ0FBQSJ9
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getKey = void 0;
7
+ var _symmetricKey = _interopRequireDefault(require("./symmetric-key"));
8
+ var _lruCache = _interopRequireDefault(require("lru-cache"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ // This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
11
+ // Copyright (c) 2019 Microsoft Corporation
12
+
13
+ const cache = new _lruCache.default(0);
14
+ const getKey = async (keyInfo, options) => {
15
+ if (!options.trustedServerNameAE) {
16
+ throw new Error('Server name should not be null in getKey');
17
+ }
18
+ const serverName = options.trustedServerNameAE;
19
+ const keyLookupValue = `${serverName}:${Buffer.from(keyInfo.encryptedKey).toString('base64')}:${keyInfo.keyStoreName}`;
20
+ if (cache.has(keyLookupValue)) {
21
+ return cache.get(keyLookupValue);
22
+ } else {
23
+ const provider = options.encryptionKeyStoreProviders && options.encryptionKeyStoreProviders[keyInfo.keyStoreName];
24
+ if (!provider) {
25
+ throw new Error(`Failed to decrypt a column encryption key. Invalid key store provider name: ${keyInfo.keyStoreName}. A key store provider name must denote either a system key store provider or a registered custom key store provider. Valid (currently registered) custom key store provider names are: ${options.encryptionKeyStoreProviders}. Please verify key store provider information in column master key definitions in the database, and verify all custom key store providers used in your application are registered properly.`);
26
+ }
27
+ const plaintextKey = await provider.decryptColumnEncryptionKey(keyInfo.keyPath, keyInfo.algorithmName, keyInfo.encryptedKey);
28
+ const encryptionKey = new _symmetricKey.default(plaintextKey);
29
+ if (options.columnEncryptionKeyCacheTTL > 0) {
30
+ cache.set(keyLookupValue, encryptionKey, options.columnEncryptionKeyCacheTTL);
31
+ }
32
+ return encryptionKey;
33
+ }
34
+ };
35
+ exports.getKey = getKey;
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3ltbWV0cmljS2V5IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbHJ1Q2FjaGUiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiTFJVIiwiZ2V0S2V5Iiwia2V5SW5mbyIsIm9wdGlvbnMiLCJ0cnVzdGVkU2VydmVyTmFtZUFFIiwiRXJyb3IiLCJzZXJ2ZXJOYW1lIiwia2V5TG9va3VwVmFsdWUiLCJCdWZmZXIiLCJmcm9tIiwiZW5jcnlwdGVkS2V5IiwidG9TdHJpbmciLCJrZXlTdG9yZU5hbWUiLCJoYXMiLCJnZXQiLCJwcm92aWRlciIsImVuY3J5cHRpb25LZXlTdG9yZVByb3ZpZGVycyIsInBsYWludGV4dEtleSIsImRlY3J5cHRDb2x1bW5FbmNyeXB0aW9uS2V5Iiwia2V5UGF0aCIsImFsZ29yaXRobU5hbWUiLCJlbmNyeXB0aW9uS2V5IiwiU3ltbWV0cmljS2V5IiwiY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMIiwic2V0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL3N5bW1ldHJpYy1rZXktY2FjaGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IHR5cGUgRW5jcnlwdGlvbktleUluZm8gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBTeW1tZXRyaWNLZXkgZnJvbSAnLi9zeW1tZXRyaWMta2V5JztcbmltcG9ydCB7IHR5cGUgSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucyBhcyBDb25uZWN0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuXG5jb25zdCBjYWNoZSA9IG5ldyBMUlU8c3RyaW5nLCBTeW1tZXRyaWNLZXk+KDApO1xuXG5leHBvcnQgY29uc3QgZ2V0S2V5ID0gYXN5bmMgKGtleUluZm86IEVuY3J5cHRpb25LZXlJbmZvLCBvcHRpb25zOiBDb25uZWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U3ltbWV0cmljS2V5PiA9PiB7XG4gIGlmICghb3B0aW9ucy50cnVzdGVkU2VydmVyTmFtZUFFKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgbmFtZSBzaG91bGQgbm90IGJlIG51bGwgaW4gZ2V0S2V5Jyk7XG4gIH1cblxuICBjb25zdCBzZXJ2ZXJOYW1lOiBzdHJpbmcgPSBvcHRpb25zLnRydXN0ZWRTZXJ2ZXJOYW1lQUU7XG5cbiAgY29uc3Qga2V5TG9va3VwVmFsdWUgPSBgJHtzZXJ2ZXJOYW1lfToke0J1ZmZlci5mcm9tKGtleUluZm8uZW5jcnlwdGVkS2V5KS50b1N0cmluZygnYmFzZTY0Jyl9OiR7a2V5SW5mby5rZXlTdG9yZU5hbWV9YDtcblxuICBpZiAoY2FjaGUuaGFzKGtleUxvb2t1cFZhbHVlKSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQoa2V5TG9va3VwVmFsdWUpIGFzIFN5bW1ldHJpY0tleTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm92aWRlciA9IG9wdGlvbnMuZW5jcnlwdGlvbktleVN0b3JlUHJvdmlkZXJzICYmIG9wdGlvbnMuZW5jcnlwdGlvbktleVN0b3JlUHJvdmlkZXJzW2tleUluZm8ua2V5U3RvcmVOYW1lXTtcbiAgICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZWNyeXB0IGEgY29sdW1uIGVuY3J5cHRpb24ga2V5LiBJbnZhbGlkIGtleSBzdG9yZSBwcm92aWRlciBuYW1lOiAke2tleUluZm8ua2V5U3RvcmVOYW1lfS4gQSBrZXkgc3RvcmUgcHJvdmlkZXIgbmFtZSBtdXN0IGRlbm90ZSBlaXRoZXIgYSBzeXN0ZW0ga2V5IHN0b3JlIHByb3ZpZGVyIG9yIGEgcmVnaXN0ZXJlZCBjdXN0b20ga2V5IHN0b3JlIHByb3ZpZGVyLiBWYWxpZCAoY3VycmVudGx5IHJlZ2lzdGVyZWQpIGN1c3RvbSBrZXkgc3RvcmUgcHJvdmlkZXIgbmFtZXMgYXJlOiAke29wdGlvbnMuZW5jcnlwdGlvbktleVN0b3JlUHJvdmlkZXJzfS4gUGxlYXNlIHZlcmlmeSBrZXkgc3RvcmUgcHJvdmlkZXIgaW5mb3JtYXRpb24gaW4gY29sdW1uIG1hc3RlciBrZXkgZGVmaW5pdGlvbnMgaW4gdGhlIGRhdGFiYXNlLCBhbmQgdmVyaWZ5IGFsbCBjdXN0b20ga2V5IHN0b3JlIHByb3ZpZGVycyB1c2VkIGluIHlvdXIgYXBwbGljYXRpb24gYXJlIHJlZ2lzdGVyZWQgcHJvcGVybHkuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGxhaW50ZXh0S2V5OiBCdWZmZXIgPSBhd2FpdCBwcm92aWRlci5kZWNyeXB0Q29sdW1uRW5jcnlwdGlvbktleShrZXlJbmZvLmtleVBhdGgsIGtleUluZm8uYWxnb3JpdGhtTmFtZSwga2V5SW5mby5lbmNyeXB0ZWRLZXkpO1xuXG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IG5ldyBTeW1tZXRyaWNLZXkocGxhaW50ZXh0S2V5KTtcblxuICAgIGlmIChvcHRpb25zLmNvbHVtbkVuY3J5cHRpb25LZXlDYWNoZVRUTCA+IDApIHtcbiAgICAgIGNhY2hlLnNldChrZXlMb29rdXBWYWx1ZSwgZW5jcnlwdGlvbktleSwgb3B0aW9ucy5jb2x1bW5FbmNyeXB0aW9uS2V5Q2FjaGVUVEwpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmNyeXB0aW9uS2V5O1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFJQSxJQUFBQSxhQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxTQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFBNEIsU0FBQUQsdUJBQUFHLEdBQUEsV0FBQUEsR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsR0FBQUQsR0FBQSxLQUFBRSxPQUFBLEVBQUFGLEdBQUE7QUFONUI7QUFDQTs7QUFPQSxNQUFNRyxLQUFLLEdBQUcsSUFBSUMsaUJBQUcsQ0FBdUIsQ0FBQyxDQUFDO0FBRXZDLE1BQU1DLE1BQU0sR0FBRyxNQUFBQSxDQUFPQyxPQUEwQixFQUFFQyxPQUEwQixLQUE0QjtFQUM3RyxJQUFJLENBQUNBLE9BQU8sQ0FBQ0MsbUJBQW1CLEVBQUU7SUFDaEMsTUFBTSxJQUFJQyxLQUFLLENBQUMsMENBQTBDLENBQUM7RUFDN0Q7RUFFQSxNQUFNQyxVQUFrQixHQUFHSCxPQUFPLENBQUNDLG1CQUFtQjtFQUV0RCxNQUFNRyxjQUFjLEdBQUksR0FBRUQsVUFBVyxJQUFHRSxNQUFNLENBQUNDLElBQUksQ0FBQ1AsT0FBTyxDQUFDUSxZQUFZLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLFFBQVEsQ0FBRSxJQUFHVCxPQUFPLENBQUNVLFlBQWEsRUFBQztFQUV0SCxJQUFJYixLQUFLLENBQUNjLEdBQUcsQ0FBQ04sY0FBYyxDQUFDLEVBQUU7SUFDN0IsT0FBT1IsS0FBSyxDQUFDZSxHQUFHLENBQUNQLGNBQWMsQ0FBQztFQUNsQyxDQUFDLE1BQU07SUFDTCxNQUFNUSxRQUFRLEdBQUdaLE9BQU8sQ0FBQ2EsMkJBQTJCLElBQUliLE9BQU8sQ0FBQ2EsMkJBQTJCLENBQUNkLE9BQU8sQ0FBQ1UsWUFBWSxDQUFDO0lBQ2pILElBQUksQ0FBQ0csUUFBUSxFQUFFO01BQ2IsTUFBTSxJQUFJVixLQUFLLENBQUUsK0VBQThFSCxPQUFPLENBQUNVLFlBQWEsMkxBQTBMVCxPQUFPLENBQUNhLDJCQUE0Qiw4TEFBNkwsQ0FBQztJQUNsaEI7SUFFQSxNQUFNQyxZQUFvQixHQUFHLE1BQU1GLFFBQVEsQ0FBQ0csMEJBQTBCLENBQUNoQixPQUFPLENBQUNpQixPQUFPLEVBQUVqQixPQUFPLENBQUNrQixhQUFhLEVBQUVsQixPQUFPLENBQUNRLFlBQVksQ0FBQztJQUVwSSxNQUFNVyxhQUFhLEdBQUcsSUFBSUMscUJBQVksQ0FBQ0wsWUFBWSxDQUFDO0lBRXBELElBQUlkLE9BQU8sQ0FBQ29CLDJCQUEyQixHQUFHLENBQUMsRUFBRTtNQUMzQ3hCLEtBQUssQ0FBQ3lCLEdBQUcsQ0FBQ2pCLGNBQWMsRUFBRWMsYUFBYSxFQUFFbEIsT0FBTyxDQUFDb0IsMkJBQTJCLENBQUM7SUFDL0U7SUFFQSxPQUFPRixhQUFhO0VBQ3RCO0FBQ0YsQ0FBQztBQUFDSSxPQUFBLENBQUF4QixNQUFBLEdBQUFBLE1BQUEifQ==