tedious 16.2.0 → 16.3.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 (205) hide show
  1. package/lib/all-headers.js +1 -2
  2. package/lib/all-headers.js.map +1 -0
  3. package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js +9 -31
  4. package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js.map +1 -0
  5. package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js +9 -24
  6. package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js.map +1 -0
  7. package/lib/always-encrypted/cek-entry.js +8 -12
  8. package/lib/always-encrypted/cek-entry.js.map +1 -0
  9. package/lib/always-encrypted/get-parameter-encryption-metadata.js +2 -24
  10. package/lib/always-encrypted/get-parameter-encryption-metadata.js.map +1 -0
  11. package/lib/always-encrypted/key-crypto.js +5 -30
  12. package/lib/always-encrypted/key-crypto.js.map +1 -0
  13. package/lib/always-encrypted/keystore-provider-azure-key-vault.js +11 -72
  14. package/lib/always-encrypted/keystore-provider-azure-key-vault.js.map +1 -0
  15. package/lib/always-encrypted/symmetric-key-cache.js +2 -13
  16. package/lib/always-encrypted/symmetric-key-cache.js.map +1 -0
  17. package/lib/always-encrypted/symmetric-key.js +3 -8
  18. package/lib/always-encrypted/symmetric-key.js.map +1 -0
  19. package/lib/always-encrypted/types.js +19 -27
  20. package/lib/always-encrypted/types.js.map +1 -0
  21. package/lib/always-encrypted/utils.js +2 -6
  22. package/lib/always-encrypted/utils.js.map +1 -0
  23. package/lib/bulk-load-payload.js +7 -15
  24. package/lib/bulk-load-payload.js.map +1 -0
  25. package/lib/bulk-load.js +58 -131
  26. package/lib/bulk-load.js.map +1 -0
  27. package/lib/collation.js +7 -15
  28. package/lib/collation.js.map +1 -0
  29. package/lib/connection.js +290 -531
  30. package/lib/connection.js.map +1 -0
  31. package/lib/connector.js +6 -37
  32. package/lib/connector.js.map +1 -0
  33. package/lib/data-type.js +2 -43
  34. package/lib/data-type.js.map +1 -0
  35. package/lib/data-types/bigint.js +1 -15
  36. package/lib/data-types/bigint.js.map +1 -0
  37. package/lib/data-types/binary.js +1 -12
  38. package/lib/data-types/binary.js.map +1 -0
  39. package/lib/data-types/bit.js +1 -11
  40. package/lib/data-types/bit.js.map +1 -0
  41. package/lib/data-types/bitn.js +1 -7
  42. package/lib/data-types/bitn.js.map +1 -0
  43. package/lib/data-types/char.js +1 -20
  44. package/lib/data-types/char.js.map +1 -0
  45. package/lib/data-types/date.js +1 -15
  46. package/lib/data-types/date.js.map +1 -0
  47. package/lib/data-types/datetime.js +3 -20
  48. package/lib/data-types/datetime.js.map +1 -0
  49. package/lib/data-types/datetime2.js +1 -26
  50. package/lib/data-types/datetime2.js.map +1 -0
  51. package/lib/data-types/datetimen.js +1 -7
  52. package/lib/data-types/datetimen.js.map +1 -0
  53. package/lib/data-types/datetimeoffset.js +1 -23
  54. package/lib/data-types/datetimeoffset.js.map +1 -0
  55. package/lib/data-types/decimal.js +1 -18
  56. package/lib/data-types/decimal.js.map +1 -0
  57. package/lib/data-types/decimaln.js +1 -7
  58. package/lib/data-types/decimaln.js.map +1 -0
  59. package/lib/data-types/float.js +1 -13
  60. package/lib/data-types/float.js.map +1 -0
  61. package/lib/data-types/floatn.js +1 -7
  62. package/lib/data-types/floatn.js.map +1 -0
  63. package/lib/data-types/image.js +1 -10
  64. package/lib/data-types/image.js.map +1 -0
  65. package/lib/data-types/int.js +1 -14
  66. package/lib/data-types/int.js.map +1 -0
  67. package/lib/data-types/intn.js +1 -7
  68. package/lib/data-types/intn.js.map +1 -0
  69. package/lib/data-types/money.js +1 -12
  70. package/lib/data-types/money.js.map +1 -0
  71. package/lib/data-types/moneyn.js +1 -7
  72. package/lib/data-types/moneyn.js.map +1 -0
  73. package/lib/data-types/nchar.js +1 -14
  74. package/lib/data-types/nchar.js.map +1 -0
  75. package/lib/data-types/ntext.js +1 -10
  76. package/lib/data-types/ntext.js.map +1 -0
  77. package/lib/data-types/null.js +1 -7
  78. package/lib/data-types/null.js.map +1 -0
  79. package/lib/data-types/numeric.js +1 -18
  80. package/lib/data-types/numeric.js.map +1 -0
  81. package/lib/data-types/numericn.js +1 -7
  82. package/lib/data-types/numericn.js.map +1 -0
  83. package/lib/data-types/nvarchar.js +1 -22
  84. package/lib/data-types/nvarchar.js.map +1 -0
  85. package/lib/data-types/real.js +1 -13
  86. package/lib/data-types/real.js.map +1 -0
  87. package/lib/data-types/smalldatetime.js +1 -14
  88. package/lib/data-types/smalldatetime.js.map +1 -0
  89. package/lib/data-types/smallint.js +1 -14
  90. package/lib/data-types/smallint.js.map +1 -0
  91. package/lib/data-types/smallmoney.js +1 -13
  92. package/lib/data-types/smallmoney.js.map +1 -0
  93. package/lib/data-types/sql-variant.js +1 -6
  94. package/lib/data-types/sql-variant.js.map +1 -0
  95. package/lib/data-types/text.js +1 -18
  96. package/lib/data-types/text.js.map +1 -0
  97. package/lib/data-types/time.js +1 -22
  98. package/lib/data-types/time.js.map +1 -0
  99. package/lib/data-types/tinyint.js +1 -14
  100. package/lib/data-types/tinyint.js.map +1 -0
  101. package/lib/data-types/tvp.js +11 -27
  102. package/lib/data-types/tvp.js.map +1 -0
  103. package/lib/data-types/udt.js +1 -7
  104. package/lib/data-types/udt.js.map +1 -0
  105. package/lib/data-types/uniqueidentifier.js +1 -11
  106. package/lib/data-types/uniqueidentifier.js.map +1 -0
  107. package/lib/data-types/varbinary.js +1 -22
  108. package/lib/data-types/varbinary.js.map +1 -0
  109. package/lib/data-types/varchar.js +1 -23
  110. package/lib/data-types/varchar.js.map +1 -0
  111. package/lib/data-types/xml.js +1 -7
  112. package/lib/data-types/xml.js.map +1 -0
  113. package/lib/debug.js +4 -16
  114. package/lib/debug.js.map +1 -0
  115. package/lib/errors/abort-error.js +2 -5
  116. package/lib/errors/abort-error.js.map +1 -0
  117. package/lib/errors/timeout-error.js +2 -5
  118. package/lib/errors/timeout-error.js.map +1 -0
  119. package/lib/errors.js +10 -16
  120. package/lib/errors.js.map +1 -0
  121. package/lib/guid-parser.js +1 -7
  122. package/lib/guid-parser.js.map +1 -0
  123. package/lib/incoming-message-stream.js +9 -29
  124. package/lib/incoming-message-stream.js.map +1 -0
  125. package/lib/instance-lookup.js +3 -34
  126. package/lib/instance-lookup.js.map +1 -0
  127. package/lib/library.js +1 -1
  128. package/lib/library.js.map +1 -0
  129. package/lib/login7-payload.js +99 -100
  130. package/lib/login7-payload.js.map +1 -0
  131. package/lib/message-io.js +17 -45
  132. package/lib/message-io.js.map +1 -0
  133. package/lib/message.js +4 -8
  134. package/lib/message.js.map +1 -0
  135. package/lib/metadata-parser.js +1 -22
  136. package/lib/metadata-parser.js.map +1 -0
  137. package/lib/ntlm-payload.js +2 -22
  138. package/lib/ntlm-payload.js.map +1 -0
  139. package/lib/ntlm.js +1 -4
  140. package/lib/ntlm.js.map +1 -0
  141. package/lib/outgoing-message-stream.js +12 -21
  142. package/lib/outgoing-message-stream.js.map +1 -0
  143. package/lib/packet.js +2 -47
  144. package/lib/packet.js.map +1 -0
  145. package/lib/prelogin-payload.js +11 -54
  146. package/lib/prelogin-payload.js.map +1 -0
  147. package/lib/request.js +88 -66
  148. package/lib/request.js.map +1 -0
  149. package/lib/rpcrequest-payload.js +8 -35
  150. package/lib/rpcrequest-payload.js.map +1 -0
  151. package/lib/sender.js +1 -24
  152. package/lib/sender.js.map +1 -0
  153. package/lib/special-stored-procedure.js +1 -1
  154. package/lib/special-stored-procedure.js.map +1 -0
  155. package/lib/sqlbatch-payload.js +5 -18
  156. package/lib/sqlbatch-payload.js.map +1 -0
  157. package/lib/tds-versions.js +3 -3
  158. package/lib/tds-versions.js.map +1 -0
  159. package/lib/tedious.js +1 -12
  160. package/lib/tedious.js.map +1 -0
  161. package/lib/token/colmetadata-token-parser.js +1 -17
  162. package/lib/token/colmetadata-token-parser.js.map +1 -0
  163. package/lib/token/done-token-parser.js +2 -8
  164. package/lib/token/done-token-parser.js.map +1 -0
  165. package/lib/token/env-change-token-parser.js +7 -28
  166. package/lib/token/env-change-token-parser.js.map +1 -0
  167. package/lib/token/feature-ext-ack-parser.js +1 -10
  168. package/lib/token/feature-ext-ack-parser.js.map +1 -0
  169. package/lib/token/fedauth-info-parser.js +2 -10
  170. package/lib/token/fedauth-info-parser.js.map +1 -0
  171. package/lib/token/handler.js +39 -149
  172. package/lib/token/handler.js.map +1 -0
  173. package/lib/token/infoerror-token-parser.js +1 -5
  174. package/lib/token/infoerror-token-parser.js.map +1 -0
  175. package/lib/token/loginack-token-parser.js +1 -6
  176. package/lib/token/loginack-token-parser.js.map +1 -0
  177. package/lib/token/nbcrow-token-parser.js +2 -15
  178. package/lib/token/nbcrow-token-parser.js.map +1 -0
  179. package/lib/token/order-token-parser.js +2 -7
  180. package/lib/token/order-token-parser.js.map +1 -0
  181. package/lib/token/returnstatus-token-parser.js +2 -4
  182. package/lib/token/returnstatus-token-parser.js.map +1 -0
  183. package/lib/token/returnvalue-token-parser.js +4 -9
  184. package/lib/token/returnvalue-token-parser.js.map +1 -0
  185. package/lib/token/row-token-parser.js +2 -11
  186. package/lib/token/row-token-parser.js.map +1 -0
  187. package/lib/token/sspi-token-parser.js +1 -5
  188. package/lib/token/sspi-token-parser.js.map +1 -0
  189. package/lib/token/stream-parser.js +24 -86
  190. package/lib/token/stream-parser.js.map +1 -0
  191. package/lib/token/token-stream-parser.js +4 -13
  192. package/lib/token/token-stream-parser.js.map +1 -0
  193. package/lib/token/token.js +88 -168
  194. package/lib/token/token.js.map +1 -0
  195. package/lib/tracking-buffer/writable-tracking-buffer.js +20 -60
  196. package/lib/tracking-buffer/writable-tracking-buffer.js.map +1 -0
  197. package/lib/transaction.js +9 -33
  198. package/lib/transaction.js.map +1 -0
  199. package/lib/transient-error-lookup.js +1 -4
  200. package/lib/transient-error-lookup.js.map +1 -0
  201. package/lib/utils/with-timeout.js +1 -9
  202. package/lib/utils/with-timeout.js.map +1 -0
  203. package/lib/value-parser.js +1 -143
  204. package/lib/value-parser.js.map +1 -0
  205. package/package.json +27 -71
@@ -11,7 +11,6 @@ const TYPE = {
11
11
  };
12
12
  const TXNDESCRIPTOR_HEADER_DATA_LEN = 4 + 8;
13
13
  const TXNDESCRIPTOR_HEADER_LEN = 4 + 2 + TXNDESCRIPTOR_HEADER_DATA_LEN;
14
-
15
14
  function writeToTrackingBuffer(buffer, txnDescriptor, outstandingRequestCount) {
16
15
  buffer.writeUInt32LE(0);
17
16
  buffer.writeUInt32LE(TXNDESCRIPTOR_HEADER_LEN);
@@ -22,4 +21,4 @@ function writeToTrackingBuffer(buffer, txnDescriptor, outstandingRequestCount) {
22
21
  data.writeUInt32LE(data.length, 0);
23
22
  return buffer;
24
23
  }
25
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUWVBFIiwiUVVFUllfTk9USUZJQ0FUSU9OUyIsIlRYTl9ERVNDUklQVE9SIiwiVFJBQ0VfQUNUSVZJVFkiLCJUWE5ERVNDUklQVE9SX0hFQURFUl9EQVRBX0xFTiIsIlRYTkRFU0NSSVBUT1JfSEVBREVSX0xFTiIsIndyaXRlVG9UcmFja2luZ0J1ZmZlciIsImJ1ZmZlciIsInR4bkRlc2NyaXB0b3IiLCJvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVCdWZmZXIiLCJkYXRhIiwibGVuZ3RoIl0sInNvdXJjZXMiOlsiLi4vc3JjL2FsbC1oZWFkZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBXcml0YWJsZVRyYWNraW5nQnVmZmVyIGZyb20gJy4vdHJhY2tpbmctYnVmZmVyL3dyaXRhYmxlLXRyYWNraW5nLWJ1ZmZlcic7XG5cbmNvbnN0IFRZUEUgPSB7XG4gIFFVRVJZX05PVElGSUNBVElPTlM6IDEsXG4gIFRYTl9ERVNDUklQVE9SOiAyLFxuICBUUkFDRV9BQ1RJVklUWTogM1xufTtcblxuY29uc3QgVFhOREVTQ1JJUFRPUl9IRUFERVJfREFUQV9MRU4gPSA0ICsgODtcblxuY29uc3QgVFhOREVTQ1JJUFRPUl9IRUFERVJfTEVOID0gNCArIDIgKyBUWE5ERVNDUklQVE9SX0hFQURFUl9EQVRBX0xFTjtcblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlVG9UcmFja2luZ0J1ZmZlcihidWZmZXI6IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIsIHR4bkRlc2NyaXB0b3I6IEJ1ZmZlciwgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQ6IG51bWJlcikge1xuICBidWZmZXIud3JpdGVVSW50MzJMRSgwKTtcbiAgYnVmZmVyLndyaXRlVUludDMyTEUoVFhOREVTQ1JJUFRPUl9IRUFERVJfTEVOKTtcbiAgYnVmZmVyLndyaXRlVUludDE2TEUoVFlQRS5UWE5fREVTQ1JJUFRPUik7XG4gIGJ1ZmZlci53cml0ZUJ1ZmZlcih0eG5EZXNjcmlwdG9yKTtcbiAgYnVmZmVyLndyaXRlVUludDMyTEUob3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQpO1xuXG4gIGNvbnN0IGRhdGEgPSBidWZmZXIuZGF0YTtcbiAgZGF0YS53cml0ZVVJbnQzMkxFKGRhdGEubGVuZ3RoLCAwKTtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsTUFBTUEsSUFBSSxHQUFHO0VBQ1hDLG1CQUFtQixFQUFFLENBRFY7RUFFWEMsY0FBYyxFQUFFLENBRkw7RUFHWEMsY0FBYyxFQUFFO0FBSEwsQ0FBYjtBQU1BLE1BQU1DLDZCQUE2QixHQUFHLElBQUksQ0FBMUM7QUFFQSxNQUFNQyx3QkFBd0IsR0FBRyxJQUFJLENBQUosR0FBUUQsNkJBQXpDOztBQUVPLFNBQVNFLHFCQUFULENBQStCQyxNQUEvQixFQUErREMsYUFBL0QsRUFBc0ZDLHVCQUF0RixFQUF1SDtFQUM1SEYsTUFBTSxDQUFDRyxhQUFQLENBQXFCLENBQXJCO0VBQ0FILE1BQU0sQ0FBQ0csYUFBUCxDQUFxQkwsd0JBQXJCO0VBQ0FFLE1BQU0sQ0FBQ0ksYUFBUCxDQUFxQlgsSUFBSSxDQUFDRSxjQUExQjtFQUNBSyxNQUFNLENBQUNLLFdBQVAsQ0FBbUJKLGFBQW5CO0VBQ0FELE1BQU0sQ0FBQ0csYUFBUCxDQUFxQkQsdUJBQXJCO0VBRUEsTUFBTUksSUFBSSxHQUFHTixNQUFNLENBQUNNLElBQXBCO0VBQ0FBLElBQUksQ0FBQ0gsYUFBTCxDQUFtQkcsSUFBSSxDQUFDQyxNQUF4QixFQUFnQyxDQUFoQztFQUNBLE9BQU9QLE1BQVA7QUFDRCJ9
24
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUWVBFIiwiUVVFUllfTk9USUZJQ0FUSU9OUyIsIlRYTl9ERVNDUklQVE9SIiwiVFJBQ0VfQUNUSVZJVFkiLCJUWE5ERVNDUklQVE9SX0hFQURFUl9EQVRBX0xFTiIsIlRYTkRFU0NSSVBUT1JfSEVBREVSX0xFTiIsIndyaXRlVG9UcmFja2luZ0J1ZmZlciIsImJ1ZmZlciIsInR4bkRlc2NyaXB0b3IiLCJvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVCdWZmZXIiLCJkYXRhIiwibGVuZ3RoIl0sInNvdXJjZXMiOlsiLi4vc3JjL2FsbC1oZWFkZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBXcml0YWJsZVRyYWNraW5nQnVmZmVyIGZyb20gJy4vdHJhY2tpbmctYnVmZmVyL3dyaXRhYmxlLXRyYWNraW5nLWJ1ZmZlcic7XG5cbmNvbnN0IFRZUEUgPSB7XG4gIFFVRVJZX05PVElGSUNBVElPTlM6IDEsXG4gIFRYTl9ERVNDUklQVE9SOiAyLFxuICBUUkFDRV9BQ1RJVklUWTogM1xufTtcblxuY29uc3QgVFhOREVTQ1JJUFRPUl9IRUFERVJfREFUQV9MRU4gPSA0ICsgODtcblxuY29uc3QgVFhOREVTQ1JJUFRPUl9IRUFERVJfTEVOID0gNCArIDIgKyBUWE5ERVNDUklQVE9SX0hFQURFUl9EQVRBX0xFTjtcblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlVG9UcmFja2luZ0J1ZmZlcihidWZmZXI6IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIsIHR4bkRlc2NyaXB0b3I6IEJ1ZmZlciwgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQ6IG51bWJlcikge1xuICBidWZmZXIud3JpdGVVSW50MzJMRSgwKTtcbiAgYnVmZmVyLndyaXRlVUludDMyTEUoVFhOREVTQ1JJUFRPUl9IRUFERVJfTEVOKTtcbiAgYnVmZmVyLndyaXRlVUludDE2TEUoVFlQRS5UWE5fREVTQ1JJUFRPUik7XG4gIGJ1ZmZlci53cml0ZUJ1ZmZlcih0eG5EZXNjcmlwdG9yKTtcbiAgYnVmZmVyLndyaXRlVUludDMyTEUob3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQpO1xuXG4gIGNvbnN0IGRhdGEgPSBidWZmZXIuZGF0YTtcbiAgZGF0YS53cml0ZVVJbnQzMkxFKGRhdGEubGVuZ3RoLCAwKTtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsTUFBTUEsSUFBSSxHQUFHO0VBQ1hDLG1CQUFtQixFQUFFLENBQUM7RUFDdEJDLGNBQWMsRUFBRSxDQUFDO0VBQ2pCQyxjQUFjLEVBQUU7QUFDbEIsQ0FBQztBQUVELE1BQU1DLDZCQUE2QixHQUFHLENBQUMsR0FBRyxDQUFDO0FBRTNDLE1BQU1DLHdCQUF3QixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUdELDZCQUE2QjtBQUUvRCxTQUFTRSxxQkFBcUJBLENBQUNDLE1BQThCLEVBQUVDLGFBQXFCLEVBQUVDLHVCQUErQixFQUFFO0VBQzVIRixNQUFNLENBQUNHLGFBQWEsQ0FBQyxDQUFDLENBQUM7RUFDdkJILE1BQU0sQ0FBQ0csYUFBYSxDQUFDTCx3QkFBd0IsQ0FBQztFQUM5Q0UsTUFBTSxDQUFDSSxhQUFhLENBQUNYLElBQUksQ0FBQ0UsY0FBYyxDQUFDO0VBQ3pDSyxNQUFNLENBQUNLLFdBQVcsQ0FBQ0osYUFBYSxDQUFDO0VBQ2pDRCxNQUFNLENBQUNHLGFBQWEsQ0FBQ0QsdUJBQXVCLENBQUM7RUFFN0MsTUFBTUksSUFBSSxHQUFHTixNQUFNLENBQUNNLElBQUk7RUFDeEJBLElBQUksQ0FBQ0gsYUFBYSxDQUFDRyxJQUFJLENBQUNDLE1BQU0sRUFBRSxDQUFDLENBQUM7RUFDbEMsT0FBT1AsTUFBTTtBQUNmIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"all-headers.js","names":["TYPE","QUERY_NOTIFICATIONS","TXN_DESCRIPTOR","TRACE_ACTIVITY","TXNDESCRIPTOR_HEADER_DATA_LEN","TXNDESCRIPTOR_HEADER_LEN","writeToTrackingBuffer","buffer","txnDescriptor","outstandingRequestCount","writeUInt32LE","writeUInt16LE","writeBuffer","data","length"],"sources":["../src/all-headers.ts"],"sourcesContent":["import WritableTrackingBuffer from './tracking-buffer/writable-tracking-buffer';\n\nconst TYPE = {\n QUERY_NOTIFICATIONS: 1,\n TXN_DESCRIPTOR: 2,\n TRACE_ACTIVITY: 3\n};\n\nconst TXNDESCRIPTOR_HEADER_DATA_LEN = 4 + 8;\n\nconst TXNDESCRIPTOR_HEADER_LEN = 4 + 2 + TXNDESCRIPTOR_HEADER_DATA_LEN;\n\nexport function writeToTrackingBuffer(buffer: WritableTrackingBuffer, txnDescriptor: Buffer, outstandingRequestCount: number) {\n buffer.writeUInt32LE(0);\n buffer.writeUInt32LE(TXNDESCRIPTOR_HEADER_LEN);\n buffer.writeUInt16LE(TYPE.TXN_DESCRIPTOR);\n buffer.writeBuffer(txnDescriptor);\n buffer.writeUInt32LE(outstandingRequestCount);\n\n const data = buffer.data;\n data.writeUInt32LE(data.length, 0);\n return buffer;\n}\n"],"mappings":";;;;;;AAEA,MAAMA,IAAI,GAAG;EACXC,mBAAmB,EAAE,CAAC;EACtBC,cAAc,EAAE,CAAC;EACjBC,cAAc,EAAE;AAClB,CAAC;AAED,MAAMC,6BAA6B,GAAG,CAAC,GAAG,CAAC;AAE3C,MAAMC,wBAAwB,GAAG,CAAC,GAAG,CAAC,GAAGD,6BAA6B;AAE/D,SAASE,qBAAqBA,CAACC,MAA8B,EAAEC,aAAqB,EAAEC,uBAA+B,EAAE;EAC5HF,MAAM,CAACG,aAAa,CAAC,CAAC,CAAC;EACvBH,MAAM,CAACG,aAAa,CAACL,wBAAwB,CAAC;EAC9CE,MAAM,CAACI,aAAa,CAACX,IAAI,CAACE,cAAc,CAAC;EACzCK,MAAM,CAACK,WAAW,CAACJ,aAAa,CAAC;EACjCD,MAAM,CAACG,aAAa,CAACD,uBAAuB,CAAC;EAE7C,MAAMI,IAAI,GAAGN,MAAM,CAACM,IAAI;EACxBA,IAAI,CAACH,aAAa,CAACG,IAAI,CAACC,MAAM,EAAE,CAAC,CAAC;EAClC,OAAOP,MAAM;AACf"}
@@ -4,29 +4,25 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.algorithmName = exports.AeadAes256CbcHmac256Algorithm = void 0;
7
-
8
7
  var _types = require("./types");
9
-
10
8
  var _crypto = require("crypto");
11
-
12
9
  var _aeadAes256CbcHmacEncryptionKey = require("./aead-aes-256-cbc-hmac-encryption-key");
13
-
14
10
  // This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
15
11
  // Copyright (c) 2019 Microsoft Corporation
12
+
16
13
  const algorithmName = 'AEAD_AES_256_CBC_HMAC_SHA256';
17
14
  exports.algorithmName = algorithmName;
18
15
  const algorithmVersion = 0x1;
19
16
  const blockSizeInBytes = 16;
20
-
21
17
  class AeadAes256CbcHmac256Algorithm {
18
+ columnEncryptionkey;
19
+ isDeterministic;
20
+ keySizeInBytes;
21
+ version;
22
+ versionSize;
23
+ minimumCipherTextLengthInBytesNoAuthenticationTag;
24
+ minimumCipherTextLengthInBytesWithAuthenticationTag;
22
25
  constructor(columnEncryptionKey, encryptionType) {
23
- this.columnEncryptionkey = void 0;
24
- this.isDeterministic = void 0;
25
- this.keySizeInBytes = void 0;
26
- this.version = void 0;
27
- this.versionSize = void 0;
28
- this.minimumCipherTextLengthInBytesNoAuthenticationTag = void 0;
29
- this.minimumCipherTextLengthInBytesWithAuthenticationTag = void 0;
30
26
  this.keySizeInBytes = _aeadAes256CbcHmacEncryptionKey.keySize / 8;
31
27
  this.version = Buffer.from([algorithmVersion]);
32
28
  this.versionSize = Buffer.from([1]);
@@ -35,10 +31,8 @@ class AeadAes256CbcHmac256Algorithm {
35
31
  this.columnEncryptionkey = columnEncryptionKey;
36
32
  this.isDeterministic = encryptionType === _types.SQLServerEncryptionType.Deterministic;
37
33
  }
38
-
39
34
  encryptData(plaintText) {
40
35
  let iv;
41
-
42
36
  if (this.isDeterministic === true) {
43
37
  const hmacIv = (0, _crypto.createHmac)('sha256', this.columnEncryptionkey.getIvKey());
44
38
  hmacIv.update(plaintText);
@@ -46,29 +40,21 @@ class AeadAes256CbcHmac256Algorithm {
46
40
  } else {
47
41
  iv = (0, _crypto.randomBytes)(blockSizeInBytes);
48
42
  }
49
-
50
43
  const encryptCipher = (0, _crypto.createCipheriv)('aes-256-cbc', this.columnEncryptionkey.getEncryptionKey(), iv);
51
44
  const encryptedBuffer = Buffer.concat([encryptCipher.update(plaintText), encryptCipher.final()]);
52
-
53
45
  const authenticationTag = this._prepareAuthenticationTag(iv, encryptedBuffer, 0, encryptedBuffer.length);
54
-
55
46
  return Buffer.concat([Buffer.from([algorithmVersion]), authenticationTag, iv, encryptedBuffer]);
56
47
  }
57
-
58
48
  decryptData(cipherText) {
59
49
  const iv = Buffer.alloc(blockSizeInBytes);
60
50
  const minimumCiperTextLength = this.minimumCipherTextLengthInBytesWithAuthenticationTag;
61
-
62
51
  if (cipherText.length < minimumCiperTextLength) {
63
52
  throw new Error(`Specified ciphertext has an invalid size of ${cipherText.length} bytes, which is below the minimum ${minimumCiperTextLength} bytes required for decryption.`);
64
53
  }
65
-
66
54
  let startIndex = 0;
67
-
68
55
  if (cipherText[0] !== algorithmVersion) {
69
56
  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}.`);
70
57
  }
71
-
72
58
  startIndex += 1;
73
59
  let authenticationTagOffset = 0;
74
60
  authenticationTagOffset = startIndex;
@@ -77,26 +63,20 @@ class AeadAes256CbcHmac256Algorithm {
77
63
  startIndex += iv.length;
78
64
  const cipherTextOffset = startIndex;
79
65
  const cipherTextCount = cipherText.length - startIndex;
80
-
81
66
  const authenticationTag = this._prepareAuthenticationTag(iv, cipherText, cipherTextOffset, cipherTextCount);
82
-
83
67
  if (0 !== authenticationTag.compare(cipherText, authenticationTagOffset, Math.min(authenticationTagOffset + cipherTextCount, authenticationTagOffset + authenticationTag.length), 0, Math.min(cipherTextCount, authenticationTag.length))) {
84
68
  throw new Error('Specified ciphertext has an invalid authentication tag.');
85
69
  }
86
-
87
70
  let plainText;
88
71
  const decipher = (0, _crypto.createDecipheriv)('aes-256-cbc', this.columnEncryptionkey.getEncryptionKey(), iv);
89
-
90
72
  try {
91
73
  plainText = decipher.update(cipherText.slice(cipherTextOffset, cipherTextOffset + cipherTextCount));
92
74
  plainText = Buffer.concat([plainText, decipher.final()]);
93
75
  } catch (error) {
94
76
  throw new Error(`Internal error while decryption: ${error.message}`);
95
77
  }
96
-
97
78
  return plainText;
98
79
  }
99
-
100
80
  _prepareAuthenticationTag(iv, cipherText, offset, length) {
101
81
  const hmac = (0, _crypto.createHmac)('sha256', this.columnEncryptionkey.getMacKey());
102
82
  hmac.update(this.version);
@@ -105,8 +85,6 @@ class AeadAes256CbcHmac256Algorithm {
105
85
  hmac.update(this.versionSize);
106
86
  return hmac.digest();
107
87
  }
108
-
109
88
  }
110
-
111
89
  exports.AeadAes256CbcHmac256Algorithm = AeadAes256CbcHmac256Algorithm;
112
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhbGdvcml0aG1OYW1lIiwiYWxnb3JpdGhtVmVyc2lvbiIsImJsb2NrU2l6ZUluQnl0ZXMiLCJBZWFkQWVzMjU2Q2JjSG1hYzI1NkFsZ29yaXRobSIsImNvbnN0cnVjdG9yIiwiY29sdW1uRW5jcnlwdGlvbktleSIsImVuY3J5cHRpb25UeXBlIiwiY29sdW1uRW5jcnlwdGlvbmtleSIsImlzRGV0ZXJtaW5pc3RpYyIsImtleVNpemVJbkJ5dGVzIiwidmVyc2lvbiIsInZlcnNpb25TaXplIiwibWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzTm9BdXRoZW50aWNhdGlvblRhZyIsIm1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc1dpdGhBdXRoZW50aWNhdGlvblRhZyIsImtleVNpemUiLCJCdWZmZXIiLCJmcm9tIiwiU1FMU2VydmVyRW5jcnlwdGlvblR5cGUiLCJEZXRlcm1pbmlzdGljIiwiZW5jcnlwdERhdGEiLCJwbGFpbnRUZXh0IiwiaXYiLCJobWFjSXYiLCJnZXRJdktleSIsInVwZGF0ZSIsImRpZ2VzdCIsInNsaWNlIiwiZW5jcnlwdENpcGhlciIsImdldEVuY3J5cHRpb25LZXkiLCJlbmNyeXB0ZWRCdWZmZXIiLCJjb25jYXQiLCJmaW5hbCIsImF1dGhlbnRpY2F0aW9uVGFnIiwiX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyIsImxlbmd0aCIsImRlY3J5cHREYXRhIiwiY2lwaGVyVGV4dCIsImFsbG9jIiwibWluaW11bUNpcGVyVGV4dExlbmd0aCIsIkVycm9yIiwic3RhcnRJbmRleCIsInRvU3RyaW5nIiwiYXV0aGVudGljYXRpb25UYWdPZmZzZXQiLCJjb3B5IiwiY2lwaGVyVGV4dE9mZnNldCIsImNpcGhlclRleHRDb3VudCIsImNvbXBhcmUiLCJNYXRoIiwibWluIiwicGxhaW5UZXh0IiwiZGVjaXBoZXIiLCJlcnJvciIsIm1lc3NhZ2UiLCJvZmZzZXQiLCJobWFjIiwiZ2V0TWFjS2V5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fsd2F5cy1lbmNyeXB0ZWQvYWVhZC1hZXMtMjU2LWNiYy1obWFjLWFsZ29yaXRobS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgRW5jcnlwdGlvbkFsZ29yaXRobSwgU1FMU2VydmVyRW5jcnlwdGlvblR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUhtYWMsIHJhbmRvbUJ5dGVzLCBjcmVhdGVDaXBoZXJpdiwgY3JlYXRlRGVjaXBoZXJpdiB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXksIGtleVNpemUgfSBmcm9tICcuL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1lbmNyeXB0aW9uLWtleSc7XG5cbmV4cG9ydCBjb25zdCBhbGdvcml0aG1OYW1lID0gJ0FFQURfQUVTXzI1Nl9DQkNfSE1BQ19TSEEyNTYnO1xuY29uc3QgYWxnb3JpdGhtVmVyc2lvbiA9IDB4MTtcbmNvbnN0IGJsb2NrU2l6ZUluQnl0ZXMgPSAxNjtcblxuZXhwb3J0IGNsYXNzIEFlYWRBZXMyNTZDYmNIbWFjMjU2QWxnb3JpdGhtIGltcGxlbWVudHMgRW5jcnlwdGlvbkFsZ29yaXRobSB7XG4gIHByaXZhdGUgY29sdW1uRW5jcnlwdGlvbmtleTogQWVhZEFlczI1NkNiY0htYWMyNTZFbmNyeXB0aW9uS2V5O1xuICBwcml2YXRlIGlzRGV0ZXJtaW5pc3RpYzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBrZXlTaXplSW5CeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHZlcnNpb246IEJ1ZmZlcjtcbiAgcHJpdmF0ZSB2ZXJzaW9uU2l6ZTogQnVmZmVyO1xuICBwcml2YXRlIG1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc05vQXV0aGVudGljYXRpb25UYWc6IG51bWJlcjtcbiAgcHJpdmF0ZSBtaW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNXaXRoQXV0aGVudGljYXRpb25UYWc6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb2x1bW5FbmNyeXB0aW9uS2V5OiBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXksIGVuY3J5cHRpb25UeXBlOiBTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSkge1xuICAgIHRoaXMua2V5U2l6ZUluQnl0ZXMgPSBrZXlTaXplIC8gODtcbiAgICB0aGlzLnZlcnNpb24gPSBCdWZmZXIuZnJvbShbYWxnb3JpdGhtVmVyc2lvbl0pO1xuICAgIHRoaXMudmVyc2lvblNpemUgPSBCdWZmZXIuZnJvbShbMV0pO1xuICAgIHRoaXMubWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzTm9BdXRoZW50aWNhdGlvblRhZyA9IDEgKyBibG9ja1NpemVJbkJ5dGVzICsgYmxvY2tTaXplSW5CeXRlcztcbiAgICB0aGlzLm1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc1dpdGhBdXRoZW50aWNhdGlvblRhZyA9IHRoaXMubWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzTm9BdXRoZW50aWNhdGlvblRhZyArIHRoaXMua2V5U2l6ZUluQnl0ZXM7XG4gICAgdGhpcy5jb2x1bW5FbmNyeXB0aW9ua2V5ID0gY29sdW1uRW5jcnlwdGlvbktleTtcblxuICAgIHRoaXMuaXNEZXRlcm1pbmlzdGljID0gZW5jcnlwdGlvblR5cGUgPT09IFNRTFNlcnZlckVuY3J5cHRpb25UeXBlLkRldGVybWluaXN0aWM7XG4gIH1cblxuICBlbmNyeXB0RGF0YShwbGFpbnRUZXh0OiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIGxldCBpdjogQnVmZmVyO1xuXG4gICAgaWYgKHRoaXMuaXNEZXRlcm1pbmlzdGljID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBobWFjSXYgPSBjcmVhdGVIbWFjKCdzaGEyNTYnLCB0aGlzLmNvbHVtbkVuY3J5cHRpb25rZXkuZ2V0SXZLZXkoKSk7XG4gICAgICBobWFjSXYudXBkYXRlKHBsYWludFRleHQpO1xuICAgICAgaXYgPSBobWFjSXYuZGlnZXN0KCkuc2xpY2UoMCwgYmxvY2tTaXplSW5CeXRlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl2ID0gcmFuZG9tQnl0ZXMoYmxvY2tTaXplSW5CeXRlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdENpcGhlciA9IGNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWNiYycsIHRoaXMuY29sdW1uRW5jcnlwdGlvbmtleS5nZXRFbmNyeXB0aW9uS2V5KCksIGl2KTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW2VuY3J5cHRDaXBoZXIudXBkYXRlKHBsYWludFRleHQpLCBlbmNyeXB0Q2lwaGVyLmZpbmFsKCldKTtcblxuICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uVGFnOiBCdWZmZXIgPSB0aGlzLl9wcmVwYXJlQXV0aGVudGljYXRpb25UYWcoaXYsIGVuY3J5cHRlZEJ1ZmZlciwgMCwgZW5jcnlwdGVkQnVmZmVyLmxlbmd0aCk7XG5cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oW2FsZ29yaXRobVZlcnNpb25dKSwgYXV0aGVudGljYXRpb25UYWcsIGl2LCBlbmNyeXB0ZWRCdWZmZXJdKTtcbiAgfVxuXG4gIGRlY3J5cHREYXRhKGNpcGhlclRleHQ6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgY29uc3QgaXY6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhibG9ja1NpemVJbkJ5dGVzKTtcblxuICAgIGNvbnN0IG1pbmltdW1DaXBlclRleHRMZW5ndGg6IG51bWJlciA9IHRoaXMubWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzV2l0aEF1dGhlbnRpY2F0aW9uVGFnO1xuXG4gICAgaWYgKGNpcGhlclRleHQubGVuZ3RoIDwgbWluaW11bUNpcGVyVGV4dExlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTcGVjaWZpZWQgY2lwaGVydGV4dCBoYXMgYW4gaW52YWxpZCBzaXplIG9mICR7Y2lwaGVyVGV4dC5sZW5ndGh9IGJ5dGVzLCB3aGljaCBpcyBiZWxvdyB0aGUgbWluaW11bSAke21pbmltdW1DaXBlclRleHRMZW5ndGh9IGJ5dGVzIHJlcXVpcmVkIGZvciBkZWNyeXB0aW9uLmApO1xuICAgIH1cblxuICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICBpZiAoY2lwaGVyVGV4dFswXSAhPT0gYWxnb3JpdGhtVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3BlY2lmaWVkIGNpcGhlcnRleHQncyBlbmNyeXB0aW9uIGFsZ29yaXRobSB2ZXJzaW9uICR7QnVmZmVyLmZyb20oW2NpcGhlclRleHRbMF1dKS50b1N0cmluZygnaGV4Jyl9IGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBlbmNyeXB0aW9uIGFsZ29yaXRobSB2ZXJzaW9uICR7YWxnb3JpdGhtVmVyc2lvbn0uYCk7XG4gICAgfVxuXG4gICAgc3RhcnRJbmRleCArPSAxO1xuICAgIGxldCBhdXRoZW50aWNhdGlvblRhZ09mZnNldCA9IDA7XG5cbiAgICBhdXRoZW50aWNhdGlvblRhZ09mZnNldCA9IHN0YXJ0SW5kZXg7XG4gICAgc3RhcnRJbmRleCArPSB0aGlzLmtleVNpemVJbkJ5dGVzO1xuXG4gICAgY2lwaGVyVGV4dC5jb3B5KGl2LCAwLCBzdGFydEluZGV4LCBzdGFydEluZGV4ICsgaXYubGVuZ3RoKTtcbiAgICBzdGFydEluZGV4ICs9IGl2Lmxlbmd0aDtcblxuICAgIGNvbnN0IGNpcGhlclRleHRPZmZzZXQgPSBzdGFydEluZGV4O1xuICAgIGNvbnN0IGNpcGhlclRleHRDb3VudCA9IGNpcGhlclRleHQubGVuZ3RoIC0gc3RhcnRJbmRleDtcblxuICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uVGFnOiBCdWZmZXIgPSB0aGlzLl9wcmVwYXJlQXV0aGVudGljYXRpb25UYWcoaXYsIGNpcGhlclRleHQsIGNpcGhlclRleHRPZmZzZXQsIGNpcGhlclRleHRDb3VudCk7XG5cbiAgICBpZiAoMCAhPT0gYXV0aGVudGljYXRpb25UYWcuY29tcGFyZShjaXBoZXJUZXh0LCBhdXRoZW50aWNhdGlvblRhZ09mZnNldCwgTWF0aC5taW4oYXV0aGVudGljYXRpb25UYWdPZmZzZXQgKyBjaXBoZXJUZXh0Q291bnQsIGF1dGhlbnRpY2F0aW9uVGFnT2Zmc2V0ICsgYXV0aGVudGljYXRpb25UYWcubGVuZ3RoKSwgMCwgTWF0aC5taW4oY2lwaGVyVGV4dENvdW50LCBhdXRoZW50aWNhdGlvblRhZy5sZW5ndGgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTcGVjaWZpZWQgY2lwaGVydGV4dCBoYXMgYW4gaW52YWxpZCBhdXRoZW50aWNhdGlvbiB0YWcuJyk7XG4gICAgfVxuXG4gICAgbGV0IHBsYWluVGV4dDogQnVmZmVyO1xuXG4gICAgY29uc3QgZGVjaXBoZXIgPSBjcmVhdGVEZWNpcGhlcml2KCdhZXMtMjU2LWNiYycsIHRoaXMuY29sdW1uRW5jcnlwdGlvbmtleS5nZXRFbmNyeXB0aW9uS2V5KCksIGl2KTtcbiAgICB0cnkge1xuICAgICAgcGxhaW5UZXh0ID0gZGVjaXBoZXIudXBkYXRlKGNpcGhlclRleHQuc2xpY2UoY2lwaGVyVGV4dE9mZnNldCwgY2lwaGVyVGV4dE9mZnNldCArIGNpcGhlclRleHRDb3VudCkpO1xuICAgICAgcGxhaW5UZXh0ID0gQnVmZmVyLmNvbmNhdChbcGxhaW5UZXh0LCBkZWNpcGhlci5maW5hbCgpXSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvciB3aGlsZSBkZWNyeXB0aW9uOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBsYWluVGV4dDtcbiAgfVxuXG4gIF9wcmVwYXJlQXV0aGVudGljYXRpb25UYWcoaXY6IEJ1ZmZlciwgY2lwaGVyVGV4dDogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpOiBCdWZmZXIge1xuICAgIGNvbnN0IGhtYWMgPSBjcmVhdGVIbWFjKCdzaGEyNTYnLCB0aGlzLmNvbHVtbkVuY3J5cHRpb25rZXkuZ2V0TWFjS2V5KCkpO1xuXG4gICAgaG1hYy51cGRhdGUodGhpcy52ZXJzaW9uKTtcbiAgICBobWFjLnVwZGF0ZShpdik7XG4gICAgaG1hYy51cGRhdGUoY2lwaGVyVGV4dC5zbGljZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpO1xuICAgIGhtYWMudXBkYXRlKHRoaXMudmVyc2lvblNpemUpO1xuICAgIHJldHVybiBobWFjLmRpZ2VzdCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFDQTs7QUFMQTtBQUNBO0FBTU8sTUFBTUEsYUFBYSxHQUFHLDhCQUF0Qjs7QUFDUCxNQUFNQyxnQkFBZ0IsR0FBRyxHQUF6QjtBQUNBLE1BQU1DLGdCQUFnQixHQUFHLEVBQXpCOztBQUVPLE1BQU1DLDZCQUFOLENBQW1FO0VBU3hFQyxXQUFXLENBQUNDLG1CQUFELEVBQXlEQyxjQUF6RCxFQUFrRztJQUFBLEtBUnJHQyxtQkFRcUc7SUFBQSxLQVByR0MsZUFPcUc7SUFBQSxLQU5yR0MsY0FNcUc7SUFBQSxLQUxyR0MsT0FLcUc7SUFBQSxLQUpyR0MsV0FJcUc7SUFBQSxLQUhyR0MsaURBR3FHO0lBQUEsS0FGckdDLG1EQUVxRztJQUMzRyxLQUFLSixjQUFMLEdBQXNCSywwQ0FBVSxDQUFoQztJQUNBLEtBQUtKLE9BQUwsR0FBZUssTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQ2YsZ0JBQUQsQ0FBWixDQUFmO0lBQ0EsS0FBS1UsV0FBTCxHQUFtQkksTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxDQUFELENBQVosQ0FBbkI7SUFDQSxLQUFLSixpREFBTCxHQUF5RCxJQUFJVixnQkFBSixHQUF1QkEsZ0JBQWhGO0lBQ0EsS0FBS1csbURB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
90
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZXMiLCJyZXF1aXJlIiwiX2NyeXB0byIsIl9hZWFkQWVzMjU2Q2JjSG1hY0VuY3J5cHRpb25LZXkiLCJhbGdvcml0aG1OYW1lIiwiZXhwb3J0cyIsImFsZ29yaXRobVZlcnNpb24iLCJibG9ja1NpemVJbkJ5dGVzIiwiQWVhZEFlczI1NkNiY0htYWMyNTZBbGdvcml0aG0iLCJjb2x1bW5FbmNyeXB0aW9ua2V5IiwiaXNEZXRlcm1pbmlzdGljIiwia2V5U2l6ZUluQnl0ZXMiLCJ2ZXJzaW9uIiwidmVyc2lvblNpemUiLCJtaW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNOb0F1dGhlbnRpY2F0aW9uVGFnIiwibWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzV2l0aEF1dGhlbnRpY2F0aW9uVGFnIiwiY29uc3RydWN0b3IiLCJjb2x1bW5FbmNyeXB0aW9uS2V5IiwiZW5jcnlwdGlvblR5cGUiLCJrZXlTaXplIiwiQnVmZmVyIiwiZnJvbSIsIlNRTFNlcnZlckVuY3J5cHRpb25UeXBlIiwiRGV0ZXJtaW5pc3RpYyIsImVuY3J5cHREYXRhIiwicGxhaW50VGV4dCIsIml2IiwiaG1hY0l2IiwiY3JlYXRlSG1hYyIsImdldEl2S2V5IiwidXBkYXRlIiwiZGlnZXN0Iiwic2xpY2UiLCJyYW5kb21CeXRlcyIsImVuY3J5cHRDaXBoZXIiLCJjcmVhdGVDaXBoZXJpdiIsImdldEVuY3J5cHRpb25LZXkiLCJlbmNyeXB0ZWRCdWZmZXIiLCJjb25jYXQiLCJmaW5hbCIsImF1dGhlbnRpY2F0aW9uVGFnIiwiX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyIsImxlbmd0aCIsImRlY3J5cHREYXRhIiwiY2lwaGVyVGV4dCIsImFsbG9jIiwibWluaW11bUNpcGVyVGV4dExlbmd0aCIsIkVycm9yIiwic3RhcnRJbmRleCIsInRvU3RyaW5nIiwiYXV0aGVudGljYXRpb25UYWdPZmZzZXQiLCJjb3B5IiwiY2lwaGVyVGV4dE9mZnNldCIsImNpcGhlclRleHRDb3VudCIsImNvbXBhcmUiLCJNYXRoIiwibWluIiwicGxhaW5UZXh0IiwiZGVjaXBoZXIiLCJjcmVhdGVEZWNpcGhlcml2IiwiZXJyb3IiLCJtZXNzYWdlIiwib2Zmc2V0IiwiaG1hYyIsImdldE1hY0tleSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1hbGdvcml0aG0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IEVuY3J5cHRpb25BbGdvcml0aG0sIFNRTFNlcnZlckVuY3J5cHRpb25UeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVIbWFjLCByYW5kb21CeXRlcywgY3JlYXRlQ2lwaGVyaXYsIGNyZWF0ZURlY2lwaGVyaXYgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgQWVhZEFlczI1NkNiY0htYWMyNTZFbmNyeXB0aW9uS2V5LCBrZXlTaXplIH0gZnJvbSAnLi9hZWFkLWFlcy0yNTYtY2JjLWhtYWMtZW5jcnlwdGlvbi1rZXknO1xuXG5leHBvcnQgY29uc3QgYWxnb3JpdGhtTmFtZSA9ICdBRUFEX0FFU18yNTZfQ0JDX0hNQUNfU0hBMjU2JztcbmNvbnN0IGFsZ29yaXRobVZlcnNpb24gPSAweDE7XG5jb25zdCBibG9ja1NpemVJbkJ5dGVzID0gMTY7XG5cbmV4cG9ydCBjbGFzcyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkFsZ29yaXRobSBpbXBsZW1lbnRzIEVuY3J5cHRpb25BbGdvcml0aG0ge1xuICBwcml2YXRlIGNvbHVtbkVuY3J5cHRpb25rZXk6IEFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleTtcbiAgcHJpdmF0ZSBpc0RldGVybWluaXN0aWM6IGJvb2xlYW47XG4gIHByaXZhdGUga2V5U2l6ZUluQnl0ZXM6IG51bWJlcjtcbiAgcHJpdmF0ZSB2ZXJzaW9uOiBCdWZmZXI7XG4gIHByaXZhdGUgdmVyc2lvblNpemU6IEJ1ZmZlcjtcbiAgcHJpdmF0ZSBtaW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNOb0F1dGhlbnRpY2F0aW9uVGFnOiBudW1iZXI7XG4gIHByaXZhdGUgbWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzV2l0aEF1dGhlbnRpY2F0aW9uVGFnOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoY29sdW1uRW5jcnlwdGlvbktleTogQWVhZEFlczI1NkNiY0htYWMyNTZFbmNyeXB0aW9uS2V5LCBlbmNyeXB0aW9uVHlwZTogU1FMU2VydmVyRW5jcnlwdGlvblR5cGUpIHtcbiAgICB0aGlzLmtleVNpemVJbkJ5dGVzID0ga2V5U2l6ZSAvIDg7XG4gICAgdGhpcy52ZXJzaW9uID0gQnVmZmVyLmZyb20oW2FsZ29yaXRobVZlcnNpb25dKTtcbiAgICB0aGlzLnZlcnNpb25TaXplID0gQnVmZmVyLmZyb20oWzFdKTtcbiAgICB0aGlzLm1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc05vQXV0aGVudGljYXRpb25UYWcgPSAxICsgYmxvY2tTaXplSW5CeXRlcyArIGJsb2NrU2l6ZUluQnl0ZXM7XG4gICAgdGhpcy5taW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNXaXRoQXV0aGVudGljYXRpb25UYWcgPSB0aGlzLm1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc05vQXV0aGVudGljYXRpb25UYWcgKyB0aGlzLmtleVNpemVJbkJ5dGVzO1xuICAgIHRoaXMuY29sdW1uRW5jcnlwdGlvbmtleSA9IGNvbHVtbkVuY3J5cHRpb25LZXk7XG5cbiAgICB0aGlzLmlzRGV0ZXJtaW5pc3RpYyA9IGVuY3J5cHRpb25UeXBlID09PSBTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZS5EZXRlcm1pbmlzdGljO1xuICB9XG5cbiAgZW5jcnlwdERhdGEocGxhaW50VGV4dDogQnVmZmVyKTogQnVmZmVyIHtcbiAgICBsZXQgaXY6IEJ1ZmZlcjtcblxuICAgIGlmICh0aGlzLmlzRGV0ZXJtaW5pc3RpYyA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaG1hY0l2ID0gY3JlYXRlSG1hYygnc2hhMjU2JywgdGhpcy5jb2x1bW5FbmNyeXB0aW9ua2V5LmdldEl2S2V5KCkpO1xuICAgICAgaG1hY0l2LnVwZGF0ZShwbGFpbnRUZXh0KTtcbiAgICAgIGl2ID0gaG1hY0l2LmRpZ2VzdCgpLnNsaWNlKDAsIGJsb2NrU2l6ZUluQnl0ZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdiA9IHJhbmRvbUJ5dGVzKGJsb2NrU2l6ZUluQnl0ZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHRDaXBoZXIgPSBjcmVhdGVDaXBoZXJpdignYWVzLTI1Ni1jYmMnLCB0aGlzLmNvbHVtbkVuY3J5cHRpb25rZXkuZ2V0RW5jcnlwdGlvbktleSgpLCBpdik7XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFtlbmNyeXB0Q2lwaGVyLnVwZGF0ZShwbGFpbnRUZXh0KSwgZW5jcnlwdENpcGhlci5maW5hbCgpXSk7XG5cbiAgICBjb25zdCBhdXRoZW50aWNhdGlvblRhZzogQnVmZmVyID0gdGhpcy5fcHJlcGFyZUF1dGhlbnRpY2F0aW9uVGFnKGl2LCBlbmNyeXB0ZWRCdWZmZXIsIDAsIGVuY3J5cHRlZEJ1ZmZlci5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFthbGdvcml0aG1WZXJzaW9uXSksIGF1dGhlbnRpY2F0aW9uVGFnLCBpdiwgZW5jcnlwdGVkQnVmZmVyXSk7XG4gIH1cblxuICBkZWNyeXB0RGF0YShjaXBoZXJUZXh0OiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIGNvbnN0IGl2OiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoYmxvY2tTaXplSW5CeXRlcyk7XG5cbiAgICBjb25zdCBtaW5pbXVtQ2lwZXJUZXh0TGVuZ3RoOiBudW1iZXIgPSB0aGlzLm1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc1dpdGhBdXRoZW50aWNhdGlvblRhZztcblxuICAgIGlmIChjaXBoZXJUZXh0Lmxlbmd0aCA8IG1pbmltdW1DaXBlclRleHRMZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3BlY2lmaWVkIGNpcGhlcnRleHQgaGFzIGFuIGludmFsaWQgc2l6ZSBvZiAke2NpcGhlclRleHQubGVuZ3RofSBieXRlcywgd2hpY2ggaXMgYmVsb3cgdGhlIG1pbmltdW0gJHttaW5pbXVtQ2lwZXJUZXh0TGVuZ3RofSBieXRlcyByZXF1aXJlZCBmb3IgZGVjcnlwdGlvbi5gKTtcbiAgICB9XG5cbiAgICBsZXQgc3RhcnRJbmRleCA9IDA7XG4gICAgaWYgKGNpcGhlclRleHRbMF0gIT09IGFsZ29yaXRobVZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNwZWNpZmllZCBjaXBoZXJ0ZXh0J3MgZW5jcnlwdGlvbiBhbGdvcml0aG0gdmVyc2lvbiAke0J1ZmZlci5mcm9tKFtjaXBoZXJUZXh0WzBdXSkudG9TdHJpbmcoJ2hleCcpfSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgZW5jcnlwdGlvbiBhbGdvcml0aG0gdmVyc2lvbiAke2FsZ29yaXRobVZlcnNpb259LmApO1xuICAgIH1cblxuICAgIHN0YXJ0SW5kZXggKz0gMTtcbiAgICBsZXQgYXV0aGVudGljYXRpb25UYWdPZmZzZXQgPSAwO1xuXG4gICAgYXV0aGVudGljYXRpb25UYWdPZmZzZXQgPSBzdGFydEluZGV4O1xuICAgIHN0YXJ0SW5kZXggKz0gdGhpcy5rZXlTaXplSW5CeXRlcztcblxuICAgIGNpcGhlclRleHQuY29weShpdiwgMCwgc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIGl2Lmxlbmd0aCk7XG4gICAgc3RhcnRJbmRleCArPSBpdi5sZW5ndGg7XG5cbiAgICBjb25zdCBjaXBoZXJUZXh0T2Zmc2V0ID0gc3RhcnRJbmRleDtcbiAgICBjb25zdCBjaXBoZXJUZXh0Q291bnQgPSBjaXBoZXJUZXh0Lmxlbmd0aCAtIHN0YXJ0SW5kZXg7XG5cbiAgICBjb25zdCBhdXRoZW50aWNhdGlvblRhZzogQnVmZmVyID0gdGhpcy5fcHJlcGFyZUF1dGhlbnRpY2F0aW9uVGFnKGl2LCBjaXBoZXJUZXh0LCBjaXBoZXJUZXh0T2Zmc2V0LCBjaXBoZXJUZXh0Q291bnQpO1xuXG4gICAgaWYgKDAgIT09IGF1dGhlbnRpY2F0aW9uVGFnLmNvbXBhcmUoY2lwaGVyVGV4dCwgYXV0aGVudGljYXRpb25UYWdPZmZzZXQsIE1hdGgubWluKGF1dGhlbnRpY2F0aW9uVGFnT2Zmc2V0ICsgY2lwaGVyVGV4dENvdW50LCBhdXRoZW50aWNhdGlvblRhZ09mZnNldCArIGF1dGhlbnRpY2F0aW9uVGFnLmxlbmd0aCksIDAsIE1hdGgubWluKGNpcGhlclRleHRDb3VudCwgYXV0aGVudGljYXRpb25UYWcubGVuZ3RoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3BlY2lmaWVkIGNpcGhlcnRleHQgaGFzIGFuIGludmFsaWQgYXV0aGVudGljYXRpb24gdGFnLicpO1xuICAgIH1cblxuICAgIGxldCBwbGFpblRleHQ6IEJ1ZmZlcjtcblxuICAgIGNvbnN0IGRlY2lwaGVyID0gY3JlYXRlRGVjaXBoZXJpdignYWVzLTI1Ni1jYmMnLCB0aGlzLmNvbHVtbkVuY3J5cHRpb25rZXkuZ2V0RW5jcnlwdGlvbktleSgpLCBpdik7XG4gICAgdHJ5IHtcbiAgICAgIHBsYWluVGV4dCA9IGRlY2lwaGVyLnVwZGF0ZShjaXBoZXJUZXh0LnNsaWNlKGNpcGhlclRleHRPZmZzZXQsIGNpcGhlclRleHRPZmZzZXQgKyBjaXBoZXJUZXh0Q291bnQpKTtcbiAgICAgIHBsYWluVGV4dCA9IEJ1ZmZlci5jb25jYXQoW3BsYWluVGV4dCwgZGVjaXBoZXIuZmluYWwoKV0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3Igd2hpbGUgZGVjcnlwdGlvbjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cblxuICAgIHJldHVybiBwbGFpblRleHQ7XG4gIH1cblxuICBfcHJlcGFyZUF1dGhlbnRpY2F0aW9uVGFnKGl2OiBCdWZmZXIsIGNpcGhlclRleHQ6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogQnVmZmVyIHtcbiAgICBjb25zdCBobWFjID0gY3JlYXRlSG1hYygnc2hhMjU2JywgdGhpcy5jb2x1bW5FbmNyeXB0aW9ua2V5LmdldE1hY0tleSgpKTtcblxuICAgIGhtYWMudXBkYXRlKHRoaXMudmVyc2lvbik7XG4gICAgaG1hYy51cGRhdGUoaXYpO1xuICAgIGhtYWMudXBkYXRlKGNpcGhlclRleHQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKTtcbiAgICBobWFjLnVwZGF0ZSh0aGlzLnZlcnNpb25TaXplKTtcbiAgICByZXR1cm4gaG1hYy5kaWdlc3QoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSwrQkFBQSxHQUFBRixPQUFBO0FBTEE7QUFDQTs7QUFNTyxNQUFNRyxhQUFhLEdBQUcsOEJBQThCO0FBQUNDLE9BQUEsQ0FBQUQsYUFBQSxHQUFBQSxhQUFBO0FBQzVELE1BQU1FLGdCQUFnQixHQUFHLEdBQUc7QUFDNUIsTUFBTUMsZ0JBQWdCLEdBQUcsRUFBRTtBQUVwQixNQUFNQyw2QkFBNkIsQ0FBZ0M7RUFDaEVDLG1CQUFtQjtFQUNuQkMsZUFBZTtFQUNmQyxjQUFjO0VBQ2RDLE9BQU87RUFDUEMsV0FBVztFQUNYQyxpREFBaUQ7RUFDakRDLG1EQUFtRDtFQUUzREMsV0FBV0EsQ0FBQ0MsbUJBQXNELEVBQUVDLGNBQXVDLEVBQUU7SUFDM0csSUFBSSxDQUFDUCxjQUFjLEdBQUdRLHVDQUFPLEdBQUcs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
@@ -0,0 +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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"}
@@ -4,50 +4,40 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.keySize = exports.generateKeySalt = exports.deriveKey = exports.AeadAes256CbcHmac256EncryptionKey = void 0;
7
-
8
7
  var _crypto = require("crypto");
9
-
10
8
  var _symmetricKey = _interopRequireDefault(require("./symmetric-key"));
11
-
12
9
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
10
  // This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
15
11
  // Copyright (c) 2019 Microsoft Corporation
12
+
16
13
  const keySize = 256;
17
14
  exports.keySize = keySize;
18
15
  const keySizeInBytes = keySize / 8;
19
-
20
16
  const deriveKey = (rootKey, salt) => {
21
17
  const hmac = (0, _crypto.createHmac)('sha256', rootKey);
22
18
  hmac.update(Buffer.from(salt, 'utf16le'));
23
19
  return hmac.digest();
24
20
  };
25
-
26
21
  exports.deriveKey = deriveKey;
27
-
28
22
  const generateKeySalt = (keyType, algorithmName, keySize) => `Microsoft SQL Server cell ${keyType} key ` + `with encryption algorithm:${algorithmName} and key length:${keySize}`;
29
-
30
23
  exports.generateKeySalt = generateKeySalt;
31
-
32
24
  class AeadAes256CbcHmac256EncryptionKey extends _symmetricKey.default {
25
+ algorithmName;
26
+ encryptionKeySaltFormat;
27
+ macKeySaltFormat;
28
+ ivKeySaltFormat;
29
+ encryptionKey;
30
+ macKey;
31
+ ivKey;
33
32
  constructor(rootKey, algorithmName) {
34
33
  super(rootKey);
35
- this.algorithmName = void 0;
36
- this.encryptionKeySaltFormat = void 0;
37
- this.macKeySaltFormat = void 0;
38
- this.ivKeySaltFormat = void 0;
39
- this.encryptionKey = void 0;
40
- this.macKey = void 0;
41
- this.ivKey = void 0;
42
34
  this.algorithmName = algorithmName;
43
35
  this.encryptionKeySaltFormat = generateKeySalt('encryption', this.algorithmName, keySize);
44
36
  this.macKeySaltFormat = generateKeySalt('MAC', this.algorithmName, keySize);
45
37
  this.ivKeySaltFormat = generateKeySalt('IV', this.algorithmName, keySize);
46
-
47
38
  if (rootKey.length !== keySizeInBytes) {
48
39
  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.`);
49
40
  }
50
-
51
41
  try {
52
42
  const encKeyBuff = deriveKey(rootKey, this.encryptionKeySaltFormat);
53
43
  this.encryptionKey = new _symmetricKey.default(encKeyBuff);
@@ -59,20 +49,15 @@ class AeadAes256CbcHmac256EncryptionKey extends _symmetricKey.default {
59
49
  throw new Error(`Key extraction failed : ${error.message}.`);
60
50
  }
61
51
  }
62
-
63
52
  getEncryptionKey() {
64
53
  return this.encryptionKey.rootKey;
65
54
  }
66
-
67
55
  getMacKey() {
68
56
  return this.macKey.rootKey;
69
57
  }
70
-
71
58
  getIvKey() {
72
59
  return this.ivKey.rootKey;
73
60
  }
74
-
75
61
  }
76
-
77
62
  exports.AeadAes256CbcHmac256EncryptionKey = AeadAes256CbcHmac256EncryptionKey;
78
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJrZXlTaXplIiwia2V5U2l6ZUluQnl0ZXMiLCJkZXJpdmVLZXkiLCJyb290S2V5Iiwic2FsdCIsImhtYWMiLCJ1cGRhdGUiLCJCdWZmZXIiLCJmcm9tIiwiZGlnZXN0IiwiZ2VuZXJhdGVLZXlTYWx0Iiwia2V5VHlwZSIsImFsZ29yaXRobU5hbWUiLCJBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXkiLCJTeW1tZXRyaWNLZXkiLCJjb25zdHJ1Y3RvciIsImVuY3J5cHRpb25LZXlTYWx0Rm9ybWF0IiwibWFjS2V5U2FsdEZvcm1hdCIsIml2S2V5U2FsdEZvcm1hdCIsImVuY3J5cHRpb25LZXkiLCJtYWNLZXkiLCJpdktleSIsImxlbmd0aCIsIkVycm9yIiwiZW5jS2V5QnVmZiIsIm1hY0tleUJ1ZmYiLCJpdktleUJ1ZmYiLCJlcnJvciIsIm1lc3NhZ2UiLCJnZXRFbmNyeXB0aW9uS2V5IiwiZ2V0TWFjS2V5IiwiZ2V0SXZLZXkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC9hZWFkLWFlcy0yNTYtY2JjLWhtYWMtZW5jcnlwdGlvbi1rZXkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IGNyZWF0ZUhtYWMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IFN5bW1ldHJpY0tleSBmcm9tICcuL3N5bW1ldHJpYy1rZXknO1xuXG5leHBvcnQgY29uc3Qga2V5U2l6ZSA9IDI1NjtcbmNvbnN0IGtleVNpemVJbkJ5dGVzID0ga2V5U2l6ZSAvIDg7XG5cbmV4cG9ydCBjb25zdCBkZXJpdmVLZXkgPSAocm9vdEtleTogQnVmZmVyLCBzYWx0OiBzdHJpbmcpOiBCdWZmZXIgPT4ge1xuICBjb25zdCBobWFjID0gY3JlYXRlSG1hYygnc2hhMjU2Jywgcm9vdEtleSk7XG4gIGhtYWMudXBkYXRlKEJ1ZmZlci5mcm9tKHNhbHQsICd1dGYxNmxlJykpO1xuICByZXR1cm4gaG1hYy5kaWdlc3QoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUtleVNhbHQgPSAoXG4gIGtleVR5cGU6ICdlbmNyeXB0aW9uJyB8ICdNQUMnIHwgJ0lWJyxcbiAgYWxnb3JpdGhtTmFtZTogc3RyaW5nLFxuICBrZXlTaXplOiBudW1iZXIsXG4pOiBzdHJpbmcgPT5cbiAgYE1pY3Jvc29mdCBTUUwgU2VydmVyIGNlbGwgJHtrZXlUeXBlfSBrZXkgYCArXG4gIGB3aXRoIGVuY3J5cHRpb24gYWxnb3JpdGhtOiR7YWxnb3JpdGhtTmFtZX0gYW5kIGtleSBsZW5ndGg6JHtrZXlTaXplfWA7XG5cbmV4cG9ydCBjbGFzcyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXkgZXh0ZW5kcyBTeW1tZXRyaWNLZXkge1xuICBwcml2YXRlIHJlYWRvbmx5IGFsZ29yaXRobU5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBlbmNyeXB0aW9uS2V5U2FsdEZvcm1hdDogc3RyaW5nO1xuICBwcml2YXRlIG1hY0tleVNhbHRGb3JtYXQ6IHN0cmluZztcbiAgcHJpdmF0ZSBpdktleVNhbHRGb3JtYXQ6IHN0cmluZztcbiAgcHJpdmF0ZSBlbmNyeXB0aW9uS2V5OiBTeW1tZXRyaWNLZXk7XG4gIHByaXZhdGUgbWFjS2V5OiBTeW1tZXRyaWNLZXk7XG4gIHByaXZhdGUgaXZLZXk6IFN5bW1ldHJpY0tleTtcblxuICBjb25zdHJ1Y3Rvcihyb290S2V5OiBCdWZmZXIsIGFsZ29yaXRobU5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKHJvb3RLZXkpO1xuICAgIHRoaXMuYWxnb3JpdGhtTmFtZSA9IGFsZ29yaXRobU5hbWU7XG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5U2FsdEZvcm1hdCA9IGdlbmVyYXRlS2V5U2FsdCgnZW5jcnlwdGlvbicsIHRoaXMuYWxnb3JpdGhtTmFtZSwga2V5U2l6ZSk7XG4gICAgdGhpcy5tYWNLZXlTYWx0Rm9ybWF0ID0gZ2VuZXJhdGVLZXlTYWx0KCdNQUMnLCB0aGlzLmFsZ29yaXRobU5hbWUsIGtleVNpemUpO1xuICAgIHRoaXMuaXZLZXlTYWx0Rm9ybWF0ID0gZ2VuZXJhdGVLZXlTYWx0KCdJVicsIHRoaXMuYWxnb3JpdGhtTmFtZSwga2V5U2l6ZSk7XG5cbiAgICBpZiAocm9vdEtleS5sZW5ndGggIT09IGtleVNpemVJbkJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY3J5cHRlZCBidXQgaXQncyBsZW5ndGg6ICR7cm9vdEtleS5sZW5ndGh9IGRvZXMgbm90IG1hdGNoIHRoZSBsZW5ndGg6ICR7a2V5U2l6ZUluQnl0ZXN9IGZvciBhbGdvcml0aG0gXCIke3RoaXMuYWxnb3JpdGhtTmFtZX1cIi4gVmVyaWZ5IHRoZSBlbmNyeXB0ZWQgdmFsdWUgb2YgdGhlIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBpbiB0aGUgZGF0YWJhc2UuYCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuY0tleUJ1ZmYgPSBkZXJpdmVLZXkocm9vdEtleSwgdGhpcy5lbmNyeXB0aW9uS2V5U2FsdEZvcm1hdCk7XG5cbiAgICAgIHRoaXMuZW5jcnlwdGlvbktleSA9IG5ldyBTeW1tZXRyaWNLZXkoZW5jS2V5QnVmZik7XG5cbiAgICAgIGNvbnN0IG1hY0tleUJ1ZmYgPSBkZXJpdmVLZXkocm9vdEtleSwgdGhpcy5tYWNLZXlTYWx0Rm9ybWF0KTtcblxuICAgICAgdGhpcy5tYWNLZXkgPSBuZXcgU3ltbWV0cmljS2V5KG1hY0tleUJ1ZmYpO1xuXG4gICAgICBjb25zdCBpdktleUJ1ZmYgPSBkZXJpdmVLZXkocm9vdEtleSwgdGhpcy5pdktleVNhbHRGb3JtYXQpO1xuXG4gICAgICB0aGlzLml2S2V5ID0gbmV3IFN5bW1ldHJpY0tleShpdktleUJ1ZmYpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgS2V5IGV4dHJhY3Rpb24gZmFpbGVkIDogJHtlcnJvci5tZXNzYWdlfS5gKTtcbiAgICB9XG4gIH1cblxuICBnZXRFbmNyeXB0aW9uS2V5KCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuZW5jcnlwdGlvbktleS5yb290S2V5O1xuICB9XG5cbiAgZ2V0TWFjS2V5KCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMubWFjS2V5LnJvb3RLZXk7XG4gIH1cblxuICBnZXRJdktleSgpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLml2S2V5LnJvb3RLZXk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUdBOztBQUNBOzs7O0FBSkE7QUFDQTtBQUtPLE1BQU1BLE9BQU8sR0FBRyxHQUFoQjs7QUFDUCxNQUFNQyxjQUFjLEdBQUdELE9BQU8sR0FBRyxDQUFqQzs7QUFFTyxNQUFNRSxTQUFTLEdBQUcsQ0FBQ0MsT0FBRCxFQUFrQkMsSUFBbEIsS0FBMkM7RUFDbEUsTUFBTUMsSUFBSSxHQUFHLHdCQUFXLFFBQVgsRUFBcUJGLE9BQXJCLENBQWI7RUFDQUUsSUFBSSxDQUFDQyxNQUFMLENBQVlDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZSixJQUFaLEVBQWtCLFNBQWxCLENBQVo7RUFDQSxPQUFPQyxJQUFJLENBQUNJLE1BQUwsRUFBUDtBQUNELENBSk07Ozs7QUFNQSxNQUFNQyxlQUFlLEdBQUcsQ0FDN0JDLE9BRDZCLEVBRTdCQyxhQUY2QixFQUc3QlosT0FINkIsS0FLNUIsNkJBQTRCVyxPQUFRLE9BQXJDLEdBQ0MsNkJBQTRCQyxhQUFjLG1CQUFrQlosT0FBUSxFQU5oRTs7OztBQVFBLE1BQU1hLGlDQUFOLFNBQWdEQyxxQkFBaEQsQ0FBNkQ7RUFTbEVDLFdBQVcsQ0FBQ1osT0FBRCxFQUFrQlMsYUFBbEIsRUFBeUM7SUFDbEQsTUFBTVQsT0FBTjtJQURrRCxLQVJuQ1MsYUFRbUM7SUFBQSxLQVA1Q0ksdUJBTzRDO0lBQUEsS0FONUNDLGdCQU00QztJQUFBLEtBTDVDQyxlQUs0QztJQUFBLEtBSjVDQyxhQUk0QztJQUFBLEtBSDVDQyxNQUc0QztJQUFBLEtBRjVDQyxLQUU0QztJQUVsRCxLQUFLVCxhQUFMLEdBQXFCQSxhQUFyQjtJQUNBLEtBQUtJLHVCQUFMLEdBQStCTixlQUFlLENBQUMsWUFBRCxFQUFlLEtBQUtFLGFBQXBCLEVBQW1DWixPQUFuQyxDQUE5QztJQUNBLEtBQUtpQixnQkFBTCxHQUF3QlAsZUFBZSxDQUFDLEtBQUQsRUFBUSxLQUFLRSxhQUFiLEVBQTRCWixPQUE1QixDQUF2QztJQUNBLEtBQUtrQixlQUFMLEdBQXVCUixlQUFlLENBQUMsSUFBRCxFQUFPLEtBQUtFLGFBQVosRUFBMkJaLE9BQTNCLENBQXRDOztJQUVBLElBQUlHLE9BQU8sQ0FBQ21CLE1BQVIsS0FBbUJyQixjQUF2QixFQUF1QztNQUNyQyxNQUFNLElBQUlzQixLQUFKLENBQVcsOEVBQTZFcEIsT0FBTyxDQUFDbUIsTUFBTywrQkFBOEJyQixjQUFlLG1CQUFrQixLQUFLVyxhQUFjLDZFQUF6TCxDQUFOO0lBQ0Q7O0lBRUQsSUFBSTtNQUNGLE1BQU1ZLFVBQVUsR0FBR3RCLFNBQVMsQ0FBQ0MsT0FBRCxFQUFVLEtBQUthLHVCQUFmLENBQTVCO01BRUEsS0FBS0csYUFBTCxHQUFxQixJQUFJTCxxQkFBSixDQUFpQlUsVUFBakIsQ0FBckI7TUFFQSxNQUFNQyxVQUFVLEdBQUd2QixTQUFTLENBQUNDLE9BQUQsRUFBVSxLQUFLYyxnQkFBZixDQUE1QjtNQUVBLEtBQUtHLE1BQUwsR0FBYyxJQUFJTixxQkFBSixDQUFpQlcsVUFBakIsQ0FBZDtNQUVBLE1BQU1DLFNBQVMsR0FBR3hCLFNBQVMsQ0FBQ0MsT0FBRCxFQUFVLEtBQUtlLGVBQWYsQ0FBM0I7TUFFQSxLQUFLRyxLQUFMLEdBQWEsSUFBSVAscUJBQUosQ0FBaUJZLFNBQWpCLENBQWI7SUFDRCxDQVpELENBWUUsT0FBT0MsS0FBUCxFQUFtQjtNQUNuQixNQUFNLElBQUlKLEtBQUosQ0FBVywyQkFBMEJJLEtBQUssQ0FBQ0MsT0FBUSxHQUFuRCxDQUFOO0lBQ0Q7RUFDRjs7RUFFREMsZ0JBQWdCLEdBQVc7SUFDekIsT0FBTyxLQUFLVixhQUFMLENBQW1CaEIsT0FBMUI7RUFDRDs7RUFFRDJCLFNBQVMsR0FBVztJQUNsQixPQUFPLEtBQUtWLE1BQUwsQ0FBWWpCLE9BQW5CO0VBQ0Q7O0VBRUQ0QixRQUFRLEdBQVc7SUFDakIsT0FBTyxLQUFLVixLQUFMLENBQVdsQixPQUFsQjtFQUNEOztBQS9DaUUifQ==
63
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3J5cHRvIiwicmVxdWlyZSIsIl9zeW1tZXRyaWNLZXkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0Iiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJrZXlTaXplIiwiZXhwb3J0cyIsImtleVNpemVJbkJ5dGVzIiwiZGVyaXZlS2V5Iiwicm9vdEtleSIsInNhbHQiLCJobWFjIiwiY3JlYXRlSG1hYyIsInVwZGF0ZSIsIkJ1ZmZlciIsImZyb20iLCJkaWdlc3QiLCJnZW5lcmF0ZUtleVNhbHQiLCJrZXlUeXBlIiwiYWxnb3JpdGhtTmFtZSIsIkFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSIsIlN5bW1ldHJpY0tleSIsImVuY3J5cHRpb25LZXlTYWx0Rm9ybWF0IiwibWFjS2V5U2FsdEZvcm1hdCIsIml2S2V5U2FsdEZvcm1hdCIsImVuY3J5cHRpb25LZXkiLCJtYWNLZXkiLCJpdktleSIsImNvbnN0cnVjdG9yIiwibGVuZ3RoIiwiRXJyb3IiLCJlbmNLZXlCdWZmIiwibWFjS2V5QnVmZiIsIml2S2V5QnVmZiIsImVycm9yIiwibWVzc2FnZSIsImdldEVuY3J5cHRpb25LZXkiLCJnZXRNYWNLZXkiLCJnZXRJdktleSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1lbmNyeXB0aW9uLWtleS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgY3JlYXRlSG1hYyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgU3ltbWV0cmljS2V5IGZyb20gJy4vc3ltbWV0cmljLWtleSc7XG5cbmV4cG9ydCBjb25zdCBrZXlTaXplID0gMjU2O1xuY29uc3Qga2V5U2l6ZUluQnl0ZXMgPSBrZXlTaXplIC8gODtcblxuZXhwb3J0IGNvbnN0IGRlcml2ZUtleSA9IChyb290S2V5OiBCdWZmZXIsIHNhbHQ6IHN0cmluZyk6IEJ1ZmZlciA9PiB7XG4gIGNvbnN0IGhtYWMgPSBjcmVhdGVIbWFjKCdzaGEyNTYnLCByb290S2V5KTtcbiAgaG1hYy51cGRhdGUoQnVmZmVyLmZyb20oc2FsdCwgJ3V0ZjE2bGUnKSk7XG4gIHJldHVybiBobWFjLmRpZ2VzdCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlS2V5U2FsdCA9IChcbiAga2V5VHlwZTogJ2VuY3J5cHRpb24nIHwgJ01BQycgfCAnSVYnLFxuICBhbGdvcml0aG1OYW1lOiBzdHJpbmcsXG4gIGtleVNpemU6IG51bWJlcixcbik6IHN0cmluZyA9PlxuICBgTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgY2VsbCAke2tleVR5cGV9IGtleSBgICtcbiAgYHdpdGggZW5jcnlwdGlvbiBhbGdvcml0aG06JHthbGdvcml0aG1OYW1lfSBhbmQga2V5IGxlbmd0aDoke2tleVNpemV9YDtcblxuZXhwb3J0IGNsYXNzIEFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSBleHRlbmRzIFN5bW1ldHJpY0tleSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxnb3JpdGhtTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGVuY3J5cHRpb25LZXlTYWx0Rm9ybWF0OiBzdHJpbmc7XG4gIHByaXZhdGUgbWFjS2V5U2FsdEZvcm1hdDogc3RyaW5nO1xuICBwcml2YXRlIGl2S2V5U2FsdEZvcm1hdDogc3RyaW5nO1xuICBwcml2YXRlIGVuY3J5cHRpb25LZXk6IFN5bW1ldHJpY0tleTtcbiAgcHJpdmF0ZSBtYWNLZXk6IFN5bW1ldHJpY0tleTtcbiAgcHJpdmF0ZSBpdktleTogU3ltbWV0cmljS2V5O1xuXG4gIGNvbnN0cnVjdG9yKHJvb3RLZXk6IEJ1ZmZlciwgYWxnb3JpdGhtTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIocm9vdEtleSk7XG4gICAgdGhpcy5hbGdvcml0aG1OYW1lID0gYWxnb3JpdGhtTmFtZTtcbiAgICB0aGlzLmVuY3J5cHRpb25LZXlTYWx0Rm9ybWF0ID0gZ2VuZXJhdGVLZXlTYWx0KCdlbmNyeXB0aW9uJywgdGhpcy5hbGdvcml0aG1OYW1lLCBrZXlTaXplKTtcbiAgICB0aGlzLm1hY0tleVNhbHRGb3JtYXQgPSBnZW5lcmF0ZUtleVNhbHQoJ01BQycsIHRoaXMuYWxnb3JpdGhtTmFtZSwga2V5U2l6ZSk7XG4gICAgdGhpcy5pdktleVNhbHRGb3JtYXQgPSBnZW5lcmF0ZUtleVNhbHQoJ0lWJywgdGhpcy5hbGdvcml0aG1OYW1lLCBrZXlTaXplKTtcblxuICAgIGlmIChyb290S2V5Lmxlbmd0aCAhPT0ga2V5U2l6ZUluQnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVjcnlwdGVkIGJ1dCBpdCdzIGxlbmd0aDogJHtyb290S2V5Lmxlbmd0aH0gZG9lcyBub3QgbWF0Y2ggdGhlIGxlbmd0aDogJHtrZXlTaXplSW5CeXRlc30gZm9yIGFsZ29yaXRobSBcIiR7dGhpcy5hbGdvcml0aG1OYW1lfVwiLiBWZXJpZnkgdGhlIGVuY3J5cHRlZCB2YWx1ZSBvZiB0aGUgY29sdW1uIGVuY3J5cHRpb24ga2V5IGluIHRoZSBkYXRhYmFzZS5gKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZW5jS2V5QnVmZiA9IGRlcml2ZUtleShyb290S2V5LCB0aGlzLmVuY3J5cHRpb25LZXlTYWx0Rm9ybWF0KTtcblxuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gbmV3IFN5bW1ldHJpY0tleShlbmNLZXlCdWZmKTtcblxuICAgICAgY29uc3QgbWFjS2V5QnVmZiA9IGRlcml2ZUtleShyb290S2V5LCB0aGlzLm1hY0tleVNhbHRGb3JtYXQpO1xuXG4gICAgICB0aGlzLm1hY0tleSA9IG5ldyBTeW1tZXRyaWNLZXkobWFjS2V5QnVmZik7XG5cbiAgICAgIGNvbnN0IGl2S2V5QnVmZiA9IGRlcml2ZUtleShyb290S2V5LCB0aGlzLml2S2V5U2FsdEZvcm1hdCk7XG5cbiAgICAgIHRoaXMuaXZLZXkgPSBuZXcgU3ltbWV0cmljS2V5KGl2S2V5QnVmZik7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBLZXkgZXh0cmFjdGlvbiBmYWlsZWQgOiAke2Vycm9yLm1lc3NhZ2V9LmApO1xuICAgIH1cbiAgfVxuXG4gIGdldEVuY3J5cHRpb25LZXkoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5lbmNyeXB0aW9uS2V5LnJvb3RLZXk7XG4gIH1cblxuICBnZXRNYWNLZXkoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5tYWNLZXkucm9vdEtleTtcbiAgfVxuXG4gIGdldEl2S2V5KCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuaXZLZXkucm9vdEtleTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxhQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFBMkMsU0FBQUUsdUJBQUFDLEdBQUEsV0FBQUEsR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsR0FBQUQsR0FBQSxLQUFBRSxPQUFBLEVBQUFGLEdBQUE7QUFKM0M7QUFDQTs7QUFLTyxNQUFNRyxPQUFPLEdBQUcsR0FBRztBQUFDQyxPQUFBLENBQUFELE9BQUEsR0FBQUEsT0FBQTtBQUMzQixNQUFNRSxjQUFjLEdBQUdGLE9BQU8sR0FBRyxDQUFDO0FBRTNCLE1BQU1HLFNBQVMsR0FBR0EsQ0FBQ0MsT0FBZSxFQUFFQyxJQUFZLEtBQWE7RUFDbEUsTUFBTUMsSUFBSSxHQUFHLElBQUFDLGtCQUFVLEVBQUMsUUFBUSxFQUFFSCxPQUFPLENBQUM7RUFDMUNFLElBQUksQ0FBQ0UsTUFBTSxDQUFDQyxNQUFNLENB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
@@ -0,0 +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":"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"}
@@ -4,17 +4,17 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.CEKEntry = void 0;
7
-
8
7
  // This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
9
8
  // Copyright (c) 2019 Microsoft Corporation
9
+
10
10
  class CEKEntry {
11
+ columnEncryptionKeyValues;
12
+ ordinal;
13
+ databaseId;
14
+ cekId;
15
+ cekVersion;
16
+ cekMdVersion;
11
17
  constructor(ordinalVal) {
12
- this.columnEncryptionKeyValues = void 0;
13
- this.ordinal = void 0;
14
- this.databaseId = void 0;
15
- this.cekId = void 0;
16
- this.cekVersion = void 0;
17
- this.cekMdVersion = void 0;
18
18
  this.ordinal = ordinalVal;
19
19
  this.databaseId = 0;
20
20
  this.cekId = 0;
@@ -22,7 +22,6 @@ class CEKEntry {
22
22
  this.cekMdVersion = Buffer.alloc(0);
23
23
  this.columnEncryptionKeyValues = [];
24
24
  }
25
-
26
25
  add(encryptedKey, dbId, keyId, keyVersion, mdVersion, keyPath, keyStoreName, algorithmName) {
27
26
  const encryptionKey = {
28
27
  encryptedKey,
@@ -35,7 +34,6 @@ class CEKEntry {
35
34
  algorithmName
36
35
  };
37
36
  this.columnEncryptionKeyValues.push(encryptionKey);
38
-
39
37
  if (this.databaseId === 0) {
40
38
  this.databaseId = dbId;
41
39
  this.cekId = keyId;
@@ -45,8 +43,6 @@ class CEKEntry {
45
43
  throw new Error('Invalid databaseId, cekId, cekVersion or cekMdVersion.');
46
44
  }
47
45
  }
48
-
49
46
  }
50
-
51
47
  exports.CEKEntry = CEKEntry;
52
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDRUtFbnRyeSIsImNvbnN0cnVjdG9yIiwib3JkaW5hbFZhbCIsImNvbHVtbkVuY3J5cHRpb25LZXlWYWx1ZXMiLCJvcmRpbmFsIiwiZGF0YWJhc2VJZCIsImNla0lkIiwiY2VrVmVyc2lvbiIsImNla01kVmVyc2lvbiIsIkJ1ZmZlciIsImFsbG9jIiwiYWRkIiwiZW5jcnlwdGVkS2V5IiwiZGJJZCIsImtleUlkIiwia2V5VmVyc2lvbiIsIm1kVmVyc2lvbiIsImtleVBhdGgiLCJrZXlTdG9yZU5hbWUiLCJhbGdvcml0aG1OYW1lIiwiZW5jcnlwdGlvbktleSIsInB1c2giLCJsZW5ndGgiLCJFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2Nlay1lbnRyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgRW5jcnlwdGlvbktleUluZm8gfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENFS0VudHJ5IHtcbiAgY29sdW1uRW5jcnlwdGlvbktleVZhbHVlczogRW5jcnlwdGlvbktleUluZm9bXTtcbiAgb3JkaW5hbDogbnVtYmVyO1xuICBkYXRhYmFzZUlkOiBudW1iZXI7XG4gIGNla0lkOiBudW1iZXI7XG4gIGNla1ZlcnNpb246IG51bWJlcjtcbiAgY2VrTWRWZXJzaW9uOiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3Iob3JkaW5hbFZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5vcmRpbmFsID0gb3JkaW5hbFZhbDtcbiAgICB0aGlzLmRhdGFiYXNlSWQgPSAwO1xuICAgIHRoaXMuY2VrSWQgPSAwO1xuICAgIHRoaXMuY2VrVmVyc2lvbiA9IDA7XG4gICAgdGhpcy5jZWtNZFZlcnNpb24gPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgdGhpcy5jb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzID0gW107XG4gIH1cblxuICBhZGQoZW5jcnlwdGVkS2V5OiBCdWZmZXIsIGRiSWQ6IG51bWJlciwga2V5SWQ6IG51bWJlciwga2V5VmVyc2lvbjogbnVtYmVyLCBtZFZlcnNpb246IEJ1ZmZlciwga2V5UGF0aDogc3RyaW5nLCBrZXlTdG9yZU5hbWU6IHN0cmluZywgYWxnb3JpdGhtTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZW5jcnlwdGlvbktleTogRW5jcnlwdGlvbktleUluZm8gPSB7XG4gICAgICBlbmNyeXB0ZWRLZXksXG4gICAgICBkYklkLFxuICAgICAga2V5SWQsXG4gICAgICBrZXlWZXJzaW9uLFxuICAgICAgbWRWZXJzaW9uLFxuICAgICAga2V5UGF0aCxcbiAgICAgIGtleVN0b3JlTmFtZSxcbiAgICAgIGFsZ29yaXRobU5hbWUsXG4gICAgfTtcblxuICAgIHRoaXMuY29sdW1uRW5jcnlwdGlvbktleVZhbHVlcy5wdXNoKGVuY3J5cHRpb25LZXkpO1xuXG4gICAgaWYgKHRoaXMuZGF0YWJhc2VJZCA9PT0gMCkge1xuICAgICAgdGhpcy5kYXRhYmFzZUlkID0gZGJJZDtcbiAgICAgIHRoaXMuY2VrSWQgPSBrZXlJZDtcbiAgICAgIHRoaXMuY2VrVmVyc2lvbiA9IGtleVZlcnNpb247XG4gICAgICB0aGlzLmNla01kVmVyc2lvbiA9IG1kVmVyc2lvbjtcbiAgICB9IGVsc2UgaWYgKCh0aGlzLmRhdGFiYXNlSWQgIT09IGRiSWQpIHx8ICh0aGlzLmNla0lkICE9PSBrZXlJZCkgfHwgKHRoaXMuY2VrVmVyc2lvbiAhPT0ga2V5VmVyc2lvbikgfHwgIXRoaXMuY2VrTWRWZXJzaW9uIHx8ICFtZFZlcnNpb24gfHwgdGhpcy5jZWtNZFZlcnNpb24ubGVuZ3RoICE9PSBtZFZlcnNpb24ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YWJhc2VJZCwgY2VrSWQsIGNla1ZlcnNpb24gb3IgY2VrTWRWZXJzaW9uLicpO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUlPLE1BQU1BLFFBQU4sQ0FBZTtFQVFwQkMsV0FBVyxDQUFDQyxVQUFELEVBQXFCO0lBQUEsS0FQaENDLHlCQU9nQztJQUFBLEtBTmhDQyxPQU1nQztJQUFBLEtBTGhDQyxVQUtnQztJQUFBLEtBSmhDQyxLQUlnQztJQUFBLEtBSGhDQyxVQUdnQztJQUFBLEtBRmhDQyxZQUVnQztJQUM5QixLQUFLSixPQUFMLEdBQWVGLFVBQWY7SUFDQSxLQUFLRyxVQUFMLEdBQWtCLENBQWxCO0lBQ0EsS0FBS0MsS0FBTCxHQUFhLENBQWI7SUFDQSxLQUFLQyxVQUFMLEdBQWtCLENBQWxCO0lBQ0EsS0FBS0MsWUFBTCxHQUFvQkMsTUFBTSxDQUFDQyxLQUFQLENBQWEsQ0FBYixDQUFwQjtJQUNBLEtBQUtQLHlCQUFMLEdBQWlDLEVBQWpDO0VBQ0Q7O0VBRURRLEdBQUcsQ0FBQ0MsWUFBRCxFQUF1QkMsSUFBdkIsRUFBcUNDLEtBQXJDLEVBQW9EQyxVQUFwRCxFQUF3RUMsU0FBeEUsRUFBMkZDLE9BQTNGLEVBQTRHQyxZQUE1RyxFQUFrSUMsYUFBbEksRUFBK0o7SUFDaEssTUFBTUMsYUFBZ0MsR0FBRztNQUN2Q1IsWUFEdUM7TUFFdkNDLElBRnVDO01BR3ZDQyxLQUh1QztNQUl2Q0MsVUFKdUM7TUFLdkNDLFNBTHVDO01BTXZDQyxPQU51QztNQU92Q0MsWUFQdUM7TUFRdkNDO0lBUnVDLENBQXpDO0lBV0EsS0FBS2hCLHlCQUFMLENBQStCa0IsSUFBL0IsQ0FBb0NELGFBQXBDOztJQUVBLElBQUksS0FBS2YsVUFBTCxLQUFvQixDQUF4QixFQUEyQjtNQUN6QixLQUFLQSxVQUFMLEdBQWtCUSxJQUFsQjtNQUNBLEtBQUtQLEtBQUwsR0FBYVEsS0FBYjtNQUNBLEtBQUtQLFVBQUwsR0FBa0JRLFVBQWxCO01BQ0EsS0FBS1AsWUFBTCxHQUFvQlEsU0FBcEI7SUFDRCxDQUxELE1BS08sSUFBSyxLQUFLWCxVQUFMLEtBQW9CUSxJQUFyQixJQUErQixLQUFLUCxLQUFMLEtBQWVRLEtBQTlDLElBQXlELEtBQUtQLFVBQUwsS0FBb0JRLFVBQTdFLElBQTRGLENBQUMsS0FBS1AsWUFBbEcsSUFBa0gsQ0FBQ1EsU0FBbkgsSUFBZ0ksS0FBS1IsWUFBTCxDQUFrQmMsTUFBbEIsS0FBNkJOLFNBQVMsQ0FBQ00sTUFBM0ssRUFBbUw7TUFDeEwsTUFBTSxJQUFJQyxLQUFKLENBQVUsd0RBQVYsQ0FBTjtJQUNEO0VBQ0Y7O0FBdkNtQiJ9
48
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDRUtFbnRyeSIsImNvbHVtbkVuY3J5cHRpb25LZXlWYWx1ZXMiLCJvcmRpbmFsIiwiZGF0YWJhc2VJZCIsImNla0lkIiwiY2VrVmVyc2lvbiIsImNla01kVmVyc2lvbiIsImNvbnN0cnVjdG9yIiwib3JkaW5hbFZhbCIsIkJ1ZmZlciIsImFsbG9jIiwiYWRkIiwiZW5jcnlwdGVkS2V5IiwiZGJJZCIsImtleUlkIiwia2V5VmVyc2lvbiIsIm1kVmVyc2lvbiIsImtleVBhdGgiLCJrZXlTdG9yZU5hbWUiLCJhbGdvcml0aG1OYW1lIiwiZW5jcnlwdGlvbktleSIsInB1c2giLCJsZW5ndGgiLCJFcnJvciIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC9jZWstZW50cnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IEVuY3J5cHRpb25LZXlJbmZvIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDRUtFbnRyeSB7XG4gIGNvbHVtbkVuY3J5cHRpb25LZXlWYWx1ZXM6IEVuY3J5cHRpb25LZXlJbmZvW107XG4gIG9yZGluYWw6IG51bWJlcjtcbiAgZGF0YWJhc2VJZDogbnVtYmVyO1xuICBjZWtJZDogbnVtYmVyO1xuICBjZWtWZXJzaW9uOiBudW1iZXI7XG4gIGNla01kVmVyc2lvbjogQnVmZmVyO1xuXG4gIGNvbnN0cnVjdG9yKG9yZGluYWxWYWw6IG51bWJlcikge1xuICAgIHRoaXMub3JkaW5hbCA9IG9yZGluYWxWYWw7XG4gICAgdGhpcy5kYXRhYmFzZUlkID0gMDtcbiAgICB0aGlzLmNla0lkID0gMDtcbiAgICB0aGlzLmNla1ZlcnNpb24gPSAwO1xuICAgIHRoaXMuY2VrTWRWZXJzaW9uID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIHRoaXMuY29sdW1uRW5jcnlwdGlvbktleVZhbHVlcyA9IFtdO1xuICB9XG5cbiAgYWRkKGVuY3J5cHRlZEtleTogQnVmZmVyLCBkYklkOiBudW1iZXIsIGtleUlkOiBudW1iZXIsIGtleVZlcnNpb246IG51bWJlciwgbWRWZXJzaW9uOiBCdWZmZXIsIGtleVBhdGg6IHN0cmluZywga2V5U3RvcmVOYW1lOiBzdHJpbmcsIGFsZ29yaXRobU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVuY3J5cHRpb25LZXk6IEVuY3J5cHRpb25LZXlJbmZvID0ge1xuICAgICAgZW5jcnlwdGVkS2V5LFxuICAgICAgZGJJZCxcbiAgICAgIGtleUlkLFxuICAgICAga2V5VmVyc2lvbixcbiAgICAgIG1kVmVyc2lvbixcbiAgICAgIGtleVBhdGgsXG4gICAgICBrZXlTdG9yZU5hbWUsXG4gICAgICBhbGdvcml0aG1OYW1lLFxuICAgIH07XG5cbiAgICB0aGlzLmNvbHVtbkVuY3J5cHRpb25LZXlWYWx1ZXMucHVzaChlbmNyeXB0aW9uS2V5KTtcblxuICAgIGlmICh0aGlzLmRhdGFiYXNlSWQgPT09IDApIHtcbiAgICAgIHRoaXMuZGF0YWJhc2VJZCA9IGRiSWQ7XG4gICAgICB0aGlzLmNla0lkID0ga2V5SWQ7XG4gICAgICB0aGlzLmNla1ZlcnNpb24gPSBrZXlWZXJzaW9uO1xuICAgICAgdGhpcy5jZWtNZFZlcnNpb24gPSBtZFZlcnNpb247XG4gICAgfSBlbHNlIGlmICgodGhpcy5kYXRhYmFzZUlkICE9PSBkYklkKSB8fCAodGhpcy5jZWtJZCAhPT0ga2V5SWQpIHx8ICh0aGlzLmNla1ZlcnNpb24gIT09IGtleVZlcnNpb24pIHx8ICF0aGlzLmNla01kVmVyc2lvbiB8fCAhbWRWZXJzaW9uIHx8IHRoaXMuY2VrTWRWZXJzaW9uLmxlbmd0aCAhPT0gbWRWZXJzaW9uLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGFiYXNlSWQsIGNla0lkLCBjZWtWZXJzaW9uIG9yIGNla01kVmVyc2lvbi4nKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7QUFJTyxNQUFNQSxRQUFRLENBQUM7RUFDcEJDLHlCQUF5QjtFQUN6QkMsT0FBTztFQUNQQyxVQUFVO0VBQ1ZDLEtBQUs7RUFDTEMsVUFBVTtFQUNWQyxZQUFZO0VBRVpDLFdBQVdBLENBQUNDLFVBQWtCLEVBQUU7SUFDOUIsSUFBSSxDQUFDTixPQUFPLEdBQUdNLFVBQVU7SUFDekIsSUFBSSxDQUFDTCxVQUFVLEdBQUcsQ0FBQztJQUNuQixJQUFJLENBQUNDLEtBQUssR0FBRyxDQUFDO0lBQ2QsSUFBSSxDQUFDQyxVQUFVLEdBQUcsQ0FBQztJQUNuQixJQUFJLENBQUNDLFlBQVksR0FBR0csTUFBTSxDQUFDQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQ1QseUJBQXlCLEdBQUcsRUFBRTtFQUNyQztFQUVBVSxHQUFHQSxDQUFDQyxZQUFvQixFQUFFQyxJQUFZLEVBQUVDLEtBQWEsRUFBRUMsVUFBa0IsRUFBRUMsU0FBaUIsRUFBRUMsT0FBZSxFQUFFQyxZQUFvQixFQUFFQyxhQUFxQixFQUFRO0lBQ2hLLE1BQU1DLGFBQWdDLEdBQUc7TUFDdkNSLFlBQVk7TUFDWkMsSUFBSTtNQUNKQyxLQUFLO01BQ0xDLFVBQVU7TUFDVkMsU0FBUztNQUNUQyxPQUFPO01BQ1BDLFlBQVk7TUFDWkM7SUFDRixDQUFDO0lBRUQsSUFBSSxDQUFDbEIseUJBQXlCLENBQUNvQixJQUFJLENBQUNELGFBQWEsQ0FBQztJQUVsRCxJQUFJLElBQUksQ0FBQ2pCLFVBQVUsS0FBSyxDQUFDLEVBQUU7TUFDekIsSUFBSSxDQUFDQSxVQUFVLEdBQUdVLElBQUk7TUFDdEIsSUFBSSxDQUFDVCxLQUFLLEdBQUdVLEtBQUs7TUFDbEIsSUFBSSxDQUFDVCxVQUFVLEdBQUdVLFVBQVU7TUFDNUIsSUFBSSxDQUFDVCxZQUFZLEdBQUdVLFNBQVM7SUFDL0IsQ0FBQyxNQUFNLElBQUssSUFBSSxDQUFDYixVQUFVLEtBQUtVLElBQUksSUFBTSxJQUFJLENBQUNULEtBQUssS0FBS1UsS0FBTSxJQUFLLElBQUksQ0FBQ1QsVUFBVSxLQUFLVSxVQUFXLElBQUksQ0FBQyxJQUFJLENBQUNULFlBQVksSUFBSSxDQUFDVSxTQUFTLElBQUksSUFBSSxDQUFDVixZQUFZLENBQUNnQixNQUFNLEtBQUtOLFNBQVMsQ0FBQ00sTUFBTSxFQUFFO01BQ3hMLE1BQU0sSUFBSUMsS0FBSyxDQUFDLHdEQUF3RCxDQUFDO0lBQzNFO0VBQ0Y7QUFDRjtBQUFDQyxPQUFBLENBQUF4QixRQUFBLEdBQUFBLFFBQUEifQ==
@@ -0,0 +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"}
@@ -4,54 +4,40 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getParameterEncryptionMetadata = void 0;
7
-
8
7
  var _types = require("./types");
9
-
10
8
  var _cekEntry = require("./cek-entry");
11
-
12
9
  var _keyCrypto = require("./key-crypto");
13
-
14
10
  var _dataType = require("../data-type");
15
-
16
11
  var _request = _interopRequireDefault(require("../request"));
17
-
18
12
  var _rpcrequestPayload = _interopRequireDefault(require("../rpcrequest-payload"));
19
-
20
13
  var _packet = require("../packet");
21
-
22
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
-
24
15
  // This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
25
16
  // Copyright (c) 2019 Microsoft Corporation
17
+
26
18
  const getParameterEncryptionMetadata = (connection, request, callback) => {
27
19
  if (request.cryptoMetadataLoaded === true) {
28
20
  return callback();
29
21
  }
30
-
31
22
  const metadataRequest = new _request.default('sp_describe_parameter_encryption', error => {
32
23
  if (error) {
33
24
  return callback(error);
34
25
  }
35
-
36
26
  const decryptSymmetricKeyPromises = [];
37
27
  const cekList = [];
38
28
  let paramCount = 0;
39
-
40
29
  for (const columns of resultRows) {
41
30
  try {
42
31
  const isFirstRecordSet = columns.some(col => (col && col.metadata && col.metadata.colName) === 'database_id');
43
-
44
32
  if (isFirstRecordSet === true) {
45
33
  const currentOrdinal = columns[_types.DescribeParameterEncryptionResultSet1.KeyOrdinal].value;
46
34
  let cekEntry;
47
-
48
35
  if (!cekList[currentOrdinal]) {
49
36
  cekEntry = new _cekEntry.CEKEntry(currentOrdinal);
50
37
  cekList[cekEntry.ordinal] = cekEntry;
51
38
  } else {
52
39
  cekEntry = cekList[currentOrdinal];
53
40
  }
54
-
55
41
  cekEntry.add(columns[_types.DescribeParameterEncryptionResultSet1.EncryptedKey].value, columns[_types.DescribeParameterEncryptionResultSet1.DbId].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyId].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyVersion].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyMdVersion].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyPath].value, columns[_types.DescribeParameterEncryptionResultSet1.ProviderName].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyEncryptionAlgorithm].value);
56
42
  } else {
57
43
  paramCount++;
@@ -59,13 +45,10 @@ const getParameterEncryptionMetadata = (connection, request, callback) => {
59
45
  const paramIndex = request.parameters.findIndex(param => paramName === `@${param.name}`);
60
46
  const cekOrdinal = columns[_types.DescribeParameterEncryptionResultSet2.ColumnEncryptionKeyOrdinal].value;
61
47
  const cekEntry = cekList[cekOrdinal];
62
-
63
48
  if (cekEntry && cekList.length < cekOrdinal) {
64
49
  return callback(new Error(`Internal error. The referenced column encryption key ordinal "${cekOrdinal}" is missing in the encryption metadata returned by sp_describe_parameter_encryption. Max ordinal is "${cekList.length}".`));
65
50
  }
66
-
67
51
  const encType = columns[_types.DescribeParameterEncryptionResultSet2.ColumnEncrytionType].value;
68
-
69
52
  if (_types.SQLServerEncryptionType.PlainText !== encType) {
70
53
  request.parameters[paramIndex].cryptoMetadata = {
71
54
  cekEntry: cekEntry,
@@ -83,11 +66,9 @@ const getParameterEncryptionMetadata = (connection, request, callback) => {
83
66
  return callback(new Error(`Internal error. Unable to parse parameter encryption metadata in statement or procedure "${request.sqlTextOrProcedure}"`));
84
67
  }
85
68
  }
86
-
87
69
  if (paramCount !== request.parameters.length) {
88
70
  return callback(new Error(`Internal error. Metadata for some parameters in statement or procedure "${request.sqlTextOrProcedure}" is missing in the resultset returned by sp_describe_parameter_encryption.`));
89
71
  }
90
-
91
72
  return Promise.all(decryptSymmetricKeyPromises).then(() => {
92
73
  request.cryptoMetadataLoaded = true;
93
74
  process.nextTick(callback);
@@ -96,17 +77,14 @@ const getParameterEncryptionMetadata = (connection, request, callback) => {
96
77
  });
97
78
  });
98
79
  metadataRequest.addParameter('tsql', _dataType.typeByName.NVarChar, request.sqlTextOrProcedure);
99
-
100
80
  if (request.parameters.length) {
101
81
  metadataRequest.addParameter('params', _dataType.typeByName.NVarChar, metadataRequest.makeParamsParameter(request.parameters));
102
82
  }
103
-
104
83
  const resultRows = [];
105
84
  metadataRequest.on('row', columns => {
106
85
  resultRows.push(columns);
107
86
  });
108
87
  connection.makeRequest(metadataRequest, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(metadataRequest.sqlTextOrProcedure, metadataRequest.parameters, connection.currentTransactionDescriptor(), connection.config.options, connection.databaseCollation));
109
88
  };
110
-
111
89
  exports.getParameterEncryptionMetadata = getParameterEncryptionMetadata;
112
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRQYXJhbWV0ZXJFbmNyeXB0aW9uTWV0YWRhdGEiLCJjb25uZWN0aW9uIiwicmVxdWVzdCIsImNhbGxiYWNrIiwiY3J5cHRvTWV0YWRhdGFMb2FkZWQiLCJtZXRhZGF0YVJlcXVlc3QiLCJSZXF1ZXN0IiwiZXJyb3IiLCJkZWNyeXB0U3ltbWV0cmljS2V5UHJvbWlzZXMiLCJjZWtMaXN0IiwicGFyYW1Db3VudCIsImNvbHVtbnMiLCJyZXN1bHRSb3dzIiwiaXNGaXJzdFJlY29yZFNldCIsInNvbWUiLCJjb2wiLCJtZXRhZGF0YSIsImNvbE5hbWUiLCJjdXJyZW50T3JkaW5hbCIsIkRlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEiLCJLZXlPcmRpbmFsIiwidmFsdWUiLCJjZWtFbnRyeSIsIkNFS0VudHJ5Iiwib3JkaW5hbCIsImFkZCIsIkVuY3J5cHRlZEtleSIsIkRiSWQiLCJLZXlJZCIsIktleVZlcnNpb24iLCJLZXlNZFZlcnNpb24iLCJLZXlQYXRoIiwiUHJvdmlkZXJOYW1lIiwiS2V5RW5jcnlwdGlvbkFsZ29yaXRobSIsInBhcmFtTmFtZSIsIkRlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIiLCJQYXJhbWV0ZXJOYW1lIiwicGFyYW1JbmRleCIsInBhcmFtZXRlcnMiLCJmaW5kSW5kZXgiLCJwYXJhbSIsIm5hbWUiLCJjZWtPcmRpbmFsIiwiQ29sdW1uRW5jcnlwdGlvbktleU9yZGluYWwiLCJsZW5ndGgiLCJFcnJvciIsImVuY1R5cGUiLCJDb2x1bW5FbmNyeXRpb25UeXBlIiwiU1FMU2VydmVyRW5jcnlwdGlvblR5cGUiLCJQbGFpblRleHQiLCJjcnlwdG9NZXRhZGF0YSIsImNpcGhlckFsZ29yaXRobUlkIiwiQ29sdW1uRW5jcnlwdGlvbkFsZ29yaXRobSIsImVuY3J5cHRpb25UeXBlIiwibm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uIiwiQnVmZmVyIiwiZnJvbSIsIk5vcm1hbGl6YXRpb25SdWxlVmVyc2lvbiIsInB1c2giLCJjb25maWciLCJvcHRpb25zIiwiZm9yY2VFbmNyeXB0Iiwic3FsVGV4dE9yUHJvY2VkdXJlIiwiUHJvbWlzZSIsImFsbCIsInRoZW4iLCJwcm9jZXNzIiwibmV4dFRpY2siLCJhZGRQYXJhbWV0ZXIiLCJUWVBFUyIsIk5WYXJDaGFyIiwibWFrZVBhcmFtc1BhcmFtZXRlciIsIm9uIiwibWFrZVJlcXVlc3QiLCJUWVBFIiwiUlBDX1JFUVVFU1QiLCJScGNSZXF1ZXN0UGF5bG9hZCIsImN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IiLCJkYXRhYmFzZUNvbGxhdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2dldC1wYXJhbWV0ZXItZW5jcnlwdGlvbi1tZXRhZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgU1FMU2VydmVyRW5jcnlwdGlvblR5cGUsIENyeXB0b01ldGFkYXRhLCBEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLCBEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBDRUtFbnRyeSB9IGZyb20gJy4vY2VrLWVudHJ5JztcbmltcG9ydCB7IGRlY3J5cHRTeW1tZXRyaWNLZXkgfSBmcm9tICcuL2tleS1jcnlwdG8nO1xuaW1wb3J0IHsgdHlwZUJ5TmFtZSBhcyBUWVBFUywgUGFyYW1ldGVyIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuaW1wb3J0IENvbm5lY3Rpb24gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgUnBjUmVxdWVzdFBheWxvYWQgZnJvbSAnLi4vcnBjcmVxdWVzdC1wYXlsb2FkJztcbmltcG9ydCB7IFRZUEUgfSBmcm9tICcuLi9wYWNrZXQnO1xuXG5leHBvcnQgY29uc3QgZ2V0UGFyYW1ldGVyRW5jcnlwdGlvbk1ldGFkYXRhID0gKGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIHJlcXVlc3Q6IFJlcXVlc3QsIGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvcikgPT4gdm9pZCkgPT4ge1xuICBpZiAocmVxdWVzdC5jcnlwdG9NZXRhZGF0YUxvYWRlZCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG5cbiAgY29uc3QgbWV0YWRhdGFSZXF1ZXN0ID0gbmV3IFJlcXVlc3QoJ3NwX2Rlc2NyaWJlX3BhcmFtZXRlcl9lbmNyeXB0aW9uJywgKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgY29uc3QgY2VrTGlzdDogQ0VLRW50cnlbXSA9IFtdO1xuICAgIGxldCBwYXJhbUNvdW50ID0gMDtcblxuICAgIGZvciAoY29uc3QgY29sdW1ucyBvZiByZXN1bHRSb3dzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpc0ZpcnN0UmVjb3JkU2V0ID0gY29sdW1ucy5zb21lKChjb2w6IGFueSkgPT4gKGNvbCAmJiBjb2wubWV0YWRhdGEgJiYgY29sLm1ldGFkYXRhLmNvbE5hbWUpID09PSAnZGF0YWJhc2VfaWQnKTtcbiAgICAgICAgaWYgKGlzRmlyc3RSZWNvcmRTZXQgPT09IHRydWUpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50T3JkaW5hbCA9IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlPcmRpbmFsXS52YWx1ZTtcbiAgICAgICAgICBsZXQgY2VrRW50cnk6IENFS0VudHJ5O1xuICAgICAgICAgIGlmICghY2VrTGlzdFtjdXJyZW50T3JkaW5hbF0pIHtcbiAgICAgICAgICAgIGNla0VudHJ5ID0gbmV3IENFS0VudHJ5KGN1cnJlbnRPcmRpbmFsKTtcbiAgICAgICAgICAgIGNla0xpc3RbY2VrRW50cnkub3JkaW5hbF0gPSBjZWtFbnRyeTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2VrRW50cnkgPSBjZWtMaXN0W2N1cnJlbnRPcmRpbmFsXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2VrRW50cnkuYWRkKGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5FbmNyeXB0ZWRLZXldLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuRGJJZF0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlJZF0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlWZXJzaW9uXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleU1kVmVyc2lvbl0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlQYXRoXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLlByb3ZpZGVyTmFtZV0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlFbmNyeXB0aW9uQWxnb3JpdGhtXS52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyYW1Db3VudCsrO1xuICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZTogc3RyaW5nID0gY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyLlBhcmFtZXRlck5hbWVdLnZhbHVlO1xuICAgICAgICAgIGNvbnN0IHBhcmFtSW5kZXg6IG51bWJlciA9IHJlcXVlc3QucGFyYW1ldGVycy5maW5kSW5kZXgoKHBhcmFtOiBQYXJhbWV0ZXIpID0+IHBhcmFtTmFtZSA9PT0gYEAke3BhcmFtLm5hbWV9YCk7XG4gICAgICAgICAgY29uc3QgY2VrT3JkaW5hbDogbnVtYmVyID0gY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyLkNvbHVtbkVuY3J5cHRpb25LZXlPcmRpbmFsXS52YWx1ZTtcbiAgICAgICAgICBjb25zdCBjZWtFbnRyeTogQ0VLRW50cnkgPSBjZWtMaXN0W2Nla09yZGluYWxdO1xuXG4gICAgICAgICAgaWYgKGNla0VudHJ5ICYmIGNla0xpc3QubGVuZ3RoIDwgY2VrT3JkaW5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3IuIFRoZSByZWZlcmVuY2VkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBvcmRpbmFsIFwiJHtjZWtPcmRpbmFsfVwiIGlzIG1pc3NpbmcgaW4gdGhlIGVuY3J5cHRpb24gbWV0YWRhdGEgcmV0dXJuZWQgYnkgc3BfZGVzY3JpYmVfcGFyYW1ldGVyX2VuY3J5cHRpb24uIE1heCBvcmRpbmFsIGlzIFwiJHtjZWtMaXN0Lmxlbmd0aH1cIi5gKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZW5jVHlwZSA9IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5Db2x1bW5FbmNyeXRpb25UeXBlXS52YWx1ZTtcbiAgICAgICAgICBpZiAoU1FMU2VydmVyRW5jcnlwdGlvblR5cGUuUGxhaW5UZXh0ICE9PSBlbmNUeXBlKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnBhcmFtZXRlcnNbcGFyYW1JbmRleF0uY3J5cHRvTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAgIGNla0VudHJ5OiBjZWtFbnRyeSxcbiAgICAgICAgICAgICAgb3JkaW5hbDogY2VrT3JkaW5hbCxcbiAgICAgICAgICAgICAgY2lwaGVyQWxnb3JpdGhtSWQ6IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5Db2x1bW5FbmNyeXB0aW9uQWxnb3JpdGhtXS52YWx1ZSxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvblR5cGU6IGVuY1R5cGUsXG4gICAgICAgICAgICAgIG5vcm1hbGl6YXRpb25SdWxlVmVyc2lvbjogQnVmZmVyLmZyb20oW2NvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5Ob3JtYWxpemF0aW9uUnVsZVZlcnNpb25dLnZhbHVlXSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGVjcnlwdFN5bW1ldHJpY0tleVByb21pc2VzLnB1c2goZGVjcnlwdFN5bW1ldHJpY0tleShyZXF1ZXN0LnBhcmFtZXRlcnNbcGFyYW1JbmRleF0uY3J5cHRvTWV0YWRhdGEgYXMgQ3J5cHRvTWV0YWRhdGEsIGNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QucGFyYW1ldGVyc1twYXJhbUluZGV4XS5mb3JjZUVuY3J5cHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYENhbm5vdCBleGVjdXRlIHN0YXRlbWVudCBvciBwcm9jZWR1cmUgJHtyZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZX0gYmVjYXVzZSBGb3JjZSBFbmNyeXB0aW9uIHdhcyBzZXQgYXMgdHJ1ZSBmb3IgcGFyYW1ldGVyICR7cGFyYW1JbmRleCArIDF9IGFuZCB0aGUgZGF0YWJhc2UgZXhwZWN0cyB0aGlzIHBhcmFtZXRlciB0byBiZSBzZW50IGFzIHBsYWludGV4dC4gVGhpcyBtYXkgYmUgZHVlIHRvIGEgY29uZmlndXJhdGlvbiBlcnJvci5gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3IuIFVuYWJsZSB0byBwYXJzZSBwYXJhbWV0ZXIgZW5jcnlwdGlvbiBtZXRhZGF0YSBpbiBzdGF0ZW1lbnQgb3IgcHJvY2VkdXJlIFwiJHtyZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZX1cImApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1Db3VudCAhPT0gcmVxdWVzdC5wYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3IuIE1ldGFkYXRhIGZvciBzb21lIHBhcmFtZXRlcnMgaW4gc3RhdGVtZW50IG9yIHByb2NlZHVyZSBcIiR7cmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmV9XCIgaXMgbWlzc2luZyBpbiB0aGUgcmVzdWx0c2V0IHJldHVybmVkIGJ5IHNwX2Rlc2NyaWJlX3BhcmFtZXRlcl9lbmNyeXB0aW9uLmApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoZGVjcnlwdFN5bW1ldHJpY0tleVByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgIHJlcXVlc3QuY3J5cHRvTWV0YWRhdGFMb2FkZWQgPSB0cnVlO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjayk7XG4gICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBlcnJvcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIG1ldGFkYXRhUmVxdWVzdC5hZGRQYXJhbWV0ZXIoJ3RzcWwnLCBUWVBFUy5OVmFyQ2hhciwgcmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmUpO1xuICBpZiAocmVxdWVzdC5wYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgIG1ldGFkYXRhUmVxdWVzdC5hZGRQYXJhbWV0ZXIoJ3BhcmFtcycsIFRZUEVTLk5WYXJDaGFyLCBtZXRhZGF0YVJlcXVlc3QubWFrZVBhcmFtc1BhcmFtZXRlcihyZXF1ZXN0LnBhcmFtZXRlcnMpKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdFJvd3M6IGFueVtdID0gW107XG5cbiAgbWV0YWRhdGFSZXF1ZXN0Lm9uKCdyb3cnLCAoY29sdW1uczogYW55KSA9PiB7XG4gICAgcmVzdWx0Um93cy5wdXNoKGNvbHVtbnMpO1xuICB9KTtcblxuICBjb25uZWN0aW9uLm1ha2VSZXF1ZXN0KG1ldGFkYXRhUmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKG1ldGFkYXRhUmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmUhLCBtZXRhZGF0YVJlcXVlc3QucGFyYW1ldGVycywgY29ubmVjdGlvbi5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIGNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMsIGNvbm5lY3Rpb24uZGF0YWJhc2VDb2xsYXRpb24pKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7OztBQVZBO0FBQ0E7QUFXTyxNQUFNQSw4QkFBOEIsR0FBRyxDQUFDQyxVQUFELEVBQXlCQyxPQUF6QixFQUEyQ0MsUUFBM0MsS0FBaUY7RUFDN0gsSUFBSUQsT0FBTyxDQUFDRSxvQkFBUixLQUFpQyxJQUFyQyxFQUEyQztJQUN6QyxPQUFPRCxRQUFRLEVBQWY7RUFDRDs7RUFFRCxNQUFNRSxlQUFlLEdBQUcsSUFBSUMsZ0JBQUosQ0FBWSxrQ0FBWixFQUFpREMsS0FB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
90
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZXMiLCJyZXF1aXJlIiwiX2Nla0VudHJ5IiwiX2tleUNyeXB0byIsIl9kYXRhVHlwZSIsIl9yZXF1ZXN0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9ycGNyZXF1ZXN0UGF5bG9hZCIsIl9wYWNrZXQiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImdldFBhcmFtZXRlckVuY3J5cHRpb25NZXRhZGF0YSIsImNvbm5lY3Rpb24iLCJyZXF1ZXN0IiwiY2FsbGJhY2siLCJjcnlwdG9NZXRhZGF0YUxvYWRlZCIsIm1ldGFkYXRhUmVxdWVzdCIsIlJlcXVlc3QiLCJlcnJvciIsImRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlcyIsImNla0xpc3QiLCJwYXJhbUNvdW50IiwiY29sdW1ucyIsInJlc3VsdFJvd3MiLCJpc0ZpcnN0UmVjb3JkU2V0Iiwic29tZSIsImNvbCIsIm1ldGFkYXRhIiwiY29sTmFtZSIsImN1cnJlbnRPcmRpbmFsIiwiRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MSIsIktleU9yZGluYWwiLCJ2YWx1ZSIsImNla0VudHJ5IiwiQ0VLRW50cnkiLCJvcmRpbmFsIiwiYWRkIiwiRW5jcnlwdGVkS2V5IiwiRGJJZCIsIktleUlkIiwiS2V5VmVyc2lvbiIsIktleU1kVmVyc2lvbiIsIktleVBhdGgiLCJQcm92aWRlck5hbWUiLCJLZXlFbmNyeXB0aW9uQWxnb3JpdGhtIiwicGFyYW1OYW1lIiwiRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MiIsIlBhcmFtZXRlck5hbWUiLCJwYXJhbUluZGV4IiwicGFyYW1ldGVycyIsImZpbmRJbmRleCIsInBhcmFtIiwibmFtZSIsImNla09yZGluYWwiLCJDb2x1bW5FbmNyeXB0aW9uS2V5T3JkaW5hbCIsImxlbmd0aCIsIkVycm9yIiwiZW5jVHlwZSIsIkNvbHVtbkVuY3J5dGlvblR5cGUiLCJTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSIsIlBsYWluVGV4dCIsImNyeXB0b01ldGFkYXRhIiwiY2lwaGVyQWxnb3JpdGhtSWQiLCJDb2x1bW5FbmNyeXB0aW9uQWxnb3JpdGhtIiwiZW5jcnlwdGlvblR5cGUiLCJub3JtYWxpemF0aW9uUnVsZVZlcnNpb24iLCJCdWZmZXIiLCJmcm9tIiwiTm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uIiwicHVzaCIsImRlY3J5cHRTeW1tZXRyaWNLZXkiLCJjb25maWciLCJvcHRpb25zIiwiZm9yY2VFbmNyeXB0Iiwic3FsVGV4dE9yUHJvY2VkdXJlIiwiUHJvbWlzZSIsImFsbCIsInRoZW4iLCJwcm9jZXNzIiwibmV4dFRpY2siLCJhZGRQYXJhbWV0ZXIiLCJUWVBFUyIsIk5WYXJDaGFyIiwibWFrZVBhcmFtc1BhcmFtZXRlciIsIm9uIiwibWFrZVJlcXVlc3QiLCJUWVBFIiwiUlBDX1JFUVVFU1QiLCJScGNSZXF1ZXN0UGF5bG9hZCIsImN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IiLCJkYXRhYmFzZUNvbGxhdGlvbiIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC9nZXQtcGFyYW1ldGVyLWVuY3J5cHRpb24tbWV0YWRhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IFNRTFNlcnZlckVuY3J5cHRpb25UeXBlLCBDcnlwdG9NZXRhZGF0YSwgRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MSwgRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQ0VLRW50cnkgfSBmcm9tICcuL2Nlay1lbnRyeSc7XG5pbXBvcnQgeyBkZWNyeXB0U3ltbWV0cmljS2V5IH0gZnJvbSAnLi9rZXktY3J5cHRvJztcbmltcG9ydCB7IHR5cGVCeU5hbWUgYXMgVFlQRVMsIFBhcmFtZXRlciB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi9yZXF1ZXN0JztcbmltcG9ydCBDb25uZWN0aW9uIGZyb20gJy4uL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IFJwY1JlcXVlc3RQYXlsb2FkIGZyb20gJy4uL3JwY3JlcXVlc3QtcGF5bG9hZCc7XG5pbXBvcnQgeyBUWVBFIH0gZnJvbSAnLi4vcGFja2V0JztcblxuZXhwb3J0IGNvbnN0IGdldFBhcmFtZXRlckVuY3J5cHRpb25NZXRhZGF0YSA9IChjb25uZWN0aW9uOiBDb25uZWN0aW9uLCByZXF1ZXN0OiBSZXF1ZXN0LCBjYWxsYmFjazogKGVycm9yPzogRXJyb3IpID0+IHZvaWQpID0+IHtcbiAgaWYgKHJlcXVlc3QuY3J5cHRvTWV0YWRhdGFMb2FkZWQgPT09IHRydWUpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfVxuXG4gIGNvbnN0IG1ldGFkYXRhUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KCdzcF9kZXNjcmliZV9wYXJhbWV0ZXJfZW5jcnlwdGlvbicsIChlcnJvcikgPT4ge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycm9yKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNyeXB0U3ltbWV0cmljS2V5UHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGNvbnN0IGNla0xpc3Q6IENFS0VudHJ5W10gPSBbXTtcbiAgICBsZXQgcGFyYW1Db3VudCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbnMgb2YgcmVzdWx0Um93cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaXNGaXJzdFJlY29yZFNldCA9IGNvbHVtbnMuc29tZSgoY29sOiBhbnkpID0+IChjb2wgJiYgY29sLm1ldGFkYXRhICYmIGNvbC5tZXRhZGF0YS5jb2xOYW1lKSA9PT0gJ2RhdGFiYXNlX2lkJyk7XG4gICAgICAgIGlmIChpc0ZpcnN0UmVjb3JkU2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudE9yZGluYWwgPSBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5T3JkaW5hbF0udmFsdWU7XG4gICAgICAgICAgbGV0IGNla0VudHJ5OiBDRUtFbnRyeTtcbiAgICAgICAgICBpZiAoIWNla0xpc3RbY3VycmVudE9yZGluYWxdKSB7XG4gICAgICAgICAgICBjZWtFbnRyeSA9IG5ldyBDRUtFbnRyeShjdXJyZW50T3JkaW5hbCk7XG4gICAgICAgICAgICBjZWtMaXN0W2Nla0VudHJ5Lm9yZGluYWxdID0gY2VrRW50cnk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNla0VudHJ5ID0gY2VrTGlzdFtjdXJyZW50T3JkaW5hbF07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNla0VudHJ5LmFkZChjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuRW5jcnlwdGVkS2V5XS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLkRiSWRdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5SWRdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5VmVyc2lvbl0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlNZFZlcnNpb25dLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5UGF0aF0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5Qcm92aWRlck5hbWVdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5RW5jcnlwdGlvbkFsZ29yaXRobV0udmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmFtQ291bnQrKztcbiAgICAgICAgICBjb25zdCBwYXJhbU5hbWU6IHN0cmluZyA9IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5QYXJhbWV0ZXJOYW1lXS52YWx1ZTtcbiAgICAgICAgICBjb25zdCBwYXJhbUluZGV4OiBudW1iZXIgPSByZXF1ZXN0LnBhcmFtZXRlcnMuZmluZEluZGV4KChwYXJhbTogUGFyYW1ldGVyKSA9PiBwYXJhbU5hbWUgPT09IGBAJHtwYXJhbS5uYW1lfWApO1xuICAgICAgICAgIGNvbnN0IGNla09yZGluYWw6IG51bWJlciA9IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5Db2x1bW5FbmNyeXB0aW9uS2V5T3JkaW5hbF0udmFsdWU7XG4gICAgICAgICAgY29uc3QgY2VrRW50cnk6IENFS0VudHJ5ID0gY2VrTGlzdFtjZWtPcmRpbmFsXTtcblxuICAgICAgICAgIGlmIChjZWtFbnRyeSAmJiBjZWtMaXN0Lmxlbmd0aCA8IGNla09yZGluYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYEludGVybmFsIGVycm9yLiBUaGUgcmVmZXJlbmNlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgb3JkaW5hbCBcIiR7Y2VrT3JkaW5hbH1cIiBpcyBtaXNzaW5nIGluIHRoZSBlbmNyeXB0aW9uIG1ldGFkYXRhIHJldHVybmVkIGJ5IHNwX2Rlc2NyaWJlX3BhcmFtZXRlcl9lbmNyeXB0aW9uLiBNYXggb3JkaW5hbCBpcyBcIiR7Y2VrTGlzdC5sZW5ndGh9XCIuYCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVuY1R5cGUgPSBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuQ29sdW1uRW5jcnl0aW9uVHlwZV0udmFsdWU7XG4gICAgICAgICAgaWYgKFNRTFNlcnZlckVuY3J5cHRpb25UeXBlLlBsYWluVGV4dCAhPT0gZW5jVHlwZSkge1xuICAgICAgICAgICAgcmVxdWVzdC5wYXJhbWV0ZXJzW3BhcmFtSW5kZXhdLmNyeXB0b01ldGFkYXRhID0ge1xuICAgICAgICAgICAgICBjZWtFbnRyeTogY2VrRW50cnksXG4gICAgICAgICAgICAgIG9yZGluYWw6IGNla09yZGluYWwsXG4gICAgICAgICAgICAgIGNpcGhlckFsZ29yaXRobUlkOiBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuQ29sdW1uRW5jcnlwdGlvbkFsZ29yaXRobV0udmFsdWUsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25UeXBlOiBlbmNUeXBlLFxuICAgICAgICAgICAgICBub3JtYWxpemF0aW9uUnVsZVZlcnNpb246IEJ1ZmZlci5mcm9tKFtjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuTm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uXS52YWx1ZV0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlcy5wdXNoKGRlY3J5cHRTeW1tZXRyaWNLZXkocmVxdWVzdC5wYXJhbWV0ZXJzW3BhcmFtSW5kZXhdLmNyeXB0b01ldGFkYXRhIGFzIENyeXB0b01ldGFkYXRhLCBjb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LnBhcmFtZXRlcnNbcGFyYW1JbmRleF0uZm9yY2VFbmNyeXB0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBDYW5ub3QgZXhlY3V0ZSBzdGF0ZW1lbnQgb3IgcHJvY2VkdXJlICR7cmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmV9IGJlY2F1c2UgRm9yY2UgRW5jcnlwdGlvbiB3YXMgc2V0IGFzIHRydWUgZm9yIHBhcmFtZXRlciAke3BhcmFtSW5kZXggKyAxfSBhbmQgdGhlIGRhdGFiYXNlIGV4cGVjdHMgdGhpcyBwYXJhbWV0ZXIgdG8gYmUgc2VudCBhcyBwbGFpbnRleHQuIFRoaXMgbWF5IGJlIGR1ZSB0byBhIGNvbmZpZ3VyYXRpb24gZXJyb3IuYCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYEludGVybmFsIGVycm9yLiBVbmFibGUgdG8gcGFyc2UgcGFyYW1ldGVyIGVuY3J5cHRpb24gbWV0YWRhdGEgaW4gc3RhdGVtZW50IG9yIHByb2NlZHVyZSBcIiR7cmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmV9XCJgKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtQ291bnQgIT09IHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYEludGVybmFsIGVycm9yLiBNZXRhZGF0YSBmb3Igc29tZSBwYXJhbWV0ZXJzIGluIHN0YXRlbWVudCBvciBwcm9jZWR1cmUgXCIke3JlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlfVwiIGlzIG1pc3NpbmcgaW4gdGhlIHJlc3VsdHNldCByZXR1cm5lZCBieSBzcF9kZXNjcmliZV9wYXJhbWV0ZXJfZW5jcnlwdGlvbi5gKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICByZXF1ZXN0LmNyeXB0b01ldGFkYXRhTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spO1xuICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaywgZXJyb3IpO1xuICAgIH0pO1xuICB9KTtcblxuICBtZXRhZGF0YVJlcXVlc3QuYWRkUGFyYW1ldGVyKCd0c3FsJywgVFlQRVMuTlZhckNoYXIsIHJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlKTtcbiAgaWYgKHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICBtZXRhZGF0YVJlcXVlc3QuYWRkUGFyYW1ldGVyKCdwYXJhbXMnLCBUWVBFUy5OVmFyQ2hhciwgbWV0YWRhdGFSZXF1ZXN0Lm1ha2VQYXJhbXNQYXJhbWV0ZXIocmVxdWVzdC5wYXJhbWV0ZXJzKSk7XG4gIH1cblxuICBjb25zdCByZXN1bHRSb3dzOiBhbnlbXSA9IFtdO1xuXG4gIG1ldGFkYXRhUmVxdWVzdC5vbigncm93JywgKGNvbHVtbnM6IGFueSkgPT4ge1xuICAgIHJlc3VsdFJvd3MucHVzaChjb2x1bW5zKTtcbiAgfSk7XG5cbiAgY29ubmVjdGlvbi5tYWtlUmVxdWVzdChtZXRhZGF0YVJlcXVlc3QsIFRZUEUuUlBDX1JFUVVFU1QsIG5ldyBScGNSZXF1ZXN0UGF5bG9hZChtZXRhZGF0YVJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlISwgbWV0YWRhdGFSZXF1ZXN0LnBhcmFtZXRlcnMsIGNvbm5lY3Rpb24uY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCBjb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLCBjb25uZWN0aW9uLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxV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
@@ -0,0 +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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"}