tedious 16.4.0 → 16.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/benchmarks/bulk-load/iterable.js +1 -1
  2. package/benchmarks/common.js +2 -4
  3. package/benchmarks/package-lock.json +21173 -0
  4. package/benchmarks/package.json +11 -0
  5. package/benchmarks/query/call-tvp.js +1 -1
  6. package/benchmarks/query/insert-varbinary.js +1 -1
  7. package/benchmarks/query/select-many-rows.js +1 -1
  8. package/benchmarks/query/select-nvarchar.js +1 -1
  9. package/benchmarks/query/select-varbinary.js +1 -1
  10. package/benchmarks/request/rpcrequest-payload-tvp.js +2 -2
  11. package/benchmarks/request/rpcrequest-payload-varbinary.js +2 -2
  12. package/benchmarks/token-parser/colmetadata-token.js +4 -2
  13. package/benchmarks/token-parser/done-token.js +5 -2
  14. package/benchmarks/token-parser/simple-tokens.js +8 -2
  15. package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js +1 -8
  16. package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js.map +1 -1
  17. package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js +1 -8
  18. package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js.map +1 -1
  19. package/lib/always-encrypted/cek-entry.js +1 -7
  20. package/lib/always-encrypted/cek-entry.js.map +1 -1
  21. package/lib/always-encrypted/get-parameter-encryption-metadata.js +1 -1
  22. package/lib/always-encrypted/get-parameter-encryption-metadata.js.map +1 -1
  23. package/lib/always-encrypted/key-crypto.js +1 -1
  24. package/lib/always-encrypted/key-crypto.js.map +1 -1
  25. package/lib/always-encrypted/keystore-provider-azure-key-vault.js +1 -8
  26. package/lib/always-encrypted/keystore-provider-azure-key-vault.js.map +1 -1
  27. package/lib/always-encrypted/symmetric-key-cache.js +1 -1
  28. package/lib/always-encrypted/symmetric-key-cache.js.map +1 -1
  29. package/lib/always-encrypted/symmetric-key.js +1 -2
  30. package/lib/always-encrypted/symmetric-key.js.map +1 -1
  31. package/lib/always-encrypted/types.js +1 -1
  32. package/lib/always-encrypted/types.js.map +1 -1
  33. package/lib/bulk-load-payload.js +1 -3
  34. package/lib/bulk-load-payload.js.map +1 -1
  35. package/lib/bulk-load.js +15 -23
  36. package/lib/bulk-load.js.map +1 -1
  37. package/lib/collation.js +1 -7
  38. package/lib/collation.js.map +1 -1
  39. package/lib/connection.js +50 -35
  40. package/lib/connection.js.map +1 -1
  41. package/lib/connector.js +1 -1
  42. package/lib/connector.js.map +1 -1
  43. package/lib/data-type.js +1 -1
  44. package/lib/data-type.js.map +1 -1
  45. package/lib/data-types/bigint.js +1 -1
  46. package/lib/data-types/bigint.js.map +1 -1
  47. package/lib/data-types/binary.js +1 -1
  48. package/lib/data-types/binary.js.map +1 -1
  49. package/lib/data-types/bit.js +1 -1
  50. package/lib/data-types/bit.js.map +1 -1
  51. package/lib/data-types/bitn.js +1 -1
  52. package/lib/data-types/bitn.js.map +1 -1
  53. package/lib/data-types/char.js +1 -1
  54. package/lib/data-types/char.js.map +1 -1
  55. package/lib/data-types/date.js +1 -1
  56. package/lib/data-types/date.js.map +1 -1
  57. package/lib/data-types/datetime.js +1 -1
  58. package/lib/data-types/datetime.js.map +1 -1
  59. package/lib/data-types/datetime2.js +1 -1
  60. package/lib/data-types/datetime2.js.map +1 -1
  61. package/lib/data-types/datetimen.js +1 -1
  62. package/lib/data-types/datetimen.js.map +1 -1
  63. package/lib/data-types/datetimeoffset.js +1 -1
  64. package/lib/data-types/datetimeoffset.js.map +1 -1
  65. package/lib/data-types/decimal.js +1 -1
  66. package/lib/data-types/decimal.js.map +1 -1
  67. package/lib/data-types/decimaln.js +1 -1
  68. package/lib/data-types/decimaln.js.map +1 -1
  69. package/lib/data-types/float.js +1 -1
  70. package/lib/data-types/float.js.map +1 -1
  71. package/lib/data-types/floatn.js +1 -1
  72. package/lib/data-types/floatn.js.map +1 -1
  73. package/lib/data-types/image.js +1 -1
  74. package/lib/data-types/image.js.map +1 -1
  75. package/lib/data-types/int.js +1 -1
  76. package/lib/data-types/int.js.map +1 -1
  77. package/lib/data-types/intn.js +1 -1
  78. package/lib/data-types/intn.js.map +1 -1
  79. package/lib/data-types/money.js +1 -1
  80. package/lib/data-types/money.js.map +1 -1
  81. package/lib/data-types/moneyn.js +1 -1
  82. package/lib/data-types/moneyn.js.map +1 -1
  83. package/lib/data-types/nchar.js +1 -1
  84. package/lib/data-types/nchar.js.map +1 -1
  85. package/lib/data-types/ntext.js +1 -1
  86. package/lib/data-types/ntext.js.map +1 -1
  87. package/lib/data-types/null.js +1 -1
  88. package/lib/data-types/null.js.map +1 -1
  89. package/lib/data-types/numeric.js +1 -1
  90. package/lib/data-types/numeric.js.map +1 -1
  91. package/lib/data-types/numericn.js +1 -1
  92. package/lib/data-types/numericn.js.map +1 -1
  93. package/lib/data-types/nvarchar.js +1 -1
  94. package/lib/data-types/nvarchar.js.map +1 -1
  95. package/lib/data-types/real.js +1 -1
  96. package/lib/data-types/real.js.map +1 -1
  97. package/lib/data-types/smalldatetime.js +1 -1
  98. package/lib/data-types/smalldatetime.js.map +1 -1
  99. package/lib/data-types/smallint.js +1 -1
  100. package/lib/data-types/smallint.js.map +1 -1
  101. package/lib/data-types/smallmoney.js +1 -1
  102. package/lib/data-types/smallmoney.js.map +1 -1
  103. package/lib/data-types/sql-variant.js +1 -1
  104. package/lib/data-types/sql-variant.js.map +1 -1
  105. package/lib/data-types/text.js +1 -1
  106. package/lib/data-types/text.js.map +1 -1
  107. package/lib/data-types/time.js +1 -1
  108. package/lib/data-types/time.js.map +1 -1
  109. package/lib/data-types/tinyint.js +1 -1
  110. package/lib/data-types/tinyint.js.map +1 -1
  111. package/lib/data-types/tvp.js +1 -1
  112. package/lib/data-types/tvp.js.map +1 -1
  113. package/lib/data-types/udt.js +1 -1
  114. package/lib/data-types/udt.js.map +1 -1
  115. package/lib/data-types/uniqueidentifier.js +1 -1
  116. package/lib/data-types/uniqueidentifier.js.map +1 -1
  117. package/lib/data-types/varbinary.js +1 -1
  118. package/lib/data-types/varbinary.js.map +1 -1
  119. package/lib/data-types/varchar.js +1 -1
  120. package/lib/data-types/varchar.js.map +1 -1
  121. package/lib/data-types/xml.js +1 -1
  122. package/lib/data-types/xml.js.map +1 -1
  123. package/lib/debug.js +1 -4
  124. package/lib/debug.js.map +1 -1
  125. package/lib/errors/abort-error.js +1 -2
  126. package/lib/errors/abort-error.js.map +1 -1
  127. package/lib/errors/timeout-error.js +1 -2
  128. package/lib/errors/timeout-error.js.map +1 -1
  129. package/lib/errors.js +1 -10
  130. package/lib/errors.js.map +1 -1
  131. package/lib/incoming-message-stream.js +1 -4
  132. package/lib/incoming-message-stream.js.map +1 -1
  133. package/lib/login7-payload.js +1 -23
  134. package/lib/login7-payload.js.map +1 -1
  135. package/lib/message-io.js +1 -8
  136. package/lib/message-io.js.map +1 -1
  137. package/lib/message.js +1 -4
  138. package/lib/message.js.map +1 -1
  139. package/lib/metadata-parser.js +1 -1
  140. package/lib/metadata-parser.js.map +1 -1
  141. package/lib/ntlm-payload.js +1 -2
  142. package/lib/ntlm-payload.js.map +1 -1
  143. package/lib/outgoing-message-stream.js +1 -5
  144. package/lib/outgoing-message-stream.js.map +1 -1
  145. package/lib/packet.js +1 -2
  146. package/lib/packet.js.map +1 -1
  147. package/lib/prelogin-payload.js +1 -11
  148. package/lib/prelogin-payload.js.map +1 -1
  149. package/lib/request.js +13 -19
  150. package/lib/request.js.map +1 -1
  151. package/lib/rpcrequest-payload.js +1 -6
  152. package/lib/rpcrequest-payload.js.map +1 -1
  153. package/lib/sqlbatch-payload.js +1 -4
  154. package/lib/sqlbatch-payload.js.map +1 -1
  155. package/lib/tedious.js +1 -1
  156. package/lib/tedious.js.map +1 -1
  157. package/lib/token/colmetadata-token-parser.js +1 -1
  158. package/lib/token/colmetadata-token-parser.js.map +1 -1
  159. package/lib/token/done-token-parser.js +1 -1
  160. package/lib/token/done-token-parser.js.map +1 -1
  161. package/lib/token/env-change-token-parser.js +1 -1
  162. package/lib/token/env-change-token-parser.js.map +1 -1
  163. package/lib/token/feature-ext-ack-parser.js +1 -1
  164. package/lib/token/feature-ext-ack-parser.js.map +1 -1
  165. package/lib/token/fedauth-info-parser.js +1 -1
  166. package/lib/token/fedauth-info-parser.js.map +1 -1
  167. package/lib/token/handler.js +3 -13
  168. package/lib/token/handler.js.map +1 -1
  169. package/lib/token/infoerror-token-parser.js +1 -1
  170. package/lib/token/infoerror-token-parser.js.map +1 -1
  171. package/lib/token/loginack-token-parser.js +1 -1
  172. package/lib/token/loginack-token-parser.js.map +1 -1
  173. package/lib/token/nbcrow-token-parser.js +1 -1
  174. package/lib/token/nbcrow-token-parser.js.map +1 -1
  175. package/lib/token/order-token-parser.js +1 -1
  176. package/lib/token/order-token-parser.js.map +1 -1
  177. package/lib/token/returnstatus-token-parser.js +1 -1
  178. package/lib/token/returnstatus-token-parser.js.map +1 -1
  179. package/lib/token/returnvalue-token-parser.js +1 -1
  180. package/lib/token/returnvalue-token-parser.js.map +1 -1
  181. package/lib/token/row-token-parser.js +1 -1
  182. package/lib/token/row-token-parser.js.map +1 -1
  183. package/lib/token/sspi-token-parser.js +1 -1
  184. package/lib/token/sspi-token-parser.js.map +1 -1
  185. package/lib/token/stream-parser.js +1 -10
  186. package/lib/token/stream-parser.js.map +1 -1
  187. package/lib/token/token-stream-parser.js +1 -4
  188. package/lib/token/token-stream-parser.js.map +1 -1
  189. package/lib/token/token.js +2 -88
  190. package/lib/token/token.js.map +1 -1
  191. package/lib/tracking-buffer/writable-tracking-buffer.js +1 -7
  192. package/lib/tracking-buffer/writable-tracking-buffer.js.map +1 -1
  193. package/lib/transaction.js +1 -4
  194. package/lib/transaction.js.map +1 -1
  195. package/lib/value-parser.js +1 -1
  196. package/lib/value-parser.js.map +1 -1
  197. package/package.json +1 -1
  198. package/tsconfig.json +2 -2
  199. package/benchmarks/bulk-load/stream.js +0 -62
  200. package/benchmarks/bulk-load/sync.js +0 -59
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "tedious-benchmarks",
3
+ "version": "1.0.0",
4
+ "description": "This folder contains a collection of benchmarks for `tedious`.",
5
+ "scripts": {
6
+ "test": "echo \"Error: no test specified\" && exit 1"
7
+ },
8
+ "dependencies": {
9
+ "tedious": "file:.."
10
+ }
11
+ }
@@ -1,6 +1,6 @@
1
1
  const { createBenchmark, createConnection } = require('../common');
2
2
 
3
- const { Request, TYPES } = require('../../src/tedious');
3
+ const { Request, TYPES } = require('tedious');
4
4
 
5
5
  const bench = createBenchmark(main, {
6
6
  n: [10, 100]
@@ -1,6 +1,6 @@
1
1
  const { createBenchmark, createConnection } = require('../common');
2
2
 
3
- const { Request, TYPES } = require('../../src/tedious');
3
+ const { Request, TYPES } = require('tedious');
4
4
 
5
5
  const bench = createBenchmark(main, {
6
6
  n: [10, 100],
@@ -1,6 +1,6 @@
1
1
  const { createBenchmark, createConnection } = require('../common');
2
2
 
3
- const { Request, TYPES } = require('../../src/tedious');
3
+ const { Request, TYPES } = require('tedious');
4
4
 
5
5
  const bench = createBenchmark(main, {
6
6
  n: [10, 100, 1000],
@@ -1,6 +1,6 @@
1
1
  const { createBenchmark, createConnection } = require('../common');
2
2
 
3
- const { Request, TYPES } = require('../../src/tedious');
3
+ const { Request, TYPES } = require('tedious');
4
4
 
5
5
  const bench = createBenchmark(main, {
6
6
  n: [10, 100, 1000],
@@ -1,6 +1,6 @@
1
1
  const { createBenchmark, createConnection } = require('../common');
2
2
 
3
- const { Request, TYPES } = require('../../src/tedious');
3
+ const { Request, TYPES } = require('tedious');
4
4
 
5
5
  const bench = createBenchmark(main, {
6
6
  n: [10, 100],
@@ -1,7 +1,7 @@
1
1
  const { createBenchmark } = require('../common');
2
2
 
3
- const { Request, TYPES } = require('../../src/tedious');
4
- const RpcRequestPayload = require('../../src/rpcrequest-payload');
3
+ const { Request, TYPES } = require('tedious');
4
+ const RpcRequestPayload = require('tedious/lib/rpcrequest-payload');
5
5
 
6
6
  const { Readable } = require('stream');
7
7
 
@@ -1,7 +1,7 @@
1
1
  const { createBenchmark } = require('../common');
2
2
 
3
- const { Request, TYPES } = require('../../src/tedious');
4
- const RpcRequestPayload = require('../../src/rpcrequest-payload');
3
+ const { Request, TYPES } = require('tedious');
4
+ const RpcRequestPayload = require('tedious/lib/rpcrequest-payload');
5
5
 
6
6
  const { Readable } = require('stream');
7
7
 
@@ -1,6 +1,6 @@
1
1
  const { createBenchmark } = require('../common');
2
2
 
3
- const { Parser } = require('../../src/token/token-stream-parser');
3
+ const { Parser } = require('tedious/lib/token/token-stream-parser');
4
4
 
5
5
  const bench = createBenchmark(main, {
6
6
  n: [10, 100, 1000],
@@ -15,7 +15,9 @@ async function * repeat(data, n) {
15
15
 
16
16
  function main({ n, tokenCount }) {
17
17
  const data = Buffer.from('810300000000001000380269006400000000000900e7c8000904d00034046e0061006d006500000000000900e7ffff0904d000340b6400650073006300720069007000740069006f006e00'.repeat(tokenCount), 'hex');
18
- const parser = new Parser(repeat(data, n), { token: function() { } }, {}, {});
18
+ const parser = new Parser(repeat(data, n), { token: function() { } }, {
19
+ onColMetadata: (token) => { }
20
+ }, {});
19
21
 
20
22
  bench.start();
21
23
 
@@ -1,6 +1,6 @@
1
1
  const { createBenchmark } = require('../common');
2
2
 
3
- const { Parser } = require('../../src/token/token-stream-parser');
3
+ const { Parser } = require('tedious/lib/token/token-stream-parser');
4
4
 
5
5
  const bench = createBenchmark(main, {
6
6
  n: [10, 100, 1000],
@@ -15,7 +15,10 @@ async function * repeat(data, n) {
15
15
 
16
16
  function main({ n, tokenCount }) {
17
17
  const data = Buffer.from('FE0000E0000000000000000000'.repeat(tokenCount), 'hex');
18
- const parser = new Parser(repeat(data, n), { token: function() { } }, {}, {});
18
+
19
+ const parser = new Parser(repeat(data, n), { token: function() { } }, {
20
+ onDoneProc: (token) => { }
21
+ }, {});
19
22
 
20
23
  bench.start();
21
24
 
@@ -1,6 +1,6 @@
1
1
  const { createBenchmark } = require('../common');
2
2
 
3
- const { Parser } = require('../../src/token/token-stream-parser');
3
+ const { Parser } = require('tedious/lib/token/token-stream-parser');
4
4
 
5
5
  const bench = createBenchmark(main, {
6
6
  n: [10, 100, 1000]
@@ -347,7 +347,13 @@ function main({ n }) {
347
347
  '1100C10064000000000000007900000000FE0000E0000000000000000000'
348
348
  ].join(''), 'hex');
349
349
 
350
- const parser = new Parser(repeat(data, n), { token: function() { } }, {}, {});
350
+ const parser = new Parser(repeat(data, n), {}, {
351
+ onColMetadata: () => { },
352
+ onRow: () => { },
353
+ onDoneInProc: () => { },
354
+ onDoneProc: () => { },
355
+ onReturnStatus: () => { }
356
+ }, {});
351
357
 
352
358
  bench.start();
353
359
 
@@ -15,13 +15,6 @@ exports.algorithmName = algorithmName;
15
15
  const algorithmVersion = 0x1;
16
16
  const blockSizeInBytes = 16;
17
17
  class AeadAes256CbcHmac256Algorithm {
18
- columnEncryptionkey;
19
- isDeterministic;
20
- keySizeInBytes;
21
- version;
22
- versionSize;
23
- minimumCipherTextLengthInBytesNoAuthenticationTag;
24
- minimumCipherTextLengthInBytesWithAuthenticationTag;
25
18
  constructor(columnEncryptionKey, encryptionType) {
26
19
  this.keySizeInBytes = _aeadAes256CbcHmacEncryptionKey.keySize / 8;
27
20
  this.version = Buffer.from([algorithmVersion]);
@@ -87,4 +80,4 @@ class AeadAes256CbcHmac256Algorithm {
87
80
  }
88
81
  }
89
82
  exports.AeadAes256CbcHmac256Algorithm = AeadAes256CbcHmac256Algorithm;
90
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZXMiLCJyZXF1aXJlIiwiX2NyeXB0byIsIl9hZWFkQWVzMjU2Q2JjSG1hY0VuY3J5cHRpb25LZXkiLCJhbGdvcml0aG1OYW1lIiwiZXhwb3J0cyIsImFsZ29yaXRobVZlcnNpb24iLCJibG9ja1NpemVJbkJ5dGVzIiwiQWVhZEFlczI1NkNiY0htYWMyNTZBbGdvcml0aG0iLCJjb2x1bW5FbmNyeXB0aW9ua2V5IiwiaXNEZXRlcm1pbmlzdGljIiwia2V5U2l6ZUluQnl0ZXMiLCJ2ZXJzaW9uIiwidmVyc2lvblNpemUiLCJtaW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNOb0F1dGhlbnRpY2F0aW9uVGFnIiwibWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzV2l0aEF1dGhlbnRpY2F0aW9uVGFnIiwiY29uc3RydWN0b3IiLCJjb2x1bW5FbmNyeXB0aW9uS2V5IiwiZW5jcnlwdGlvblR5cGUiLCJrZXlTaXplIiwiQnVmZmVyIiwiZnJvbSIsIlNRTFNlcnZlckVuY3J5cHRpb25UeXBlIiwiRGV0ZXJtaW5pc3RpYyIsImVuY3J5cHREYXRhIiwicGxhaW50VGV4dCIsIml2IiwiaG1hY0l2IiwiY3JlYXRlSG1hYyIsImdldEl2S2V5IiwidXBkYXRlIiwiZGlnZXN0Iiwic2xpY2UiLCJyYW5kb21CeXRlcyIsImVuY3J5cHRDaXBoZXIiLCJjcmVhdGVDaXBoZXJpdiIsImdldEVuY3J5cHRpb25LZXkiLCJlbmNyeXB0ZWRCdWZmZXIiLCJjb25jYXQiLCJmaW5hbCIsImF1dGhlbnRpY2F0aW9uVGFnIiwiX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyIsImxlbmd0aCIsImRlY3J5cHREYXRhIiwiY2lwaGVyVGV4dCIsImFsbG9jIiwibWluaW11bUNpcGVyVGV4dExlbmd0aCIsIkVycm9yIiwic3RhcnRJbmRleCIsInRvU3RyaW5nIiwiYXV0aGVudGljYXRpb25UYWdPZmZzZXQiLCJjb3B5IiwiY2lwaGVyVGV4dE9mZnNldCIsImNpcGhlclRleHRDb3VudCIsImNvbXBhcmUiLCJNYXRoIiwibWluIiwicGxhaW5UZXh0IiwiZGVjaXBoZXIiLCJjcmVhdGVEZWNpcGhlcml2IiwiZXJyb3IiLCJtZXNzYWdlIiwib2Zmc2V0IiwiaG1hYyIsImdldE1hY0tleSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1hbGdvcml0aG0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IEVuY3J5cHRpb25BbGdvcml0aG0sIFNRTFNlcnZlckVuY3J5cHRpb25UeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVIbWFjLCByYW5kb21CeXRlcywgY3JlYXRlQ2lwaGVyaXYsIGNyZWF0ZURlY2lwaGVyaXYgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgQWVhZEFlczI1NkNiY0htYWMyNTZFbmNyeXB0aW9uS2V5LCBrZXlTaXplIH0gZnJvbSAnLi9hZWFkLWFlcy0yNTYtY2JjLWhtYWMtZW5jcnlwdGlvbi1rZXknO1xuXG5leHBvcnQgY29uc3QgYWxnb3JpdGhtTmFtZSA9ICdBRUFEX0FFU18yNTZfQ0JDX0hNQUNfU0hBMjU2JztcbmNvbnN0IGFsZ29yaXRobVZlcnNpb24gPSAweDE7XG5jb25zdCBibG9ja1NpemVJbkJ5dGVzID0gMTY7XG5cbmV4cG9ydCBjbGFzcyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkFsZ29yaXRobSBpbXBsZW1lbnRzIEVuY3J5cHRpb25BbGdvcml0aG0ge1xuICBwcml2YXRlIGNvbHVtbkVuY3J5cHRpb25rZXk6IEFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleTtcbiAgcHJpdmF0ZSBpc0RldGVybWluaXN0aWM6IGJvb2xlYW47XG4gIHByaXZhdGUga2V5U2l6ZUluQnl0ZXM6IG51bWJlcjtcbiAgcHJpdmF0ZSB2ZXJzaW9uOiBCdWZmZXI7XG4gIHByaXZhdGUgdmVyc2lvblNpemU6IEJ1ZmZlcjtcbiAgcHJpdmF0ZSBtaW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNOb0F1dGhlbnRpY2F0aW9uVGFnOiBudW1iZXI7XG4gIHByaXZhdGUgbWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzV2l0aEF1dGhlbnRpY2F0aW9uVGFnOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoY29sdW1uRW5jcnlwdGlvbktleTogQWVhZEFlczI1NkNiY0htYWMyNTZFbmNyeXB0aW9uS2V5LCBlbmNyeXB0aW9uVHlwZTogU1FMU2VydmVyRW5jcnlwdGlvblR5cGUpIHtcbiAgICB0aGlzLmtleVNpemVJbkJ5dGVzID0ga2V5U2l6ZSAvIDg7XG4gICAgdGhpcy52ZXJzaW9uID0gQnVmZmVyLmZyb20oW2FsZ29yaXRobVZlcnNpb25dKTtcbiAgICB0aGlzLnZlcnNpb25TaXplID0gQnVmZmVyLmZyb20oWzFdKTtcbiAgICB0aGlzLm1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc05vQXV0aGVudGljYXRpb25UYWcgPSAxICsgYmxvY2tTaXplSW5CeXRlcyArIGJsb2NrU2l6ZUluQnl0ZXM7XG4gICAgdGhpcy5taW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNXaXRoQXV0aGVudGljYXRpb25UYWcgPSB0aGlzLm1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc05vQXV0aGVudGljYXRpb25UYWcgKyB0aGlzLmtleVNpemVJbkJ5dGVzO1xuICAgIHRoaXMuY29sdW1uRW5jcnlwdGlvbmtleSA9IGNvbHVtbkVuY3J5cHRpb25LZXk7XG5cbiAgICB0aGlzLmlzRGV0ZXJtaW5pc3RpYyA9IGVuY3J5cHRpb25UeXBlID09PSBTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZS5EZXRlcm1pbmlzdGljO1xuICB9XG5cbiAgZW5jcnlwdERhdGEocGxhaW50VGV4dDogQnVmZmVyKTogQnVmZmVyIHtcbiAgICBsZXQgaXY6IEJ1ZmZlcjtcblxuICAgIGlmICh0aGlzLmlzRGV0ZXJtaW5pc3RpYyA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaG1hY0l2ID0gY3JlYXRlSG1hYygnc2hhMjU2JywgdGhpcy5jb2x1bW5FbmNyeXB0aW9ua2V5LmdldEl2S2V5KCkpO1xuICAgICAgaG1hY0l2LnVwZGF0ZShwbGFpbnRUZXh0KTtcbiAgICAgIGl2ID0gaG1hY0l2LmRpZ2VzdCgpLnNsaWNlKDAsIGJsb2NrU2l6ZUluQnl0ZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdiA9IHJhbmRvbUJ5dGVzKGJsb2NrU2l6ZUluQnl0ZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHRDaXBoZXIgPSBjcmVhdGVDaXBoZXJpdignYWVzLTI1Ni1jYmMnLCB0aGlzLmNvbHVtbkVuY3J5cHRpb25rZXkuZ2V0RW5jcnlwdGlvbktleSgpLCBpdik7XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFtlbmNyeXB0Q2lwaGVyLnVwZGF0ZShwbGFpbnRUZXh0KSwgZW5jcnlwdENpcGhlci5maW5hbCgpXSk7XG5cbiAgICBjb25zdCBhdXRoZW50aWNhdGlvblRhZzogQnVmZmVyID0gdGhpcy5fcHJlcGFyZUF1dGhlbnRpY2F0aW9uVGFnKGl2LCBlbmNyeXB0ZWRCdWZmZXIsIDAsIGVuY3J5cHRlZEJ1ZmZlci5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFthbGdvcml0aG1WZXJzaW9uXSksIGF1dGhlbnRpY2F0aW9uVGFnLCBpdiwgZW5jcnlwdGVkQnVmZmVyXSk7XG4gIH1cblxuICBkZWNyeXB0RGF0YShjaXBoZXJUZXh0OiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIGNvbnN0IGl2OiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoYmxvY2tTaXplSW5CeXRlcyk7XG5cbiAgICBjb25zdCBtaW5pbXVtQ2lwZXJUZXh0TGVuZ3RoOiBudW1iZXIgPSB0aGlzLm1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc1dpdGhBdXRoZW50aWNhdGlvblRhZztcblxuICAgIGlmIChjaXBoZXJUZXh0Lmxlbmd0aCA8IG1pbmltdW1DaXBlclRleHRMZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3BlY2lmaWVkIGNpcGhlcnRleHQgaGFzIGFuIGludmFsaWQgc2l6ZSBvZiAke2NpcGhlclRleHQubGVuZ3RofSBieXRlcywgd2hpY2ggaXMgYmVsb3cgdGhlIG1pbmltdW0gJHttaW5pbXVtQ2lwZXJUZXh0TGVuZ3RofSBieXRlcyByZXF1aXJlZCBmb3IgZGVjcnlwdGlvbi5gKTtcbiAgICB9XG5cbiAgICBsZXQgc3RhcnRJbmRleCA9IDA7XG4gICAgaWYgKGNpcGhlclRleHRbMF0gIT09IGFsZ29yaXRobVZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNwZWNpZmllZCBjaXBoZXJ0ZXh0J3MgZW5jcnlwdGlvbiBhbGdvcml0aG0gdmVyc2lvbiAke0J1ZmZlci5mcm9tKFtjaXBoZXJUZXh0WzBdXSkudG9TdHJpbmcoJ2hleCcpfSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgZW5jcnlwdGlvbiBhbGdvcml0aG0gdmVyc2lvbiAke2FsZ29yaXRobVZlcnNpb259LmApO1xuICAgIH1cblxuICAgIHN0YXJ0SW5kZXggKz0gMTtcbiAgICBsZXQgYXV0aGVudGljYXRpb25UYWdPZmZzZXQgPSAwO1xuXG4gICAgYXV0aGVudGljYXRpb25UYWdPZmZzZXQgPSBzdGFydEluZGV4O1xuICAgIHN0YXJ0SW5kZXggKz0gdGhpcy5rZXlTaXplSW5CeXRlcztcblxuICAgIGNpcGhlclRleHQuY29weShpdiwgMCwgc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIGl2Lmxlbmd0aCk7XG4gICAgc3RhcnRJbmRleCArPSBpdi5sZW5ndGg7XG5cbiAgICBjb25zdCBjaXBoZXJUZXh0T2Zmc2V0ID0gc3RhcnRJbmRleDtcbiAgICBjb25zdCBjaXBoZXJUZXh0Q291bnQgPSBjaXBoZXJUZXh0Lmxlbmd0aCAtIHN0YXJ0SW5kZXg7XG5cbiAgICBjb25zdCBhdXRoZW50aWNhdGlvblRhZzogQnVmZmVyID0gdGhpcy5fcHJlcGFyZUF1dGhlbnRpY2F0aW9uVGFnKGl2LCBjaXBoZXJUZXh0LCBjaXBoZXJUZXh0T2Zmc2V0LCBjaXBoZXJUZXh0Q291bnQpO1xuXG4gICAgaWYgKDAgIT09IGF1dGhlbnRpY2F0aW9uVGFnLmNvbXBhcmUoY2lwaGVyVGV4dCwgYXV0aGVudGljYXRpb25UYWdPZmZzZXQsIE1hdGgubWluKGF1dGhlbnRpY2F0aW9uVGFnT2Zmc2V0ICsgY2lwaGVyVGV4dENvdW50LCBhdXRoZW50aWNhdGlvblRhZ09mZnNldCArIGF1dGhlbnRpY2F0aW9uVGFnLmxlbmd0aCksIDAsIE1hdGgubWluKGNpcGhlclRleHRDb3VudCwgYXV0aGVudGljYXRpb25UYWcubGVuZ3RoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3BlY2lmaWVkIGNpcGhlcnRleHQgaGFzIGFuIGludmFsaWQgYXV0aGVudGljYXRpb24gdGFnLicpO1xuICAgIH1cblxuICAgIGxldCBwbGFpblRleHQ6IEJ1ZmZlcjtcblxuICAgIGNvbnN0IGRlY2lwaGVyID0gY3JlYXRlRGVjaXBoZXJpdignYWVzLTI1Ni1jYmMnLCB0aGlzLmNvbHVtbkVuY3J5cHRpb25rZXkuZ2V0RW5jcnlwdGlvbktleSgpLCBpdik7XG4gICAgdHJ5IHtcbiAgICAgIHBsYWluVGV4dCA9IGRlY2lwaGVyLnVwZGF0ZShjaXBoZXJUZXh0LnNsaWNlKGNpcGhlclRleHRPZmZzZXQsIGNpcGhlclRleHRPZmZzZXQgKyBjaXBoZXJUZXh0Q291bnQpKTtcbiAgICAgIHBsYWluVGV4dCA9IEJ1ZmZlci5jb25jYXQoW3BsYWluVGV4dCwgZGVjaXBoZXIuZmluYWwoKV0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3Igd2hpbGUgZGVjcnlwdGlvbjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cblxuICAgIHJldHVybiBwbGFpblRleHQ7XG4gIH1cblxuICBfcHJlcGFyZUF1dGhlbnRpY2F0aW9uVGFnKGl2OiBCdWZmZXIsIGNpcGhlclRleHQ6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogQnVmZmVyIHtcbiAgICBjb25zdCBobWFjID0gY3JlYXRlSG1hYygnc2hhMjU2JywgdGhpcy5jb2x1bW5FbmNyeXB0aW9ua2V5LmdldE1hY0tleSgpKTtcblxuICAgIGhtYWMudXBkYXRlKHRoaXMudmVyc2lvbik7XG4gICAgaG1hYy51cGRhdGUoaXYpO1xuICAgIGhtYWMudXBkYXRlKGNpcGhlclRleHQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKTtcbiAgICBobWFjLnVwZGF0ZSh0aGlzLnZlcnNpb25TaXplKTtcbiAgICByZXR1cm4gaG1hYy5kaWdlc3QoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSwrQkFBQSxHQUFBRixPQUFBO0FBTEE7QUFDQTs7QUFNTyxNQUFNRyxhQUFhLEdBQUcsOEJBQThCO0FBQUNDLE9BQUEsQ0FBQUQsYUFBQSxHQUFBQSxhQUFBO0FBQzVELE1BQU1FLGdCQUFnQixHQUFHLEdBQUc7QUFDNUIsTUFBTUMsZ0JBQWdCLEdBQUcsRUFBRTtBQUVwQixNQUFNQyw2QkFBNkIsQ0FBZ0M7RUFDaEVDLG1CQUFtQjtFQUNuQkMsZUFBZTtFQUNmQyxjQUFjO0VBQ2RDLE9BQU87RUFDUEMsV0FBVztFQUNYQyxpREFBaUQ7RUFDakRDLG1EQUFtRDtFQUUzREMsV0FBV0EsQ0FBQ0MsbUJBQXNELEVBQUVDLGNBQXVDLEVBQUU7SUFDM0csSUFBSSxDQUFDUCxjQUFjLEdBQUdRLHVDQUFPLEdBQUcs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
83
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZXMiLCJyZXF1aXJlIiwiX2NyeXB0byIsIl9hZWFkQWVzMjU2Q2JjSG1hY0VuY3J5cHRpb25LZXkiLCJhbGdvcml0aG1OYW1lIiwiZXhwb3J0cyIsImFsZ29yaXRobVZlcnNpb24iLCJibG9ja1NpemVJbkJ5dGVzIiwiQWVhZEFlczI1NkNiY0htYWMyNTZBbGdvcml0aG0iLCJjb25zdHJ1Y3RvciIsImNvbHVtbkVuY3J5cHRpb25LZXkiLCJlbmNyeXB0aW9uVHlwZSIsImtleVNpemVJbkJ5dGVzIiwia2V5U2l6ZSIsInZlcnNpb24iLCJCdWZmZXIiLCJmcm9tIiwidmVyc2lvblNpemUiLCJtaW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNOb0F1dGhlbnRpY2F0aW9uVGFnIiwibWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzV2l0aEF1dGhlbnRpY2F0aW9uVGFnIiwiY29sdW1uRW5jcnlwdGlvbmtleSIsImlzRGV0ZXJtaW5pc3RpYyIsIlNRTFNlcnZlckVuY3J5cHRpb25UeXBlIiwiRGV0ZXJtaW5pc3RpYyIsImVuY3J5cHREYXRhIiwicGxhaW50VGV4dCIsIml2IiwiaG1hY0l2IiwiY3JlYXRlSG1hYyIsImdldEl2S2V5IiwidXBkYXRlIiwiZGlnZXN0Iiwic2xpY2UiLCJyYW5kb21CeXRlcyIsImVuY3J5cHRDaXBoZXIiLCJjcmVhdGVDaXBoZXJpdiIsImdldEVuY3J5cHRpb25LZXkiLCJlbmNyeXB0ZWRCdWZmZXIiLCJjb25jYXQiLCJmaW5hbCIsImF1dGhlbnRpY2F0aW9uVGFnIiwiX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyIsImxlbmd0aCIsImRlY3J5cHREYXRhIiwiY2lwaGVyVGV4dCIsImFsbG9jIiwibWluaW11bUNpcGVyVGV4dExlbmd0aCIsIkVycm9yIiwic3RhcnRJbmRleCIsInRvU3RyaW5nIiwiYXV0aGVudGljYXRpb25UYWdPZmZzZXQiLCJjb3B5IiwiY2lwaGVyVGV4dE9mZnNldCIsImNpcGhlclRleHRDb3VudCIsImNvbXBhcmUiLCJNYXRoIiwibWluIiwicGxhaW5UZXh0IiwiZGVjaXBoZXIiLCJjcmVhdGVEZWNpcGhlcml2IiwiZXJyb3IiLCJtZXNzYWdlIiwib2Zmc2V0IiwiaG1hYyIsImdldE1hY0tleSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1hbGdvcml0aG0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IHR5cGUgRW5jcnlwdGlvbkFsZ29yaXRobSwgU1FMU2VydmVyRW5jcnlwdGlvblR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUhtYWMsIHJhbmRvbUJ5dGVzLCBjcmVhdGVDaXBoZXJpdiwgY3JlYXRlRGVjaXBoZXJpdiB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXksIGtleVNpemUgfSBmcm9tICcuL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1lbmNyeXB0aW9uLWtleSc7XG5cbmV4cG9ydCBjb25zdCBhbGdvcml0aG1OYW1lID0gJ0FFQURfQUVTXzI1Nl9DQkNfSE1BQ19TSEEyNTYnO1xuY29uc3QgYWxnb3JpdGhtVmVyc2lvbiA9IDB4MTtcbmNvbnN0IGJsb2NrU2l6ZUluQnl0ZXMgPSAxNjtcblxuZXhwb3J0IGNsYXNzIEFlYWRBZXMyNTZDYmNIbWFjMjU2QWxnb3JpdGhtIGltcGxlbWVudHMgRW5jcnlwdGlvbkFsZ29yaXRobSB7XG4gIGRlY2xhcmUgcHJpdmF0ZSBjb2x1bW5FbmNyeXB0aW9ua2V5OiBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXk7XG4gIGRlY2xhcmUgcHJpdmF0ZSBpc0RldGVybWluaXN0aWM6IGJvb2xlYW47XG4gIGRlY2xhcmUgcHJpdmF0ZSBrZXlTaXplSW5CeXRlczogbnVtYmVyO1xuICBkZWNsYXJlIHByaXZhdGUgdmVyc2lvbjogQnVmZmVyO1xuICBkZWNsYXJlIHByaXZhdGUgdmVyc2lvblNpemU6IEJ1ZmZlcjtcbiAgZGVjbGFyZSBwcml2YXRlIG1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc05vQXV0aGVudGljYXRpb25UYWc6IG51bWJlcjtcbiAgZGVjbGFyZSBwcml2YXRlIG1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc1dpdGhBdXRoZW50aWNhdGlvblRhZzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbHVtbkVuY3J5cHRpb25LZXk6IEFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSwgZW5jcnlwdGlvblR5cGU6IFNRTFNlcnZlckVuY3J5cHRpb25UeXBlKSB7XG4gICAgdGhpcy5rZXlTaXplSW5CeXRlcyA9IGtleVNpemUgLyA4O1xuICAgIHRoaXMudmVyc2lvbiA9IEJ1ZmZlci5mcm9tKFthbGdvcml0aG1WZXJzaW9uXSk7XG4gICAgdGhpcy52ZXJzaW9uU2l6ZSA9IEJ1ZmZlci5mcm9tKFsxXSk7XG4gICAgdGhpcy5taW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNOb0F1dGhlbnRpY2F0aW9uVGFnID0gMSArIGJsb2NrU2l6ZUluQnl0ZXMgKyBibG9ja1NpemVJbkJ5dGVzO1xuICAgIHRoaXMubWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzV2l0aEF1dGhlbnRpY2F0aW9uVGFnID0gdGhpcy5taW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNOb0F1dGhlbnRpY2F0aW9uVGFnICsgdGhpcy5rZXlTaXplSW5CeXRlcztcbiAgICB0aGlzLmNvbHVtbkVuY3J5cHRpb25rZXkgPSBjb2x1bW5FbmNyeXB0aW9uS2V5O1xuXG4gICAgdGhpcy5pc0RldGVybWluaXN0aWMgPSBlbmNyeXB0aW9uVHlwZSA9PT0gU1FMU2VydmVyRW5jcnlwdGlvblR5cGUuRGV0ZXJtaW5pc3RpYztcbiAgfVxuXG4gIGVuY3J5cHREYXRhKHBsYWludFRleHQ6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgbGV0IGl2OiBCdWZmZXI7XG5cbiAgICBpZiAodGhpcy5pc0RldGVybWluaXN0aWMgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGhtYWNJdiA9IGNyZWF0ZUhtYWMoJ3NoYTI1NicsIHRoaXMuY29sdW1uRW5jcnlwdGlvbmtleS5nZXRJdktleSgpKTtcbiAgICAgIGhtYWNJdi51cGRhdGUocGxhaW50VGV4dCk7XG4gICAgICBpdiA9IGhtYWNJdi5kaWdlc3QoKS5zbGljZSgwLCBibG9ja1NpemVJbkJ5dGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXYgPSByYW5kb21CeXRlcyhibG9ja1NpemVJbkJ5dGVzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0Q2lwaGVyID0gY3JlYXRlQ2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgdGhpcy5jb2x1bW5FbmNyeXB0aW9ua2V5LmdldEVuY3J5cHRpb25LZXkoKSwgaXYpO1xuXG4gICAgY29uc3QgZW5jcnlwdGVkQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbZW5jcnlwdENpcGhlci51cGRhdGUocGxhaW50VGV4dCksIGVuY3J5cHRDaXBoZXIuZmluYWwoKV0pO1xuXG4gICAgY29uc3QgYXV0aGVudGljYXRpb25UYWc6IEJ1ZmZlciA9IHRoaXMuX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyhpdiwgZW5jcnlwdGVkQnVmZmVyLCAwLCBlbmNyeXB0ZWRCdWZmZXIubGVuZ3RoKTtcblxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbYWxnb3JpdGhtVmVyc2lvbl0pLCBhdXRoZW50aWNhdGlvblRhZywgaXYsIGVuY3J5cHRlZEJ1ZmZlcl0pO1xuICB9XG5cbiAgZGVjcnlwdERhdGEoY2lwaGVyVGV4dDogQnVmZmVyKTogQnVmZmVyIHtcbiAgICBjb25zdCBpdjogQnVmZmVyID0gQnVmZmVyLmFsbG9jKGJsb2NrU2l6ZUluQnl0ZXMpO1xuXG4gICAgY29uc3QgbWluaW11bUNpcGVyVGV4dExlbmd0aDogbnVtYmVyID0gdGhpcy5taW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNXaXRoQXV0aGVudGljYXRpb25UYWc7XG5cbiAgICBpZiAoY2lwaGVyVGV4dC5sZW5ndGggPCBtaW5pbXVtQ2lwZXJUZXh0TGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBjaXBoZXJ0ZXh0IGhhcyBhbiBpbnZhbGlkIHNpemUgb2YgJHtjaXBoZXJUZXh0Lmxlbmd0aH0gYnl0ZXMsIHdoaWNoIGlzIGJlbG93IHRoZSBtaW5pbXVtICR7bWluaW11bUNpcGVyVGV4dExlbmd0aH0gYnl0ZXMgcmVxdWlyZWQgZm9yIGRlY3J5cHRpb24uYCk7XG4gICAgfVxuXG4gICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xuICAgIGlmIChjaXBoZXJUZXh0WzBdICE9PSBhbGdvcml0aG1WZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBzcGVjaWZpZWQgY2lwaGVydGV4dCdzIGVuY3J5cHRpb24gYWxnb3JpdGhtIHZlcnNpb24gJHtCdWZmZXIuZnJvbShbY2lwaGVyVGV4dFswXV0pLnRvU3RyaW5nKCdoZXgnKX0gZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGVuY3J5cHRpb24gYWxnb3JpdGhtIHZlcnNpb24gJHthbGdvcml0aG1WZXJzaW9ufS5gKTtcbiAgICB9XG5cbiAgICBzdGFydEluZGV4ICs9IDE7XG4gICAgbGV0IGF1dGhlbnRpY2F0aW9uVGFnT2Zmc2V0ID0gMDtcblxuICAgIGF1dGhlbnRpY2F0aW9uVGFnT2Zmc2V0ID0gc3RhcnRJbmRleDtcbiAgICBzdGFydEluZGV4ICs9IHRoaXMua2V5U2l6ZUluQnl0ZXM7XG5cbiAgICBjaXBoZXJUZXh0LmNvcHkoaXYsIDAsIHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyBpdi5sZW5ndGgpO1xuICAgIHN0YXJ0SW5kZXggKz0gaXYubGVuZ3RoO1xuXG4gICAgY29uc3QgY2lwaGVyVGV4dE9mZnNldCA9IHN0YXJ0SW5kZXg7XG4gICAgY29uc3QgY2lwaGVyVGV4dENvdW50ID0gY2lwaGVyVGV4dC5sZW5ndGggLSBzdGFydEluZGV4O1xuXG4gICAgY29uc3QgYXV0aGVudGljYXRpb25UYWc6IEJ1ZmZlciA9IHRoaXMuX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyhpdiwgY2lwaGVyVGV4dCwgY2lwaGVyVGV4dE9mZnNldCwgY2lwaGVyVGV4dENvdW50KTtcblxuICAgIGlmICgwICE9PSBhdXRoZW50aWNhdGlvblRhZy5jb21wYXJlKGNpcGhlclRleHQsIGF1dGhlbnRpY2F0aW9uVGFnT2Zmc2V0LCBNYXRoLm1pbihhdXRoZW50aWNhdGlvblRhZ09mZnNldCArIGNpcGhlclRleHRDb3VudCwgYXV0aGVudGljYXRpb25UYWdPZmZzZXQgKyBhdXRoZW50aWNhdGlvblRhZy5sZW5ndGgpLCAwLCBNYXRoLm1pbihjaXBoZXJUZXh0Q291bnQsIGF1dGhlbnRpY2F0aW9uVGFnLmxlbmd0aCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NwZWNpZmllZCBjaXBoZXJ0ZXh0IGhhcyBhbiBpbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHRhZy4nKTtcbiAgICB9XG5cbiAgICBsZXQgcGxhaW5UZXh0OiBCdWZmZXI7XG5cbiAgICBjb25zdCBkZWNpcGhlciA9IGNyZWF0ZURlY2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgdGhpcy5jb2x1bW5FbmNyeXB0aW9ua2V5LmdldEVuY3J5cHRpb25LZXkoKSwgaXYpO1xuICAgIHRyeSB7XG4gICAgICBwbGFpblRleHQgPSBkZWNpcGhlci51cGRhdGUoY2lwaGVyVGV4dC5zbGljZShjaXBoZXJUZXh0T2Zmc2V0LCBjaXBoZXJUZXh0T2Zmc2V0ICsgY2lwaGVyVGV4dENvdW50KSk7XG4gICAgICBwbGFpblRleHQgPSBCdWZmZXIuY29uY2F0KFtwbGFpblRleHQsIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIGVycm9yIHdoaWxlIGRlY3J5cHRpb246ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGxhaW5UZXh0O1xuICB9XG5cbiAgX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyhpdjogQnVmZmVyLCBjaXBoZXJUZXh0OiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBsZW5ndGg6IG51bWJlcik6IEJ1ZmZlciB7XG4gICAgY29uc3QgaG1hYyA9IGNyZWF0ZUhtYWMoJ3NoYTI1NicsIHRoaXMuY29sdW1uRW5jcnlwdGlvbmtleS5nZXRNYWNLZXkoKSk7XG5cbiAgICBobWFjLnVwZGF0ZSh0aGlzLnZlcnNpb24pO1xuICAgIGhtYWMudXBkYXRlKGl2KTtcbiAgICBobWFjLnVwZGF0ZShjaXBoZXJUZXh0LnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSk7XG4gICAgaG1hYy51cGRhdGUodGhpcy52ZXJzaW9uU2l6ZSk7XG4gICAgcmV0dXJuIGhtYWMuZGlnZXN0KCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsK0JBQUEsR0FBQUYsT0FBQTtBQUxBO0FBQ0E7O0FBTU8sTUFBTUcsYUFBYSxHQUFHLDhCQUE4QjtBQUFDQyxPQUFBLENBQUFELGFBQUEsR0FBQUEsYUFBQTtBQUM1RCxNQUFNRSxnQkFBZ0IsR0FBRyxHQUFHO0FBQzVCLE1BQU1DLGdCQUFnQixHQUFHLEVBQUU7QUFFcEIsTUFBTUMsNkJBQTZCLENBQWdDO0VBU3hFQyxXQUFXQSxDQUFDQyxtQkFBc0QsRUFBRUMsY0FBdUMsRUFBRTtJQUMzRyxJQUFJLENBQUNDLGNBQWMsR0FBR0MsdUNBQU8sR0FBRyxDQUFDO0lBQ2pDLElBQUksQ0FBQ0MsT0FB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
@@ -1 +1 @@
1
- {"version":3,"file":"aead-aes-256-cbc-hmac-algorithm.js","names":["_types","require","_crypto","_aeadAes256CbcHmacEncryptionKey","algorithmName","exports","algorithmVersion","blockSizeInBytes","AeadAes256CbcHmac256Algorithm","columnEncryptionkey","isDeterministic","keySizeInBytes","version","versionSize","minimumCipherTextLengthInBytesNoAuthenticationTag","minimumCipherTextLengthInBytesWithAuthenticationTag","constructor","columnEncryptionKey","encryptionType","keySize","Buffer","from","SQLServerEncryptionType","Deterministic","encryptData","plaintText","iv","hmacIv","createHmac","getIvKey","update","digest","slice","randomBytes","encryptCipher","createCipheriv","getEncryptionKey","encryptedBuffer","concat","final","authenticationTag","_prepareAuthenticationTag","length","decryptData","cipherText","alloc","minimumCiperTextLength","Error","startIndex","toString","authenticationTagOffset","copy","cipherTextOffset","cipherTextCount","compare","Math","min","plainText","decipher","createDecipheriv","error","message","offset","hmac","getMacKey"],"sources":["../../src/always-encrypted/aead-aes-256-cbc-hmac-algorithm.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { EncryptionAlgorithm, SQLServerEncryptionType } from './types';\nimport { createHmac, randomBytes, createCipheriv, createDecipheriv } from 'crypto';\nimport { AeadAes256CbcHmac256EncryptionKey, keySize } from './aead-aes-256-cbc-hmac-encryption-key';\n\nexport const algorithmName = 'AEAD_AES_256_CBC_HMAC_SHA256';\nconst algorithmVersion = 0x1;\nconst blockSizeInBytes = 16;\n\nexport class AeadAes256CbcHmac256Algorithm implements EncryptionAlgorithm {\n private columnEncryptionkey: AeadAes256CbcHmac256EncryptionKey;\n private isDeterministic: boolean;\n private keySizeInBytes: number;\n private version: Buffer;\n private versionSize: Buffer;\n private minimumCipherTextLengthInBytesNoAuthenticationTag: number;\n private minimumCipherTextLengthInBytesWithAuthenticationTag: number;\n\n constructor(columnEncryptionKey: AeadAes256CbcHmac256EncryptionKey, encryptionType: SQLServerEncryptionType) {\n this.keySizeInBytes = keySize / 8;\n this.version = Buffer.from([algorithmVersion]);\n this.versionSize = Buffer.from([1]);\n this.minimumCipherTextLengthInBytesNoAuthenticationTag = 1 + blockSizeInBytes + blockSizeInBytes;\n this.minimumCipherTextLengthInBytesWithAuthenticationTag = this.minimumCipherTextLengthInBytesNoAuthenticationTag + this.keySizeInBytes;\n this.columnEncryptionkey = columnEncryptionKey;\n\n this.isDeterministic = encryptionType === SQLServerEncryptionType.Deterministic;\n }\n\n encryptData(plaintText: Buffer): Buffer {\n let iv: Buffer;\n\n if (this.isDeterministic === true) {\n const hmacIv = createHmac('sha256', this.columnEncryptionkey.getIvKey());\n hmacIv.update(plaintText);\n iv = hmacIv.digest().slice(0, blockSizeInBytes);\n } else {\n iv = randomBytes(blockSizeInBytes);\n }\n\n const encryptCipher = createCipheriv('aes-256-cbc', this.columnEncryptionkey.getEncryptionKey(), iv);\n\n const encryptedBuffer = Buffer.concat([encryptCipher.update(plaintText), encryptCipher.final()]);\n\n const authenticationTag: Buffer = this._prepareAuthenticationTag(iv, encryptedBuffer, 0, encryptedBuffer.length);\n\n return Buffer.concat([Buffer.from([algorithmVersion]), authenticationTag, iv, encryptedBuffer]);\n }\n\n decryptData(cipherText: Buffer): Buffer {\n const iv: Buffer = Buffer.alloc(blockSizeInBytes);\n\n const minimumCiperTextLength: number = this.minimumCipherTextLengthInBytesWithAuthenticationTag;\n\n if (cipherText.length < minimumCiperTextLength) {\n throw new Error(`Specified ciphertext has an invalid size of ${cipherText.length} bytes, which is below the minimum ${minimumCiperTextLength} bytes required for decryption.`);\n }\n\n let startIndex = 0;\n if (cipherText[0] !== algorithmVersion) {\n throw new Error(`The specified ciphertext's encryption algorithm version ${Buffer.from([cipherText[0]]).toString('hex')} does not match the expected encryption algorithm version ${algorithmVersion}.`);\n }\n\n startIndex += 1;\n let authenticationTagOffset = 0;\n\n authenticationTagOffset = startIndex;\n startIndex += this.keySizeInBytes;\n\n cipherText.copy(iv, 0, startIndex, startIndex + iv.length);\n startIndex += iv.length;\n\n const cipherTextOffset = startIndex;\n const cipherTextCount = cipherText.length - startIndex;\n\n const authenticationTag: Buffer = this._prepareAuthenticationTag(iv, cipherText, cipherTextOffset, cipherTextCount);\n\n if (0 !== authenticationTag.compare(cipherText, authenticationTagOffset, Math.min(authenticationTagOffset + cipherTextCount, authenticationTagOffset + authenticationTag.length), 0, Math.min(cipherTextCount, authenticationTag.length))) {\n throw new Error('Specified ciphertext has an invalid authentication tag.');\n }\n\n let plainText: Buffer;\n\n const decipher = createDecipheriv('aes-256-cbc', this.columnEncryptionkey.getEncryptionKey(), iv);\n try {\n plainText = decipher.update(cipherText.slice(cipherTextOffset, cipherTextOffset + cipherTextCount));\n plainText = Buffer.concat([plainText, decipher.final()]);\n } catch (error: any) {\n throw new Error(`Internal error while decryption: ${error.message}`);\n }\n\n return plainText;\n }\n\n _prepareAuthenticationTag(iv: Buffer, cipherText: Buffer, offset: number, length: number): Buffer {\n const hmac = createHmac('sha256', this.columnEncryptionkey.getMacKey());\n\n hmac.update(this.version);\n hmac.update(iv);\n hmac.update(cipherText.slice(offset, offset + length));\n hmac.update(this.versionSize);\n return hmac.digest();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"aead-aes-256-cbc-hmac-algorithm.js","names":["_types","require","_crypto","_aeadAes256CbcHmacEncryptionKey","algorithmName","exports","algorithmVersion","blockSizeInBytes","AeadAes256CbcHmac256Algorithm","constructor","columnEncryptionKey","encryptionType","keySizeInBytes","keySize","version","Buffer","from","versionSize","minimumCipherTextLengthInBytesNoAuthenticationTag","minimumCipherTextLengthInBytesWithAuthenticationTag","columnEncryptionkey","isDeterministic","SQLServerEncryptionType","Deterministic","encryptData","plaintText","iv","hmacIv","createHmac","getIvKey","update","digest","slice","randomBytes","encryptCipher","createCipheriv","getEncryptionKey","encryptedBuffer","concat","final","authenticationTag","_prepareAuthenticationTag","length","decryptData","cipherText","alloc","minimumCiperTextLength","Error","startIndex","toString","authenticationTagOffset","copy","cipherTextOffset","cipherTextCount","compare","Math","min","plainText","decipher","createDecipheriv","error","message","offset","hmac","getMacKey"],"sources":["../../src/always-encrypted/aead-aes-256-cbc-hmac-algorithm.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { type EncryptionAlgorithm, SQLServerEncryptionType } from './types';\nimport { createHmac, randomBytes, createCipheriv, createDecipheriv } from 'crypto';\nimport { AeadAes256CbcHmac256EncryptionKey, keySize } from './aead-aes-256-cbc-hmac-encryption-key';\n\nexport const algorithmName = 'AEAD_AES_256_CBC_HMAC_SHA256';\nconst algorithmVersion = 0x1;\nconst blockSizeInBytes = 16;\n\nexport class AeadAes256CbcHmac256Algorithm implements EncryptionAlgorithm {\n declare private columnEncryptionkey: AeadAes256CbcHmac256EncryptionKey;\n declare private isDeterministic: boolean;\n declare private keySizeInBytes: number;\n declare private version: Buffer;\n declare private versionSize: Buffer;\n declare private minimumCipherTextLengthInBytesNoAuthenticationTag: number;\n declare private minimumCipherTextLengthInBytesWithAuthenticationTag: number;\n\n constructor(columnEncryptionKey: AeadAes256CbcHmac256EncryptionKey, encryptionType: SQLServerEncryptionType) {\n this.keySizeInBytes = keySize / 8;\n this.version = Buffer.from([algorithmVersion]);\n this.versionSize = Buffer.from([1]);\n this.minimumCipherTextLengthInBytesNoAuthenticationTag = 1 + blockSizeInBytes + blockSizeInBytes;\n this.minimumCipherTextLengthInBytesWithAuthenticationTag = this.minimumCipherTextLengthInBytesNoAuthenticationTag + this.keySizeInBytes;\n this.columnEncryptionkey = columnEncryptionKey;\n\n this.isDeterministic = encryptionType === SQLServerEncryptionType.Deterministic;\n }\n\n encryptData(plaintText: Buffer): Buffer {\n let iv: Buffer;\n\n if (this.isDeterministic === true) {\n const hmacIv = createHmac('sha256', this.columnEncryptionkey.getIvKey());\n hmacIv.update(plaintText);\n iv = hmacIv.digest().slice(0, blockSizeInBytes);\n } else {\n iv = randomBytes(blockSizeInBytes);\n }\n\n const encryptCipher = createCipheriv('aes-256-cbc', this.columnEncryptionkey.getEncryptionKey(), iv);\n\n const encryptedBuffer = Buffer.concat([encryptCipher.update(plaintText), encryptCipher.final()]);\n\n const authenticationTag: Buffer = this._prepareAuthenticationTag(iv, encryptedBuffer, 0, encryptedBuffer.length);\n\n return Buffer.concat([Buffer.from([algorithmVersion]), authenticationTag, iv, encryptedBuffer]);\n }\n\n decryptData(cipherText: Buffer): Buffer {\n const iv: Buffer = Buffer.alloc(blockSizeInBytes);\n\n const minimumCiperTextLength: number = this.minimumCipherTextLengthInBytesWithAuthenticationTag;\n\n if (cipherText.length < minimumCiperTextLength) {\n throw new Error(`Specified ciphertext has an invalid size of ${cipherText.length} bytes, which is below the minimum ${minimumCiperTextLength} bytes required for decryption.`);\n }\n\n let startIndex = 0;\n if (cipherText[0] !== algorithmVersion) {\n throw new Error(`The specified ciphertext's encryption algorithm version ${Buffer.from([cipherText[0]]).toString('hex')} does not match the expected encryption algorithm version ${algorithmVersion}.`);\n }\n\n startIndex += 1;\n let authenticationTagOffset = 0;\n\n authenticationTagOffset = startIndex;\n startIndex += this.keySizeInBytes;\n\n cipherText.copy(iv, 0, startIndex, startIndex + iv.length);\n startIndex += iv.length;\n\n const cipherTextOffset = startIndex;\n const cipherTextCount = cipherText.length - startIndex;\n\n const authenticationTag: Buffer = this._prepareAuthenticationTag(iv, cipherText, cipherTextOffset, cipherTextCount);\n\n if (0 !== authenticationTag.compare(cipherText, authenticationTagOffset, Math.min(authenticationTagOffset + cipherTextCount, authenticationTagOffset + authenticationTag.length), 0, Math.min(cipherTextCount, authenticationTag.length))) {\n throw new Error('Specified ciphertext has an invalid authentication tag.');\n }\n\n let plainText: Buffer;\n\n const decipher = createDecipheriv('aes-256-cbc', this.columnEncryptionkey.getEncryptionKey(), iv);\n try {\n plainText = decipher.update(cipherText.slice(cipherTextOffset, cipherTextOffset + cipherTextCount));\n plainText = Buffer.concat([plainText, decipher.final()]);\n } catch (error: any) {\n throw new Error(`Internal error while decryption: ${error.message}`);\n }\n\n return plainText;\n }\n\n _prepareAuthenticationTag(iv: Buffer, cipherText: Buffer, offset: number, length: number): Buffer {\n const hmac = createHmac('sha256', this.columnEncryptionkey.getMacKey());\n\n hmac.update(this.version);\n hmac.update(iv);\n hmac.update(cipherText.slice(offset, offset + length));\n hmac.update(this.versionSize);\n return hmac.digest();\n }\n}\n"],"mappings":"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"}
@@ -22,13 +22,6 @@ exports.deriveKey = deriveKey;
22
22
  const generateKeySalt = (keyType, algorithmName, keySize) => `Microsoft SQL Server cell ${keyType} key ` + `with encryption algorithm:${algorithmName} and key length:${keySize}`;
23
23
  exports.generateKeySalt = generateKeySalt;
24
24
  class AeadAes256CbcHmac256EncryptionKey extends _symmetricKey.default {
25
- algorithmName;
26
- encryptionKeySaltFormat;
27
- macKeySaltFormat;
28
- ivKeySaltFormat;
29
- encryptionKey;
30
- macKey;
31
- ivKey;
32
25
  constructor(rootKey, algorithmName) {
33
26
  super(rootKey);
34
27
  this.algorithmName = algorithmName;
@@ -60,4 +53,4 @@ class AeadAes256CbcHmac256EncryptionKey extends _symmetricKey.default {
60
53
  }
61
54
  }
62
55
  exports.AeadAes256CbcHmac256EncryptionKey = AeadAes256CbcHmac256EncryptionKey;
63
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3J5cHRvIiwicmVxdWlyZSIsIl9zeW1tZXRyaWNLZXkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0Iiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJrZXlTaXplIiwiZXhwb3J0cyIsImtleVNpemVJbkJ5dGVzIiwiZGVyaXZlS2V5Iiwicm9vdEtleSIsInNhbHQiLCJobWFjIiwiY3JlYXRlSG1hYyIsInVwZGF0ZSIsIkJ1ZmZlciIsImZyb20iLCJkaWdlc3QiLCJnZW5lcmF0ZUtleVNhbHQiLCJrZXlUeXBlIiwiYWxnb3JpdGhtTmFtZSIsIkFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSIsIlN5bW1ldHJpY0tleSIsImVuY3J5cHRpb25LZXlTYWx0Rm9ybWF0IiwibWFjS2V5U2FsdEZvcm1hdCIsIml2S2V5U2FsdEZvcm1hdCIsImVuY3J5cHRpb25LZXkiLCJtYWNLZXkiLCJpdktleSIsImNvbnN0cnVjdG9yIiwibGVuZ3RoIiwiRXJyb3IiLCJlbmNLZXlCdWZmIiwibWFjS2V5QnVmZiIsIml2S2V5QnVmZiIsImVycm9yIiwibWVzc2FnZSIsImdldEVuY3J5cHRpb25LZXkiLCJnZXRNYWNLZXkiLCJnZXRJdktleSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1lbmNyeXB0aW9uLWtleS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgY3JlYXRlSG1hYyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgU3ltbWV0cmljS2V5IGZyb20gJy4vc3ltbWV0cmljLWtleSc7XG5cbmV4cG9ydCBjb25zdCBrZXlTaXplID0gMjU2O1xuY29uc3Qga2V5U2l6ZUluQnl0ZXMgPSBrZXlTaXplIC8gODtcblxuZXhwb3J0IGNvbnN0IGRlcml2ZUtleSA9IChyb290S2V5OiBCdWZmZXIsIHNhbHQ6IHN0cmluZyk6IEJ1ZmZlciA9PiB7XG4gIGNvbnN0IGhtYWMgPSBjcmVhdGVIbWFjKCdzaGEyNTYnLCByb290S2V5KTtcbiAgaG1hYy51cGRhdGUoQnVmZmVyLmZyb20oc2FsdCwgJ3V0ZjE2bGUnKSk7XG4gIHJldHVybiBobWFjLmRpZ2VzdCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlS2V5U2FsdCA9IChcbiAga2V5VHlwZTogJ2VuY3J5cHRpb24nIHwgJ01BQycgfCAnSVYnLFxuICBhbGdvcml0aG1OYW1lOiBzdHJpbmcsXG4gIGtleVNpemU6IG51bWJlcixcbik6IHN0cmluZyA9PlxuICBgTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgY2VsbCAke2tleVR5cGV9IGtleSBgICtcbiAgYHdpdGggZW5jcnlwdGlvbiBhbGdvcml0aG06JHthbGdvcml0aG1OYW1lfSBhbmQga2V5IGxlbmd0aDoke2tleVNpemV9YDtcblxuZXhwb3J0IGNsYXNzIEFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSBleHRlbmRzIFN5bW1ldHJpY0tleSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxnb3JpdGhtTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGVuY3J5cHRpb25LZXlTYWx0Rm9ybWF0OiBzdHJpbmc7XG4gIHByaXZhdGUgbWFjS2V5U2FsdEZvcm1hdDogc3RyaW5nO1xuICBwcml2YXRlIGl2S2V5U2FsdEZvcm1hdDogc3RyaW5nO1xuICBwcml2YXRlIGVuY3J5cHRpb25LZXk6IFN5bW1ldHJpY0tleTtcbiAgcHJpdmF0ZSBtYWNLZXk6IFN5bW1ldHJpY0tleTtcbiAgcHJpdmF0ZSBpdktleTogU3ltbWV0cmljS2V5O1xuXG4gIGNvbnN0cnVjdG9yKHJvb3RLZXk6IEJ1ZmZlciwgYWxnb3JpdGhtTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIocm9vdEtleSk7XG4gICAgdGhpcy5hbGdvcml0aG1OYW1lID0gYWxnb3JpdGhtTmFtZTtcbiAgICB0aGlzLmVuY3J5cHRpb25LZXlTYWx0Rm9ybWF0ID0gZ2VuZXJhdGVLZXlTYWx0KCdlbmNyeXB0aW9uJywgdGhpcy5hbGdvcml0aG1OYW1lLCBrZXlTaXplKTtcbiAgICB0aGlzLm1hY0tleVNhbHRGb3JtYXQgPSBnZW5lcmF0ZUtleVNhbHQoJ01BQycsIHRoaXMuYWxnb3JpdGhtTmFtZSwga2V5U2l6ZSk7XG4gICAgdGhpcy5pdktleVNhbHRGb3JtYXQgPSBnZW5lcmF0ZUtleVNhbHQoJ0lWJywgdGhpcy5hbGdvcml0aG1OYW1lLCBrZXlTaXplKTtcblxuICAgIGlmIChyb290S2V5Lmxlbmd0aCAhPT0ga2V5U2l6ZUluQnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVjcnlwdGVkIGJ1dCBpdCdzIGxlbmd0aDogJHtyb290S2V5Lmxlbmd0aH0gZG9lcyBub3QgbWF0Y2ggdGhlIGxlbmd0aDogJHtrZXlTaXplSW5CeXRlc30gZm9yIGFsZ29yaXRobSBcIiR7dGhpcy5hbGdvcml0aG1OYW1lfVwiLiBWZXJpZnkgdGhlIGVuY3J5cHRlZCB2YWx1ZSBvZiB0aGUgY29sdW1uIGVuY3J5cHRpb24ga2V5IGluIHRoZSBkYXRhYmFzZS5gKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZW5jS2V5QnVmZiA9IGRlcml2ZUtleShyb290S2V5LCB0aGlzLmVuY3J5cHRpb25LZXlTYWx0Rm9ybWF0KTtcblxuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gbmV3IFN5bW1ldHJpY0tleShlbmNLZXlCdWZmKTtcblxuICAgICAgY29uc3QgbWFjS2V5QnVmZiA9IGRlcml2ZUtleShyb290S2V5LCB0aGlzLm1hY0tleVNhbHRGb3JtYXQpO1xuXG4gICAgICB0aGlzLm1hY0tleSA9IG5ldyBTeW1tZXRyaWNLZXkobWFjS2V5QnVmZik7XG5cbiAgICAgIGNvbnN0IGl2S2V5QnVmZiA9IGRlcml2ZUtleShyb290S2V5LCB0aGlzLml2S2V5U2FsdEZvcm1hdCk7XG5cbiAgICAgIHRoaXMuaXZLZXkgPSBuZXcgU3ltbWV0cmljS2V5KGl2S2V5QnVmZik7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBLZXkgZXh0cmFjdGlvbiBmYWlsZWQgOiAke2Vycm9yLm1lc3NhZ2V9LmApO1xuICAgIH1cbiAgfVxuXG4gIGdldEVuY3J5cHRpb25LZXkoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5lbmNyeXB0aW9uS2V5LnJvb3RLZXk7XG4gIH1cblxuICBnZXRNYWNLZXkoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5tYWNLZXkucm9vdEtleTtcbiAgfVxuXG4gIGdldEl2S2V5KCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuaXZLZXkucm9vdEtleTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxhQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFBMkMsU0FBQUUsdUJBQUFDLEdBQUEsV0FBQUEsR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsR0FBQUQsR0FBQSxLQUFBRSxPQUFBLEVBQUFGLEdBQUE7QUFKM0M7QUFDQTs7QUFLTyxNQUFNRyxPQUFPLEdBQUcsR0FBRztBQUFDQyxPQUFBLENBQUFELE9BQUEsR0FBQUEsT0FBQTtBQUMzQixNQUFNRSxjQUFjLEdBQUdGLE9BQU8sR0FBRyxDQUFDO0FBRTNCLE1BQU1HLFNBQVMsR0FBR0EsQ0FBQ0MsT0FBZSxFQUFFQyxJQUFZLEtBQWE7RUFDbEUsTUFBTUMsSUFBSSxHQUFHLElBQUFDLGtCQUFVLEVBQUMsUUFBUSxFQUFFSCxPQUFPLENBQUM7RUFDMUNFLElBQUksQ0FBQ0UsTUFBTSxDQUFDQyxNQUFNLENB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
56
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3J5cHRvIiwicmVxdWlyZSIsIl9zeW1tZXRyaWNLZXkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0Iiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJrZXlTaXplIiwiZXhwb3J0cyIsImtleVNpemVJbkJ5dGVzIiwiZGVyaXZlS2V5Iiwicm9vdEtleSIsInNhbHQiLCJobWFjIiwiY3JlYXRlSG1hYyIsInVwZGF0ZSIsIkJ1ZmZlciIsImZyb20iLCJkaWdlc3QiLCJnZW5lcmF0ZUtleVNhbHQiLCJrZXlUeXBlIiwiYWxnb3JpdGhtTmFtZSIsIkFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSIsIlN5bW1ldHJpY0tleSIsImNvbnN0cnVjdG9yIiwiZW5jcnlwdGlvbktleVNhbHRGb3JtYXQiLCJtYWNLZXlTYWx0Rm9ybWF0IiwiaXZLZXlTYWx0Rm9ybWF0IiwibGVuZ3RoIiwiRXJyb3IiLCJlbmNLZXlCdWZmIiwiZW5jcnlwdGlvbktleSIsIm1hY0tleUJ1ZmYiLCJtYWNLZXkiLCJpdktleUJ1ZmYiLCJpdktleSIsImVycm9yIiwibWVzc2FnZSIsImdldEVuY3J5cHRpb25LZXkiLCJnZXRNYWNLZXkiLCJnZXRJdktleSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1lbmNyeXB0aW9uLWtleS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgY3JlYXRlSG1hYyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgU3ltbWV0cmljS2V5IGZyb20gJy4vc3ltbWV0cmljLWtleSc7XG5cbmV4cG9ydCBjb25zdCBrZXlTaXplID0gMjU2O1xuY29uc3Qga2V5U2l6ZUluQnl0ZXMgPSBrZXlTaXplIC8gODtcblxuZXhwb3J0IGNvbnN0IGRlcml2ZUtleSA9IChyb290S2V5OiBCdWZmZXIsIHNhbHQ6IHN0cmluZyk6IEJ1ZmZlciA9PiB7XG4gIGNvbnN0IGhtYWMgPSBjcmVhdGVIbWFjKCdzaGEyNTYnLCByb290S2V5KTtcbiAgaG1hYy51cGRhdGUoQnVmZmVyLmZyb20oc2FsdCwgJ3V0ZjE2bGUnKSk7XG4gIHJldHVybiBobWFjLmRpZ2VzdCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlS2V5U2FsdCA9IChcbiAga2V5VHlwZTogJ2VuY3J5cHRpb24nIHwgJ01BQycgfCAnSVYnLFxuICBhbGdvcml0aG1OYW1lOiBzdHJpbmcsXG4gIGtleVNpemU6IG51bWJlcixcbik6IHN0cmluZyA9PlxuICBgTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgY2VsbCAke2tleVR5cGV9IGtleSBgICtcbiAgYHdpdGggZW5jcnlwdGlvbiBhbGdvcml0aG06JHthbGdvcml0aG1OYW1lfSBhbmQga2V5IGxlbmd0aDoke2tleVNpemV9YDtcblxuZXhwb3J0IGNsYXNzIEFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSBleHRlbmRzIFN5bW1ldHJpY0tleSB7XG4gIGRlY2xhcmUgcHJpdmF0ZSByZWFkb25seSBhbGdvcml0aG1OYW1lOiBzdHJpbmc7XG4gIGRlY2xhcmUgcHJpdmF0ZSBlbmNyeXB0aW9uS2V5U2FsdEZvcm1hdDogc3RyaW5nO1xuICBkZWNsYXJlIHByaXZhdGUgbWFjS2V5U2FsdEZvcm1hdDogc3RyaW5nO1xuICBkZWNsYXJlIHByaXZhdGUgaXZLZXlTYWx0Rm9ybWF0OiBzdHJpbmc7XG4gIGRlY2xhcmUgcHJpdmF0ZSBlbmNyeXB0aW9uS2V5OiBTeW1tZXRyaWNLZXk7XG4gIGRlY2xhcmUgcHJpdmF0ZSBtYWNLZXk6IFN5bW1ldHJpY0tleTtcbiAgZGVjbGFyZSBwcml2YXRlIGl2S2V5OiBTeW1tZXRyaWNLZXk7XG5cbiAgY29uc3RydWN0b3Iocm9vdEtleTogQnVmZmVyLCBhbGdvcml0aG1OYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihyb290S2V5KTtcbiAgICB0aGlzLmFsZ29yaXRobU5hbWUgPSBhbGdvcml0aG1OYW1lO1xuICAgIHRoaXMuZW5jcnlwdGlvbktleVNhbHRGb3JtYXQgPSBnZW5lcmF0ZUtleVNhbHQoJ2VuY3J5cHRpb24nLCB0aGlzLmFsZ29yaXRobU5hbWUsIGtleVNpemUpO1xuICAgIHRoaXMubWFjS2V5U2FsdEZvcm1hdCA9IGdlbmVyYXRlS2V5U2FsdCgnTUFDJywgdGhpcy5hbGdvcml0aG1OYW1lLCBrZXlTaXplKTtcbiAgICB0aGlzLml2S2V5U2FsdEZvcm1hdCA9IGdlbmVyYXRlS2V5U2FsdCgnSVYnLCB0aGlzLmFsZ29yaXRobU5hbWUsIGtleVNpemUpO1xuXG4gICAgaWYgKHJvb3RLZXkubGVuZ3RoICE9PSBrZXlTaXplSW5CeXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgY29sdW1uIGVuY3J5cHRpb24ga2V5IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNyeXB0ZWQgYnV0IGl0J3MgbGVuZ3RoOiAke3Jvb3RLZXkubGVuZ3RofSBkb2VzIG5vdCBtYXRjaCB0aGUgbGVuZ3RoOiAke2tleVNpemVJbkJ5dGVzfSBmb3IgYWxnb3JpdGhtIFwiJHt0aGlzLmFsZ29yaXRobU5hbWV9XCIuIFZlcmlmeSB0aGUgZW5jcnlwdGVkIHZhbHVlIG9mIHRoZSBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgaW4gdGhlIGRhdGFiYXNlLmApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbmNLZXlCdWZmID0gZGVyaXZlS2V5KHJvb3RLZXksIHRoaXMuZW5jcnlwdGlvbktleVNhbHRGb3JtYXQpO1xuXG4gICAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBuZXcgU3ltbWV0cmljS2V5KGVuY0tleUJ1ZmYpO1xuXG4gICAgICBjb25zdCBtYWNLZXlCdWZmID0gZGVyaXZlS2V5KHJvb3RLZXksIHRoaXMubWFjS2V5U2FsdEZvcm1hdCk7XG5cbiAgICAgIHRoaXMubWFjS2V5ID0gbmV3IFN5bW1ldHJpY0tleShtYWNLZXlCdWZmKTtcblxuICAgICAgY29uc3QgaXZLZXlCdWZmID0gZGVyaXZlS2V5KHJvb3RLZXksIHRoaXMuaXZLZXlTYWx0Rm9ybWF0KTtcblxuICAgICAgdGhpcy5pdktleSA9IG5ldyBTeW1tZXRyaWNLZXkoaXZLZXlCdWZmKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleSBleHRyYWN0aW9uIGZhaWxlZCA6ICR7ZXJyb3IubWVzc2FnZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RW5jcnlwdGlvbktleSgpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLmVuY3J5cHRpb25LZXkucm9vdEtleTtcbiAgfVxuXG4gIGdldE1hY0tleSgpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLm1hY0tleS5yb290S2V5O1xuICB9XG5cbiAgZ2V0SXZLZXkoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5pdktleS5yb290S2V5O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUdBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLGFBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUEyQyxTQUFBRSx1QkFBQUMsR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLEtBQUFFLE9BQUEsRUFBQUYsR0FBQTtBQUozQztBQUNBOztBQUtPLE1BQU1HLE9BQU8sR0FBRyxHQUFHO0FBQUNDLE9BQUEsQ0FBQUQsT0FBQSxHQUFBQSxPQUFBO0FBQzNCLE1BQU1FLGNBQWMsR0FBR0YsT0FBTyxHQUFHLENBQUM7QUFFM0IsTUFBTUcsU0FBUyxHQUFHQSxDQUFDQyxPQUFlLEVBQUVDLElBQVksS0FBYTtFQUNsRSxNQUFNQyxJQUFJLEdBQUcsSUFBQUMsa0JBQVUsRUFBQyxR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
@@ -1 +1 @@
1
- {"version":3,"file":"aead-aes-256-cbc-hmac-encryption-key.js","names":["_crypto","require","_symmetricKey","_interopRequireDefault","obj","__esModule","default","keySize","exports","keySizeInBytes","deriveKey","rootKey","salt","hmac","createHmac","update","Buffer","from","digest","generateKeySalt","keyType","algorithmName","AeadAes256CbcHmac256EncryptionKey","SymmetricKey","encryptionKeySaltFormat","macKeySaltFormat","ivKeySaltFormat","encryptionKey","macKey","ivKey","constructor","length","Error","encKeyBuff","macKeyBuff","ivKeyBuff","error","message","getEncryptionKey","getMacKey","getIvKey"],"sources":["../../src/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { createHmac } from 'crypto';\nimport SymmetricKey from './symmetric-key';\n\nexport const keySize = 256;\nconst keySizeInBytes = keySize / 8;\n\nexport const deriveKey = (rootKey: Buffer, salt: string): Buffer => {\n const hmac = createHmac('sha256', rootKey);\n hmac.update(Buffer.from(salt, 'utf16le'));\n return hmac.digest();\n};\n\nexport const generateKeySalt = (\n keyType: 'encryption' | 'MAC' | 'IV',\n algorithmName: string,\n keySize: number,\n): string =>\n `Microsoft SQL Server cell ${keyType} key ` +\n `with encryption algorithm:${algorithmName} and key length:${keySize}`;\n\nexport class AeadAes256CbcHmac256EncryptionKey extends SymmetricKey {\n private readonly algorithmName: string;\n private encryptionKeySaltFormat: string;\n private macKeySaltFormat: string;\n private ivKeySaltFormat: string;\n private encryptionKey: SymmetricKey;\n private macKey: SymmetricKey;\n private ivKey: SymmetricKey;\n\n constructor(rootKey: Buffer, algorithmName: string) {\n super(rootKey);\n this.algorithmName = algorithmName;\n this.encryptionKeySaltFormat = generateKeySalt('encryption', this.algorithmName, keySize);\n this.macKeySaltFormat = generateKeySalt('MAC', this.algorithmName, keySize);\n this.ivKeySaltFormat = generateKeySalt('IV', this.algorithmName, keySize);\n\n if (rootKey.length !== keySizeInBytes) {\n throw new Error(`The column encryption key has been successfully decrypted but it's length: ${rootKey.length} does not match the length: ${keySizeInBytes} for algorithm \"${this.algorithmName}\". Verify the encrypted value of the column encryption key in the database.`);\n }\n\n try {\n const encKeyBuff = deriveKey(rootKey, this.encryptionKeySaltFormat);\n\n this.encryptionKey = new SymmetricKey(encKeyBuff);\n\n const macKeyBuff = deriveKey(rootKey, this.macKeySaltFormat);\n\n this.macKey = new SymmetricKey(macKeyBuff);\n\n const ivKeyBuff = deriveKey(rootKey, this.ivKeySaltFormat);\n\n this.ivKey = new SymmetricKey(ivKeyBuff);\n } catch (error: any) {\n throw new Error(`Key extraction failed : ${error.message}.`);\n }\n }\n\n getEncryptionKey(): Buffer {\n return this.encryptionKey.rootKey;\n }\n\n getMacKey(): Buffer {\n return this.macKey.rootKey;\n }\n\n getIvKey(): Buffer {\n return this.ivKey.rootKey;\n }\n}\n"],"mappings":";;;;;;AAGA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAC,sBAAA,CAAAF,OAAA;AAA2C,SAAAE,uBAAAC,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAJ3C;AACA;;AAKO,MAAMG,OAAO,GAAG,GAAG;AAACC,OAAA,CAAAD,OAAA,GAAAA,OAAA;AAC3B,MAAME,cAAc,GAAGF,OAAO,GAAG,CAAC;AAE3B,MAAMG,SAAS,GAAGA,CAACC,OAAe,EAAEC,IAAY,KAAa;EAClE,MAAMC,IAAI,GAAG,IAAAC,kBAAU,EAAC,QAAQ,EAAEH,OAAO,CAAC;EAC1CE,IAAI,CAACE,MAAM,CAACC,MAAM,CAACC,IAAI,CAACL,IAAI,EAAE,SAAS,CAAC,CAAC;EACzC,OAAOC,IAAI,CAACK,MAAM,CAAC,CAAC;AACtB,CAAC;AAACV,OAAA,CAAAE,SAAA,GAAAA,SAAA;AAEK,MAAMS,eAAe,GAAGA,CAC7BC,OAAoC,EACpCC,aAAqB,EACrBd,OAAe,KAEd,6BAA4Ba,OAAQ,OAAM,GAC1C,6BAA4BC,aAAc,mBAAkBd,OAAQ,EAAC;AAACC,OAAA,CAAAW,eAAA,GAAAA,eAAA;AAElE,MAAMG,iCAAiC,SAASC,qBAAY,CAAC;EACjDF,aAAa;EACtBG,uBAAuB;EACvBC,gBAAgB;EAChBC,eAAe;EACfC,aAAa;EACbC,MAAM;EACNC,KAAK;EAEbC,WAAWA,CAACnB,OAAe,EAAEU,aAAqB,EAAE;IAClD,KAAK,CAACV,OAAO,CAAC;IACd,IAAI,CAACU,aAAa,GAAGA,aAAa;IAClC,IAAI,CAACG,uBAAuB,GAAGL,eAAe,CAAC,YAAY,EAAE,IAAI,CAACE,aAAa,EAAEd,OAAO,CAAC;IACzF,IAAI,CAACkB,gBAAgB,GAAGN,eAAe,CAAC,KAAK,EAAE,IAAI,CAACE,aAAa,EAAEd,OAAO,CAAC;IAC3E,IAAI,CAACmB,eAAe,GAAGP,eAAe,CAAC,IAAI,EAAE,IAAI,CAACE,aAAa,EAAEd,OAAO,CAAC;IAEzE,IAAII,OAAO,CAACoB,MAAM,KAAKtB,cAAc,EAAE;MACrC,MAAM,IAAIuB,KAAK,CAAE,8EAA6ErB,OAAO,CAACoB,MAAO,+BAA8BtB,cAAe,mBAAkB,IAAI,CAACY,aAAc,6EAA4E,CAAC;IAC9Q;IAEA,IAAI;MACF,MAAMY,UAAU,GAAGvB,SAAS,CAACC,OAAO,EAAE,IAAI,CAACa,uBAAuB,CAAC;MAEnE,IAAI,CAACG,aAAa,GAAG,IAAIJ,qBAAY,CAACU,UAAU,CAAC;MAEjD,MAAMC,UAAU,GAAGxB,SAAS,CAACC,OAAO,EAAE,IAAI,CAACc,gBAAgB,CAAC;MAE5D,IAAI,CAACG,MAAM,GAAG,IAAIL,qBAAY,CAACW,UAAU,CAAC;MAE1C,MAAMC,SAAS,GAAGzB,SAAS,CAACC,OAAO,EAAE,IAAI,CAACe,eAAe,CAAC;MAE1D,IAAI,CAACG,KAAK,GAAG,IAAIN,qBAAY,CAACY,SAAS,CAAC;IAC1C,CAAC,CAAC,OAAOC,KAAU,EAAE;MACnB,MAAM,IAAIJ,KAAK,CAAE,2BAA0BI,KAAK,CAACC,OAAQ,GAAE,CAAC;IAC9D;EACF;EAEAC,gBAAgBA,CAAA,EAAW;IACzB,OAAO,IAAI,CAACX,aAAa,CAAChB,OAAO;EACnC;EAEA4B,SAASA,CAAA,EAAW;IAClB,OAAO,IAAI,CAACX,MAAM,CAACjB,OAAO;EAC5B;EAEA6B,QAAQA,CAAA,EAAW;IACjB,OAAO,IAAI,CAACX,KAAK,CAAClB,OAAO;EAC3B;AACF;AAACH,OAAA,CAAAc,iCAAA,GAAAA,iCAAA"}
1
+ {"version":3,"file":"aead-aes-256-cbc-hmac-encryption-key.js","names":["_crypto","require","_symmetricKey","_interopRequireDefault","obj","__esModule","default","keySize","exports","keySizeInBytes","deriveKey","rootKey","salt","hmac","createHmac","update","Buffer","from","digest","generateKeySalt","keyType","algorithmName","AeadAes256CbcHmac256EncryptionKey","SymmetricKey","constructor","encryptionKeySaltFormat","macKeySaltFormat","ivKeySaltFormat","length","Error","encKeyBuff","encryptionKey","macKeyBuff","macKey","ivKeyBuff","ivKey","error","message","getEncryptionKey","getMacKey","getIvKey"],"sources":["../../src/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { createHmac } from 'crypto';\nimport SymmetricKey from './symmetric-key';\n\nexport const keySize = 256;\nconst keySizeInBytes = keySize / 8;\n\nexport const deriveKey = (rootKey: Buffer, salt: string): Buffer => {\n const hmac = createHmac('sha256', rootKey);\n hmac.update(Buffer.from(salt, 'utf16le'));\n return hmac.digest();\n};\n\nexport const generateKeySalt = (\n keyType: 'encryption' | 'MAC' | 'IV',\n algorithmName: string,\n keySize: number,\n): string =>\n `Microsoft SQL Server cell ${keyType} key ` +\n `with encryption algorithm:${algorithmName} and key length:${keySize}`;\n\nexport class AeadAes256CbcHmac256EncryptionKey extends SymmetricKey {\n declare private readonly algorithmName: string;\n declare private encryptionKeySaltFormat: string;\n declare private macKeySaltFormat: string;\n declare private ivKeySaltFormat: string;\n declare private encryptionKey: SymmetricKey;\n declare private macKey: SymmetricKey;\n declare private ivKey: SymmetricKey;\n\n constructor(rootKey: Buffer, algorithmName: string) {\n super(rootKey);\n this.algorithmName = algorithmName;\n this.encryptionKeySaltFormat = generateKeySalt('encryption', this.algorithmName, keySize);\n this.macKeySaltFormat = generateKeySalt('MAC', this.algorithmName, keySize);\n this.ivKeySaltFormat = generateKeySalt('IV', this.algorithmName, keySize);\n\n if (rootKey.length !== keySizeInBytes) {\n throw new Error(`The column encryption key has been successfully decrypted but it's length: ${rootKey.length} does not match the length: ${keySizeInBytes} for algorithm \"${this.algorithmName}\". Verify the encrypted value of the column encryption key in the database.`);\n }\n\n try {\n const encKeyBuff = deriveKey(rootKey, this.encryptionKeySaltFormat);\n\n this.encryptionKey = new SymmetricKey(encKeyBuff);\n\n const macKeyBuff = deriveKey(rootKey, this.macKeySaltFormat);\n\n this.macKey = new SymmetricKey(macKeyBuff);\n\n const ivKeyBuff = deriveKey(rootKey, this.ivKeySaltFormat);\n\n this.ivKey = new SymmetricKey(ivKeyBuff);\n } catch (error: any) {\n throw new Error(`Key extraction failed : ${error.message}.`);\n }\n }\n\n getEncryptionKey(): Buffer {\n return this.encryptionKey.rootKey;\n }\n\n getMacKey(): Buffer {\n return this.macKey.rootKey;\n }\n\n getIvKey(): Buffer {\n return this.ivKey.rootKey;\n }\n}\n"],"mappings":";;;;;;AAGA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAC,sBAAA,CAAAF,OAAA;AAA2C,SAAAE,uBAAAC,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAJ3C;AACA;;AAKO,MAAMG,OAAO,GAAG,GAAG;AAACC,OAAA,CAAAD,OAAA,GAAAA,OAAA;AAC3B,MAAME,cAAc,GAAGF,OAAO,GAAG,CAAC;AAE3B,MAAMG,SAAS,GAAGA,CAACC,OAAe,EAAEC,IAAY,KAAa;EAClE,MAAMC,IAAI,GAAG,IAAAC,kBAAU,EAAC,QAAQ,EAAEH,OAAO,CAAC;EAC1CE,IAAI,CAACE,MAAM,CAACC,MAAM,CAACC,IAAI,CAACL,IAAI,EAAE,SAAS,CAAC,CAAC;EACzC,OAAOC,IAAI,CAACK,MAAM,CAAC,CAAC;AACtB,CAAC;AAACV,OAAA,CAAAE,SAAA,GAAAA,SAAA;AAEK,MAAMS,eAAe,GAAGA,CAC7BC,OAAoC,EACpCC,aAAqB,EACrBd,OAAe,KAEd,6BAA4Ba,OAAQ,OAAM,GAC1C,6BAA4BC,aAAc,mBAAkBd,OAAQ,EAAC;AAACC,OAAA,CAAAW,eAAA,GAAAA,eAAA;AAElE,MAAMG,iCAAiC,SAASC,qBAAY,CAAC;EASlEC,WAAWA,CAACb,OAAe,EAAEU,aAAqB,EAAE;IAClD,KAAK,CAACV,OAAO,CAAC;IACd,IAAI,CAACU,aAAa,GAAGA,aAAa;IAClC,IAAI,CAACI,uBAAuB,GAAGN,eAAe,CAAC,YAAY,EAAE,IAAI,CAACE,aAAa,EAAEd,OAAO,CAAC;IACzF,IAAI,CAACmB,gBAAgB,GAAGP,eAAe,CAAC,KAAK,EAAE,IAAI,CAACE,aAAa,EAAEd,OAAO,CAAC;IAC3E,IAAI,CAACoB,eAAe,GAAGR,eAAe,CAAC,IAAI,EAAE,IAAI,CAACE,aAAa,EAAEd,OAAO,CAAC;IAEzE,IAAII,OAAO,CAACiB,MAAM,KAAKnB,cAAc,EAAE;MACrC,MAAM,IAAIoB,KAAK,CAAE,8EAA6ElB,OAAO,CAACiB,MAAO,+BAA8BnB,cAAe,mBAAkB,IAAI,CAACY,aAAc,6EAA4E,CAAC;IAC9Q;IAEA,IAAI;MACF,MAAMS,UAAU,GAAGpB,SAAS,CAACC,OAAO,EAAE,IAAI,CAACc,uBAAuB,CAAC;MAEnE,IAAI,CAACM,aAAa,GAAG,IAAIR,qBAAY,CAACO,UAAU,CAAC;MAEjD,MAAME,UAAU,GAAGtB,SAAS,CAACC,OAAO,EAAE,IAAI,CAACe,gBAAgB,CAAC;MAE5D,IAAI,CAACO,MAAM,GAAG,IAAIV,qBAAY,CAACS,UAAU,CAAC;MAE1C,MAAME,SAAS,GAAGxB,SAAS,CAACC,OAAO,EAAE,IAAI,CAACgB,eAAe,CAAC;MAE1D,IAAI,CAACQ,KAAK,GAAG,IAAIZ,qBAAY,CAACW,SAAS,CAAC;IAC1C,CAAC,CAAC,OAAOE,KAAU,EAAE;MACnB,MAAM,IAAIP,KAAK,CAAE,2BAA0BO,KAAK,CAACC,OAAQ,GAAE,CAAC;IAC9D;EACF;EAEAC,gBAAgBA,CAAA,EAAW;IACzB,OAAO,IAAI,CAACP,aAAa,CAACpB,OAAO;EACnC;EAEA4B,SAASA,CAAA,EAAW;IAClB,OAAO,IAAI,CAACN,MAAM,CAACtB,OAAO;EAC5B;EAEA6B,QAAQA,CAAA,EAAW;IACjB,OAAO,IAAI,CAACL,KAAK,CAACxB,OAAO;EAC3B;AACF;AAACH,OAAA,CAAAc,iCAAA,GAAAA,iCAAA"}
@@ -8,12 +8,6 @@ exports.CEKEntry = void 0;
8
8
  // Copyright (c) 2019 Microsoft Corporation
9
9
 
10
10
  class CEKEntry {
11
- columnEncryptionKeyValues;
12
- ordinal;
13
- databaseId;
14
- cekId;
15
- cekVersion;
16
- cekMdVersion;
17
11
  constructor(ordinalVal) {
18
12
  this.ordinal = ordinalVal;
19
13
  this.databaseId = 0;
@@ -45,4 +39,4 @@ class CEKEntry {
45
39
  }
46
40
  }
47
41
  exports.CEKEntry = CEKEntry;
48
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDRUtFbnRyeSIsImNvbHVtbkVuY3J5cHRpb25LZXlWYWx1ZXMiLCJvcmRpbmFsIiwiZGF0YWJhc2VJZCIsImNla0lkIiwiY2VrVmVyc2lvbiIsImNla01kVmVyc2lvbiIsImNvbnN0cnVjdG9yIiwib3JkaW5hbFZhbCIsIkJ1ZmZlciIsImFsbG9jIiwiYWRkIiwiZW5jcnlwdGVkS2V5IiwiZGJJZCIsImtleUlkIiwia2V5VmVyc2lvbiIsIm1kVmVyc2lvbiIsImtleVBhdGgiLCJrZXlTdG9yZU5hbWUiLCJhbGdvcml0aG1OYW1lIiwiZW5jcnlwdGlvbktleSIsInB1c2giLCJsZW5ndGgiLCJFcnJvciIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC9jZWstZW50cnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IEVuY3J5cHRpb25LZXlJbmZvIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDRUtFbnRyeSB7XG4gIGNvbHVtbkVuY3J5cHRpb25LZXlWYWx1ZXM6IEVuY3J5cHRpb25LZXlJbmZvW107XG4gIG9yZGluYWw6IG51bWJlcjtcbiAgZGF0YWJhc2VJZDogbnVtYmVyO1xuICBjZWtJZDogbnVtYmVyO1xuICBjZWtWZXJzaW9uOiBudW1iZXI7XG4gIGNla01kVmVyc2lvbjogQnVmZmVyO1xuXG4gIGNvbnN0cnVjdG9yKG9yZGluYWxWYWw6IG51bWJlcikge1xuICAgIHRoaXMub3JkaW5hbCA9IG9yZGluYWxWYWw7XG4gICAgdGhpcy5kYXRhYmFzZUlkID0gMDtcbiAgICB0aGlzLmNla0lkID0gMDtcbiAgICB0aGlzLmNla1ZlcnNpb24gPSAwO1xuICAgIHRoaXMuY2VrTWRWZXJzaW9uID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIHRoaXMuY29sdW1uRW5jcnlwdGlvbktleVZhbHVlcyA9IFtdO1xuICB9XG5cbiAgYWRkKGVuY3J5cHRlZEtleTogQnVmZmVyLCBkYklkOiBudW1iZXIsIGtleUlkOiBudW1iZXIsIGtleVZlcnNpb246IG51bWJlciwgbWRWZXJzaW9uOiBCdWZmZXIsIGtleVBhdGg6IHN0cmluZywga2V5U3RvcmVOYW1lOiBzdHJpbmcsIGFsZ29yaXRobU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVuY3J5cHRpb25LZXk6IEVuY3J5cHRpb25LZXlJbmZvID0ge1xuICAgICAgZW5jcnlwdGVkS2V5LFxuICAgICAgZGJJZCxcbiAgICAgIGtleUlkLFxuICAgICAga2V5VmVyc2lvbixcbiAgICAgIG1kVmVyc2lvbixcbiAgICAgIGtleVBhdGgsXG4gICAgICBrZXlTdG9yZU5hbWUsXG4gICAgICBhbGdvcml0aG1OYW1lLFxuICAgIH07XG5cbiAgICB0aGlzLmNvbHVtbkVuY3J5cHRpb25LZXlWYWx1ZXMucHVzaChlbmNyeXB0aW9uS2V5KTtcblxuICAgIGlmICh0aGlzLmRhdGFiYXNlSWQgPT09IDApIHtcbiAgICAgIHRoaXMuZGF0YWJhc2VJZCA9IGRiSWQ7XG4gICAgICB0aGlzLmNla0lkID0ga2V5SWQ7XG4gICAgICB0aGlzLmNla1ZlcnNpb24gPSBrZXlWZXJzaW9uO1xuICAgICAgdGhpcy5jZWtNZFZlcnNpb24gPSBtZFZlcnNpb247XG4gICAgfSBlbHNlIGlmICgodGhpcy5kYXRhYmFzZUlkICE9PSBkYklkKSB8fCAodGhpcy5jZWtJZCAhPT0ga2V5SWQpIHx8ICh0aGlzLmNla1ZlcnNpb24gIT09IGtleVZlcnNpb24pIHx8ICF0aGlzLmNla01kVmVyc2lvbiB8fCAhbWRWZXJzaW9uIHx8IHRoaXMuY2VrTWRWZXJzaW9uLmxlbmd0aCAhPT0gbWRWZXJzaW9uLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGFiYXNlSWQsIGNla0lkLCBjZWtWZXJzaW9uIG9yIGNla01kVmVyc2lvbi4nKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7QUFJTyxNQUFNQSxRQUFRLENBQUM7RUFDcEJDLHlCQUF5QjtFQUN6QkMsT0FBTztFQUNQQyxVQUFVO0VBQ1ZDLEtBQUs7RUFDTEMsVUFBVTtFQUNWQyxZQUFZO0VBRVpDLFdBQVdBLENBQUNDLFVBQWtCLEVBQUU7SUFDOUIsSUFBSSxDQUFDTixPQUFPLEdBQUdNLFVBQVU7SUFDekIsSUFBSSxDQUFDTCxVQUFVLEdBQUcsQ0FBQztJQUNuQixJQUFJLENBQUNDLEtBQUssR0FBRyxDQUFDO0lBQ2QsSUFBSSxDQUFDQyxVQUFVLEdBQUcsQ0FBQztJQUNuQixJQUFJLENBQUNDLFlBQVksR0FBR0csTUFBTSxDQUFDQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQ1QseUJBQXlCLEdBQUcsRUFBRTtFQUNyQztFQUVBVSxHQUFHQSxDQUFDQyxZQUFvQixFQUFFQyxJQUFZLEVBQUVDLEtBQWEsRUFBRUMsVUFBa0IsRUFBRUMsU0FBaUIsRUFBRUMsT0FBZSxFQUFFQyxZQUFvQixFQUFFQyxhQUFxQixFQUFRO0lBQ2hLLE1BQU1DLGFBQWdDLEdBQUc7TUFDdkNSLFlBQVk7TUFDWkMsSUFBSTtNQUNKQyxLQUFLO01BQ0xDLFVBQVU7TUFDVkMsU0FBUztNQUNUQyxPQUFPO01BQ1BDLFlBQVk7TUFDWkM7SUFDRixDQUFDO0lBRUQsSUFBSSxDQUFDbEIseUJBQXlCLENBQUNvQixJQUFJLENBQUNELGFBQWEsQ0FBQztJQUVsRCxJQUFJLElBQUksQ0FBQ2pCLFVBQVUsS0FBSyxDQUFDLEVBQUU7TUFDekIsSUFBSSxDQUFDQSxVQUFVLEdBQUdVLElBQUk7TUFDdEIsSUFBSSxDQUFDVCxLQUFLLEdBQUdVLEtBQUs7TUFDbEIsSUFBSSxDQUFDVCxVQUFVLEdBQUdVLFVBQVU7TUFDNUIsSUFBSSxDQUFDVCxZQUFZLEdBQUdVLFNBQVM7SUFDL0IsQ0FBQyxNQUFNLElBQUssSUFBSSxDQUFDYixVQUFVLEtBQUtVLElBQUksSUFBTSxJQUFJLENBQUNULEtBQUssS0FBS1UsS0FBTSxJQUFLLElBQUksQ0FBQ1QsVUFBVSxLQUFLVSxVQUFXLElBQUksQ0FBQyxJQUFJLENBQUNULFlBQVksSUFBSSxDQUFDVSxTQUFTLElBQUksSUFBSSxDQUFDVixZQUFZLENBQUNnQixNQUFNLEtBQUtOLFNBQVMsQ0FBQ00sTUFBTSxFQUFFO01BQ3hMLE1BQU0sSUFBSUMsS0FBSyxDQUFDLHdEQUF3RCxDQUFDO0lBQzNFO0VBQ0Y7QUFDRjtBQUFDQyxPQUFBLENBQUF4QixRQUFBLEdBQUFBLFFBQUEifQ==
42
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDRUtFbnRyeSIsImNvbnN0cnVjdG9yIiwib3JkaW5hbFZhbCIsIm9yZGluYWwiLCJkYXRhYmFzZUlkIiwiY2VrSWQiLCJjZWtWZXJzaW9uIiwiY2VrTWRWZXJzaW9uIiwiQnVmZmVyIiwiYWxsb2MiLCJjb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzIiwiYWRkIiwiZW5jcnlwdGVkS2V5IiwiZGJJZCIsImtleUlkIiwia2V5VmVyc2lvbiIsIm1kVmVyc2lvbiIsImtleVBhdGgiLCJrZXlTdG9yZU5hbWUiLCJhbGdvcml0aG1OYW1lIiwiZW5jcnlwdGlvbktleSIsInB1c2giLCJsZW5ndGgiLCJFcnJvciIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC9jZWstZW50cnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IHR5cGUgRW5jcnlwdGlvbktleUluZm8gfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENFS0VudHJ5IHtcbiAgZGVjbGFyZSBjb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzOiBFbmNyeXB0aW9uS2V5SW5mb1tdO1xuICBkZWNsYXJlIG9yZGluYWw6IG51bWJlcjtcbiAgZGVjbGFyZSBkYXRhYmFzZUlkOiBudW1iZXI7XG4gIGRlY2xhcmUgY2VrSWQ6IG51bWJlcjtcbiAgZGVjbGFyZSBjZWtWZXJzaW9uOiBudW1iZXI7XG4gIGRlY2xhcmUgY2VrTWRWZXJzaW9uOiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3Iob3JkaW5hbFZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5vcmRpbmFsID0gb3JkaW5hbFZhbDtcbiAgICB0aGlzLmRhdGFiYXNlSWQgPSAwO1xuICAgIHRoaXMuY2VrSWQgPSAwO1xuICAgIHRoaXMuY2VrVmVyc2lvbiA9IDA7XG4gICAgdGhpcy5jZWtNZFZlcnNpb24gPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgdGhpcy5jb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzID0gW107XG4gIH1cblxuICBhZGQoZW5jcnlwdGVkS2V5OiBCdWZmZXIsIGRiSWQ6IG51bWJlciwga2V5SWQ6IG51bWJlciwga2V5VmVyc2lvbjogbnVtYmVyLCBtZFZlcnNpb246IEJ1ZmZlciwga2V5UGF0aDogc3RyaW5nLCBrZXlTdG9yZU5hbWU6IHN0cmluZywgYWxnb3JpdGhtTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZW5jcnlwdGlvbktleTogRW5jcnlwdGlvbktleUluZm8gPSB7XG4gICAgICBlbmNyeXB0ZWRLZXksXG4gICAgICBkYklkLFxuICAgICAga2V5SWQsXG4gICAgICBrZXlWZXJzaW9uLFxuICAgICAgbWRWZXJzaW9uLFxuICAgICAga2V5UGF0aCxcbiAgICAgIGtleVN0b3JlTmFtZSxcbiAgICAgIGFsZ29yaXRobU5hbWUsXG4gICAgfTtcblxuICAgIHRoaXMuY29sdW1uRW5jcnlwdGlvbktleVZhbHVlcy5wdXNoKGVuY3J5cHRpb25LZXkpO1xuXG4gICAgaWYgKHRoaXMuZGF0YWJhc2VJZCA9PT0gMCkge1xuICAgICAgdGhpcy5kYXRhYmFzZUlkID0gZGJJZDtcbiAgICAgIHRoaXMuY2VrSWQgPSBrZXlJZDtcbiAgICAgIHRoaXMuY2VrVmVyc2lvbiA9IGtleVZlcnNpb247XG4gICAgICB0aGlzLmNla01kVmVyc2lvbiA9IG1kVmVyc2lvbjtcbiAgICB9IGVsc2UgaWYgKCh0aGlzLmRhdGFiYXNlSWQgIT09IGRiSWQpIHx8ICh0aGlzLmNla0lkICE9PSBrZXlJZCkgfHwgKHRoaXMuY2VrVmVyc2lvbiAhPT0ga2V5VmVyc2lvbikgfHwgIXRoaXMuY2VrTWRWZXJzaW9uIHx8ICFtZFZlcnNpb24gfHwgdGhpcy5jZWtNZFZlcnNpb24ubGVuZ3RoICE9PSBtZFZlcnNpb24ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YWJhc2VJZCwgY2VrSWQsIGNla1ZlcnNpb24gb3IgY2VrTWRWZXJzaW9uLicpO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBOztBQUlPLE1BQU1BLFFBQVEsQ0FBQztFQVFwQkMsV0FBV0EsQ0FBQ0MsVUFBa0IsRUFBRTtJQUM5QixJQUFJLENBQUNDLE9BQU8sR0FBR0QsVUFBVTtJQUN6QixJQUFJLENBQUNFLFVBQVUsR0FBRyxDQUFDO0lBQ25CLElBQUksQ0FBQ0MsS0FBSyxHQUFHLENBQUM7SUFDZCxJQUFJLENBQUNDLFVBQVUsR0FBRyxDQUFDO0lBQ25CLElBQUksQ0FBQ0MsWUFBWSxHQUFHQyxNQUFNLENBQUNDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkMsSUFBSSxDQUFDQyx5QkFBeUIsR0FBRyxFQUFFO0VBQ3JDO0VBRUFDLEdBQUdBLENBQUNDLFlBQW9CLEVBQUVDLElBQVksRUFBRUMsS0FBYSxFQUFFQyxVQUFrQixFQUFFQyxTQUFpQixFQUFFQyxPQUFlLEVBQUVDLFlBQW9CLEVBQUVDLGFBQXFCLEVBQVE7SUFDaEssTUFBTUMsYUFBZ0MsR0FBRztNQUN2Q1IsWUFBWTtNQUNaQyxJQUFJO01BQ0pDLEtBQUs7TUFDTEMsVUFBVTtNQUNWQyxTQUFTO01BQ1RDLE9BQU87TUFDUEMsWUFBWTtNQUNaQztJQUNGLENBQUM7SUFFRCxJQUFJLENBQUNULHlCQUF5QixDQUFDVyxJQUFJLENBQUNELGFBQWEsQ0FBQztJQUVsRCxJQUFJLElBQUksQ0FBQ2hCLFVBQVUsS0FBSyxDQUFDLEVBQUU7TUFDekIsSUFBSSxDQUFDQSxVQUFVLEdBQUdTLElBQUk7TUFDdEIsSUFBSSxDQUFDUixLQUFLLEdBQUdTLEtBQUs7TUFDbEIsSUFBSSxDQUFDUixVQUFVLEdBQUdTLFVBQVU7TUFDNUIsSUFBSSxDQUFDUixZQUFZLEdBQUdTLFNBQVM7SUFDL0IsQ0FBQyxNQUFNLElBQUssSUFBSSxDQUFDWixVQUFVLEtBQUtTLElBQUksSUFBTSxJQUFJLENBQUNSLEtBQUssS0FBS1MsS0FBTSxJQUFLLElBQUksQ0FBQ1IsVUFBVSxLQUFLUyxVQUFXLElBQUksQ0FBQyxJQUFJLENBQUNSLFlBQVksSUFBSSxDQUFDUyxTQUFTLElBQUksSUFBSSxDQUFDVCxZQUFZLENBQUNlLE1BQU0sS0FBS04sU0FBUyxDQUFDTSxNQUFNLEVBQUU7TUFDeEwsTUFBTSxJQUFJQyxLQUFLLENBQUMsd0RBQXdELENBQUM7SUFDM0U7RUFDRjtBQUNGO0FBQUNDLE9BQUEsQ0FBQXhCLFFBQUEsR0FBQUEsUUFBQSJ9
@@ -1 +1 @@
1
- {"version":3,"file":"cek-entry.js","names":["CEKEntry","columnEncryptionKeyValues","ordinal","databaseId","cekId","cekVersion","cekMdVersion","constructor","ordinalVal","Buffer","alloc","add","encryptedKey","dbId","keyId","keyVersion","mdVersion","keyPath","keyStoreName","algorithmName","encryptionKey","push","length","Error","exports"],"sources":["../../src/always-encrypted/cek-entry.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { EncryptionKeyInfo } from './types';\n\nexport class CEKEntry {\n columnEncryptionKeyValues: EncryptionKeyInfo[];\n ordinal: number;\n databaseId: number;\n cekId: number;\n cekVersion: number;\n cekMdVersion: Buffer;\n\n constructor(ordinalVal: number) {\n this.ordinal = ordinalVal;\n this.databaseId = 0;\n this.cekId = 0;\n this.cekVersion = 0;\n this.cekMdVersion = Buffer.alloc(0);\n this.columnEncryptionKeyValues = [];\n }\n\n add(encryptedKey: Buffer, dbId: number, keyId: number, keyVersion: number, mdVersion: Buffer, keyPath: string, keyStoreName: string, algorithmName: string): void {\n const encryptionKey: EncryptionKeyInfo = {\n encryptedKey,\n dbId,\n keyId,\n keyVersion,\n mdVersion,\n keyPath,\n keyStoreName,\n algorithmName,\n };\n\n this.columnEncryptionKeyValues.push(encryptionKey);\n\n if (this.databaseId === 0) {\n this.databaseId = dbId;\n this.cekId = keyId;\n this.cekVersion = keyVersion;\n this.cekMdVersion = mdVersion;\n } else if ((this.databaseId !== dbId) || (this.cekId !== keyId) || (this.cekVersion !== keyVersion) || !this.cekMdVersion || !mdVersion || this.cekMdVersion.length !== mdVersion.length) {\n throw new Error('Invalid databaseId, cekId, cekVersion or cekMdVersion.');\n }\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;;AAIO,MAAMA,QAAQ,CAAC;EACpBC,yBAAyB;EACzBC,OAAO;EACPC,UAAU;EACVC,KAAK;EACLC,UAAU;EACVC,YAAY;EAEZC,WAAWA,CAACC,UAAkB,EAAE;IAC9B,IAAI,CAACN,OAAO,GAAGM,UAAU;IACzB,IAAI,CAACL,UAAU,GAAG,CAAC;IACnB,IAAI,CAACC,KAAK,GAAG,CAAC;IACd,IAAI,CAACC,UAAU,GAAG,CAAC;IACnB,IAAI,CAACC,YAAY,GAAGG,MAAM,CAACC,KAAK,CAAC,CAAC,CAAC;IACnC,IAAI,CAACT,yBAAyB,GAAG,EAAE;EACrC;EAEAU,GAAGA,CAACC,YAAoB,EAAEC,IAAY,EAAEC,KAAa,EAAEC,UAAkB,EAAEC,SAAiB,EAAEC,OAAe,EAAEC,YAAoB,EAAEC,aAAqB,EAAQ;IAChK,MAAMC,aAAgC,GAAG;MACvCR,YAAY;MACZC,IAAI;MACJC,KAAK;MACLC,UAAU;MACVC,SAAS;MACTC,OAAO;MACPC,YAAY;MACZC;IACF,CAAC;IAED,IAAI,CAAClB,yBAAyB,CAACoB,IAAI,CAACD,aAAa,CAAC;IAElD,IAAI,IAAI,CAACjB,UAAU,KAAK,CAAC,EAAE;MACzB,IAAI,CAACA,UAAU,GAAGU,IAAI;MACtB,IAAI,CAACT,KAAK,GAAGU,KAAK;MAClB,IAAI,CAACT,UAAU,GAAGU,UAAU;MAC5B,IAAI,CAACT,YAAY,GAAGU,SAAS;IAC/B,CAAC,MAAM,IAAK,IAAI,CAACb,UAAU,KAAKU,IAAI,IAAM,IAAI,CAACT,KAAK,KAAKU,KAAM,IAAK,IAAI,CAACT,UAAU,KAAKU,UAAW,IAAI,CAAC,IAAI,CAACT,YAAY,IAAI,CAACU,SAAS,IAAI,IAAI,CAACV,YAAY,CAACgB,MAAM,KAAKN,SAAS,CAACM,MAAM,EAAE;MACxL,MAAM,IAAIC,KAAK,CAAC,wDAAwD,CAAC;IAC3E;EACF;AACF;AAACC,OAAA,CAAAxB,QAAA,GAAAA,QAAA"}
1
+ {"version":3,"file":"cek-entry.js","names":["CEKEntry","constructor","ordinalVal","ordinal","databaseId","cekId","cekVersion","cekMdVersion","Buffer","alloc","columnEncryptionKeyValues","add","encryptedKey","dbId","keyId","keyVersion","mdVersion","keyPath","keyStoreName","algorithmName","encryptionKey","push","length","Error","exports"],"sources":["../../src/always-encrypted/cek-entry.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { type EncryptionKeyInfo } from './types';\n\nexport class CEKEntry {\n declare columnEncryptionKeyValues: EncryptionKeyInfo[];\n declare ordinal: number;\n declare databaseId: number;\n declare cekId: number;\n declare cekVersion: number;\n declare cekMdVersion: Buffer;\n\n constructor(ordinalVal: number) {\n this.ordinal = ordinalVal;\n this.databaseId = 0;\n this.cekId = 0;\n this.cekVersion = 0;\n this.cekMdVersion = Buffer.alloc(0);\n this.columnEncryptionKeyValues = [];\n }\n\n add(encryptedKey: Buffer, dbId: number, keyId: number, keyVersion: number, mdVersion: Buffer, keyPath: string, keyStoreName: string, algorithmName: string): void {\n const encryptionKey: EncryptionKeyInfo = {\n encryptedKey,\n dbId,\n keyId,\n keyVersion,\n mdVersion,\n keyPath,\n keyStoreName,\n algorithmName,\n };\n\n this.columnEncryptionKeyValues.push(encryptionKey);\n\n if (this.databaseId === 0) {\n this.databaseId = dbId;\n this.cekId = keyId;\n this.cekVersion = keyVersion;\n this.cekMdVersion = mdVersion;\n } else if ((this.databaseId !== dbId) || (this.cekId !== keyId) || (this.cekVersion !== keyVersion) || !this.cekMdVersion || !mdVersion || this.cekMdVersion.length !== mdVersion.length) {\n throw new Error('Invalid databaseId, cekId, cekVersion or cekMdVersion.');\n }\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;;AAIO,MAAMA,QAAQ,CAAC;EAQpBC,WAAWA,CAACC,UAAkB,EAAE;IAC9B,IAAI,CAACC,OAAO,GAAGD,UAAU;IACzB,IAAI,CAACE,UAAU,GAAG,CAAC;IACnB,IAAI,CAACC,KAAK,GAAG,CAAC;IACd,IAAI,CAACC,UAAU,GAAG,CAAC;IACnB,IAAI,CAACC,YAAY,GAAGC,MAAM,CAACC,KAAK,CAAC,CAAC,CAAC;IACnC,IAAI,CAACC,yBAAyB,GAAG,EAAE;EACrC;EAEAC,GAAGA,CAACC,YAAoB,EAAEC,IAAY,EAAEC,KAAa,EAAEC,UAAkB,EAAEC,SAAiB,EAAEC,OAAe,EAAEC,YAAoB,EAAEC,aAAqB,EAAQ;IAChK,MAAMC,aAAgC,GAAG;MACvCR,YAAY;MACZC,IAAI;MACJC,KAAK;MACLC,UAAU;MACVC,SAAS;MACTC,OAAO;MACPC,YAAY;MACZC;IACF,CAAC;IAED,IAAI,CAACT,yBAAyB,CAACW,IAAI,CAACD,aAAa,CAAC;IAElD,IAAI,IAAI,CAAChB,UAAU,KAAK,CAAC,EAAE;MACzB,IAAI,CAACA,UAAU,GAAGS,IAAI;MACtB,IAAI,CAACR,KAAK,GAAGS,KAAK;MAClB,IAAI,CAACR,UAAU,GAAGS,UAAU;MAC5B,IAAI,CAACR,YAAY,GAAGS,SAAS;IAC/B,CAAC,MAAM,IAAK,IAAI,CAACZ,UAAU,KAAKS,IAAI,IAAM,IAAI,CAACR,KAAK,KAAKS,KAAM,IAAK,IAAI,CAACR,UAAU,KAAKS,UAAW,IAAI,CAAC,IAAI,CAACR,YAAY,IAAI,CAACS,SAAS,IAAI,IAAI,CAACT,YAAY,CAACe,MAAM,KAAKN,SAAS,CAACM,MAAM,EAAE;MACxL,MAAM,IAAIC,KAAK,CAAC,wDAAwD,CAAC;IAC3E;EACF;AACF;AAACC,OAAA,CAAAxB,QAAA,GAAAA,QAAA"}
@@ -87,4 +87,4 @@ const getParameterEncryptionMetadata = (connection, request, callback) => {
87
87
  connection.makeRequest(metadataRequest, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(metadataRequest.sqlTextOrProcedure, metadataRequest.parameters, connection.currentTransactionDescriptor(), connection.config.options, connection.databaseCollation));
88
88
  };
89
89
  exports.getParameterEncryptionMetadata = getParameterEncryptionMetadata;
90
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZXMiLCJyZXF1aXJlIiwiX2Nla0VudHJ5IiwiX2tleUNyeXB0byIsIl9kYXRhVHlwZSIsIl9yZXF1ZXN0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9ycGNyZXF1ZXN0UGF5bG9hZCIsIl9wYWNrZXQiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImdldFBhcmFtZXRlckVuY3J5cHRpb25NZXRhZGF0YSIsImNvbm5lY3Rpb24iLCJyZXF1ZXN0IiwiY2FsbGJhY2siLCJjcnlwdG9NZXRhZGF0YUxvYWRlZCIsIm1ldGFkYXRhUmVxdWVzdCIsIlJlcXVlc3QiLCJlcnJvciIsImRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlcyIsImNla0xpc3QiLCJwYXJhbUNvdW50IiwiY29sdW1ucyIsInJlc3VsdFJvd3MiLCJpc0ZpcnN0UmVjb3JkU2V0Iiwic29tZSIsImNvbCIsIm1ldGFkYXRhIiwiY29sTmFtZSIsImN1cnJlbnRPcmRpbmFsIiwiRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MSIsIktleU9yZGluYWwiLCJ2YWx1ZSIsImNla0VudHJ5IiwiQ0VLRW50cnkiLCJvcmRpbmFsIiwiYWRkIiwiRW5jcnlwdGVkS2V5IiwiRGJJZCIsIktleUlkIiwiS2V5VmVyc2lvbiIsIktleU1kVmVyc2lvbiIsIktleVBhdGgiLCJQcm92aWRlck5hbWUiLCJLZXlFbmNyeXB0aW9uQWxnb3JpdGhtIiwicGFyYW1OYW1lIiwiRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MiIsIlBhcmFtZXRlck5hbWUiLCJwYXJhbUluZGV4IiwicGFyYW1ldGVycyIsImZpbmRJbmRleCIsInBhcmFtIiwibmFtZSIsImNla09yZGluYWwiLCJDb2x1bW5FbmNyeXB0aW9uS2V5T3JkaW5hbCIsImxlbmd0aCIsIkVycm9yIiwiZW5jVHlwZSIsIkNvbHVtbkVuY3J5dGlvblR5cGUiLCJTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSIsIlBsYWluVGV4dCIsImNyeXB0b01ldGFkYXRhIiwiY2lwaGVyQWxnb3JpdGhtSWQiLCJDb2x1bW5FbmNyeXB0aW9uQWxnb3JpdGhtIiwiZW5jcnlwdGlvblR5cGUiLCJub3JtYWxpemF0aW9uUnVsZVZlcnNpb24iLCJCdWZmZXIiLCJmcm9tIiwiTm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uIiwicHVzaCIsImRlY3J5cHRTeW1tZXRyaWNLZXkiLCJjb25maWciLCJvcHRpb25zIiwiZm9yY2VFbmNyeXB0Iiwic3FsVGV4dE9yUHJvY2VkdXJlIiwiUHJvbWlzZSIsImFsbCIsInRoZW4iLCJwcm9jZXNzIiwibmV4dFRpY2siLCJhZGRQYXJhbWV0ZXIiLCJUWVBFUyIsIk5WYXJDaGFyIiwibWFrZVBhcmFtc1BhcmFtZXRlciIsIm9uIiwibWFrZVJlcXVlc3QiLCJUWVBFIiwiUlBDX1JFUVVFU1QiLCJScGNSZXF1ZXN0UGF5bG9hZCIsImN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IiLCJkYXRhYmFzZUNvbGxhdGlvbiIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC9nZXQtcGFyYW1ldGVyLWVuY3J5cHRpb24tbWV0YWRhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IFNRTFNlcnZlckVuY3J5cHRpb25UeXBlLCBDcnlwdG9NZXRhZGF0YSwgRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MSwgRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQ0VLRW50cnkgfSBmcm9tICcuL2Nlay1lbnRyeSc7XG5pbXBvcnQgeyBkZWNyeXB0U3ltbWV0cmljS2V5IH0gZnJvbSAnLi9rZXktY3J5cHRvJztcbmltcG9ydCB7IHR5cGVCeU5hbWUgYXMgVFlQRVMsIFBhcmFtZXRlciB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi9yZXF1ZXN0JztcbmltcG9ydCBDb25uZWN0aW9uIGZyb20gJy4uL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IFJwY1JlcXVlc3RQYXlsb2FkIGZyb20gJy4uL3JwY3JlcXVlc3QtcGF5bG9hZCc7XG5pbXBvcnQgeyBUWVBFIH0gZnJvbSAnLi4vcGFja2V0JztcblxuZXhwb3J0IGNvbnN0IGdldFBhcmFtZXRlckVuY3J5cHRpb25NZXRhZGF0YSA9IChjb25uZWN0aW9uOiBDb25uZWN0aW9uLCByZXF1ZXN0OiBSZXF1ZXN0LCBjYWxsYmFjazogKGVycm9yPzogRXJyb3IpID0+IHZvaWQpID0+IHtcbiAgaWYgKHJlcXVlc3QuY3J5cHRvTWV0YWRhdGFMb2FkZWQgPT09IHRydWUpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfVxuXG4gIGNvbnN0IG1ldGFkYXRhUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KCdzcF9kZXNjcmliZV9wYXJhbWV0ZXJfZW5jcnlwdGlvbicsIChlcnJvcikgPT4ge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycm9yKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNyeXB0U3ltbWV0cmljS2V5UHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGNvbnN0IGNla0xpc3Q6IENFS0VudHJ5W10gPSBbXTtcbiAgICBsZXQgcGFyYW1Db3VudCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbnMgb2YgcmVzdWx0Um93cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaXNGaXJzdFJlY29yZFNldCA9IGNvbHVtbnMuc29tZSgoY29sOiBhbnkpID0+IChjb2wgJiYgY29sLm1ldGFkYXRhICYmIGNvbC5tZXRhZGF0YS5jb2xOYW1lKSA9PT0gJ2RhdGFiYXNlX2lkJyk7XG4gICAgICAgIGlmIChpc0ZpcnN0UmVjb3JkU2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudE9yZGluYWwgPSBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5T3JkaW5hbF0udmFsdWU7XG4gICAgICAgICAgbGV0IGNla0VudHJ5OiBDRUtFbnRyeTtcbiAgICAgICAgICBpZiAoIWNla0xpc3RbY3VycmVudE9yZGluYWxdKSB7XG4gICAgICAgICAgICBjZWtFbnRyeSA9IG5ldyBDRUtFbnRyeShjdXJyZW50T3JkaW5hbCk7XG4gICAgICAgICAgICBjZWtMaXN0W2Nla0VudHJ5Lm9yZGluYWxdID0gY2VrRW50cnk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNla0VudHJ5ID0gY2VrTGlzdFtjdXJyZW50T3JkaW5hbF07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNla0VudHJ5LmFkZChjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuRW5jcnlwdGVkS2V5XS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLkRiSWRdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5SWRdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5VmVyc2lvbl0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlNZFZlcnNpb25dLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5UGF0aF0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5Qcm92aWRlck5hbWVdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5RW5jcnlwdGlvbkFsZ29yaXRobV0udmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmFtQ291bnQrKztcbiAgICAgICAgICBjb25zdCBwYXJhbU5hbWU6IHN0cmluZyA9IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5QYXJhbWV0ZXJOYW1lXS52YWx1ZTtcbiAgICAgICAgICBjb25zdCBwYXJhbUluZGV4OiBudW1iZXIgPSByZXF1ZXN0LnBhcmFtZXRlcnMuZmluZEluZGV4KChwYXJhbTogUGFyYW1ldGVyKSA9PiBwYXJhbU5hbWUgPT09IGBAJHtwYXJhbS5uYW1lfWApO1xuICAgICAgICAgIGNvbnN0IGNla09yZGluYWw6IG51bWJlciA9IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5Db2x1bW5FbmNyeXB0aW9uS2V5T3JkaW5hbF0udmFsdWU7XG4gICAgICAgICAgY29uc3QgY2VrRW50cnk6IENFS0VudHJ5ID0gY2VrTGlzdFtjZWtPcmRpbmFsXTtcblxuICAgICAgICAgIGlmIChjZWtFbnRyeSAmJiBjZWtMaXN0Lmxlbmd0aCA8IGNla09yZGluYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYEludGVybmFsIGVycm9yLiBUaGUgcmVmZXJlbmNlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgb3JkaW5hbCBcIiR7Y2VrT3JkaW5hbH1cIiBpcyBtaXNzaW5nIGluIHRoZSBlbmNyeXB0aW9uIG1ldGFkYXRhIHJldHVybmVkIGJ5IHNwX2Rlc2NyaWJlX3BhcmFtZXRlcl9lbmNyeXB0aW9uLiBNYXggb3JkaW5hbCBpcyBcIiR7Y2VrTGlzdC5sZW5ndGh9XCIuYCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVuY1R5cGUgPSBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuQ29sdW1uRW5jcnl0aW9uVHlwZV0udmFsdWU7XG4gICAgICAgICAgaWYgKFNRTFNlcnZlckVuY3J5cHRpb25UeXBlLlBsYWluVGV4dCAhPT0gZW5jVHlwZSkge1xuICAgICAgICAgICAgcmVxdWVzdC5wYXJhbWV0ZXJzW3BhcmFtSW5kZXhdLmNyeXB0b01ldGFkYXRhID0ge1xuICAgICAgICAgICAgICBjZWtFbnRyeTogY2VrRW50cnksXG4gICAgICAgICAgICAgIG9yZGluYWw6IGNla09yZGluYWwsXG4gICAgICAgICAgICAgIGNpcGhlckFsZ29yaXRobUlkOiBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuQ29sdW1uRW5jcnlwdGlvbkFsZ29yaXRobV0udmFsdWUsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25UeXBlOiBlbmNUeXBlLFxuICAgICAgICAgICAgICBub3JtYWxpemF0aW9uUnVsZVZlcnNpb246IEJ1ZmZlci5mcm9tKFtjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuTm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uXS52YWx1ZV0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlcy5wdXNoKGRlY3J5cHRTeW1tZXRyaWNLZXkocmVxdWVzdC5wYXJhbWV0ZXJzW3BhcmFtSW5kZXhdLmNyeXB0b01ldGFkYXRhIGFzIENyeXB0b01ldGFkYXRhLCBjb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LnBhcmFtZXRlcnNbcGFyYW1JbmRleF0uZm9yY2VFbmNyeXB0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBDYW5ub3QgZXhlY3V0ZSBzdGF0ZW1lbnQgb3IgcHJvY2VkdXJlICR7cmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmV9IGJlY2F1c2UgRm9yY2UgRW5jcnlwdGlvbiB3YXMgc2V0IGFzIHRydWUgZm9yIHBhcmFtZXRlciAke3BhcmFtSW5kZXggKyAxfSBhbmQgdGhlIGRhdGFiYXNlIGV4cGVjdHMgdGhpcyBwYXJhbWV0ZXIgdG8gYmUgc2VudCBhcyBwbGFpbnRleHQuIFRoaXMgbWF5IGJlIGR1ZSB0byBhIGNvbmZpZ3VyYXRpb24gZXJyb3IuYCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYEludGVybmFsIGVycm9yLiBVbmFibGUgdG8gcGFyc2UgcGFyYW1ldGVyIGVuY3J5cHRpb24gbWV0YWRhdGEgaW4gc3RhdGVtZW50IG9yIHByb2NlZHVyZSBcIiR7cmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmV9XCJgKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtQ291bnQgIT09IHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYEludGVybmFsIGVycm9yLiBNZXRhZGF0YSBmb3Igc29tZSBwYXJhbWV0ZXJzIGluIHN0YXRlbWVudCBvciBwcm9jZWR1cmUgXCIke3JlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlfVwiIGlzIG1pc3NpbmcgaW4gdGhlIHJlc3VsdHNldCByZXR1cm5lZCBieSBzcF9kZXNjcmliZV9wYXJhbWV0ZXJfZW5jcnlwdGlvbi5gKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICByZXF1ZXN0LmNyeXB0b01ldGFkYXRhTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spO1xuICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaywgZXJyb3IpO1xuICAgIH0pO1xuICB9KTtcblxuICBtZXRhZGF0YVJlcXVlc3QuYWRkUGFyYW1ldGVyKCd0c3FsJywgVFlQRVMuTlZhckNoYXIsIHJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlKTtcbiAgaWYgKHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICBtZXRhZGF0YVJlcXVlc3QuYWRkUGFyYW1ldGVyKCdwYXJhbXMnLCBUWVBFUy5OVmFyQ2hhciwgbWV0YWRhdGFSZXF1ZXN0Lm1ha2VQYXJhbXNQYXJhbWV0ZXIocmVxdWVzdC5wYXJhbWV0ZXJzKSk7XG4gIH1cblxuICBjb25zdCByZXN1bHRSb3dzOiBhbnlbXSA9IFtdO1xuXG4gIG1ldGFkYXRhUmVxdWVzdC5vbigncm93JywgKGNvbHVtbnM6IGFueSkgPT4ge1xuICAgIHJlc3VsdFJvd3MucHVzaChjb2x1bW5zKTtcbiAgfSk7XG5cbiAgY29ubmVjdGlvbi5tYWtlUmVxdWVzdChtZXRhZGF0YVJlcXVlc3QsIFRZUEUuUlBDX1JFUVVFU1QsIG5ldyBScGNSZXF1ZXN0UGF5bG9hZChtZXRhZGF0YVJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlISwgbWV0YWRhdGFSZXF1ZXN0LnBhcmFtZXRlcnMsIGNvbm5lY3Rpb24uY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCBjb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLCBjb25uZWN0aW9uLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxV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
90
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZXMiLCJyZXF1aXJlIiwiX2Nla0VudHJ5IiwiX2tleUNyeXB0byIsIl9kYXRhVHlwZSIsIl9yZXF1ZXN0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9ycGNyZXF1ZXN0UGF5bG9hZCIsIl9wYWNrZXQiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImdldFBhcmFtZXRlckVuY3J5cHRpb25NZXRhZGF0YSIsImNvbm5lY3Rpb24iLCJyZXF1ZXN0IiwiY2FsbGJhY2siLCJjcnlwdG9NZXRhZGF0YUxvYWRlZCIsIm1ldGFkYXRhUmVxdWVzdCIsIlJlcXVlc3QiLCJlcnJvciIsImRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlcyIsImNla0xpc3QiLCJwYXJhbUNvdW50IiwiY29sdW1ucyIsInJlc3VsdFJvd3MiLCJpc0ZpcnN0UmVjb3JkU2V0Iiwic29tZSIsImNvbCIsIm1ldGFkYXRhIiwiY29sTmFtZSIsImN1cnJlbnRPcmRpbmFsIiwiRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MSIsIktleU9yZGluYWwiLCJ2YWx1ZSIsImNla0VudHJ5IiwiQ0VLRW50cnkiLCJvcmRpbmFsIiwiYWRkIiwiRW5jcnlwdGVkS2V5IiwiRGJJZCIsIktleUlkIiwiS2V5VmVyc2lvbiIsIktleU1kVmVyc2lvbiIsIktleVBhdGgiLCJQcm92aWRlck5hbWUiLCJLZXlFbmNyeXB0aW9uQWxnb3JpdGhtIiwicGFyYW1OYW1lIiwiRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MiIsIlBhcmFtZXRlck5hbWUiLCJwYXJhbUluZGV4IiwicGFyYW1ldGVycyIsImZpbmRJbmRleCIsInBhcmFtIiwibmFtZSIsImNla09yZGluYWwiLCJDb2x1bW5FbmNyeXB0aW9uS2V5T3JkaW5hbCIsImxlbmd0aCIsIkVycm9yIiwiZW5jVHlwZSIsIkNvbHVtbkVuY3J5dGlvblR5cGUiLCJTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSIsIlBsYWluVGV4dCIsImNyeXB0b01ldGFkYXRhIiwiY2lwaGVyQWxnb3JpdGhtSWQiLCJDb2x1bW5FbmNyeXB0aW9uQWxnb3JpdGhtIiwiZW5jcnlwdGlvblR5cGUiLCJub3JtYWxpemF0aW9uUnVsZVZlcnNpb24iLCJCdWZmZXIiLCJmcm9tIiwiTm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uIiwicHVzaCIsImRlY3J5cHRTeW1tZXRyaWNLZXkiLCJjb25maWciLCJvcHRpb25zIiwiZm9yY2VFbmNyeXB0Iiwic3FsVGV4dE9yUHJvY2VkdXJlIiwiUHJvbWlzZSIsImFsbCIsInRoZW4iLCJwcm9jZXNzIiwibmV4dFRpY2siLCJhZGRQYXJhbWV0ZXIiLCJUWVBFUyIsIk5WYXJDaGFyIiwibWFrZVBhcmFtc1BhcmFtZXRlciIsIm9uIiwibWFrZVJlcXVlc3QiLCJUWVBFIiwiUlBDX1JFUVVFU1QiLCJScGNSZXF1ZXN0UGF5bG9hZCIsImN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IiLCJkYXRhYmFzZUNvbGxhdGlvbiIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC9nZXQtcGFyYW1ldGVyLWVuY3J5cHRpb24tbWV0YWRhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IFNRTFNlcnZlckVuY3J5cHRpb25UeXBlLCB0eXBlIENyeXB0b01ldGFkYXRhLCBEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLCBEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBDRUtFbnRyeSB9IGZyb20gJy4vY2VrLWVudHJ5JztcbmltcG9ydCB7IGRlY3J5cHRTeW1tZXRyaWNLZXkgfSBmcm9tICcuL2tleS1jcnlwdG8nO1xuaW1wb3J0IHsgdHlwZUJ5TmFtZSBhcyBUWVBFUywgdHlwZSBQYXJhbWV0ZXIgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi4vcmVxdWVzdCc7XG5pbXBvcnQgQ29ubmVjdGlvbiBmcm9tICcuLi9jb25uZWN0aW9uJztcbmltcG9ydCBScGNSZXF1ZXN0UGF5bG9hZCBmcm9tICcuLi9ycGNyZXF1ZXN0LXBheWxvYWQnO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gJy4uL3BhY2tldCc7XG5cbmV4cG9ydCBjb25zdCBnZXRQYXJhbWV0ZXJFbmNyeXB0aW9uTWV0YWRhdGEgPSAoY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgcmVxdWVzdDogUmVxdWVzdCwgY2FsbGJhY2s6IChlcnJvcj86IEVycm9yKSA9PiB2b2lkKSA9PiB7XG4gIGlmIChyZXF1ZXN0LmNyeXB0b01ldGFkYXRhTG9hZGVkID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gIH1cblxuICBjb25zdCBtZXRhZGF0YVJlcXVlc3QgPSBuZXcgUmVxdWVzdCgnc3BfZGVzY3JpYmVfcGFyYW1ldGVyX2VuY3J5cHRpb24nLCAoZXJyb3IpID0+IHtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnJvcik7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjcnlwdFN5bW1ldHJpY0tleVByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBjb25zdCBjZWtMaXN0OiBDRUtFbnRyeVtdID0gW107XG4gICAgbGV0IHBhcmFtQ291bnQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW5zIG9mIHJlc3VsdFJvd3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGlzRmlyc3RSZWNvcmRTZXQgPSBjb2x1bW5zLnNvbWUoKGNvbDogYW55KSA9PiAoY29sICYmIGNvbC5tZXRhZGF0YSAmJiBjb2wubWV0YWRhdGEuY29sTmFtZSkgPT09ICdkYXRhYmFzZV9pZCcpO1xuICAgICAgICBpZiAoaXNGaXJzdFJlY29yZFNldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRPcmRpbmFsID0gY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleU9yZGluYWxdLnZhbHVlO1xuICAgICAgICAgIGxldCBjZWtFbnRyeTogQ0VLRW50cnk7XG4gICAgICAgICAgaWYgKCFjZWtMaXN0W2N1cnJlbnRPcmRpbmFsXSkge1xuICAgICAgICAgICAgY2VrRW50cnkgPSBuZXcgQ0VLRW50cnkoY3VycmVudE9yZGluYWwpO1xuICAgICAgICAgICAgY2VrTGlzdFtjZWtFbnRyeS5vcmRpbmFsXSA9IGNla0VudHJ5O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjZWtFbnRyeSA9IGNla0xpc3RbY3VycmVudE9yZGluYWxdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjZWtFbnRyeS5hZGQoY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLkVuY3J5cHRlZEtleV0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5EYklkXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleUlkXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleVZlcnNpb25dLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5TWRWZXJzaW9uXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleVBhdGhdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuUHJvdmlkZXJOYW1lXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleUVuY3J5cHRpb25BbGdvcml0aG1dLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJhbUNvdW50Kys7XG4gICAgICAgICAgY29uc3QgcGFyYW1OYW1lOiBzdHJpbmcgPSBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuUGFyYW1ldGVyTmFtZV0udmFsdWU7XG4gICAgICAgICAgY29uc3QgcGFyYW1JbmRleDogbnVtYmVyID0gcmVxdWVzdC5wYXJhbWV0ZXJzLmZpbmRJbmRleCgocGFyYW06IFBhcmFtZXRlcikgPT4gcGFyYW1OYW1lID09PSBgQCR7cGFyYW0ubmFtZX1gKTtcbiAgICAgICAgICBjb25zdCBjZWtPcmRpbmFsOiBudW1iZXIgPSBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuQ29sdW1uRW5jcnlwdGlvbktleU9yZGluYWxdLnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGNla0VudHJ5OiBDRUtFbnRyeSA9IGNla0xpc3RbY2VrT3JkaW5hbF07XG5cbiAgICAgICAgICBpZiAoY2VrRW50cnkgJiYgY2VrTGlzdC5sZW5ndGggPCBjZWtPcmRpbmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvci4gVGhlIHJlZmVyZW5jZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IG9yZGluYWwgXCIke2Nla09yZGluYWx9XCIgaXMgbWlzc2luZyBpbiB0aGUgZW5jcnlwdGlvbiBtZXRhZGF0YSByZXR1cm5lZCBieSBzcF9kZXNjcmliZV9wYXJhbWV0ZXJfZW5jcnlwdGlvbi4gTWF4IG9yZGluYWwgaXMgXCIke2Nla0xpc3QubGVuZ3RofVwiLmApKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbmNUeXBlID0gY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyLkNvbHVtbkVuY3J5dGlvblR5cGVdLnZhbHVlO1xuICAgICAgICAgIGlmIChTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZS5QbGFpblRleHQgIT09IGVuY1R5cGUpIHtcbiAgICAgICAgICAgIHJlcXVlc3QucGFyYW1ldGVyc1twYXJhbUluZGV4XS5jcnlwdG9NZXRhZGF0YSA9IHtcbiAgICAgICAgICAgICAgY2VrRW50cnk6IGNla0VudHJ5LFxuICAgICAgICAgICAgICBvcmRpbmFsOiBjZWtPcmRpbmFsLFxuICAgICAgICAgICAgICBjaXBoZXJBbGdvcml0aG1JZDogY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyLkNvbHVtbkVuY3J5cHRpb25BbGdvcml0aG1dLnZhbHVlLFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uVHlwZTogZW5jVHlwZSxcbiAgICAgICAgICAgICAgbm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uOiBCdWZmZXIuZnJvbShbY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyLk5vcm1hbGl6YXRpb25SdWxlVmVyc2lvbl0udmFsdWVdKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkZWNyeXB0U3ltbWV0cmljS2V5UHJvbWlzZXMucHVzaChkZWNyeXB0U3ltbWV0cmljS2V5KHJlcXVlc3QucGFyYW1ldGVyc1twYXJhbUluZGV4XS5jcnlwdG9NZXRhZGF0YSBhcyBDcnlwdG9NZXRhZGF0YSwgY29ubmVjdGlvbi5jb25maWcub3B0aW9ucykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5wYXJhbWV0ZXJzW3BhcmFtSW5kZXhdLmZvcmNlRW5jcnlwdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgQ2Fubm90IGV4ZWN1dGUgc3RhdGVtZW50IG9yIHByb2NlZHVyZSAke3JlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlfSBiZWNhdXNlIEZvcmNlIEVuY3J5cHRpb24gd2FzIHNldCBhcyB0cnVlIGZvciBwYXJhbWV0ZXIgJHtwYXJhbUluZGV4ICsgMX0gYW5kIHRoZSBkYXRhYmFzZSBleHBlY3RzIHRoaXMgcGFyYW1ldGVyIHRvIGJlIHNlbnQgYXMgcGxhaW50ZXh0LiBUaGlzIG1heSBiZSBkdWUgdG8gYSBjb25maWd1cmF0aW9uIGVycm9yLmApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvci4gVW5hYmxlIHRvIHBhcnNlIHBhcmFtZXRlciBlbmNyeXB0aW9uIG1ldGFkYXRhIGluIHN0YXRlbWVudCBvciBwcm9jZWR1cmUgXCIke3JlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlfVwiYCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbUNvdW50ICE9PSByZXF1ZXN0LnBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvci4gTWV0YWRhdGEgZm9yIHNvbWUgcGFyYW1ldGVycyBpbiBzdGF0ZW1lbnQgb3IgcHJvY2VkdXJlIFwiJHtyZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZX1cIiBpcyBtaXNzaW5nIGluIHRoZSByZXN1bHRzZXQgcmV0dXJuZWQgYnkgc3BfZGVzY3JpYmVfcGFyYW1ldGVyX2VuY3J5cHRpb24uYCkpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbChkZWNyeXB0U3ltbWV0cmljS2V5UHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmVxdWVzdC5jcnlwdG9NZXRhZGF0YUxvYWRlZCA9IHRydWU7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKTtcbiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2ssIGVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgbWV0YWRhdGFSZXF1ZXN0LmFkZFBhcmFtZXRlcigndHNxbCcsIFRZUEVTLk5WYXJDaGFyLCByZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSk7XG4gIGlmIChyZXF1ZXN0LnBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgbWV0YWRhdGFSZXF1ZXN0LmFkZFBhcmFtZXRlcigncGFyYW1zJywgVFlQRVMuTlZhckNoYXIsIG1ldGFkYXRhUmVxdWVzdC5tYWtlUGFyYW1zUGFyYW1ldGVyKHJlcXVlc3QucGFyYW1ldGVycykpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0Um93czogYW55W10gPSBbXTtcblxuICBtZXRhZGF0YVJlcXVlc3Qub24oJ3JvdycsIChjb2x1bW5zOiBhbnkpID0+IHtcbiAgICByZXN1bHRSb3dzLnB1c2goY29sdW1ucyk7XG4gIH0pO1xuXG4gIGNvbm5lY3Rpb24ubWFrZVJlcXVlc3QobWV0YWRhdGFSZXF1ZXN0LCBUWVBFLlJQQ19SRVFVRVNULCBuZXcgUnBjUmVxdWVzdFBheWxvYWQobWV0YWRhdGFSZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSEsIG1ldGFkYXRhUmVxdWVzdC5wYXJhbWV0ZXJzLCBjb25uZWN0aW9uLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgY29ubmVjdGlvbi5jb25maWcub3B0aW9ucywgY29ubmVjdGlvbi5kYXRhYmFzZUNvbGxhdGlvbikpO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBRCxPQUFBO0FB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
@@ -1 +1 @@
1
- {"version":3,"file":"get-parameter-encryption-metadata.js","names":["_types","require","_cekEntry","_keyCrypto","_dataType","_request","_interopRequireDefault","_rpcrequestPayload","_packet","obj","__esModule","default","getParameterEncryptionMetadata","connection","request","callback","cryptoMetadataLoaded","metadataRequest","Request","error","decryptSymmetricKeyPromises","cekList","paramCount","columns","resultRows","isFirstRecordSet","some","col","metadata","colName","currentOrdinal","DescribeParameterEncryptionResultSet1","KeyOrdinal","value","cekEntry","CEKEntry","ordinal","add","EncryptedKey","DbId","KeyId","KeyVersion","KeyMdVersion","KeyPath","ProviderName","KeyEncryptionAlgorithm","paramName","DescribeParameterEncryptionResultSet2","ParameterName","paramIndex","parameters","findIndex","param","name","cekOrdinal","ColumnEncryptionKeyOrdinal","length","Error","encType","ColumnEncrytionType","SQLServerEncryptionType","PlainText","cryptoMetadata","cipherAlgorithmId","ColumnEncryptionAlgorithm","encryptionType","normalizationRuleVersion","Buffer","from","NormalizationRuleVersion","push","decryptSymmetricKey","config","options","forceEncrypt","sqlTextOrProcedure","Promise","all","then","process","nextTick","addParameter","TYPES","NVarChar","makeParamsParameter","on","makeRequest","TYPE","RPC_REQUEST","RpcRequestPayload","currentTransactionDescriptor","databaseCollation","exports"],"sources":["../../src/always-encrypted/get-parameter-encryption-metadata.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { SQLServerEncryptionType, CryptoMetadata, DescribeParameterEncryptionResultSet1, DescribeParameterEncryptionResultSet2 } from './types';\nimport { CEKEntry } from './cek-entry';\nimport { decryptSymmetricKey } from './key-crypto';\nimport { typeByName as TYPES, Parameter } from '../data-type';\nimport Request from '../request';\nimport Connection from '../connection';\nimport RpcRequestPayload from '../rpcrequest-payload';\nimport { TYPE } from '../packet';\n\nexport const getParameterEncryptionMetadata = (connection: Connection, request: Request, callback: (error?: Error) => void) => {\n if (request.cryptoMetadataLoaded === true) {\n return callback();\n }\n\n const metadataRequest = new Request('sp_describe_parameter_encryption', (error) => {\n if (error) {\n return callback(error);\n }\n\n const decryptSymmetricKeyPromises: Promise<void>[] = [];\n const cekList: CEKEntry[] = [];\n let paramCount = 0;\n\n for (const columns of resultRows) {\n try {\n const isFirstRecordSet = columns.some((col: any) => (col && col.metadata && col.metadata.colName) === 'database_id');\n if (isFirstRecordSet === true) {\n const currentOrdinal = columns[DescribeParameterEncryptionResultSet1.KeyOrdinal].value;\n let cekEntry: CEKEntry;\n if (!cekList[currentOrdinal]) {\n cekEntry = new CEKEntry(currentOrdinal);\n cekList[cekEntry.ordinal] = cekEntry;\n } else {\n cekEntry = cekList[currentOrdinal];\n }\n cekEntry.add(columns[DescribeParameterEncryptionResultSet1.EncryptedKey].value,\n columns[DescribeParameterEncryptionResultSet1.DbId].value,\n columns[DescribeParameterEncryptionResultSet1.KeyId].value,\n columns[DescribeParameterEncryptionResultSet1.KeyVersion].value,\n columns[DescribeParameterEncryptionResultSet1.KeyMdVersion].value,\n columns[DescribeParameterEncryptionResultSet1.KeyPath].value,\n columns[DescribeParameterEncryptionResultSet1.ProviderName].value,\n columns[DescribeParameterEncryptionResultSet1.KeyEncryptionAlgorithm].value);\n } else {\n paramCount++;\n const paramName: string = columns[DescribeParameterEncryptionResultSet2.ParameterName].value;\n const paramIndex: number = request.parameters.findIndex((param: Parameter) => paramName === `@${param.name}`);\n const cekOrdinal: number = columns[DescribeParameterEncryptionResultSet2.ColumnEncryptionKeyOrdinal].value;\n const cekEntry: CEKEntry = cekList[cekOrdinal];\n\n if (cekEntry && cekList.length < cekOrdinal) {\n 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}\".`));\n }\n\n const encType = columns[DescribeParameterEncryptionResultSet2.ColumnEncrytionType].value;\n if (SQLServerEncryptionType.PlainText !== encType) {\n request.parameters[paramIndex].cryptoMetadata = {\n cekEntry: cekEntry,\n ordinal: cekOrdinal,\n cipherAlgorithmId: columns[DescribeParameterEncryptionResultSet2.ColumnEncryptionAlgorithm].value,\n encryptionType: encType,\n normalizationRuleVersion: Buffer.from([columns[DescribeParameterEncryptionResultSet2.NormalizationRuleVersion].value]),\n };\n decryptSymmetricKeyPromises.push(decryptSymmetricKey(request.parameters[paramIndex].cryptoMetadata as CryptoMetadata, connection.config.options));\n } else if (request.parameters[paramIndex].forceEncrypt === true) {\n 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.`));\n }\n }\n } catch {\n return callback(new Error(`Internal error. Unable to parse parameter encryption metadata in statement or procedure \"${request.sqlTextOrProcedure}\"`));\n }\n }\n\n if (paramCount !== request.parameters.length) {\n 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.`));\n }\n\n return Promise.all(decryptSymmetricKeyPromises).then(() => {\n request.cryptoMetadataLoaded = true;\n process.nextTick(callback);\n }, (error) => {\n process.nextTick(callback, error);\n });\n });\n\n metadataRequest.addParameter('tsql', TYPES.NVarChar, request.sqlTextOrProcedure);\n if (request.parameters.length) {\n metadataRequest.addParameter('params', TYPES.NVarChar, metadataRequest.makeParamsParameter(request.parameters));\n }\n\n const resultRows: any[] = [];\n\n metadataRequest.on('row', (columns: any) => {\n resultRows.push(columns);\n });\n\n connection.makeRequest(metadataRequest, TYPE.RPC_REQUEST, new RpcRequestPayload(metadataRequest.sqlTextOrProcedure!, metadataRequest.parameters, connection.currentTransactionDescriptor(), connection.config.options, connection.databaseCollation));\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"get-parameter-encryption-metadata.js","names":["_types","require","_cekEntry","_keyCrypto","_dataType","_request","_interopRequireDefault","_rpcrequestPayload","_packet","obj","__esModule","default","getParameterEncryptionMetadata","connection","request","callback","cryptoMetadataLoaded","metadataRequest","Request","error","decryptSymmetricKeyPromises","cekList","paramCount","columns","resultRows","isFirstRecordSet","some","col","metadata","colName","currentOrdinal","DescribeParameterEncryptionResultSet1","KeyOrdinal","value","cekEntry","CEKEntry","ordinal","add","EncryptedKey","DbId","KeyId","KeyVersion","KeyMdVersion","KeyPath","ProviderName","KeyEncryptionAlgorithm","paramName","DescribeParameterEncryptionResultSet2","ParameterName","paramIndex","parameters","findIndex","param","name","cekOrdinal","ColumnEncryptionKeyOrdinal","length","Error","encType","ColumnEncrytionType","SQLServerEncryptionType","PlainText","cryptoMetadata","cipherAlgorithmId","ColumnEncryptionAlgorithm","encryptionType","normalizationRuleVersion","Buffer","from","NormalizationRuleVersion","push","decryptSymmetricKey","config","options","forceEncrypt","sqlTextOrProcedure","Promise","all","then","process","nextTick","addParameter","TYPES","NVarChar","makeParamsParameter","on","makeRequest","TYPE","RPC_REQUEST","RpcRequestPayload","currentTransactionDescriptor","databaseCollation","exports"],"sources":["../../src/always-encrypted/get-parameter-encryption-metadata.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { SQLServerEncryptionType, type CryptoMetadata, DescribeParameterEncryptionResultSet1, DescribeParameterEncryptionResultSet2 } from './types';\nimport { CEKEntry } from './cek-entry';\nimport { decryptSymmetricKey } from './key-crypto';\nimport { typeByName as TYPES, type Parameter } from '../data-type';\nimport Request from '../request';\nimport Connection from '../connection';\nimport RpcRequestPayload from '../rpcrequest-payload';\nimport { TYPE } from '../packet';\n\nexport const getParameterEncryptionMetadata = (connection: Connection, request: Request, callback: (error?: Error) => void) => {\n if (request.cryptoMetadataLoaded === true) {\n return callback();\n }\n\n const metadataRequest = new Request('sp_describe_parameter_encryption', (error) => {\n if (error) {\n return callback(error);\n }\n\n const decryptSymmetricKeyPromises: Promise<void>[] = [];\n const cekList: CEKEntry[] = [];\n let paramCount = 0;\n\n for (const columns of resultRows) {\n try {\n const isFirstRecordSet = columns.some((col: any) => (col && col.metadata && col.metadata.colName) === 'database_id');\n if (isFirstRecordSet === true) {\n const currentOrdinal = columns[DescribeParameterEncryptionResultSet1.KeyOrdinal].value;\n let cekEntry: CEKEntry;\n if (!cekList[currentOrdinal]) {\n cekEntry = new CEKEntry(currentOrdinal);\n cekList[cekEntry.ordinal] = cekEntry;\n } else {\n cekEntry = cekList[currentOrdinal];\n }\n cekEntry.add(columns[DescribeParameterEncryptionResultSet1.EncryptedKey].value,\n columns[DescribeParameterEncryptionResultSet1.DbId].value,\n columns[DescribeParameterEncryptionResultSet1.KeyId].value,\n columns[DescribeParameterEncryptionResultSet1.KeyVersion].value,\n columns[DescribeParameterEncryptionResultSet1.KeyMdVersion].value,\n columns[DescribeParameterEncryptionResultSet1.KeyPath].value,\n columns[DescribeParameterEncryptionResultSet1.ProviderName].value,\n columns[DescribeParameterEncryptionResultSet1.KeyEncryptionAlgorithm].value);\n } else {\n paramCount++;\n const paramName: string = columns[DescribeParameterEncryptionResultSet2.ParameterName].value;\n const paramIndex: number = request.parameters.findIndex((param: Parameter) => paramName === `@${param.name}`);\n const cekOrdinal: number = columns[DescribeParameterEncryptionResultSet2.ColumnEncryptionKeyOrdinal].value;\n const cekEntry: CEKEntry = cekList[cekOrdinal];\n\n if (cekEntry && cekList.length < cekOrdinal) {\n 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}\".`));\n }\n\n const encType = columns[DescribeParameterEncryptionResultSet2.ColumnEncrytionType].value;\n if (SQLServerEncryptionType.PlainText !== encType) {\n request.parameters[paramIndex].cryptoMetadata = {\n cekEntry: cekEntry,\n ordinal: cekOrdinal,\n cipherAlgorithmId: columns[DescribeParameterEncryptionResultSet2.ColumnEncryptionAlgorithm].value,\n encryptionType: encType,\n normalizationRuleVersion: Buffer.from([columns[DescribeParameterEncryptionResultSet2.NormalizationRuleVersion].value]),\n };\n decryptSymmetricKeyPromises.push(decryptSymmetricKey(request.parameters[paramIndex].cryptoMetadata as CryptoMetadata, connection.config.options));\n } else if (request.parameters[paramIndex].forceEncrypt === true) {\n 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.`));\n }\n }\n } catch {\n return callback(new Error(`Internal error. Unable to parse parameter encryption metadata in statement or procedure \"${request.sqlTextOrProcedure}\"`));\n }\n }\n\n if (paramCount !== request.parameters.length) {\n 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.`));\n }\n\n return Promise.all(decryptSymmetricKeyPromises).then(() => {\n request.cryptoMetadataLoaded = true;\n process.nextTick(callback);\n }, (error) => {\n process.nextTick(callback, error);\n });\n });\n\n metadataRequest.addParameter('tsql', TYPES.NVarChar, request.sqlTextOrProcedure);\n if (request.parameters.length) {\n metadataRequest.addParameter('params', TYPES.NVarChar, metadataRequest.makeParamsParameter(request.parameters));\n }\n\n const resultRows: any[] = [];\n\n metadataRequest.on('row', (columns: any) => {\n resultRows.push(columns);\n });\n\n connection.makeRequest(metadataRequest, TYPE.RPC_REQUEST, new RpcRequestPayload(metadataRequest.sqlTextOrProcedure!, metadataRequest.parameters, connection.currentTransactionDescriptor(), connection.config.options, connection.databaseCollation));\n};\n"],"mappings":"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"}
@@ -91,4 +91,4 @@ const decryptSymmetricKey = async (md, options) => {
91
91
  md.encryptionKeyInfo = encryptionKeyInfoChosen;
92
92
  };
93
93
  exports.decryptSymmetricKey = decryptSymmetricKey;
94
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3ltbWV0cmljS2V5Q2FjaGUiLCJyZXF1aXJlIiwiX2FlYWRBZXMyNTZDYmNIbWFjQWxnb3JpdGhtIiwiX2FlYWRBZXMyNTZDYmNIbWFjRW5jcnlwdGlvbktleSIsInZhbGlkYXRlQW5kR2V0RW5jcnlwdGlvbkFsZ29yaXRobU5hbWUiLCJjaXBoZXJBbGdvcml0aG1JZCIsImNpcGhlckFsZ29yaXRobU5hbWUiLCJFcnJvciIsImFsZ29yaXRobU5hbWUiLCJleHBvcnRzIiwiZW5jcnlwdFdpdGhLZXkiLCJwbGFpbnRleHQiLCJtZCIsIm9wdGlvbnMiLCJ0cnVzdGVkU2VydmVyTmFtZUFFIiwiY2lwaGVyQWxnb3JpdGhtIiwiZGVjcnlwdFN5bW1ldHJpY0tleSIsImNpcGhlclRleHQiLCJlbmNyeXB0RGF0YSIsImRlY3J5cHRXaXRoS2V5IiwicGxhaW5UZXh0IiwiZGVjcnlwdERhdGEiLCJjZWtFbnRyeSIsImNvbHVtbkVuY3J5cHRpb25LZXlWYWx1ZXMiLCJzeW1LZXkiLCJlbmNyeXB0aW9uS2V5SW5mb0Nob3NlbiIsIkNFS1ZhbHVlcyIsImxhc3RFcnJvciIsIkNFS1ZhbHVlIiwiZ2V0S2V5IiwiZXJyb3IiLCJBZWFkQWVzMjU2Q2JjSG1hYzI1NkFsZ29yaXRobSIsIkFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSIsInJvb3RLZXkiLCJlbmNyeXB0aW9uVHlwZSIsImVuY3J5cHRpb25LZXlJbmZvIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fsd2F5cy1lbmNyeXB0ZWQva2V5LWNyeXB0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgQ3J5cHRvTWV0YWRhdGEsIEVuY3J5cHRpb25LZXlJbmZvIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zIGFzIENvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgU3ltbWV0cmljS2V5IGZyb20gJy4vc3ltbWV0cmljLWtleSc7XG5pbXBvcnQgeyBnZXRLZXkgfSBmcm9tICcuL3N5bW1ldHJpYy1rZXktY2FjaGUnO1xuaW1wb3J0IHsgQWVhZEFlczI1NkNiY0htYWMyNTZBbGdvcml0aG0sIGFsZ29yaXRobU5hbWUgfSBmcm9tICcuL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1hbGdvcml0aG0nO1xuaW1wb3J0IHsgQWVhZEFlczI1NkNiY0htYWMyNTZFbmNyeXB0aW9uS2V5IH0gZnJvbSAnLi9hZWFkLWFlcy0yNTYtY2JjLWhtYWMtZW5jcnlwdGlvbi1rZXknO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBbmRHZXRFbmNyeXB0aW9uQWxnb3JpdGhtTmFtZSA9IChjaXBoZXJBbGdvcml0aG1JZDogbnVtYmVyLCBjaXBoZXJBbGdvcml0aG1OYW1lPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKGNpcGhlckFsZ29yaXRobUlkICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDdXN0b20gY2lwaGVyIGFsZ29yaXRobSBub3Qgc3VwcG9ydGVkLicpO1xuICB9XG5cbiAgcmV0dXJuIGFsZ29yaXRobU5hbWU7XG59O1xuXG5leHBvcnQgY29uc3QgZW5jcnlwdFdpdGhLZXkgPSBhc3luYyAocGxhaW50ZXh0OiBCdWZmZXIsIG1kOiBDcnlwdG9NZXRhZGF0YSwgb3B0aW9uczogQ29ubmVjdGlvbk9wdGlvbnMpOiBQcm9taXNlPEJ1ZmZlcj4gPT4ge1xuICBpZiAoIW9wdGlvbnMudHJ1c3RlZFNlcnZlck5hbWVBRSkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2VydmVyIG5hbWUgc2hvdWxkIG5vdCBiZSBudWxsIGluIEVuY3J5cHRXaXRoS2V5Jyk7XG4gIH1cblxuICBpZiAoIW1kLmNpcGhlckFsZ29yaXRobSkge1xuICAgIGF3YWl0IGRlY3J5cHRTeW1tZXRyaWNLZXkobWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKCFtZC5jaXBoZXJBbGdvcml0aG0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NpcGhlciBBbGdvcml0aG0gc2hvdWxkIG5vdCBiZSBudWxsIGluIEVuY3J5cHRXaXRoS2V5Jyk7XG4gIH1cblxuICBjb25zdCBjaXBoZXJUZXh0OiBCdWZmZXIgPSBtZC5jaXBoZXJBbGdvcml0aG0uZW5jcnlwdERhdGEocGxhaW50ZXh0KTtcblxuICBpZiAoIWNpcGhlclRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIGVycm9yLiBDaXBoZXJ0ZXh0IHZhbHVlIGNhbm5vdCBiZSBudWxsLicpO1xuICB9XG5cbiAgcmV0dXJuIGNpcGhlclRleHQ7XG59O1xuXG5leHBvcnQgY29uc3QgZGVjcnlwdFdpdGhLZXkgPSAoY2lwaGVyVGV4dDogQnVmZmVyLCBtZDogQ3J5cHRvTWV0YWRhdGEsIG9wdGlvbnM6IENvbm5lY3Rpb25PcHRpb25zKTogQnVmZmVyID0+IHtcbiAgaWYgKCFvcHRpb25zLnRydXN0ZWRTZXJ2ZXJOYW1lQUUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBuYW1lIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0V2l0aEtleScpO1xuICB9XG5cbiAgLy8gaWYgKCFtZC5jaXBoZXJBbGdvcml0aG0pIHtcbiAgLy8gICBhd2FpdCBkZWNyeXB0U3ltbWV0cmljS2V5KG1kLCBvcHRpb25zKTtcbiAgLy8gfVxuXG4gIGlmICghbWQuY2lwaGVyQWxnb3JpdGhtKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDaXBoZXIgQWxnb3JpdGhtIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0V2l0aEtleScpO1xuICB9XG5cbiAgY29uc3QgcGxhaW5UZXh0OiBCdWZmZXIgPSBtZC5jaXBoZXJBbGdvcml0aG0uZGVjcnlwdERhdGEoY2lwaGVyVGV4dCk7XG5cbiAgaWYgKCFwbGFpblRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIGVycm9yLiBQbGFpbnRleHQgdmFsdWUgY2Fubm90IGJlIG51bGwuJyk7XG4gIH1cblxuICByZXR1cm4gcGxhaW5UZXh0O1xufTtcblxuZXhwb3J0IGNvbnN0IGRlY3J5cHRTeW1tZXRyaWNLZXkgPSBhc3luYyAobWQ6IENyeXB0b01ldGFkYXRhLCBvcHRpb25zOiBDb25uZWN0aW9uT3B0aW9ucyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZiAoIW1kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtZCBzaG91bGQgbm90IGJlIG51bGwgaW4gRGVjcnlwdFN5bW1ldHJpY0tleS4nKTtcbiAgfVxuXG4gIGlmICghbWQuY2VrRW50cnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21kLkVuY3J5cHRpb25JbmZvIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0U3ltbWV0cmljS2V5LicpO1xuICB9XG5cbiAgaWYgKCFtZC5jZWtFbnRyeS5jb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtZC5FbmNyeXB0aW9uSW5mby5Db2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0U3ltbWV0cmljS2V5LicpO1xuICB9XG5cbiAgbGV0IHN5bUtleTogU3ltbWV0cmljS2V5IHwgdW5kZWZpbmVkO1xuICBsZXQgZW5jcnlwdGlvbktleUluZm9DaG9zZW46IEVuY3J5cHRpb25LZXlJbmZvIHwgdW5kZWZpbmVkO1xuICBjb25zdCBDRUtWYWx1ZXM6IEVuY3J5cHRpb25LZXlJbmZvW10gPSBtZC5jZWtFbnRyeS5jb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzO1xuICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IENFS1ZhbHVlIG9mIENFS1ZhbHVlcykge1xuICAgIHRyeSB7XG4gICAgICBzeW1LZXkgPSBhd2FpdCBnZXRLZXkoQ0VLVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgaWYgKHN5bUtleSkge1xuICAgICAgICBlbmNyeXB0aW9uS2V5SW5mb0Nob3NlbiA9IENFS1ZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBpZiAoIXN5bUtleSkge1xuICAgIGlmIChsYXN0RXJyb3IpIHtcbiAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeGNlcHRpb24gd2hpbGUgZGVjcnlwdGlvbiBvZiBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5LicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFsZ29yaXRobU5hbWUgPSB2YWxpZGF0ZUFuZEdldEVuY3J5cHRpb25BbGdvcml0aG1OYW1lKG1kLmNpcGhlckFsZ29yaXRobUlkLCBtZC5jaXBoZXJBbGdvcml0aG1OYW1lKTtcbiAgY29uc3QgY2lwaGVyQWxnb3JpdGhtID0gbmV3IEFlYWRBZXMyNTZDYmNIbWFjMjU2QWxnb3JpdGhtKG5ldyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXkoc3ltS2V5LnJvb3RLZXksIGFsZ29yaXRobU5hbWUpLCBtZC5lbmNyeXB0aW9uVHlwZSk7XG5cbiAgbWQuY2lwaGVyQWxnb3JpdGhtID0gY2lwaGVyQWxnb3JpdGhtO1xuICBtZC5lbmNyeXB0aW9uS2V5SW5mbyA9IGVuY3J5cHRpb25LZXlJbmZvQ2hvc2VuIGFzIEVuY3J5cHRpb25LZXlJbmZvO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBTUEsSUFBQUEsa0JBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLDJCQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSwrQkFBQSxHQUFBRixPQUFBO0FBUkE7QUFD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
94
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3ltbWV0cmljS2V5Q2FjaGUiLCJyZXF1aXJlIiwiX2FlYWRBZXMyNTZDYmNIbWFjQWxnb3JpdGhtIiwiX2FlYWRBZXMyNTZDYmNIbWFjRW5jcnlwdGlvbktleSIsInZhbGlkYXRlQW5kR2V0RW5jcnlwdGlvbkFsZ29yaXRobU5hbWUiLCJjaXBoZXJBbGdvcml0aG1JZCIsImNpcGhlckFsZ29yaXRobU5hbWUiLCJFcnJvciIsImFsZ29yaXRobU5hbWUiLCJleHBvcnRzIiwiZW5jcnlwdFdpdGhLZXkiLCJwbGFpbnRleHQiLCJtZCIsIm9wdGlvbnMiLCJ0cnVzdGVkU2VydmVyTmFtZUFFIiwiY2lwaGVyQWxnb3JpdGhtIiwiZGVjcnlwdFN5bW1ldHJpY0tleSIsImNpcGhlclRleHQiLCJlbmNyeXB0RGF0YSIsImRlY3J5cHRXaXRoS2V5IiwicGxhaW5UZXh0IiwiZGVjcnlwdERhdGEiLCJjZWtFbnRyeSIsImNvbHVtbkVuY3J5cHRpb25LZXlWYWx1ZXMiLCJzeW1LZXkiLCJlbmNyeXB0aW9uS2V5SW5mb0Nob3NlbiIsIkNFS1ZhbHVlcyIsImxhc3RFcnJvciIsIkNFS1ZhbHVlIiwiZ2V0S2V5IiwiZXJyb3IiLCJBZWFkQWVzMjU2Q2JjSG1hYzI1NkFsZ29yaXRobSIsIkFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSIsInJvb3RLZXkiLCJlbmNyeXB0aW9uVHlwZSIsImVuY3J5cHRpb25LZXlJbmZvIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fsd2F5cy1lbmNyeXB0ZWQva2V5LWNyeXB0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgdHlwZSBDcnlwdG9NZXRhZGF0YSwgdHlwZSBFbmNyeXB0aW9uS2V5SW5mbyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgdHlwZSBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zIGFzIENvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgU3ltbWV0cmljS2V5IGZyb20gJy4vc3ltbWV0cmljLWtleSc7XG5pbXBvcnQgeyBnZXRLZXkgfSBmcm9tICcuL3N5bW1ldHJpYy1rZXktY2FjaGUnO1xuaW1wb3J0IHsgQWVhZEFlczI1NkNiY0htYWMyNTZBbGdvcml0aG0sIGFsZ29yaXRobU5hbWUgfSBmcm9tICcuL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1hbGdvcml0aG0nO1xuaW1wb3J0IHsgQWVhZEFlczI1NkNiY0htYWMyNTZFbmNyeXB0aW9uS2V5IH0gZnJvbSAnLi9hZWFkLWFlcy0yNTYtY2JjLWhtYWMtZW5jcnlwdGlvbi1rZXknO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBbmRHZXRFbmNyeXB0aW9uQWxnb3JpdGhtTmFtZSA9IChjaXBoZXJBbGdvcml0aG1JZDogbnVtYmVyLCBjaXBoZXJBbGdvcml0aG1OYW1lPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKGNpcGhlckFsZ29yaXRobUlkICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDdXN0b20gY2lwaGVyIGFsZ29yaXRobSBub3Qgc3VwcG9ydGVkLicpO1xuICB9XG5cbiAgcmV0dXJuIGFsZ29yaXRobU5hbWU7XG59O1xuXG5leHBvcnQgY29uc3QgZW5jcnlwdFdpdGhLZXkgPSBhc3luYyAocGxhaW50ZXh0OiBCdWZmZXIsIG1kOiBDcnlwdG9NZXRhZGF0YSwgb3B0aW9uczogQ29ubmVjdGlvbk9wdGlvbnMpOiBQcm9taXNlPEJ1ZmZlcj4gPT4ge1xuICBpZiAoIW9wdGlvbnMudHJ1c3RlZFNlcnZlck5hbWVBRSkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2VydmVyIG5hbWUgc2hvdWxkIG5vdCBiZSBudWxsIGluIEVuY3J5cHRXaXRoS2V5Jyk7XG4gIH1cblxuICBpZiAoIW1kLmNpcGhlckFsZ29yaXRobSkge1xuICAgIGF3YWl0IGRlY3J5cHRTeW1tZXRyaWNLZXkobWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKCFtZC5jaXBoZXJBbGdvcml0aG0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NpcGhlciBBbGdvcml0aG0gc2hvdWxkIG5vdCBiZSBudWxsIGluIEVuY3J5cHRXaXRoS2V5Jyk7XG4gIH1cblxuICBjb25zdCBjaXBoZXJUZXh0OiBCdWZmZXIgPSBtZC5jaXBoZXJBbGdvcml0aG0uZW5jcnlwdERhdGEocGxhaW50ZXh0KTtcblxuICBpZiAoIWNpcGhlclRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIGVycm9yLiBDaXBoZXJ0ZXh0IHZhbHVlIGNhbm5vdCBiZSBudWxsLicpO1xuICB9XG5cbiAgcmV0dXJuIGNpcGhlclRleHQ7XG59O1xuXG5leHBvcnQgY29uc3QgZGVjcnlwdFdpdGhLZXkgPSAoY2lwaGVyVGV4dDogQnVmZmVyLCBtZDogQ3J5cHRvTWV0YWRhdGEsIG9wdGlvbnM6IENvbm5lY3Rpb25PcHRpb25zKTogQnVmZmVyID0+IHtcbiAgaWYgKCFvcHRpb25zLnRydXN0ZWRTZXJ2ZXJOYW1lQUUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBuYW1lIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0V2l0aEtleScpO1xuICB9XG5cbiAgLy8gaWYgKCFtZC5jaXBoZXJBbGdvcml0aG0pIHtcbiAgLy8gICBhd2FpdCBkZWNyeXB0U3ltbWV0cmljS2V5KG1kLCBvcHRpb25zKTtcbiAgLy8gfVxuXG4gIGlmICghbWQuY2lwaGVyQWxnb3JpdGhtKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDaXBoZXIgQWxnb3JpdGhtIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0V2l0aEtleScpO1xuICB9XG5cbiAgY29uc3QgcGxhaW5UZXh0OiBCdWZmZXIgPSBtZC5jaXBoZXJBbGdvcml0aG0uZGVjcnlwdERhdGEoY2lwaGVyVGV4dCk7XG5cbiAgaWYgKCFwbGFpblRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIGVycm9yLiBQbGFpbnRleHQgdmFsdWUgY2Fubm90IGJlIG51bGwuJyk7XG4gIH1cblxuICByZXR1cm4gcGxhaW5UZXh0O1xufTtcblxuZXhwb3J0IGNvbnN0IGRlY3J5cHRTeW1tZXRyaWNLZXkgPSBhc3luYyAobWQ6IENyeXB0b01ldGFkYXRhLCBvcHRpb25zOiBDb25uZWN0aW9uT3B0aW9ucyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZiAoIW1kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtZCBzaG91bGQgbm90IGJlIG51bGwgaW4gRGVjcnlwdFN5bW1ldHJpY0tleS4nKTtcbiAgfVxuXG4gIGlmICghbWQuY2VrRW50cnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21kLkVuY3J5cHRpb25JbmZvIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0U3ltbWV0cmljS2V5LicpO1xuICB9XG5cbiAgaWYgKCFtZC5jZWtFbnRyeS5jb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtZC5FbmNyeXB0aW9uSW5mby5Db2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0U3ltbWV0cmljS2V5LicpO1xuICB9XG5cbiAgbGV0IHN5bUtleTogU3ltbWV0cmljS2V5IHwgdW5kZWZpbmVkO1xuICBsZXQgZW5jcnlwdGlvbktleUluZm9DaG9zZW46IEVuY3J5cHRpb25LZXlJbmZvIHwgdW5kZWZpbmVkO1xuICBjb25zdCBDRUtWYWx1ZXM6IEVuY3J5cHRpb25LZXlJbmZvW10gPSBtZC5jZWtFbnRyeS5jb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzO1xuICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IENFS1ZhbHVlIG9mIENFS1ZhbHVlcykge1xuICAgIHRyeSB7XG4gICAgICBzeW1LZXkgPSBhd2FpdCBnZXRLZXkoQ0VLVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgaWYgKHN5bUtleSkge1xuICAgICAgICBlbmNyeXB0aW9uS2V5SW5mb0Nob3NlbiA9IENFS1ZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBpZiAoIXN5bUtleSkge1xuICAgIGlmIChsYXN0RXJyb3IpIHtcbiAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeGNlcHRpb24gd2hpbGUgZGVjcnlwdGlvbiBvZiBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5LicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFsZ29yaXRobU5hbWUgPSB2YWxpZGF0ZUFuZEdldEVuY3J5cHRpb25BbGdvcml0aG1OYW1lKG1kLmNpcGhlckFsZ29yaXRobUlkLCBtZC5jaXBoZXJBbGdvcml0aG1OYW1lKTtcbiAgY29uc3QgY2lwaGVyQWxnb3JpdGhtID0gbmV3IEFlYWRBZXMyNTZDYmNIbWFjMjU2QWxnb3JpdGhtKG5ldyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXkoc3ltS2V5LnJvb3RLZXksIGFsZ29yaXRobU5hbWUpLCBtZC5lbmNyeXB0aW9uVHlwZSk7XG5cbiAgbWQuY2lwaGVyQWxnb3JpdGhtID0gY2lwaGVyQWxnb3JpdGhtO1xuICBtZC5lbmNyeXB0aW9uS2V5SW5mbyA9IGVuY3J5cHRpb25LZXlJbmZvQ2hvc2VuIGFzIEVuY3J5cHRpb25LZXlJbmZvO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBTUEsSUFBQUEsa0JBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLDJCQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSwrQkFBQSxHQUFB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