libmongocrypt-helper 1.7.4.0.1001 → 1.8.0.0.1001

Sign up to get free protection for your applications and to get access to all the features.
Files changed (398) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/ext/libmongocrypt/extconf.rb +2 -2
  4. data/ext/libmongocrypt/libmongocrypt/CHANGELOG.md +9 -7
  5. data/ext/libmongocrypt/libmongocrypt/CMakeLists.txt +17 -23
  6. data/ext/libmongocrypt/libmongocrypt/Earthfile +374 -0
  7. data/ext/libmongocrypt/libmongocrypt/README.md +7 -7
  8. data/ext/libmongocrypt/libmongocrypt/VERSION_CURRENT +1 -1
  9. data/ext/libmongocrypt/libmongocrypt/bindings/cs/MongoDB.Libmongocrypt/CryptClient.cs +25 -6
  10. data/ext/libmongocrypt/libmongocrypt/bindings/cs/MongoDB.Libmongocrypt/Library.cs +25 -3
  11. data/ext/libmongocrypt/libmongocrypt/bindings/cs/MongoDB.Libmongocrypt.Example/MongoDB.Libmongocrypt.Example.csproj +1 -1
  12. data/ext/libmongocrypt/libmongocrypt/bindings/cs/MongoDB.Libmongocrypt.Test/BasicTests.cs +1 -1
  13. data/ext/libmongocrypt/libmongocrypt/bindings/cs/Scripts/build.cake +3 -2
  14. data/ext/libmongocrypt/libmongocrypt/bindings/cs/cs.sln +79 -0
  15. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/build.gradle.kts +2 -2
  16. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/java/com/mongodb/crypt/capi/MongoCryptTest.java +6 -4
  17. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/fle2-find-range-explicit-v2/int32/encrypted-payload.json +26 -0
  18. data/ext/libmongocrypt/libmongocrypt/bindings/node/CHANGELOG.md +24 -0
  19. data/ext/libmongocrypt/libmongocrypt/bindings/node/README.md +134 -5
  20. data/ext/libmongocrypt/libmongocrypt/bindings/node/etc/build-static.sh +3 -6
  21. data/ext/libmongocrypt/libmongocrypt/bindings/node/index.d.ts +203 -77
  22. data/ext/libmongocrypt/libmongocrypt/bindings/node/lib/autoEncrypter.js +1 -1
  23. data/ext/libmongocrypt/libmongocrypt/bindings/node/lib/clientEncryption.js +165 -43
  24. data/ext/libmongocrypt/libmongocrypt/bindings/node/lib/common.js +12 -14
  25. data/ext/libmongocrypt/libmongocrypt/bindings/node/lib/errors.js +75 -0
  26. data/ext/libmongocrypt/libmongocrypt/bindings/node/lib/index.js +34 -3
  27. data/ext/libmongocrypt/libmongocrypt/bindings/node/lib/providers/aws.js +26 -0
  28. data/ext/libmongocrypt/libmongocrypt/bindings/node/lib/providers/azure.js +178 -0
  29. data/ext/libmongocrypt/libmongocrypt/bindings/node/lib/providers/gcp.js +24 -0
  30. data/ext/libmongocrypt/libmongocrypt/bindings/node/lib/providers/index.js +54 -0
  31. data/ext/libmongocrypt/libmongocrypt/bindings/node/lib/providers/utils.js +39 -0
  32. data/ext/libmongocrypt/libmongocrypt/bindings/node/lib/stateMachine.js +9 -4
  33. data/ext/libmongocrypt/libmongocrypt/bindings/node/package-lock.json +4440 -5189
  34. data/ext/libmongocrypt/libmongocrypt/bindings/node/package.json +27 -8
  35. data/ext/libmongocrypt/libmongocrypt/bindings/node/src/mongocrypt.cc +65 -38
  36. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/autoEncrypter.test.js +4 -7
  37. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/clientEncryption.test.js +434 -42
  38. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/common.test.js +94 -0
  39. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/cryptoCallbacks.test.js +1 -45
  40. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/index.test.js +45 -0
  41. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/mongocryptdManager.test.js +1 -1
  42. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/providers/credentialsProvider.test.js +551 -0
  43. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/release.test.js +10 -3
  44. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/requirements.helper.js +23 -1
  45. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/stateMachine.test.js +1 -1
  46. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/tools/chai-addons.js +8 -0
  47. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/types/index.test-d.ts +63 -0
  48. data/ext/libmongocrypt/libmongocrypt/bindings/python/CHANGELOG.rst +26 -0
  49. data/ext/libmongocrypt/libmongocrypt/bindings/python/README.rst +2 -2
  50. data/ext/libmongocrypt/libmongocrypt/bindings/python/build-manylinux-wheel.sh +1 -1
  51. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/binding.py +128 -238
  52. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/compat.py +0 -27
  53. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/explicit_encrypter.py +1 -1
  54. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/mongocrypt.py +5 -21
  55. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/version.py +2 -2
  56. data/ext/libmongocrypt/libmongocrypt/bindings/python/release.sh +5 -5
  57. data/ext/libmongocrypt/libmongocrypt/bindings/python/setup.py +14 -9
  58. data/ext/libmongocrypt/libmongocrypt/bindings/python/test/__init__.py +1 -10
  59. data/ext/libmongocrypt/libmongocrypt/bindings/python/test/data/fle2-find-range-explicit-v2/int32/encrypted-payload.json +26 -0
  60. data/ext/libmongocrypt/libmongocrypt/bindings/python/test/test_mongocrypt.py +5 -5
  61. data/ext/libmongocrypt/libmongocrypt/bindings/python/test-requirements.txt +4 -12
  62. data/ext/libmongocrypt/libmongocrypt/cmake/ImportBSON.cmake +8 -6
  63. data/ext/libmongocrypt/libmongocrypt/cmake/IntelDFP.cmake +2 -1
  64. data/ext/libmongocrypt/libmongocrypt/cmake/Platform.cmake +50 -0
  65. data/ext/libmongocrypt/libmongocrypt/cmake/mongocrypt-config.cmake +21 -0
  66. data/ext/libmongocrypt/libmongocrypt/debian/gbp.conf +2 -2
  67. data/ext/libmongocrypt/libmongocrypt/etc/c6-vault.repo +39 -0
  68. data/ext/libmongocrypt/libmongocrypt/etc/fle2_aead_generate_tests.py +15 -24
  69. data/ext/libmongocrypt/libmongocrypt/etc/fle2_crypto.py +66 -54
  70. data/ext/libmongocrypt/libmongocrypt/etc/fle2_generate_tests.py +14 -23
  71. data/ext/libmongocrypt/libmongocrypt/etc/fle2v2_aead_generate_tests.py +32 -0
  72. data/ext/libmongocrypt/libmongocrypt/etc/format-all.sh +12 -0
  73. data/ext/libmongocrypt/libmongocrypt/etc/format.sh +16 -0
  74. data/ext/libmongocrypt/libmongocrypt/etc/install-package.sh +48 -0
  75. data/ext/libmongocrypt/libmongocrypt/etc/mongo-inteldfp-libmongocrypt-pr-625.patch +13 -0
  76. data/ext/libmongocrypt/libmongocrypt/src/crypto/cng.c +381 -436
  77. data/ext/libmongocrypt/libmongocrypt/src/crypto/commoncrypto.c +162 -227
  78. data/ext/libmongocrypt/libmongocrypt/src/crypto/libcrypto.c +180 -248
  79. data/ext/libmongocrypt/libmongocrypt/src/crypto/none.c +33 -55
  80. data/ext/libmongocrypt/libmongocrypt/src/csfle-markup.cpp +175 -205
  81. data/ext/libmongocrypt/libmongocrypt/src/mc-array-private.h +10 -21
  82. data/ext/libmongocrypt/libmongocrypt/src/mc-array.c +44 -56
  83. data/ext/libmongocrypt/libmongocrypt/src/mc-check-conversions-private.h +4 -8
  84. data/ext/libmongocrypt/libmongocrypt/src/mc-dec128.h +351 -463
  85. data/ext/libmongocrypt/libmongocrypt/src/mc-dec128.test.cpp +59 -66
  86. data/ext/libmongocrypt/libmongocrypt/src/mc-efc-private.h +7 -11
  87. data/ext/libmongocrypt/libmongocrypt/src/mc-efc.c +80 -92
  88. data/ext/libmongocrypt/libmongocrypt/src/mc-fle-blob-subtype-private.h +18 -10
  89. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-encryption-placeholder-private.h +59 -70
  90. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-encryption-placeholder.c +384 -439
  91. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-equality-payload-private-v2.h +41 -0
  92. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-equality-payload-private.h +11 -18
  93. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-equality-payload-v2.c +135 -0
  94. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-equality-payload.c +109 -126
  95. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-range-payload-private-v2.h +88 -0
  96. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-range-payload-private.h +24 -27
  97. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-range-payload-v2.c +137 -0
  98. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-range-payload.c +106 -125
  99. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-insert-update-payload-private-v2.h +117 -0
  100. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-insert-update-payload-private.h +28 -36
  101. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-insert-update-payload-v2.c +294 -0
  102. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-insert-update-payload.c +237 -278
  103. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-iev-private-v2.h +133 -0
  104. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-iev-private.h +67 -56
  105. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-iev-v2.c +437 -0
  106. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-iev.c +476 -325
  107. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-uev-common-private.h +69 -0
  108. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-uev-common.c +182 -0
  109. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-uev-private.h +23 -31
  110. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-uev-v2-private.h +85 -0
  111. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-uev-v2.c +142 -0
  112. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-uev.c +104 -231
  113. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-range-operator-private.h +8 -7
  114. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-rfds-private.h +55 -56
  115. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-rfds.c +517 -580
  116. data/ext/libmongocrypt/libmongocrypt/src/mc-optional-private.h +36 -66
  117. data/ext/libmongocrypt/libmongocrypt/src/mc-range-edge-generation-private.h +57 -76
  118. data/ext/libmongocrypt/libmongocrypt/src/mc-range-edge-generation.c +158 -189
  119. data/ext/libmongocrypt/libmongocrypt/src/mc-range-encoding-private.h +36 -42
  120. data/ext/libmongocrypt/libmongocrypt/src/mc-range-encoding.c +515 -558
  121. data/ext/libmongocrypt/libmongocrypt/src/mc-range-mincover-generator.template.h +155 -191
  122. data/ext/libmongocrypt/libmongocrypt/src/mc-range-mincover-private.h +43 -53
  123. data/ext/libmongocrypt/libmongocrypt/src/mc-range-mincover.c +170 -240
  124. data/ext/libmongocrypt/libmongocrypt/src/mc-rangeopts-private.h +29 -34
  125. data/ext/libmongocrypt/libmongocrypt/src/mc-rangeopts.c +289 -338
  126. data/ext/libmongocrypt/libmongocrypt/src/mc-reader-private.h +36 -71
  127. data/ext/libmongocrypt/libmongocrypt/src/mc-reader.c +111 -164
  128. data/ext/libmongocrypt/libmongocrypt/src/mc-tokens-private.h +55 -49
  129. data/ext/libmongocrypt/libmongocrypt/src/mc-tokens.c +109 -125
  130. data/ext/libmongocrypt/libmongocrypt/src/mc-writer-private.h +66 -0
  131. data/ext/libmongocrypt/libmongocrypt/src/mc-writer.c +141 -0
  132. data/ext/libmongocrypt/libmongocrypt/src/mlib/check.hpp +37 -55
  133. data/ext/libmongocrypt/libmongocrypt/src/mlib/endian.h +11 -11
  134. data/ext/libmongocrypt/libmongocrypt/src/mlib/error.h +27 -32
  135. data/ext/libmongocrypt/libmongocrypt/src/mlib/int128.h +444 -499
  136. data/ext/libmongocrypt/libmongocrypt/src/mlib/int128.test.cpp +251 -334
  137. data/ext/libmongocrypt/libmongocrypt/src/mlib/macros.h +4 -5
  138. data/ext/libmongocrypt/libmongocrypt/src/mlib/path.h +196 -231
  139. data/ext/libmongocrypt/libmongocrypt/src/mlib/path.test.c +56 -79
  140. data/ext/libmongocrypt/libmongocrypt/src/mlib/str.h +411 -530
  141. data/ext/libmongocrypt/libmongocrypt/src/mlib/str.test.c +116 -131
  142. data/ext/libmongocrypt/libmongocrypt/src/mlib/thread.h +17 -26
  143. data/ext/libmongocrypt/libmongocrypt/src/mlib/user-check.h +2 -2
  144. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-binary-private.h +3 -6
  145. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-binary.c +31 -48
  146. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-buffer-private.h +55 -131
  147. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-buffer.c +444 -565
  148. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-cache-collinfo-private.h +1 -2
  149. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-cache-collinfo.c +28 -45
  150. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-cache-key-private.h +11 -17
  151. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-cache-key.c +103 -132
  152. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-cache-oauth-private.h +8 -14
  153. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-cache-oauth.c +78 -90
  154. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-cache-private.h +26 -45
  155. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-cache.c +220 -273
  156. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ciphertext-private.h +13 -25
  157. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ciphertext.c +147 -166
  158. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-compat.h +2 -2
  159. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-crypto-private.h +110 -204
  160. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-crypto.c +1137 -1565
  161. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-datakey.c +425 -472
  162. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-decrypt.c +817 -694
  163. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-encrypt.c +2394 -2697
  164. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-private.h +166 -186
  165. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-rewrap-many-datakey.c +308 -351
  166. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx.c +921 -1138
  167. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-dll-private.h +16 -24
  168. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-endian-private.h +44 -58
  169. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-endpoint-private.h +21 -25
  170. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-endpoint.c +167 -181
  171. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-kek-private.h +37 -43
  172. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-kek.c +215 -253
  173. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-key-broker-private.h +73 -108
  174. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-key-broker.c +889 -1034
  175. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-key-private.h +27 -44
  176. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-key.c +349 -402
  177. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-kms-ctx-private.h +92 -120
  178. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-kms-ctx.c +1397 -1612
  179. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-log-private.h +35 -67
  180. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-log.c +49 -83
  181. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-marking-private.h +30 -36
  182. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-marking.c +1821 -1470
  183. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-mutex-private.h +7 -12
  184. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-opts-private.h +80 -108
  185. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-opts.c +354 -424
  186. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-private.h +101 -117
  187. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-status-private.h +3 -8
  188. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-status.c +92 -119
  189. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-traverse-util-private.h +19 -29
  190. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-traverse-util.c +136 -176
  191. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-util-private.h +11 -21
  192. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-util.c +96 -135
  193. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt.c +1092 -1320
  194. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt.h +130 -295
  195. data/ext/libmongocrypt/libmongocrypt/src/os_posix/os_dll.c +66 -78
  196. data/ext/libmongocrypt/libmongocrypt/src/os_posix/os_mutex.c +20 -28
  197. data/ext/libmongocrypt/libmongocrypt/src/os_win/os_dll.c +60 -73
  198. data/ext/libmongocrypt/libmongocrypt/src/os_win/os_mutex.c +8 -16
  199. data/ext/libmongocrypt/libmongocrypt/test/crypt_shared-stub.cpp +57 -87
  200. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-delete/empty/encrypted-payload-v2.json +60 -0
  201. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-delete/success/encrypted-payload-v2.json +67 -0
  202. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explain/with-csfle/encrypted-payload.json +2 -2
  203. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explicit/find-indexed-contentionFactor1-v2.json +8 -0
  204. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explicit/find-indexed-v2.json +8 -0
  205. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explicit/insert-indexed-contentionFactor1-v2.json +8 -0
  206. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explicit/insert-indexed-same-user-and-index-key-v2.json +8 -0
  207. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explicit/insert-indexed-v2.json +8 -0
  208. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-equality-v2/cmd.json +6 -0
  209. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-equality-v2/encrypted-field-map.json +22 -0
  210. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-equality-v2/encrypted-payload.json +40 -0
  211. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-equality-v2/mongocryptd-reply.json +19 -0
  212. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date-v2/cmd.json +10 -0
  213. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date-v2/encrypted-field-map.json +27 -0
  214. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date-v2/encrypted-payload.json +41 -0
  215. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date-v2/mongocryptd-reply.json +49 -0
  216. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision-v2/cmd.json +6 -0
  217. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision-v2/encrypted-field-map.json +30 -0
  218. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision-v2/encrypted-payload.json +50 -0
  219. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision-v2/mongocryptd-reply.json +58 -0
  220. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-v2/cmd.json +6 -0
  221. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-v2/encrypted-field-map.json +27 -0
  222. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-v2/encrypted-payload.json +41 -0
  223. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-v2/mongocryptd-reply.json +49 -0
  224. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-precision-v2/cmd.json +8 -0
  225. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-precision-v2/encrypted-field-map.json +30 -0
  226. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-precision-v2/encrypted-payload.json +44 -0
  227. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-precision-v2/mongocryptd-reply.json +52 -0
  228. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-v2/cmd.json +8 -0
  229. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-v2/encrypted-field-map.json +27 -0
  230. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-v2/encrypted-payload.json +41 -0
  231. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-v2/mongocryptd-reply.json +49 -0
  232. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32-v2/cmd.json +8 -0
  233. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32-v2/encrypted-field-map.json +27 -0
  234. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32-v2/encrypted-payload.json +41 -0
  235. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32-v2/mongocryptd-reply.json +49 -0
  236. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64-v2/cmd.json +8 -0
  237. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64-v2/encrypted-field-map.json +27 -0
  238. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64-v2/encrypted-payload.json +41 -0
  239. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64-v2/mongocryptd-reply.json +49 -0
  240. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/double/encrypted-payload-v2.json +26 -0
  241. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/double-precision/encrypted-payload-v2.json +26 -0
  242. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32/encrypted-payload-v2.json +26 -0
  243. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32-nominmax/encrypted-payload-v2.json +26 -0
  244. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32-openinterval/encrypted-payload-v2.json +16 -0
  245. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert/cmd.json +1 -1
  246. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date/RNG_DATA.h +65 -65
  247. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date-v2/cmd.json +13 -0
  248. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date-v2/encrypted-field-map.json +27 -0
  249. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date-v2/encrypted-payload.json +44 -0
  250. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date-v2/mongocryptd-reply.json +52 -0
  251. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128/RNG_DATA.h +132 -132
  252. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision/RNG_DATA.h +71 -71
  253. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision-v2/cmd.json +9 -0
  254. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision-v2/encrypted-field-map.json +30 -0
  255. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision-v2/encrypted-payload.json +53 -0
  256. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision-v2/mongocryptd-reply.json +61 -0
  257. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-v2/cmd.json +9 -0
  258. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-v2/encrypted-field-map.json +27 -0
  259. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-v2/encrypted-payload.json +44 -0
  260. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-v2/mongocryptd-reply.json +52 -0
  261. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double/RNG_DATA.h +68 -68
  262. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-precision/RNG_DATA.h +19 -19
  263. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-precision-v2/cmd.json +11 -0
  264. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-precision-v2/encrypted-field-map.json +30 -0
  265. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-precision-v2/encrypted-payload.json +47 -0
  266. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-precision-v2/mongocryptd-reply.json +55 -0
  267. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-v2/cmd.json +11 -0
  268. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-v2/encrypted-field-map.json +27 -0
  269. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-v2/encrypted-payload.json +44 -0
  270. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-v2/mongocryptd-reply.json +52 -0
  271. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32/RNG_DATA.h +25 -25
  272. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32-v2/cmd.json +11 -0
  273. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32-v2/encrypted-field-map.json +27 -0
  274. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32-v2/encrypted-payload.json +44 -0
  275. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32-v2/mongocryptd-reply.json +52 -0
  276. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64/RNG_DATA.h +65 -65
  277. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64-v2/cmd.json +11 -0
  278. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64-v2/encrypted-field-map.json +27 -0
  279. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64-v2/encrypted-payload.json +44 -0
  280. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64-v2/mongocryptd-reply.json +52 -0
  281. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/double/RNG_DATA.h +68 -68
  282. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/double/encrypted-payload-v2.json +8 -0
  283. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/double-precision/RNG_DATA.h +19 -19
  284. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/double-precision/encrypted-payload-v2.json +8 -0
  285. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/int32/RNG_DATA.h +25 -25
  286. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/int32/encrypted-payload-v2.json +8 -0
  287. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/int32-nominmax/encrypted-payload-v2.json +8 -0
  288. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/sparsity-2/RNG_DATA.h +15 -15
  289. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/sparsity-2/encrypted-payload-v2.json +8 -0
  290. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-unindexed-v2/cmd.json +9 -0
  291. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-unindexed-v2/encrypted-field-map.json +18 -0
  292. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-unindexed-v2/encrypted-payload.json +14 -0
  293. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-unindexed-v2/mongocryptd-reply.json +41 -0
  294. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-v2/cmd.json +9 -0
  295. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-v2/encrypted-field-map.json +22 -0
  296. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-v2/encrypted-payload.json +39 -0
  297. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-v2/mongocryptd-reply.json +49 -0
  298. data/ext/libmongocrypt/libmongocrypt/test/data/iev-v2/FLECrudTest-insertOneRangeV2.json +10 -0
  299. data/ext/libmongocrypt/libmongocrypt/test/data/iev-v2/FLECrudTest-insertOneV2.json +10 -0
  300. data/ext/libmongocrypt/libmongocrypt/test/data/roundtrip/README.md +17 -0
  301. data/ext/libmongocrypt/libmongocrypt/test/data/roundtrip/aes-ctr.json +29 -0
  302. data/ext/libmongocrypt/libmongocrypt/test/data/roundtrip/fle2-fixed.json +10 -0
  303. data/ext/libmongocrypt/libmongocrypt/test/data/roundtrip/fle2-generated.json +38 -0
  304. data/ext/libmongocrypt/libmongocrypt/test/data/roundtrip/fle2aead-decrypt.json +35 -0
  305. data/ext/libmongocrypt/libmongocrypt/test/data/roundtrip/fle2aead-fixed.json +29 -0
  306. data/ext/libmongocrypt/libmongocrypt/test/data/roundtrip/fle2aead-generated.json +122 -0
  307. data/ext/libmongocrypt/libmongocrypt/test/data/roundtrip/fle2v2-aead-fixed.json +29 -0
  308. data/ext/libmongocrypt/libmongocrypt/test/data/roundtrip/fle2v2-aead-generated.json +122 -0
  309. data/ext/libmongocrypt/libmongocrypt/test/data/roundtrip/mcgrew.json +12 -0
  310. data/ext/libmongocrypt/libmongocrypt/test/data/roundtrip/nist.json +20 -0
  311. data/ext/libmongocrypt/libmongocrypt/test/data/tokens/README.md +27 -0
  312. data/ext/libmongocrypt/libmongocrypt/test/data/tokens/mc.json +21 -0
  313. data/ext/libmongocrypt/libmongocrypt/test/data/tokens/server.json +21 -0
  314. data/ext/libmongocrypt/libmongocrypt/test/example-no-bson.c +4 -4
  315. data/ext/libmongocrypt/libmongocrypt/test/example-state-machine.c +278 -323
  316. data/ext/libmongocrypt/libmongocrypt/test/fuzz_kms.c +8 -7
  317. data/ext/libmongocrypt/libmongocrypt/test/test-dll.cpp +6 -7
  318. data/ext/libmongocrypt/libmongocrypt/test/test-gcp-auth.c +221 -283
  319. data/ext/libmongocrypt/libmongocrypt/test/test-mc-efc.c +58 -73
  320. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-find-equality-payload-v2.c +78 -0
  321. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-find-range-payload-v2.c +89 -0
  322. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-iev-v2.c +248 -0
  323. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-iev.c +467 -414
  324. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-iup-v2.c +172 -0
  325. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-iup.c +141 -159
  326. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-uev-v2.c +338 -0
  327. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-uev.c +238 -176
  328. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-rfds.c +373 -474
  329. data/ext/libmongocrypt/libmongocrypt/test/test-mc-range-edge-generation.c +346 -388
  330. data/ext/libmongocrypt/libmongocrypt/test/test-mc-range-encoding.c +708 -825
  331. data/ext/libmongocrypt/libmongocrypt/test/test-mc-range-mincover.c +417 -481
  332. data/ext/libmongocrypt/libmongocrypt/test/test-mc-rangeopts.c +110 -144
  333. data/ext/libmongocrypt/libmongocrypt/test/test-mc-reader.c +124 -207
  334. data/ext/libmongocrypt/libmongocrypt/test/test-mc-tokens.c +223 -213
  335. data/ext/libmongocrypt/libmongocrypt/test/test-mc-writer.c +176 -0
  336. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-assert-match-bson.c +634 -807
  337. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-assert-match-bson.h +1 -2
  338. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-assert.h +168 -189
  339. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-buffer.c +187 -211
  340. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-cache-oauth.c +34 -36
  341. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-cache.c +210 -233
  342. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ciphertext.c +185 -220
  343. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-compact.c +331 -445
  344. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-crypto-hooks.c +670 -814
  345. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-crypto-std-hooks.c +102 -135
  346. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-crypto-std-hooks.h +54 -71
  347. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-crypto.c +394 -846
  348. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-csfle-lib.c +159 -183
  349. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ctx-decrypt.c +867 -1045
  350. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ctx-encrypt.c +4349 -4713
  351. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ctx-rewrap-many-datakey.c +750 -964
  352. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ctx-setopt.c +991 -1178
  353. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-datakey.c +342 -419
  354. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-dll.c +23 -30
  355. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-endpoint.c +98 -111
  356. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-kek.c +49 -52
  357. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-key-broker.c +770 -920
  358. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-key-cache.c +354 -407
  359. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-key.c +197 -245
  360. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-kms-ctx.c +286 -370
  361. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-kms-responses.c +147 -166
  362. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-local-kms.c +50 -61
  363. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-log.c +85 -100
  364. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-marking.c +656 -692
  365. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-status.c +46 -58
  366. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-traverse-util.c +377 -451
  367. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-util.c +48 -67
  368. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-util.h +4 -10
  369. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt.c +827 -918
  370. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt.h +111 -172
  371. data/ext/libmongocrypt/libmongocrypt/test/util/csfle.c +508 -559
  372. data/ext/libmongocrypt/libmongocrypt/test/util/util.c +735 -881
  373. data/ext/libmongocrypt/libmongocrypt/test/util/util.h +33 -55
  374. data/lib/libmongocrypt_helper/version.rb +2 -2
  375. data/lib/libmongocrypt_helper.rb +2 -2
  376. data.tar.gz.sig +0 -0
  377. metadata +154 -26
  378. metadata.gz.sig +0 -0
  379. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/fle2-find-range-explicit/int32/encrypted-payload.json +0 -26
  380. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/fle2-find-range-explicit/int32/key-document.json +0 -0
  381. data/ext/libmongocrypt/libmongocrypt/bindings/node/lib/credentialsProvider.js +0 -33
  382. data/ext/libmongocrypt/libmongocrypt/bindings/node/test/credentialsProvider.test.js +0 -163
  383. data/ext/libmongocrypt/libmongocrypt/bindings/python/test/data/fle2-find-range-explicit/int32/encrypted-payload.json +0 -26
  384. data/ext/libmongocrypt/libmongocrypt/test/data/aes-ctr.cstructs +0 -359
  385. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-aead.cstructs +0 -109
  386. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32-nominmax/encrypted-payload.json +0 -26
  387. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32-nominmax/rangeopts.json +0 -5
  388. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32-nominmax/value-to-encrypt.json +0 -20
  389. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/int32-nominmax/RNG_DATA.h +0 -70
  390. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/int32-nominmax/encrypted-payload.json +0 -8
  391. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/int32-nominmax/rangeopts.json +0 -5
  392. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/int32-nominmax/value-to-encrypt.json +0 -5
  393. data/ext/libmongocrypt/libmongocrypt/test/data/fle2.cstructs +0 -33
  394. /data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/{fle2-find-range-explicit → fle2-find-range-explicit-v2}/int32/key-filter.json +0 -0
  395. /data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/{fle2-find-range-explicit → fle2-find-range-explicit-v2}/int32/rangeopts.json +0 -0
  396. /data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/{fle2-find-range-explicit → fle2-find-range-explicit-v2}/int32/value-to-encrypt.json +0 -0
  397. /data/ext/libmongocrypt/libmongocrypt/bindings/python/test/data/{fle2-find-range-explicit → fle2-find-range-explicit-v2}/int32/rangeopts.json +0 -0
  398. /data/ext/libmongocrypt/libmongocrypt/bindings/python/test/data/{fle2-find-range-explicit → fle2-find-range-explicit-v2}/int32/value-to-encrypt.json +0 -0
@@ -17,16 +17,14 @@
17
17
  #include "mongocrypt-key-broker-private.h"
18
18
  #include "mongocrypt-private.h"
19
19
 
20
- void
21
- _mongocrypt_key_broker_init (_mongocrypt_key_broker_t *kb, mongocrypt_t *crypt)
22
- {
23
- BSON_ASSERT_PARAM (kb);
24
- BSON_ASSERT_PARAM (crypt);
25
-
26
- memset (kb, 0, sizeof (*kb));
27
- kb->crypt = crypt;
28
- kb->state = KB_REQUESTING;
29
- kb->status = mongocrypt_status_new ();
20
+ void _mongocrypt_key_broker_init(_mongocrypt_key_broker_t *kb, mongocrypt_t *crypt) {
21
+ BSON_ASSERT_PARAM(kb);
22
+ BSON_ASSERT_PARAM(crypt);
23
+
24
+ memset(kb, 0, sizeof(*kb));
25
+ kb->crypt = crypt;
26
+ kb->state = KB_REQUESTING;
27
+ kb->status = mongocrypt_status_new();
30
28
  }
31
29
 
32
30
  /*
@@ -36,1154 +34,1011 @@ _mongocrypt_key_broker_init (_mongocrypt_key_broker_t *kb, mongocrypt_t *crypt)
36
34
  * - updates *list to point to a new head.
37
35
  */
38
36
  static key_returned_t *
39
- _key_returned_prepend (_mongocrypt_key_broker_t *kb,
40
- key_returned_t **list,
41
- _mongocrypt_key_doc_t *key_doc)
42
- {
43
- key_returned_t *key_returned;
37
+ _key_returned_prepend(_mongocrypt_key_broker_t *kb, key_returned_t **list, _mongocrypt_key_doc_t *key_doc) {
38
+ key_returned_t *key_returned;
44
39
 
45
- BSON_ASSERT_PARAM (kb);
46
- BSON_ASSERT_PARAM (list);
47
- BSON_ASSERT_PARAM (key_doc);
40
+ BSON_ASSERT_PARAM(kb);
41
+ BSON_ASSERT_PARAM(list);
42
+ BSON_ASSERT_PARAM(key_doc);
48
43
 
49
- key_returned = bson_malloc0 (sizeof (*key_returned));
50
- BSON_ASSERT (key_returned);
44
+ key_returned = bson_malloc0(sizeof(*key_returned));
45
+ BSON_ASSERT(key_returned);
51
46
 
52
- key_returned->doc = _mongocrypt_key_new ();
53
- _mongocrypt_key_doc_copy_to (key_doc, key_returned->doc);
47
+ key_returned->doc = _mongocrypt_key_new();
48
+ _mongocrypt_key_doc_copy_to(key_doc, key_returned->doc);
54
49
 
55
- /* Prepend and update the head of the list. */
56
- key_returned->next = *list;
57
- *list = key_returned;
50
+ /* Prepend and update the head of the list. */
51
+ key_returned->next = *list;
52
+ *list = key_returned;
58
53
 
59
- /* Update the head of the decrypting iter. */
60
- kb->decryptor_iter = kb->keys_returned;
61
- return key_returned;
54
+ /* Update the head of the decrypting iter. */
55
+ kb->decryptor_iter = kb->keys_returned;
56
+ return key_returned;
62
57
  }
63
58
 
64
59
  /* Find the first (if any) key_returned_t matching either a key_id or a list of
65
60
  * key_alt_names (both are NULLable) */
66
61
  static key_returned_t *
67
- _key_returned_find_one (key_returned_t *list,
68
- _mongocrypt_buffer_t *key_id,
69
- _mongocrypt_key_alt_name_t *key_alt_names)
70
- {
71
- key_returned_t *key_returned;
72
-
73
- /* list can be NULL. */
74
- /* key_id and key_alt_names are not dereferenced in this function and they
75
- * are checked just before being passed on as parameters. */
76
-
77
- for (key_returned = list; NULL != key_returned;
78
- key_returned = key_returned->next) {
79
- if (key_id) {
80
- BSON_ASSERT (key_returned->doc);
81
- if (0 == _mongocrypt_buffer_cmp (key_id, &key_returned->doc->id)) {
82
- return key_returned;
83
- }
84
- }
85
- if (key_alt_names) {
86
- BSON_ASSERT (key_returned->doc);
87
- if (_mongocrypt_key_alt_name_intersects (
88
- key_alt_names, key_returned->doc->key_alt_names)) {
89
- return key_returned;
90
- }
91
- }
92
- }
93
-
94
- return NULL;
62
+ _key_returned_find_one(key_returned_t *list, _mongocrypt_buffer_t *key_id, _mongocrypt_key_alt_name_t *key_alt_names) {
63
+ key_returned_t *key_returned;
64
+
65
+ /* list can be NULL. */
66
+ /* key_id and key_alt_names are not dereferenced in this function and they
67
+ * are checked just before being passed on as parameters. */
68
+
69
+ for (key_returned = list; NULL != key_returned; key_returned = key_returned->next) {
70
+ if (key_id) {
71
+ BSON_ASSERT(key_returned->doc);
72
+ if (0 == _mongocrypt_buffer_cmp(key_id, &key_returned->doc->id)) {
73
+ return key_returned;
74
+ }
75
+ }
76
+ if (key_alt_names) {
77
+ BSON_ASSERT(key_returned->doc);
78
+ if (_mongocrypt_key_alt_name_intersects(key_alt_names, key_returned->doc->key_alt_names)) {
79
+ return key_returned;
80
+ }
81
+ }
82
+ }
83
+
84
+ return NULL;
95
85
  }
96
86
 
97
87
  /* Find the first (if any) key_request_t in the key broker matching either a
98
88
  * key_id or a list of key_alt_names (both are NULLable) */
99
- static key_request_t *
100
- _key_request_find_one (_mongocrypt_key_broker_t *kb,
101
- const _mongocrypt_buffer_t *key_id,
102
- _mongocrypt_key_alt_name_t *key_alt_names)
103
- {
104
- key_request_t *key_request;
105
-
106
- BSON_ASSERT_PARAM (kb);
107
- /* key_id and key_alt_names are not dereferenced in this function and they
108
- * are checked just before being passed on as parameters. */
109
-
110
- for (key_request = kb->key_requests; NULL != key_request;
111
- key_request = key_request->next) {
112
- if (key_id) {
113
- if (0 == _mongocrypt_buffer_cmp (key_id, &key_request->id)) {
114
- return key_request;
115
- }
116
- }
117
- if (key_alt_names) {
118
- if (_mongocrypt_key_alt_name_intersects (key_alt_names,
119
- key_request->alt_name)) {
120
- return key_request;
121
- }
122
- }
123
- }
124
-
125
- return NULL;
89
+ static key_request_t *_key_request_find_one(_mongocrypt_key_broker_t *kb,
90
+ const _mongocrypt_buffer_t *key_id,
91
+ _mongocrypt_key_alt_name_t *key_alt_names) {
92
+ key_request_t *key_request;
93
+
94
+ BSON_ASSERT_PARAM(kb);
95
+ /* key_id and key_alt_names are not dereferenced in this function and they
96
+ * are checked just before being passed on as parameters. */
97
+
98
+ for (key_request = kb->key_requests; NULL != key_request; key_request = key_request->next) {
99
+ if (key_id) {
100
+ if (0 == _mongocrypt_buffer_cmp(key_id, &key_request->id)) {
101
+ return key_request;
102
+ }
103
+ }
104
+ if (key_alt_names) {
105
+ if (_mongocrypt_key_alt_name_intersects(key_alt_names, key_request->alt_name)) {
106
+ return key_request;
107
+ }
108
+ }
109
+ }
110
+
111
+ return NULL;
126
112
  }
127
113
 
128
- static bool
129
- _all_key_requests_satisfied (_mongocrypt_key_broker_t *kb)
130
- {
131
- key_request_t *key_request;
114
+ static bool _all_key_requests_satisfied(_mongocrypt_key_broker_t *kb) {
115
+ key_request_t *key_request;
132
116
 
133
- BSON_ASSERT_PARAM (kb);
117
+ BSON_ASSERT_PARAM(kb);
134
118
 
135
- for (key_request = kb->key_requests; NULL != key_request;
136
- key_request = key_request->next) {
137
- if (!key_request->satisfied) {
138
- return false;
139
- }
140
- }
141
- return true;
119
+ for (key_request = kb->key_requests; NULL != key_request; key_request = key_request->next) {
120
+ if (!key_request->satisfied) {
121
+ return false;
122
+ }
123
+ }
124
+ return true;
142
125
  }
143
126
 
144
- static bool
145
- _key_broker_fail_w_msg (_mongocrypt_key_broker_t *kb, const char *msg)
146
- {
147
- mongocrypt_status_t *status;
127
+ static bool _key_broker_fail_w_msg(_mongocrypt_key_broker_t *kb, const char *msg) {
128
+ mongocrypt_status_t *status;
148
129
 
149
- BSON_ASSERT_PARAM (kb);
150
- BSON_ASSERT_PARAM (msg);
130
+ BSON_ASSERT_PARAM(kb);
131
+ BSON_ASSERT_PARAM(msg);
151
132
 
152
- kb->state = KB_ERROR;
153
- status = kb->status;
154
- CLIENT_ERR ("%s", msg);
155
- return false;
133
+ kb->state = KB_ERROR;
134
+ status = kb->status;
135
+ CLIENT_ERR("%s", msg);
136
+ return false;
156
137
  }
157
138
 
158
- static bool
159
- _key_broker_fail (_mongocrypt_key_broker_t *kb)
160
- {
161
- BSON_ASSERT_PARAM (kb);
162
-
163
- if (mongocrypt_status_ok (kb->status)) {
164
- return _key_broker_fail_w_msg (
165
- kb, "unexpected, failing but no error status set");
166
- }
167
- kb->state = KB_ERROR;
168
- return false;
139
+ static bool _key_broker_fail(_mongocrypt_key_broker_t *kb) {
140
+ BSON_ASSERT_PARAM(kb);
141
+
142
+ if (mongocrypt_status_ok(kb->status)) {
143
+ return _key_broker_fail_w_msg(kb, "unexpected, failing but no error status set");
144
+ }
145
+ kb->state = KB_ERROR;
146
+ return false;
169
147
  }
170
148
 
171
- static bool
172
- _try_satisfying_from_cache (_mongocrypt_key_broker_t *kb, key_request_t *req)
173
- {
174
- _mongocrypt_cache_key_attr_t *attr = NULL;
175
- _mongocrypt_cache_key_value_t *value = NULL;
176
- bool ret = false;
177
-
178
- BSON_ASSERT_PARAM (kb);
179
- BSON_ASSERT_PARAM (req);
180
-
181
- if (kb->state != KB_REQUESTING && kb->state != KB_ADDING_DOCS_ANY) {
182
- _key_broker_fail_w_msg (
183
- kb, "trying to retrieve key from cache in invalid state");
184
- goto cleanup;
185
- }
186
-
187
- attr = _mongocrypt_cache_key_attr_new (&req->id, req->alt_name);
188
- if (!_mongocrypt_cache_get (&kb->crypt->cache_key, attr, (void **) &value)) {
189
- _key_broker_fail_w_msg (kb, "failed to retrieve from cache");
190
- goto cleanup;
191
- }
192
-
193
- if (value) {
194
- key_returned_t *key_returned;
195
-
196
- req->satisfied = true;
197
- if (_mongocrypt_buffer_empty (&value->decrypted_key_material)) {
198
- _key_broker_fail_w_msg (
199
- kb, "cache entry does not have decrypted key material");
200
- goto cleanup;
201
- }
202
-
203
- /* Add the cached key to our locally copied list.
204
- * Note, we deduplicate requests, but *not* keys from the cache,
205
- * because the state of the cache may change between each call to
206
- * _mongocrypt_cache_get.
207
- */
208
- key_returned =
209
- _key_returned_prepend (kb, &kb->keys_cached, value->key_doc);
210
- _mongocrypt_buffer_init (&key_returned->decrypted_key_material);
211
- _mongocrypt_buffer_copy_to (&value->decrypted_key_material,
212
- &key_returned->decrypted_key_material);
213
- key_returned->decrypted = true;
214
- }
215
-
216
- ret = true;
149
+ static bool _try_satisfying_from_cache(_mongocrypt_key_broker_t *kb, key_request_t *req) {
150
+ _mongocrypt_cache_key_attr_t *attr = NULL;
151
+ _mongocrypt_cache_key_value_t *value = NULL;
152
+ bool ret = false;
153
+
154
+ BSON_ASSERT_PARAM(kb);
155
+ BSON_ASSERT_PARAM(req);
156
+
157
+ if (kb->state != KB_REQUESTING && kb->state != KB_ADDING_DOCS_ANY) {
158
+ _key_broker_fail_w_msg(kb, "trying to retrieve key from cache in invalid state");
159
+ goto cleanup;
160
+ }
161
+
162
+ attr = _mongocrypt_cache_key_attr_new(&req->id, req->alt_name);
163
+ if (!_mongocrypt_cache_get(&kb->crypt->cache_key, attr, (void **)&value)) {
164
+ _key_broker_fail_w_msg(kb, "failed to retrieve from cache");
165
+ goto cleanup;
166
+ }
167
+
168
+ if (value) {
169
+ key_returned_t *key_returned;
170
+
171
+ req->satisfied = true;
172
+ if (_mongocrypt_buffer_empty(&value->decrypted_key_material)) {
173
+ _key_broker_fail_w_msg(kb, "cache entry does not have decrypted key material");
174
+ goto cleanup;
175
+ }
176
+
177
+ /* Add the cached key to our locally copied list.
178
+ * Note, we deduplicate requests, but *not* keys from the cache,
179
+ * because the state of the cache may change between each call to
180
+ * _mongocrypt_cache_get.
181
+ */
182
+ key_returned = _key_returned_prepend(kb, &kb->keys_cached, value->key_doc);
183
+ _mongocrypt_buffer_init(&key_returned->decrypted_key_material);
184
+ _mongocrypt_buffer_copy_to(&value->decrypted_key_material, &key_returned->decrypted_key_material);
185
+ key_returned->decrypted = true;
186
+ }
187
+
188
+ ret = true;
217
189
  cleanup:
218
- _mongocrypt_cache_key_value_destroy (value);
219
- _mongocrypt_cache_key_attr_destroy (attr);
220
- return ret;
190
+ _mongocrypt_cache_key_value_destroy(value);
191
+ _mongocrypt_cache_key_attr_destroy(attr);
192
+ return ret;
221
193
  }
222
194
 
223
- static bool
224
- _store_to_cache (_mongocrypt_key_broker_t *kb, key_returned_t *key_returned)
225
- {
226
- _mongocrypt_cache_key_value_t *value;
227
- _mongocrypt_cache_key_attr_t *attr;
228
- bool ret;
229
-
230
- BSON_ASSERT_PARAM (kb);
231
- BSON_ASSERT_PARAM (key_returned);
232
-
233
- if (!key_returned->decrypted) {
234
- return _key_broker_fail_w_msg (kb, "cannot cache non-decrypted key");
235
- }
236
-
237
- attr = _mongocrypt_cache_key_attr_new (&key_returned->doc->id,
238
- key_returned->doc->key_alt_names);
239
- if (!attr) {
240
- return _key_broker_fail_w_msg (kb,
241
- "could not create key cache attribute");
242
- }
243
- value = _mongocrypt_cache_key_value_new (
244
- key_returned->doc, &key_returned->decrypted_key_material);
245
- ret = _mongocrypt_cache_add_stolen (
246
- &kb->crypt->cache_key, attr, value, kb->status);
247
- _mongocrypt_cache_key_attr_destroy (attr);
248
- if (!ret) {
249
- return _key_broker_fail (kb);
250
- }
251
- return true;
195
+ static bool _store_to_cache(_mongocrypt_key_broker_t *kb, key_returned_t *key_returned) {
196
+ _mongocrypt_cache_key_value_t *value;
197
+ _mongocrypt_cache_key_attr_t *attr;
198
+ bool ret;
199
+
200
+ BSON_ASSERT_PARAM(kb);
201
+ BSON_ASSERT_PARAM(key_returned);
202
+
203
+ if (!key_returned->decrypted) {
204
+ return _key_broker_fail_w_msg(kb, "cannot cache non-decrypted key");
205
+ }
206
+
207
+ attr = _mongocrypt_cache_key_attr_new(&key_returned->doc->id, key_returned->doc->key_alt_names);
208
+ if (!attr) {
209
+ return _key_broker_fail_w_msg(kb, "could not create key cache attribute");
210
+ }
211
+ value = _mongocrypt_cache_key_value_new(key_returned->doc, &key_returned->decrypted_key_material);
212
+ ret = _mongocrypt_cache_add_stolen(&kb->crypt->cache_key, attr, value, kb->status);
213
+ _mongocrypt_cache_key_attr_destroy(attr);
214
+ if (!ret) {
215
+ return _key_broker_fail(kb);
216
+ }
217
+ return true;
252
218
  }
253
219
 
254
- bool
255
- _mongocrypt_key_broker_request_id (_mongocrypt_key_broker_t *kb,
256
- const _mongocrypt_buffer_t *key_id)
257
- {
258
- key_request_t *req;
259
-
260
- BSON_ASSERT_PARAM (kb);
261
- BSON_ASSERT_PARAM (key_id);
262
-
263
- if (kb->state != KB_REQUESTING) {
264
- return _key_broker_fail_w_msg (
265
- kb, "attempting to request a key id, but in wrong state");
266
- }
267
-
268
- if (!_mongocrypt_buffer_is_uuid ((_mongocrypt_buffer_t *) key_id)) {
269
- return _key_broker_fail_w_msg (kb, "expected UUID for key id");
270
- }
271
-
272
- if (_key_request_find_one (kb, key_id, NULL)) {
273
- return true;
274
- }
275
-
276
- req = bson_malloc0 (sizeof *req);
277
- BSON_ASSERT (req);
278
-
279
- _mongocrypt_buffer_copy_to (key_id, &req->id);
280
- req->next = kb->key_requests;
281
- kb->key_requests = req;
282
- if (!_try_satisfying_from_cache (kb, req)) {
283
- return false;
284
- }
285
- return true;
286
- }
220
+ bool _mongocrypt_key_broker_request_id(_mongocrypt_key_broker_t *kb, const _mongocrypt_buffer_t *key_id) {
221
+ key_request_t *req;
222
+
223
+ BSON_ASSERT_PARAM(kb);
224
+ BSON_ASSERT_PARAM(key_id);
287
225
 
226
+ if (kb->state != KB_REQUESTING) {
227
+ return _key_broker_fail_w_msg(kb, "attempting to request a key id, but in wrong state");
228
+ }
288
229
 
289
- bool
290
- _mongocrypt_key_broker_request_name (_mongocrypt_key_broker_t *kb,
291
- const bson_value_t *key_alt_name_value)
292
- {
293
- key_request_t *req;
294
- _mongocrypt_key_alt_name_t *key_alt_name;
230
+ if (!_mongocrypt_buffer_is_uuid((_mongocrypt_buffer_t *)key_id)) {
231
+ return _key_broker_fail_w_msg(kb, "expected UUID for key id");
232
+ }
295
233
 
296
- BSON_ASSERT_PARAM (kb);
297
- BSON_ASSERT_PARAM (key_alt_name_value);
234
+ if (_key_request_find_one(kb, key_id, NULL)) {
235
+ return true;
236
+ }
298
237
 
299
- if (kb->state != KB_REQUESTING) {
300
- return _key_broker_fail_w_msg (
301
- kb, "attempting to request a key name, but in wrong state");
302
- }
238
+ req = bson_malloc0(sizeof *req);
239
+ BSON_ASSERT(req);
240
+
241
+ _mongocrypt_buffer_copy_to(key_id, &req->id);
242
+ req->next = kb->key_requests;
243
+ kb->key_requests = req;
244
+ if (!_try_satisfying_from_cache(kb, req)) {
245
+ return false;
246
+ }
247
+ return true;
248
+ }
303
249
 
304
- key_alt_name = _mongocrypt_key_alt_name_new (key_alt_name_value);
250
+ bool _mongocrypt_key_broker_request_name(_mongocrypt_key_broker_t *kb, const bson_value_t *key_alt_name_value) {
251
+ key_request_t *req;
252
+ _mongocrypt_key_alt_name_t *key_alt_name;
305
253
 
306
- /* Check if we already have a request for this key alt name. */
307
- if (_key_request_find_one (kb, NULL /* key id */, key_alt_name)) {
308
- _mongocrypt_key_alt_name_destroy_all (key_alt_name);
309
- return true;
310
- }
254
+ BSON_ASSERT_PARAM(kb);
255
+ BSON_ASSERT_PARAM(key_alt_name_value);
311
256
 
312
- req = bson_malloc0 (sizeof *req);
313
- BSON_ASSERT (req);
257
+ if (kb->state != KB_REQUESTING) {
258
+ return _key_broker_fail_w_msg(kb, "attempting to request a key name, but in wrong state");
259
+ }
314
260
 
315
- req->alt_name = key_alt_name /* takes ownership */;
316
- req->next = kb->key_requests;
317
- kb->key_requests = req;
318
- if (!_try_satisfying_from_cache (kb, req)) {
319
- return false;
320
- }
321
- return true;
261
+ key_alt_name = _mongocrypt_key_alt_name_new(key_alt_name_value);
262
+
263
+ /* Check if we already have a request for this key alt name. */
264
+ if (_key_request_find_one(kb, NULL /* key id */, key_alt_name)) {
265
+ _mongocrypt_key_alt_name_destroy_all(key_alt_name);
266
+ return true;
267
+ }
268
+
269
+ req = bson_malloc0(sizeof *req);
270
+ BSON_ASSERT(req);
271
+
272
+ req->alt_name = key_alt_name /* takes ownership */;
273
+ req->next = kb->key_requests;
274
+ kb->key_requests = req;
275
+ if (!_try_satisfying_from_cache(kb, req)) {
276
+ return false;
277
+ }
278
+ return true;
322
279
  }
323
280
 
324
- bool
325
- _mongocrypt_key_broker_request_any (_mongocrypt_key_broker_t *kb)
326
- {
327
- BSON_ASSERT_PARAM (kb);
281
+ bool _mongocrypt_key_broker_request_any(_mongocrypt_key_broker_t *kb) {
282
+ BSON_ASSERT_PARAM(kb);
328
283
 
329
- if (kb->state != KB_REQUESTING) {
330
- return _key_broker_fail_w_msg (
331
- kb, "attempting to request any keys, but in wrong state");
332
- }
284
+ if (kb->state != KB_REQUESTING) {
285
+ return _key_broker_fail_w_msg(kb, "attempting to request any keys, but in wrong state");
286
+ }
333
287
 
334
- if (kb->key_requests) {
335
- return _key_broker_fail_w_msg (
336
- kb, "attempting to request any keys, but requests already made");
337
- }
288
+ if (kb->key_requests) {
289
+ return _key_broker_fail_w_msg(kb, "attempting to request any keys, but requests already made");
290
+ }
338
291
 
339
- kb->state = KB_ADDING_DOCS_ANY;
292
+ kb->state = KB_ADDING_DOCS_ANY;
340
293
 
341
- return true;
294
+ return true;
342
295
  }
343
296
 
344
- bool
345
- _mongocrypt_key_broker_requests_done (_mongocrypt_key_broker_t *kb)
346
- {
347
- BSON_ASSERT_PARAM (kb);
348
-
349
- if (kb->state != KB_REQUESTING) {
350
- return _key_broker_fail_w_msg (
351
- kb, "attempting to finish adding requests, but in wrong state");
352
- }
353
-
354
- if (kb->key_requests) {
355
- if (_all_key_requests_satisfied (kb)) {
356
- kb->state = KB_DONE;
357
- } else {
358
- kb->state = KB_ADDING_DOCS;
359
- }
360
- } else {
361
- kb->state = KB_DONE;
362
- }
363
- return true;
297
+ bool _mongocrypt_key_broker_requests_done(_mongocrypt_key_broker_t *kb) {
298
+ BSON_ASSERT_PARAM(kb);
299
+
300
+ if (kb->state != KB_REQUESTING) {
301
+ return _key_broker_fail_w_msg(kb, "attempting to finish adding requests, but in wrong state");
302
+ }
303
+
304
+ if (kb->key_requests) {
305
+ if (_all_key_requests_satisfied(kb)) {
306
+ kb->state = KB_DONE;
307
+ } else {
308
+ kb->state = KB_ADDING_DOCS;
309
+ }
310
+ } else {
311
+ kb->state = KB_DONE;
312
+ }
313
+ return true;
364
314
  }
365
315
 
366
- bool
367
- _mongocrypt_key_broker_filter (_mongocrypt_key_broker_t *kb,
368
- mongocrypt_binary_t *out)
369
- {
370
- key_request_t *req;
371
- _mongocrypt_key_alt_name_t *key_alt_name;
372
- int name_index = 0;
373
- int id_index = 0;
374
- bson_t ids, names;
375
- bson_t *filter;
376
-
377
- BSON_ASSERT_PARAM (kb);
378
- BSON_ASSERT_PARAM (out);
379
-
380
- if (kb->state != KB_ADDING_DOCS) {
381
- return _key_broker_fail_w_msg (
382
- kb, "attempting to retrieve filter, but in wrong state");
383
- }
384
-
385
- if (!_mongocrypt_buffer_empty (&kb->filter)) {
386
- _mongocrypt_buffer_to_binary (&kb->filter, out);
387
- return true;
388
- }
389
-
390
- bson_init (&names);
391
- bson_init (&ids);
392
-
393
- for (req = kb->key_requests; NULL != req; req = req->next) {
394
- if (req->satisfied) {
395
- continue;
396
- }
397
-
398
- if (!_mongocrypt_buffer_empty (&req->id)) {
399
- /* Collect key_ids in "ids" */
400
- char *key_str;
401
-
402
- key_str = bson_strdup_printf ("%d", id_index++);
403
- if (!key_str ||
404
- !_mongocrypt_buffer_append (&req->id, &ids, key_str, -1)) {
405
- bson_destroy (&ids);
406
- bson_destroy (&names);
407
- bson_free (key_str);
408
- return _key_broker_fail_w_msg (kb, "could not construct id list");
409
- }
410
-
411
- bson_free (key_str);
412
- }
413
-
414
- /* Collect key alt names in "names" */
415
- for (key_alt_name = req->alt_name; NULL != key_alt_name;
416
- key_alt_name = key_alt_name->next) {
417
- char *key_str;
418
-
419
-
420
- key_str = bson_strdup_printf ("%d", name_index++);
421
- BSON_ASSERT (key_str);
422
- if (!bson_append_value (&names,
423
- key_str,
424
- (int) strlen (key_str),
425
- &key_alt_name->value)) {
426
- bson_destroy (&ids);
427
- bson_destroy (&names);
428
- bson_free (key_str);
429
- return _key_broker_fail_w_msg (
430
- kb, "could not construct keyAltName list");
431
- }
432
-
433
- bson_free (key_str);
434
- }
435
- }
436
-
437
- /*
438
- * This is our final query:
439
- * { $or: [ { _id: { $in : [ids] }},
440
- * { keyAltName : { $in : [names] }} ] }
441
- */
442
- filter = BCON_NEW ("$or",
316
+ bool _mongocrypt_key_broker_filter(_mongocrypt_key_broker_t *kb, mongocrypt_binary_t *out) {
317
+ key_request_t *req;
318
+ _mongocrypt_key_alt_name_t *key_alt_name;
319
+ int name_index = 0;
320
+ int id_index = 0;
321
+ bson_t ids, names;
322
+ bson_t *filter;
323
+
324
+ BSON_ASSERT_PARAM(kb);
325
+ BSON_ASSERT_PARAM(out);
326
+
327
+ if (kb->state != KB_ADDING_DOCS) {
328
+ return _key_broker_fail_w_msg(kb, "attempting to retrieve filter, but in wrong state");
329
+ }
330
+
331
+ if (!_mongocrypt_buffer_empty(&kb->filter)) {
332
+ _mongocrypt_buffer_to_binary(&kb->filter, out);
333
+ return true;
334
+ }
335
+
336
+ bson_init(&names);
337
+ bson_init(&ids);
338
+
339
+ for (req = kb->key_requests; NULL != req; req = req->next) {
340
+ if (req->satisfied) {
341
+ continue;
342
+ }
343
+
344
+ if (!_mongocrypt_buffer_empty(&req->id)) {
345
+ /* Collect key_ids in "ids" */
346
+ char *key_str;
347
+
348
+ key_str = bson_strdup_printf("%d", id_index++);
349
+ if (!key_str || !_mongocrypt_buffer_append(&req->id, &ids, key_str, -1)) {
350
+ bson_destroy(&ids);
351
+ bson_destroy(&names);
352
+ bson_free(key_str);
353
+ return _key_broker_fail_w_msg(kb, "could not construct id list");
354
+ }
355
+
356
+ bson_free(key_str);
357
+ }
358
+
359
+ /* Collect key alt names in "names" */
360
+ for (key_alt_name = req->alt_name; NULL != key_alt_name; key_alt_name = key_alt_name->next) {
361
+ char *key_str;
362
+
363
+ key_str = bson_strdup_printf("%d", name_index++);
364
+ BSON_ASSERT(key_str);
365
+ if (!bson_append_value(&names, key_str, (int)strlen(key_str), &key_alt_name->value)) {
366
+ bson_destroy(&ids);
367
+ bson_destroy(&names);
368
+ bson_free(key_str);
369
+ return _key_broker_fail_w_msg(kb, "could not construct keyAltName list");
370
+ }
371
+
372
+ bson_free(key_str);
373
+ }
374
+ }
375
+
376
+ /*
377
+ * This is our final query:
378
+ * { $or: [ { _id: { $in : [ids] }},
379
+ * { keyAltName : { $in : [names] }} ] }
380
+ */
381
+ filter = BCON_NEW("$or",
443
382
  "[",
444
383
  "{",
445
384
  "_id",
446
385
  "{",
447
386
  "$in",
448
- BCON_ARRAY (&ids),
387
+ BCON_ARRAY(&ids),
449
388
  "}",
450
389
  "}",
451
390
  "{",
452
391
  "keyAltNames",
453
392
  "{",
454
393
  "$in",
455
- BCON_ARRAY (&names),
394
+ BCON_ARRAY(&names),
456
395
  "}",
457
396
  "}",
458
397
  "]");
459
398
 
460
- _mongocrypt_buffer_steal_from_bson (&kb->filter, filter);
461
- _mongocrypt_buffer_to_binary (&kb->filter, out);
462
- bson_destroy (&ids);
463
- bson_destroy (&names);
399
+ _mongocrypt_buffer_steal_from_bson(&kb->filter, filter);
400
+ _mongocrypt_buffer_to_binary(&kb->filter, out);
401
+ bson_destroy(&ids);
402
+ bson_destroy(&names);
464
403
 
465
- return true;
404
+ return true;
466
405
  }
467
406
 
468
- bool
469
- _mongocrypt_key_broker_add_doc (_mongocrypt_key_broker_t *kb,
470
- _mongocrypt_opts_kms_providers_t *kms_providers,
471
- const _mongocrypt_buffer_t *doc)
472
- {
473
- bool ret = false;
474
- bson_t doc_bson;
475
- _mongocrypt_key_doc_t *key_doc = NULL;
476
- key_request_t *key_request;
477
- key_returned_t *key_returned;
478
- _mongocrypt_kms_provider_t kek_provider;
479
- char *access_token = NULL;
480
-
481
- BSON_ASSERT_PARAM (kb);
482
- BSON_ASSERT_PARAM (kms_providers);
483
-
484
- if (kb->state != KB_ADDING_DOCS && kb->state != KB_ADDING_DOCS_ANY) {
485
- _key_broker_fail_w_msg (
486
- kb, "attempting to add a key doc, but in wrong state");
487
- goto done;
488
- }
489
-
490
- if (!doc) {
491
- _key_broker_fail_w_msg (kb, "invalid key");
492
- goto done;
493
- }
494
-
495
- /* First, parse the key document. */
496
- key_doc = _mongocrypt_key_new ();
497
- if (!_mongocrypt_buffer_to_bson (doc, &doc_bson)) {
498
- _key_broker_fail_w_msg (kb, "malformed BSON for key document");
499
- goto done;
500
- }
501
-
502
- if (!_mongocrypt_key_parse_owned (&doc_bson, key_doc, kb->status)) {
503
- goto done;
504
- }
505
-
506
- if (!_key_request_find_one (kb, &key_doc->id, key_doc->key_alt_names)) {
507
- /* If in normal mode, ensure that this document matches at least one
508
- * existing request. */
509
- if (kb->state == KB_ADDING_DOCS) {
510
- _key_broker_fail_w_msg (
511
- kb, "unexpected key returned, does not match any requests");
512
- goto done;
513
- }
514
-
515
- /* If in any mode, add request for provided document now. */
516
- if (kb->state == KB_ADDING_DOCS_ANY) {
517
- key_request_t *const req = bson_malloc0 (sizeof (key_request_t));
518
-
519
- BSON_ASSERT (req);
520
-
521
- _mongocrypt_buffer_copy_to (&key_doc->id, &req->id);
522
- req->alt_name =
523
- _mongocrypt_key_alt_name_copy_all (key_doc->key_alt_names);
524
- req->next = kb->key_requests;
525
- kb->key_requests = req;
526
-
527
- if (!_try_satisfying_from_cache (kb, req)) {
407
+ bool _mongocrypt_key_broker_add_doc(_mongocrypt_key_broker_t *kb,
408
+ _mongocrypt_opts_kms_providers_t *kms_providers,
409
+ const _mongocrypt_buffer_t *doc) {
410
+ bool ret = false;
411
+ bson_t doc_bson;
412
+ _mongocrypt_key_doc_t *key_doc = NULL;
413
+ key_request_t *key_request;
414
+ key_returned_t *key_returned;
415
+ _mongocrypt_kms_provider_t kek_provider;
416
+ char *access_token = NULL;
417
+
418
+ BSON_ASSERT_PARAM(kb);
419
+ BSON_ASSERT_PARAM(kms_providers);
420
+
421
+ if (kb->state != KB_ADDING_DOCS && kb->state != KB_ADDING_DOCS_ANY) {
422
+ _key_broker_fail_w_msg(kb, "attempting to add a key doc, but in wrong state");
423
+ goto done;
424
+ }
425
+
426
+ if (!doc) {
427
+ _key_broker_fail_w_msg(kb, "invalid key");
428
+ goto done;
429
+ }
430
+
431
+ /* First, parse the key document. */
432
+ key_doc = _mongocrypt_key_new();
433
+ if (!_mongocrypt_buffer_to_bson(doc, &doc_bson)) {
434
+ _key_broker_fail_w_msg(kb, "malformed BSON for key document");
435
+ goto done;
436
+ }
437
+
438
+ if (!_mongocrypt_key_parse_owned(&doc_bson, key_doc, kb->status)) {
439
+ goto done;
440
+ }
441
+
442
+ if (!_key_request_find_one(kb, &key_doc->id, key_doc->key_alt_names)) {
443
+ /* If in normal mode, ensure that this document matches at least one
444
+ * existing request. */
445
+ if (kb->state == KB_ADDING_DOCS) {
446
+ _key_broker_fail_w_msg(kb, "unexpected key returned, does not match any requests");
528
447
  goto done;
529
- }
448
+ }
530
449
 
531
- /* Key is already cached; no work to be done. */
532
- if (req->satisfied) {
533
- ret = true;
534
- goto done;
535
- }
536
- }
537
- }
538
-
539
- /* Check if there are other keys_returned with intersecting altnames or
540
- * equal id. This is an error. Do *not* check cached keys. */
541
- if (_key_returned_find_one (
542
- kb->keys_returned, &key_doc->id, key_doc->key_alt_names)) {
543
- _key_broker_fail_w_msg (
544
- kb, "keys returned have duplicate keyAltNames or _id");
545
- goto done;
546
- }
547
-
548
- key_returned = _key_returned_prepend (kb, &kb->keys_returned, key_doc);
549
-
550
- /* Check that the returned key doc's provider matches. */
551
- kek_provider = key_doc->kek.kms_provider;
552
- if (0 == ((int) kek_provider & kms_providers->configured_providers)) {
553
- _key_broker_fail_w_msg (
554
- kb, "client not configured with KMS provider necessary to decrypt");
555
- goto done;
556
- }
557
-
558
- /* If the KMS provider is local, decrypt immediately. Otherwise, create the
559
- * HTTP KMS request. */
560
- BSON_ASSERT (kb->crypt);
561
- if (kek_provider == MONGOCRYPT_KMS_PROVIDER_LOCAL) {
562
- if (!_mongocrypt_unwrap_key (kb->crypt->crypto,
563
- &kms_providers->local.key,
564
- &key_returned->doc->key_material,
565
- &key_returned->decrypted_key_material,
566
- kb->status)) {
567
- _key_broker_fail (kb);
568
- goto done;
569
- }
570
- key_returned->decrypted = true;
571
- if (!_store_to_cache (kb, key_returned)) {
572
- goto done;
573
- }
574
- } else if (kek_provider == MONGOCRYPT_KMS_PROVIDER_AWS) {
575
- if (!_mongocrypt_kms_ctx_init_aws_decrypt (&key_returned->kms,
576
- kms_providers,
577
- key_doc,
578
- &kb->crypt->log,
579
- kb->crypt->crypto)) {
580
- mongocrypt_kms_ctx_status (&key_returned->kms, kb->status);
581
- _key_broker_fail (kb);
582
- goto done;
583
- }
584
- } else if (kek_provider == MONGOCRYPT_KMS_PROVIDER_AZURE) {
585
- if (kms_providers->azure.access_token) {
586
- access_token = bson_strdup (kms_providers->azure.access_token);
587
- } else {
588
- access_token =
589
- _mongocrypt_cache_oauth_get (kb->crypt->cache_oauth_azure);
590
- }
591
- if (!access_token) {
592
- key_returned->needs_auth = true;
593
- /* Create an oauth request if one does not exist. */
594
- if (!kb->auth_request_azure.initialized) {
595
- if (!_mongocrypt_kms_ctx_init_azure_auth (
596
- &kb->auth_request_azure.kms,
597
- &kb->crypt->log,
598
- kms_providers,
599
- /* The key vault endpoint is used to determine the scope. */
600
- key_doc->kek.provider.azure.key_vault_endpoint)) {
601
- mongocrypt_kms_ctx_status (&kb->auth_request_azure.kms,
602
- kb->status);
603
- _key_broker_fail (kb);
604
- goto done;
450
+ /* If in any mode, add request for provided document now. */
451
+ if (kb->state == KB_ADDING_DOCS_ANY) {
452
+ key_request_t *const req = bson_malloc0(sizeof(key_request_t));
453
+
454
+ BSON_ASSERT(req);
455
+
456
+ _mongocrypt_buffer_copy_to(&key_doc->id, &req->id);
457
+ req->alt_name = _mongocrypt_key_alt_name_copy_all(key_doc->key_alt_names);
458
+ req->next = kb->key_requests;
459
+ kb->key_requests = req;
460
+
461
+ if (!_try_satisfying_from_cache(kb, req)) {
462
+ goto done;
463
+ }
464
+
465
+ /* Key is already cached; no work to be done. */
466
+ if (req->satisfied) {
467
+ ret = true;
468
+ goto done;
605
469
  }
606
- kb->auth_request_azure.initialized = true;
607
- }
608
- } else {
609
- if (!_mongocrypt_kms_ctx_init_azure_unwrapkey (&key_returned->kms,
610
- kms_providers,
611
- access_token,
612
- key_doc,
613
- &kb->crypt->log)) {
614
- mongocrypt_kms_ctx_status (&key_returned->kms, kb->status);
615
- _key_broker_fail (kb);
470
+ }
471
+ }
472
+
473
+ /* Check if there are other keys_returned with intersecting altnames or
474
+ * equal id. This is an error. Do *not* check cached keys. */
475
+ if (_key_returned_find_one(kb->keys_returned, &key_doc->id, key_doc->key_alt_names)) {
476
+ _key_broker_fail_w_msg(kb, "keys returned have duplicate keyAltNames or _id");
477
+ goto done;
478
+ }
479
+
480
+ key_returned = _key_returned_prepend(kb, &kb->keys_returned, key_doc);
481
+
482
+ /* Check that the returned key doc's provider matches. */
483
+ kek_provider = key_doc->kek.kms_provider;
484
+ if (0 == ((int)kek_provider & kms_providers->configured_providers)) {
485
+ _key_broker_fail_w_msg(kb, "client not configured with KMS provider necessary to decrypt");
486
+ goto done;
487
+ }
488
+
489
+ /* If the KMS provider is local, decrypt immediately. Otherwise, create the
490
+ * HTTP KMS request. */
491
+ BSON_ASSERT(kb->crypt);
492
+ if (kek_provider == MONGOCRYPT_KMS_PROVIDER_LOCAL) {
493
+ if (!_mongocrypt_unwrap_key(kb->crypt->crypto,
494
+ &kms_providers->local.key,
495
+ &key_returned->doc->key_material,
496
+ &key_returned->decrypted_key_material,
497
+ kb->status)) {
498
+ _key_broker_fail(kb);
616
499
  goto done;
617
- }
618
- }
619
- } else if (kek_provider == MONGOCRYPT_KMS_PROVIDER_GCP) {
620
- if (NULL != kms_providers->gcp.access_token) {
621
- access_token = bson_strdup (kms_providers->gcp.access_token);
622
- } else {
623
- access_token =
624
- _mongocrypt_cache_oauth_get (kb->crypt->cache_oauth_gcp);
625
- }
626
- if (!access_token) {
627
- key_returned->needs_auth = true;
628
- /* Create an oauth request if one does not exist. */
629
- if (!kb->auth_request_gcp.initialized) {
630
- if (!_mongocrypt_kms_ctx_init_gcp_auth (
631
- &kb->auth_request_gcp.kms,
632
- &kb->crypt->log,
633
- &kb->crypt->opts,
634
- kms_providers,
635
- key_doc->kek.provider.gcp.endpoint)) {
636
- mongocrypt_kms_ctx_status (&kb->auth_request_gcp.kms,
637
- kb->status);
638
- _key_broker_fail (kb);
639
- goto done;
500
+ }
501
+ key_returned->decrypted = true;
502
+ if (!_store_to_cache(kb, key_returned)) {
503
+ goto done;
504
+ }
505
+ } else if (kek_provider == MONGOCRYPT_KMS_PROVIDER_AWS) {
506
+ if (!_mongocrypt_kms_ctx_init_aws_decrypt(&key_returned->kms,
507
+ kms_providers,
508
+ key_doc,
509
+ &kb->crypt->log,
510
+ kb->crypt->crypto)) {
511
+ mongocrypt_kms_ctx_status(&key_returned->kms, kb->status);
512
+ _key_broker_fail(kb);
513
+ goto done;
514
+ }
515
+ } else if (kek_provider == MONGOCRYPT_KMS_PROVIDER_AZURE) {
516
+ if (kms_providers->azure.access_token) {
517
+ access_token = bson_strdup(kms_providers->azure.access_token);
518
+ } else {
519
+ access_token = _mongocrypt_cache_oauth_get(kb->crypt->cache_oauth_azure);
520
+ }
521
+ if (!access_token) {
522
+ key_returned->needs_auth = true;
523
+ /* Create an oauth request if one does not exist. */
524
+ if (!kb->auth_request_azure.initialized) {
525
+ if (!_mongocrypt_kms_ctx_init_azure_auth(&kb->auth_request_azure.kms,
526
+ &kb->crypt->log,
527
+ kms_providers,
528
+ /* The key vault endpoint is used to determine the scope. */
529
+ key_doc->kek.provider.azure.key_vault_endpoint)) {
530
+ mongocrypt_kms_ctx_status(&kb->auth_request_azure.kms, kb->status);
531
+ _key_broker_fail(kb);
532
+ goto done;
533
+ }
534
+ kb->auth_request_azure.initialized = true;
535
+ }
536
+ } else {
537
+ if (!_mongocrypt_kms_ctx_init_azure_unwrapkey(&key_returned->kms,
538
+ kms_providers,
539
+ access_token,
540
+ key_doc,
541
+ &kb->crypt->log)) {
542
+ mongocrypt_kms_ctx_status(&key_returned->kms, kb->status);
543
+ _key_broker_fail(kb);
544
+ goto done;
545
+ }
546
+ }
547
+ } else if (kek_provider == MONGOCRYPT_KMS_PROVIDER_GCP) {
548
+ if (NULL != kms_providers->gcp.access_token) {
549
+ access_token = bson_strdup(kms_providers->gcp.access_token);
550
+ } else {
551
+ access_token = _mongocrypt_cache_oauth_get(kb->crypt->cache_oauth_gcp);
552
+ }
553
+ if (!access_token) {
554
+ key_returned->needs_auth = true;
555
+ /* Create an oauth request if one does not exist. */
556
+ if (!kb->auth_request_gcp.initialized) {
557
+ if (!_mongocrypt_kms_ctx_init_gcp_auth(&kb->auth_request_gcp.kms,
558
+ &kb->crypt->log,
559
+ &kb->crypt->opts,
560
+ kms_providers,
561
+ key_doc->kek.provider.gcp.endpoint)) {
562
+ mongocrypt_kms_ctx_status(&kb->auth_request_gcp.kms, kb->status);
563
+ _key_broker_fail(kb);
564
+ goto done;
565
+ }
566
+ kb->auth_request_gcp.initialized = true;
640
567
  }
641
- kb->auth_request_gcp.initialized = true;
642
- }
643
- } else {
644
- if (!_mongocrypt_kms_ctx_init_gcp_decrypt (&key_returned->kms,
645
- kms_providers,
646
- access_token,
647
- key_doc,
648
- &kb->crypt->log)) {
649
- mongocrypt_kms_ctx_status (&key_returned->kms, kb->status);
650
- _key_broker_fail (kb);
568
+ } else {
569
+ if (!_mongocrypt_kms_ctx_init_gcp_decrypt(&key_returned->kms,
570
+ kms_providers,
571
+ access_token,
572
+ key_doc,
573
+ &kb->crypt->log)) {
574
+ mongocrypt_kms_ctx_status(&key_returned->kms, kb->status);
575
+ _key_broker_fail(kb);
576
+ goto done;
577
+ }
578
+ }
579
+ } else if (kek_provider == MONGOCRYPT_KMS_PROVIDER_KMIP) {
580
+ char *unique_identifier;
581
+ _mongocrypt_endpoint_t *endpoint;
582
+
583
+ if (!key_returned->doc->kek.provider.kmip.key_id) {
584
+ _key_broker_fail_w_msg(kb, "KMIP key malformed, no keyId present");
585
+ goto done;
586
+ }
587
+
588
+ unique_identifier = key_returned->doc->kek.provider.kmip.key_id;
589
+
590
+ if (key_returned->doc->kek.provider.kmip.endpoint) {
591
+ endpoint = key_returned->doc->kek.provider.kmip.endpoint;
592
+ } else if (kms_providers->kmip.endpoint) {
593
+ endpoint = kms_providers->kmip.endpoint;
594
+ } else {
595
+ _key_broker_fail_w_msg(kb, "endpoint not set for KMIP request");
651
596
  goto done;
652
- }
653
- }
654
- } else if (kek_provider == MONGOCRYPT_KMS_PROVIDER_KMIP) {
655
- char *unique_identifier;
656
- _mongocrypt_endpoint_t *endpoint;
657
-
658
- if (!key_returned->doc->kek.provider.kmip.key_id) {
659
- _key_broker_fail_w_msg (kb, "KMIP key malformed, no keyId present");
660
- goto done;
661
- }
662
-
663
- unique_identifier = key_returned->doc->kek.provider.kmip.key_id;
664
-
665
- if (key_returned->doc->kek.provider.kmip.endpoint) {
666
- endpoint = key_returned->doc->kek.provider.kmip.endpoint;
667
- } else if (kms_providers->kmip.endpoint) {
668
- endpoint = kms_providers->kmip.endpoint;
669
- } else {
670
- _key_broker_fail_w_msg (kb, "endpoint not set for KMIP request");
671
- goto done;
672
- }
673
-
674
- if (!_mongocrypt_kms_ctx_init_kmip_get (&key_returned->kms,
675
- endpoint,
676
- unique_identifier,
677
- &kb->crypt->log)) {
678
- mongocrypt_kms_ctx_status (&key_returned->kms, kb->status);
679
- _key_broker_fail (kb);
680
- goto done;
681
- }
682
- } else {
683
- _key_broker_fail_w_msg (kb, "unrecognized kms provider");
684
- goto done;
685
- }
686
-
687
- /* Mark all matching key requests as satisfied. */
688
- for (key_request = kb->key_requests; NULL != key_request;
689
- key_request = key_request->next) {
690
- if (0 == _mongocrypt_buffer_cmp (&key_doc->id, &key_request->id)) {
691
- key_request->satisfied = true;
692
- }
693
- if (_mongocrypt_key_alt_name_intersects (key_doc->key_alt_names,
694
- key_request->alt_name)) {
695
- key_request->satisfied = true;
696
- }
697
- }
698
-
699
- ret = true;
597
+ }
598
+
599
+ if (!_mongocrypt_kms_ctx_init_kmip_get(&key_returned->kms, endpoint, unique_identifier, &kb->crypt->log)) {
600
+ mongocrypt_kms_ctx_status(&key_returned->kms, kb->status);
601
+ _key_broker_fail(kb);
602
+ goto done;
603
+ }
604
+ } else {
605
+ _key_broker_fail_w_msg(kb, "unrecognized kms provider");
606
+ goto done;
607
+ }
608
+
609
+ /* Mark all matching key requests as satisfied. */
610
+ for (key_request = kb->key_requests; NULL != key_request; key_request = key_request->next) {
611
+ if (0 == _mongocrypt_buffer_cmp(&key_doc->id, &key_request->id)) {
612
+ key_request->satisfied = true;
613
+ }
614
+ if (_mongocrypt_key_alt_name_intersects(key_doc->key_alt_names, key_request->alt_name)) {
615
+ key_request->satisfied = true;
616
+ }
617
+ }
618
+
619
+ ret = true;
700
620
  done:
701
- bson_free (access_token);
702
- _mongocrypt_key_destroy (key_doc);
703
- return ret;
621
+ bson_free(access_token);
622
+ _mongocrypt_key_destroy(key_doc);
623
+ return ret;
704
624
  }
705
625
 
706
- bool
707
- _mongocrypt_key_broker_docs_done (_mongocrypt_key_broker_t *kb)
708
- {
709
- key_returned_t *key_returned;
710
- bool needs_decryption;
711
- bool needs_auth;
712
-
713
- BSON_ASSERT_PARAM (kb);
714
-
715
- if (kb->state != KB_ADDING_DOCS && kb->state != KB_ADDING_DOCS_ANY) {
716
- return _key_broker_fail_w_msg (
717
- kb, "attempting to finish adding docs, but in wrong state");
718
- }
719
-
720
- /* If there are any requests left unsatisfied, error. */
721
- if (!_all_key_requests_satisfied (kb)) {
722
- return _key_broker_fail_w_msg (kb,
723
- "not all keys requested were satisfied");
724
- }
725
-
726
- /* Transition to the next state.
727
- * - If there are any Azure or GCP backed keys, and no oauth token is
728
- * cached, transition to KB_AUTHENTICATING.
729
- * - Otherwise, if there are keys that need to be decrypted, transition to
730
- * KB_DECRYPTING_KEY_MATERIAL.
731
- * - Otherwise, all keys were retrieved from the cache or decrypted locally,
732
- * skip the decrypting state and go right to KB_DONE.
733
- */
734
- needs_decryption = false;
735
- needs_auth = false;
736
- for (key_returned = kb->keys_returned; NULL != key_returned;
737
- key_returned = key_returned->next) {
738
- if (key_returned->needs_auth) {
739
- needs_auth = true;
740
- break;
741
- }
742
- if (!key_returned->decrypted) {
743
- needs_decryption = true;
744
- }
745
- }
746
-
747
- if (needs_auth) {
748
- kb->state = KB_AUTHENTICATING;
749
- } else if (needs_decryption) {
750
- kb->state = KB_DECRYPTING_KEY_MATERIAL;
751
- } else {
752
- kb->state = KB_DONE;
753
- }
754
- return true;
626
+ bool _mongocrypt_key_broker_docs_done(_mongocrypt_key_broker_t *kb) {
627
+ key_returned_t *key_returned;
628
+ bool needs_decryption;
629
+ bool needs_auth;
630
+
631
+ BSON_ASSERT_PARAM(kb);
632
+
633
+ if (kb->state != KB_ADDING_DOCS && kb->state != KB_ADDING_DOCS_ANY) {
634
+ return _key_broker_fail_w_msg(kb, "attempting to finish adding docs, but in wrong state");
635
+ }
636
+
637
+ /* If there are any requests left unsatisfied, error. */
638
+ if (!_all_key_requests_satisfied(kb)) {
639
+ return _key_broker_fail_w_msg(
640
+ kb,
641
+ "not all keys requested were satisfied. Verify that key vault DB/collection name was correctly specified.");
642
+ }
643
+
644
+ /* Transition to the next state.
645
+ * - If there are any Azure or GCP backed keys, and no oauth token is
646
+ * cached, transition to KB_AUTHENTICATING.
647
+ * - Otherwise, if there are keys that need to be decrypted, transition to
648
+ * KB_DECRYPTING_KEY_MATERIAL.
649
+ * - Otherwise, all keys were retrieved from the cache or decrypted locally,
650
+ * skip the decrypting state and go right to KB_DONE.
651
+ */
652
+ needs_decryption = false;
653
+ needs_auth = false;
654
+ for (key_returned = kb->keys_returned; NULL != key_returned; key_returned = key_returned->next) {
655
+ if (key_returned->needs_auth) {
656
+ needs_auth = true;
657
+ break;
658
+ }
659
+ if (!key_returned->decrypted) {
660
+ needs_decryption = true;
661
+ }
662
+ }
663
+
664
+ if (needs_auth) {
665
+ kb->state = KB_AUTHENTICATING;
666
+ } else if (needs_decryption) {
667
+ kb->state = KB_DECRYPTING_KEY_MATERIAL;
668
+ } else {
669
+ kb->state = KB_DONE;
670
+ }
671
+ return true;
755
672
  }
756
673
 
757
- mongocrypt_kms_ctx_t *
758
- _mongocrypt_key_broker_next_kms (_mongocrypt_key_broker_t *kb)
759
- {
760
- BSON_ASSERT_PARAM (kb);
761
-
762
- if (kb->state != KB_DECRYPTING_KEY_MATERIAL &&
763
- kb->state != KB_AUTHENTICATING) {
764
- _key_broker_fail_w_msg (
765
- kb, "attempting to get KMS request, but in wrong state");
766
- /* TODO (CDRIVER-3327) this breaks other expectations. If the caller only
767
- * checks the return value they may mistake this NULL as indicating all
768
- * KMS requests have been iterated. */
769
- return NULL;
770
- }
771
-
772
- if (kb->state == KB_AUTHENTICATING) {
773
- if (!kb->auth_request_azure.initialized &&
774
- !kb->auth_request_gcp.initialized) {
775
- _key_broker_fail_w_msg (kb,
776
- "unexpected, attempting to authenticate but "
777
- "KMS request not initialized");
778
- return NULL;
779
- }
780
- if (kb->auth_request_azure.initialized &&
781
- !kb->auth_request_azure.returned) {
782
- kb->auth_request_azure.returned = true;
783
- return &kb->auth_request_azure.kms;
784
- }
785
-
786
- if (kb->auth_request_gcp.initialized && !kb->auth_request_gcp.returned) {
787
- kb->auth_request_gcp.returned = true;
788
- return &kb->auth_request_gcp.kms;
789
- }
790
-
791
- return NULL;
792
- }
793
-
794
- while (kb->decryptor_iter) {
795
- if (!kb->decryptor_iter->decrypted) {
796
- key_returned_t *key_returned;
797
-
798
- key_returned = kb->decryptor_iter;
799
- /* iterate before returning, so next call starts at next entry */
800
- kb->decryptor_iter = kb->decryptor_iter->next;
801
- return &key_returned->kms;
802
- }
803
- kb->decryptor_iter = kb->decryptor_iter->next;
804
- }
805
-
806
- return NULL;
674
+ mongocrypt_kms_ctx_t *_mongocrypt_key_broker_next_kms(_mongocrypt_key_broker_t *kb) {
675
+ BSON_ASSERT_PARAM(kb);
676
+
677
+ if (kb->state != KB_DECRYPTING_KEY_MATERIAL && kb->state != KB_AUTHENTICATING) {
678
+ _key_broker_fail_w_msg(kb, "attempting to get KMS request, but in wrong state");
679
+ /* TODO (CDRIVER-3327) this breaks other expectations. If the caller only
680
+ * checks the return value they may mistake this NULL as indicating all
681
+ * KMS requests have been iterated. */
682
+ return NULL;
683
+ }
684
+
685
+ if (kb->state == KB_AUTHENTICATING) {
686
+ if (!kb->auth_request_azure.initialized && !kb->auth_request_gcp.initialized) {
687
+ _key_broker_fail_w_msg(kb,
688
+ "unexpected, attempting to authenticate but "
689
+ "KMS request not initialized");
690
+ return NULL;
691
+ }
692
+ if (kb->auth_request_azure.initialized && !kb->auth_request_azure.returned) {
693
+ kb->auth_request_azure.returned = true;
694
+ return &kb->auth_request_azure.kms;
695
+ }
696
+
697
+ if (kb->auth_request_gcp.initialized && !kb->auth_request_gcp.returned) {
698
+ kb->auth_request_gcp.returned = true;
699
+ return &kb->auth_request_gcp.kms;
700
+ }
701
+
702
+ return NULL;
703
+ }
704
+
705
+ while (kb->decryptor_iter) {
706
+ if (!kb->decryptor_iter->decrypted) {
707
+ key_returned_t *key_returned;
708
+
709
+ key_returned = kb->decryptor_iter;
710
+ /* iterate before returning, so next call starts at next entry */
711
+ kb->decryptor_iter = kb->decryptor_iter->next;
712
+ return &key_returned->kms;
713
+ }
714
+ kb->decryptor_iter = kb->decryptor_iter->next;
715
+ }
716
+
717
+ return NULL;
807
718
  }
808
719
 
809
- bool
810
- _mongocrypt_key_broker_kms_done (
811
- _mongocrypt_key_broker_t *kb,
812
- _mongocrypt_opts_kms_providers_t *kms_providers)
813
- {
814
- key_returned_t *key_returned;
815
-
816
- BSON_ASSERT_PARAM (kb);
817
- BSON_ASSERT_PARAM (kms_providers);
818
-
819
- if (kb->state != KB_DECRYPTING_KEY_MATERIAL &&
820
- kb->state != KB_AUTHENTICATING) {
821
- return _key_broker_fail_w_msg (
822
- kb, "attempting to complete KMS requests, but in wrong state");
823
- }
824
-
825
- if (kb->state == KB_AUTHENTICATING) {
826
- bson_t oauth_response;
827
- _mongocrypt_buffer_t oauth_response_buf;
828
-
829
- if (kb->auth_request_azure.initialized) {
830
- if (!_mongocrypt_kms_ctx_result (&kb->auth_request_azure.kms,
831
- &oauth_response_buf)) {
832
- mongocrypt_kms_ctx_status (&kb->auth_request_azure.kms, kb->status);
833
- return _key_broker_fail (kb);
834
- }
835
-
836
- /* Cache returned tokens. */
837
- BSON_ASSERT (
838
- _mongocrypt_buffer_to_bson (&oauth_response_buf, &oauth_response));
839
- if (!_mongocrypt_cache_oauth_add (
840
- kb->crypt->cache_oauth_azure, &oauth_response, kb->status)) {
841
- return false;
842
- }
843
- }
844
-
845
- if (kb->auth_request_gcp.initialized) {
846
- if (!_mongocrypt_kms_ctx_result (&kb->auth_request_gcp.kms,
847
- &oauth_response_buf)) {
848
- mongocrypt_kms_ctx_status (&kb->auth_request_gcp.kms, kb->status);
849
- return _key_broker_fail (kb);
850
- }
851
-
852
- /* Cache returned tokens. */
853
- BSON_ASSERT (
854
- _mongocrypt_buffer_to_bson (&oauth_response_buf, &oauth_response));
855
- if (!_mongocrypt_cache_oauth_add (
856
- kb->crypt->cache_oauth_gcp, &oauth_response, kb->status)) {
857
- return false;
858
- }
859
- }
720
+ bool _mongocrypt_key_broker_kms_done(_mongocrypt_key_broker_t *kb, _mongocrypt_opts_kms_providers_t *kms_providers) {
721
+ key_returned_t *key_returned;
860
722
 
861
- /* Auth should be finished, create any remaining KMS requests. */
862
- for (key_returned = kb->keys_returned; NULL != key_returned;
863
- key_returned = key_returned->next) {
864
- char *access_token;
723
+ BSON_ASSERT_PARAM(kb);
724
+ BSON_ASSERT_PARAM(kms_providers);
865
725
 
866
- if (!key_returned->needs_auth) {
867
- continue;
868
- }
726
+ if (kb->state != KB_DECRYPTING_KEY_MATERIAL && kb->state != KB_AUTHENTICATING) {
727
+ return _key_broker_fail_w_msg(kb, "attempting to complete KMS requests, but in wrong state");
728
+ }
869
729
 
870
- if (key_returned->doc->kek.kms_provider ==
871
- MONGOCRYPT_KMS_PROVIDER_AZURE) {
872
- if (kms_providers->azure.access_token) {
873
- access_token = bson_strdup (kms_providers->azure.access_token);
874
- } else {
875
- access_token =
876
- _mongocrypt_cache_oauth_get (kb->crypt->cache_oauth_azure);
730
+ if (kb->state == KB_AUTHENTICATING) {
731
+ bson_t oauth_response;
732
+ _mongocrypt_buffer_t oauth_response_buf;
733
+
734
+ if (kb->auth_request_azure.initialized) {
735
+ if (!_mongocrypt_kms_ctx_result(&kb->auth_request_azure.kms, &oauth_response_buf)) {
736
+ mongocrypt_kms_ctx_status(&kb->auth_request_azure.kms, kb->status);
737
+ return _key_broker_fail(kb);
738
+ }
739
+
740
+ /* Cache returned tokens. */
741
+ BSON_ASSERT(_mongocrypt_buffer_to_bson(&oauth_response_buf, &oauth_response));
742
+ if (!_mongocrypt_cache_oauth_add(kb->crypt->cache_oauth_azure, &oauth_response, kb->status)) {
743
+ return false;
877
744
  }
745
+ }
878
746
 
879
- if (!access_token) {
880
- return _key_broker_fail_w_msg (
881
- kb, "authentication failed, no oauth token");
747
+ if (kb->auth_request_gcp.initialized) {
748
+ if (!_mongocrypt_kms_ctx_result(&kb->auth_request_gcp.kms, &oauth_response_buf)) {
749
+ mongocrypt_kms_ctx_status(&kb->auth_request_gcp.kms, kb->status);
750
+ return _key_broker_fail(kb);
882
751
  }
883
752
 
884
- if (!_mongocrypt_kms_ctx_init_azure_unwrapkey (&key_returned->kms,
885
- kms_providers,
886
- access_token,
887
- key_returned->doc,
888
- &kb->crypt->log)) {
889
- mongocrypt_kms_ctx_status (&key_returned->kms, kb->status);
890
- bson_free (access_token);
891
- return _key_broker_fail (kb);
753
+ /* Cache returned tokens. */
754
+ BSON_ASSERT(_mongocrypt_buffer_to_bson(&oauth_response_buf, &oauth_response));
755
+ if (!_mongocrypt_cache_oauth_add(kb->crypt->cache_oauth_gcp, &oauth_response, kb->status)) {
756
+ return false;
892
757
  }
758
+ }
893
759
 
894
- key_returned->needs_auth = false;
895
- bson_free (access_token);
896
- } else if (key_returned->doc->kek.kms_provider ==
897
- MONGOCRYPT_KMS_PROVIDER_GCP) {
898
- if (NULL != kms_providers->gcp.access_token) {
899
- access_token = bson_strdup (kms_providers->gcp.access_token);
760
+ /* Auth should be finished, create any remaining KMS requests. */
761
+ for (key_returned = kb->keys_returned; NULL != key_returned; key_returned = key_returned->next) {
762
+ char *access_token;
763
+
764
+ if (!key_returned->needs_auth) {
765
+ continue;
766
+ }
767
+
768
+ if (key_returned->doc->kek.kms_provider == MONGOCRYPT_KMS_PROVIDER_AZURE) {
769
+ if (kms_providers->azure.access_token) {
770
+ access_token = bson_strdup(kms_providers->azure.access_token);
771
+ } else {
772
+ access_token = _mongocrypt_cache_oauth_get(kb->crypt->cache_oauth_azure);
773
+ }
774
+
775
+ if (!access_token) {
776
+ return _key_broker_fail_w_msg(kb, "authentication failed, no oauth token");
777
+ }
778
+
779
+ if (!_mongocrypt_kms_ctx_init_azure_unwrapkey(&key_returned->kms,
780
+ kms_providers,
781
+ access_token,
782
+ key_returned->doc,
783
+ &kb->crypt->log)) {
784
+ mongocrypt_kms_ctx_status(&key_returned->kms, kb->status);
785
+ bson_free(access_token);
786
+ return _key_broker_fail(kb);
787
+ }
788
+
789
+ key_returned->needs_auth = false;
790
+ bson_free(access_token);
791
+ } else if (key_returned->doc->kek.kms_provider == MONGOCRYPT_KMS_PROVIDER_GCP) {
792
+ if (NULL != kms_providers->gcp.access_token) {
793
+ access_token = bson_strdup(kms_providers->gcp.access_token);
794
+ } else {
795
+ access_token = _mongocrypt_cache_oauth_get(kb->crypt->cache_oauth_gcp);
796
+ }
797
+
798
+ if (!access_token) {
799
+ return _key_broker_fail_w_msg(kb, "authentication failed, no oauth token");
800
+ }
801
+
802
+ if (!_mongocrypt_kms_ctx_init_gcp_decrypt(&key_returned->kms,
803
+ kms_providers,
804
+ access_token,
805
+ key_returned->doc,
806
+ &kb->crypt->log)) {
807
+ mongocrypt_kms_ctx_status(&key_returned->kms, kb->status);
808
+ bson_free(access_token);
809
+ return _key_broker_fail(kb);
810
+ }
811
+
812
+ key_returned->needs_auth = false;
813
+ bson_free(access_token);
900
814
  } else {
901
- access_token =
902
- _mongocrypt_cache_oauth_get (kb->crypt->cache_oauth_gcp);
815
+ return _key_broker_fail_w_msg(kb,
816
+ "unexpected, authenticating but "
817
+ "no requests require "
818
+ "authentication");
819
+ }
820
+ }
821
+
822
+ kb->state = KB_DECRYPTING_KEY_MATERIAL;
823
+ return true;
824
+ }
825
+
826
+ for (key_returned = kb->keys_returned; NULL != key_returned; key_returned = key_returned->next) {
827
+ /* Local keys were already decrypted. */
828
+ if (key_returned->doc->kek.kms_provider == MONGOCRYPT_KMS_PROVIDER_AWS
829
+ || key_returned->doc->kek.kms_provider == MONGOCRYPT_KMS_PROVIDER_AZURE
830
+ || key_returned->doc->kek.kms_provider == MONGOCRYPT_KMS_PROVIDER_GCP) {
831
+ if (key_returned->decrypted) {
832
+ /* Non-local keys may have been decrypted previously if the key
833
+ * broker has been restarted. */
834
+ continue;
903
835
  }
904
836
 
905
- if (!access_token) {
906
- return _key_broker_fail_w_msg (
907
- kb, "authentication failed, no oauth token");
837
+ if (!key_returned->kms.req) {
838
+ return _key_broker_fail_w_msg(kb, "unexpected, KMS not set on key returned");
908
839
  }
909
840
 
910
- if (!_mongocrypt_kms_ctx_init_gcp_decrypt (&key_returned->kms,
911
- kms_providers,
912
- access_token,
913
- key_returned->doc,
914
- &kb->crypt->log)) {
915
- mongocrypt_kms_ctx_status (&key_returned->kms, kb->status);
916
- bson_free (access_token);
917
- return _key_broker_fail (kb);
841
+ if (!_mongocrypt_kms_ctx_result(&key_returned->kms, &key_returned->decrypted_key_material)) {
842
+ /* Always fatal. Key attempted to decrypt but failed. */
843
+ mongocrypt_kms_ctx_status(&key_returned->kms, kb->status);
844
+ return _key_broker_fail(kb);
845
+ }
846
+ } else if (key_returned->doc->kek.kms_provider == MONGOCRYPT_KMS_PROVIDER_KMIP) {
847
+ _mongocrypt_buffer_t kek;
848
+ if (!_mongocrypt_kms_ctx_result(&key_returned->kms, &kek)) {
849
+ mongocrypt_kms_ctx_status(&key_returned->kms, kb->status);
850
+ return _key_broker_fail(kb);
918
851
  }
919
852
 
920
- key_returned->needs_auth = false;
921
- bson_free (access_token);
922
- } else {
923
- return _key_broker_fail_w_msg (kb,
924
- "unexpected, authenticating but "
925
- "no requests require "
926
- "authentication");
927
- }
928
- }
929
-
930
- kb->state = KB_DECRYPTING_KEY_MATERIAL;
931
- return true;
932
- }
933
-
934
- for (key_returned = kb->keys_returned; NULL != key_returned;
935
- key_returned = key_returned->next) {
936
- /* Local keys were already decrypted. */
937
- if (key_returned->doc->kek.kms_provider == MONGOCRYPT_KMS_PROVIDER_AWS ||
938
- key_returned->doc->kek.kms_provider ==
939
- MONGOCRYPT_KMS_PROVIDER_AZURE ||
940
- key_returned->doc->kek.kms_provider == MONGOCRYPT_KMS_PROVIDER_GCP) {
941
- if (key_returned->decrypted) {
942
- /* Non-local keys may have been decrypted previously if the key
943
- * broker has been restarted. */
944
- continue;
945
- }
946
-
947
- if (!key_returned->kms.req) {
948
- return _key_broker_fail_w_msg (
949
- kb, "unexpected, KMS not set on key returned");
950
- }
951
-
952
- if (!_mongocrypt_kms_ctx_result (
953
- &key_returned->kms, &key_returned->decrypted_key_material)) {
954
- /* Always fatal. Key attempted to decrypt but failed. */
955
- mongocrypt_kms_ctx_status (&key_returned->kms, kb->status);
956
- return _key_broker_fail (kb);
957
- }
958
- } else if (key_returned->doc->kek.kms_provider ==
959
- MONGOCRYPT_KMS_PROVIDER_KMIP) {
960
- _mongocrypt_buffer_t kek;
961
- if (!_mongocrypt_kms_ctx_result (&key_returned->kms, &kek)) {
962
- mongocrypt_kms_ctx_status (&key_returned->kms, kb->status);
963
- return _key_broker_fail (kb);
964
- }
965
-
966
- if (!_mongocrypt_unwrap_key (kb->crypt->crypto,
967
- &kek,
968
- &key_returned->doc->key_material,
969
- &key_returned->decrypted_key_material,
970
- kb->status)) {
971
- _key_broker_fail (kb);
972
- _mongocrypt_buffer_cleanup (&kek);
853
+ if (!_mongocrypt_unwrap_key(kb->crypt->crypto,
854
+ &kek,
855
+ &key_returned->doc->key_material,
856
+ &key_returned->decrypted_key_material,
857
+ kb->status)) {
858
+ _key_broker_fail(kb);
859
+ _mongocrypt_buffer_cleanup(&kek);
860
+ return false;
861
+ }
862
+ _mongocrypt_buffer_cleanup(&kek);
863
+ } else if (key_returned->doc->kek.kms_provider != MONGOCRYPT_KMS_PROVIDER_LOCAL) {
864
+ return _key_broker_fail_w_msg(kb, "unrecognized kms provider");
865
+ }
866
+
867
+ if (key_returned->decrypted_key_material.len != MONGOCRYPT_KEY_LEN) {
868
+ return _key_broker_fail_w_msg(kb, "decrypted key is incorrect length");
869
+ }
870
+
871
+ key_returned->decrypted = true;
872
+ if (!_store_to_cache(kb, key_returned)) {
973
873
  return false;
974
- }
975
- _mongocrypt_buffer_cleanup (&kek);
976
- } else if (key_returned->doc->kek.kms_provider !=
977
- MONGOCRYPT_KMS_PROVIDER_LOCAL) {
978
- return _key_broker_fail_w_msg (kb, "unrecognized kms provider");
979
- }
980
-
981
- if (key_returned->decrypted_key_material.len != MONGOCRYPT_KEY_LEN) {
982
- return _key_broker_fail_w_msg (kb,
983
- "decrypted key is incorrect length");
984
- }
985
-
986
- key_returned->decrypted = true;
987
- if (!_store_to_cache (kb, key_returned)) {
988
- return false;
989
- }
990
- }
991
-
992
- kb->state = KB_DONE;
993
- return true;
994
- }
874
+ }
875
+ }
995
876
 
877
+ kb->state = KB_DONE;
878
+ return true;
879
+ }
996
880
 
997
- static bool
998
- _get_decrypted_key_material (_mongocrypt_key_broker_t *kb,
999
- _mongocrypt_buffer_t *key_id,
1000
- _mongocrypt_key_alt_name_t *key_alt_name,
1001
- _mongocrypt_buffer_t *out,
1002
- _mongocrypt_buffer_t *key_id_out)
1003
- {
1004
- key_returned_t *key_returned;
1005
-
1006
- BSON_ASSERT_PARAM (kb);
1007
- /* key_id can be NULL */
1008
- /* key_alt_name can be NULL */
1009
- BSON_ASSERT_PARAM (out);
1010
- /* key_id_out is checked before each use, so it can be NULL */
1011
-
1012
- _mongocrypt_buffer_init (out);
1013
- if (key_id_out) {
1014
- _mongocrypt_buffer_init (key_id_out);
1015
- }
1016
- /* Search both keys_returned and keys_cached. */
1017
-
1018
- key_returned =
1019
- _key_returned_find_one (kb->keys_returned, key_id, key_alt_name);
1020
- if (!key_returned) {
1021
- /* Try the keys retrieved from the cache. */
1022
- key_returned =
1023
- _key_returned_find_one (kb->keys_cached, key_id, key_alt_name);
1024
- }
1025
-
1026
- if (!key_returned) {
1027
- return _key_broker_fail_w_msg (kb, "could not find key");
1028
- }
1029
-
1030
- if (!key_returned->decrypted) {
1031
- return _key_broker_fail_w_msg (kb, "unexpected, key not decrypted");
1032
- }
1033
-
1034
- _mongocrypt_buffer_copy_to (&key_returned->decrypted_key_material, out);
1035
- if (key_id_out) {
1036
- _mongocrypt_buffer_copy_to (&key_returned->doc->id, key_id_out);
1037
- }
1038
- return true;
881
+ static bool _get_decrypted_key_material(_mongocrypt_key_broker_t *kb,
882
+ _mongocrypt_buffer_t *key_id,
883
+ _mongocrypt_key_alt_name_t *key_alt_name,
884
+ _mongocrypt_buffer_t *out,
885
+ _mongocrypt_buffer_t *key_id_out) {
886
+ key_returned_t *key_returned;
887
+
888
+ BSON_ASSERT_PARAM(kb);
889
+ /* key_id can be NULL */
890
+ /* key_alt_name can be NULL */
891
+ BSON_ASSERT_PARAM(out);
892
+ /* key_id_out is checked before each use, so it can be NULL */
893
+
894
+ _mongocrypt_buffer_init(out);
895
+ if (key_id_out) {
896
+ _mongocrypt_buffer_init(key_id_out);
897
+ }
898
+ /* Search both keys_returned and keys_cached. */
899
+
900
+ key_returned = _key_returned_find_one(kb->keys_returned, key_id, key_alt_name);
901
+ if (!key_returned) {
902
+ /* Try the keys retrieved from the cache. */
903
+ key_returned = _key_returned_find_one(kb->keys_cached, key_id, key_alt_name);
904
+ }
905
+
906
+ if (!key_returned) {
907
+ return _key_broker_fail_w_msg(kb, "could not find key");
908
+ }
909
+
910
+ if (!key_returned->decrypted) {
911
+ return _key_broker_fail_w_msg(kb, "unexpected, key not decrypted");
912
+ }
913
+
914
+ _mongocrypt_buffer_copy_to(&key_returned->decrypted_key_material, out);
915
+ if (key_id_out) {
916
+ _mongocrypt_buffer_copy_to(&key_returned->doc->id, key_id_out);
917
+ }
918
+ return true;
1039
919
  }
1040
920
 
1041
- bool
1042
- _mongocrypt_key_broker_decrypted_key_by_id (_mongocrypt_key_broker_t *kb,
1043
- const _mongocrypt_buffer_t *key_id,
1044
- _mongocrypt_buffer_t *out)
1045
- {
1046
- BSON_ASSERT_PARAM (kb);
1047
- BSON_ASSERT_PARAM (key_id);
1048
- BSON_ASSERT_PARAM (out);
1049
-
1050
- if (kb->state != KB_DONE && kb->state != KB_REQUESTING) {
1051
- return _key_broker_fail_w_msg (
1052
- kb, "attempting retrieve decrypted key material, but in wrong state");
1053
- }
1054
- return _get_decrypted_key_material (kb,
1055
- (_mongocrypt_buffer_t *) key_id,
921
+ bool _mongocrypt_key_broker_decrypted_key_by_id(_mongocrypt_key_broker_t *kb,
922
+ const _mongocrypt_buffer_t *key_id,
923
+ _mongocrypt_buffer_t *out) {
924
+ BSON_ASSERT_PARAM(kb);
925
+ BSON_ASSERT_PARAM(key_id);
926
+ BSON_ASSERT_PARAM(out);
927
+
928
+ if (kb->state != KB_DONE && kb->state != KB_REQUESTING) {
929
+ return _key_broker_fail_w_msg(kb, "attempting retrieve decrypted key material, but in wrong state");
930
+ }
931
+ return _get_decrypted_key_material(kb,
932
+ (_mongocrypt_buffer_t *)key_id,
1056
933
  NULL /* key alt name */,
1057
934
  out,
1058
935
  NULL /* key id out */);
1059
936
  }
1060
937
 
1061
- bool
1062
- _mongocrypt_key_broker_decrypted_key_by_name (
1063
- _mongocrypt_key_broker_t *kb,
1064
- const bson_value_t *key_alt_name_value,
1065
- _mongocrypt_buffer_t *out,
1066
- _mongocrypt_buffer_t *key_id_out)
1067
- {
1068
- bool ret;
1069
- _mongocrypt_key_alt_name_t *key_alt_name;
1070
-
1071
- BSON_ASSERT_PARAM (kb);
1072
- BSON_ASSERT_PARAM (key_alt_name_value);
1073
- BSON_ASSERT_PARAM (out);
1074
- BSON_ASSERT_PARAM (key_id_out);
1075
-
1076
- if (kb->state != KB_DONE) {
1077
- return _key_broker_fail_w_msg (
1078
- kb, "attempting retrieve decrypted key material, but in wrong state");
1079
- }
1080
-
1081
- key_alt_name = _mongocrypt_key_alt_name_new (key_alt_name_value);
1082
- ret = _get_decrypted_key_material (kb, NULL, key_alt_name, out, key_id_out);
1083
- _mongocrypt_key_alt_name_destroy_all (key_alt_name);
1084
- return ret;
938
+ bool _mongocrypt_key_broker_decrypted_key_by_name(_mongocrypt_key_broker_t *kb,
939
+ const bson_value_t *key_alt_name_value,
940
+ _mongocrypt_buffer_t *out,
941
+ _mongocrypt_buffer_t *key_id_out) {
942
+ bool ret;
943
+ _mongocrypt_key_alt_name_t *key_alt_name;
944
+
945
+ BSON_ASSERT_PARAM(kb);
946
+ BSON_ASSERT_PARAM(key_alt_name_value);
947
+ BSON_ASSERT_PARAM(out);
948
+ BSON_ASSERT_PARAM(key_id_out);
949
+
950
+ if (kb->state != KB_DONE) {
951
+ return _key_broker_fail_w_msg(kb, "attempting retrieve decrypted key material, but in wrong state");
952
+ }
953
+
954
+ key_alt_name = _mongocrypt_key_alt_name_new(key_alt_name_value);
955
+ ret = _get_decrypted_key_material(kb, NULL, key_alt_name, out, key_id_out);
956
+ _mongocrypt_key_alt_name_destroy_all(key_alt_name);
957
+ return ret;
1085
958
  }
1086
959
 
1087
- bool
1088
- _mongocrypt_key_broker_status (_mongocrypt_key_broker_t *kb,
1089
- mongocrypt_status_t *out)
1090
- {
1091
- BSON_ASSERT_PARAM (kb);
1092
- BSON_ASSERT_PARAM (out);
960
+ bool _mongocrypt_key_broker_status(_mongocrypt_key_broker_t *kb, mongocrypt_status_t *out) {
961
+ BSON_ASSERT_PARAM(kb);
962
+ BSON_ASSERT_PARAM(out);
1093
963
 
1094
- if (!mongocrypt_status_ok (kb->status)) {
1095
- _mongocrypt_status_copy_to (kb->status, out);
1096
- return false;
1097
- }
964
+ if (!mongocrypt_status_ok(kb->status)) {
965
+ _mongocrypt_status_copy_to(kb->status, out);
966
+ return false;
967
+ }
1098
968
 
1099
- return true;
969
+ return true;
1100
970
  }
1101
971
 
972
+ static void _destroy_key_requests(key_request_t *head) {
973
+ key_request_t *tmp;
1102
974
 
1103
- static void
1104
- _destroy_key_requests (key_request_t *head)
1105
- {
1106
- key_request_t *tmp;
1107
-
1108
- while (head) {
1109
- tmp = head->next;
975
+ while (head) {
976
+ tmp = head->next;
1110
977
 
1111
- _mongocrypt_buffer_cleanup (&head->id);
1112
- _mongocrypt_key_alt_name_destroy_all (head->alt_name);
978
+ _mongocrypt_buffer_cleanup(&head->id);
979
+ _mongocrypt_key_alt_name_destroy_all(head->alt_name);
1113
980
 
1114
- bson_free (head);
1115
- head = tmp;
1116
- }
981
+ bson_free(head);
982
+ head = tmp;
983
+ }
1117
984
  }
1118
985
 
1119
- static void
1120
- _destroy_keys_returned (key_returned_t *head)
1121
- {
1122
- key_returned_t *tmp;
986
+ static void _destroy_keys_returned(key_returned_t *head) {
987
+ key_returned_t *tmp;
1123
988
 
1124
- while (head) {
1125
- tmp = head->next;
989
+ while (head) {
990
+ tmp = head->next;
1126
991
 
1127
- _mongocrypt_key_destroy (head->doc);
1128
- _mongocrypt_buffer_cleanup (&head->decrypted_key_material);
1129
- _mongocrypt_kms_ctx_cleanup (&head->kms);
992
+ _mongocrypt_key_destroy(head->doc);
993
+ _mongocrypt_buffer_cleanup(&head->decrypted_key_material);
994
+ _mongocrypt_kms_ctx_cleanup(&head->kms);
1130
995
 
1131
- bson_free (head);
1132
- head = tmp;
1133
- }
996
+ bson_free(head);
997
+ head = tmp;
998
+ }
1134
999
  }
1135
1000
 
1136
- void
1137
- _mongocrypt_key_broker_cleanup (_mongocrypt_key_broker_t *kb)
1138
- {
1139
- if (!kb) {
1140
- return;
1141
- }
1142
- mongocrypt_status_destroy (kb->status);
1143
- _mongocrypt_buffer_cleanup (&kb->filter);
1144
- /* Delete all linked lists */
1145
- _destroy_keys_returned (kb->keys_returned);
1146
- _destroy_keys_returned (kb->keys_cached);
1147
- _destroy_key_requests (kb->key_requests);
1148
- _mongocrypt_kms_ctx_cleanup (&kb->auth_request_azure.kms);
1149
- _mongocrypt_kms_ctx_cleanup (&kb->auth_request_gcp.kms);
1001
+ void _mongocrypt_key_broker_cleanup(_mongocrypt_key_broker_t *kb) {
1002
+ if (!kb) {
1003
+ return;
1004
+ }
1005
+ mongocrypt_status_destroy(kb->status);
1006
+ _mongocrypt_buffer_cleanup(&kb->filter);
1007
+ /* Delete all linked lists */
1008
+ _destroy_keys_returned(kb->keys_returned);
1009
+ _destroy_keys_returned(kb->keys_cached);
1010
+ _destroy_key_requests(kb->key_requests);
1011
+ _mongocrypt_kms_ctx_cleanup(&kb->auth_request_azure.kms);
1012
+ _mongocrypt_kms_ctx_cleanup(&kb->auth_request_gcp.kms);
1150
1013
  }
1151
1014
 
1152
- void
1153
- _mongocrypt_key_broker_add_test_key (_mongocrypt_key_broker_t *kb,
1154
- const _mongocrypt_buffer_t *key_id)
1155
- {
1156
- key_returned_t *key_returned;
1157
- _mongocrypt_key_doc_t *key_doc;
1158
-
1159
- BSON_ASSERT_PARAM (kb);
1160
- BSON_ASSERT_PARAM (key_id);
1161
-
1162
- key_doc = _mongocrypt_key_new ();
1163
- _mongocrypt_buffer_copy_to (key_id, &key_doc->id);
1164
-
1165
- key_returned = _key_returned_prepend (kb, &kb->keys_returned, key_doc);
1166
- key_returned->decrypted = true;
1167
- _mongocrypt_buffer_init (&key_returned->decrypted_key_material);
1168
- _mongocrypt_buffer_resize (&key_returned->decrypted_key_material,
1169
- MONGOCRYPT_KEY_LEN);
1170
- memset (key_returned->decrypted_key_material.data, 0, MONGOCRYPT_KEY_LEN);
1171
- _mongocrypt_key_destroy (key_doc);
1172
- /* Hijack state and move directly to DONE. */
1173
- kb->state = KB_DONE;
1174
- }
1015
+ void _mongocrypt_key_broker_add_test_key(_mongocrypt_key_broker_t *kb, const _mongocrypt_buffer_t *key_id) {
1016
+ key_returned_t *key_returned;
1017
+ _mongocrypt_key_doc_t *key_doc;
1018
+
1019
+ BSON_ASSERT_PARAM(kb);
1020
+ BSON_ASSERT_PARAM(key_id);
1175
1021
 
1022
+ key_doc = _mongocrypt_key_new();
1023
+ _mongocrypt_buffer_copy_to(key_id, &key_doc->id);
1024
+
1025
+ key_returned = _key_returned_prepend(kb, &kb->keys_returned, key_doc);
1026
+ key_returned->decrypted = true;
1027
+ _mongocrypt_buffer_init(&key_returned->decrypted_key_material);
1028
+ _mongocrypt_buffer_resize(&key_returned->decrypted_key_material, MONGOCRYPT_KEY_LEN);
1029
+ memset(key_returned->decrypted_key_material.data, 0, MONGOCRYPT_KEY_LEN);
1030
+ _mongocrypt_key_destroy(key_doc);
1031
+ /* Hijack state and move directly to DONE. */
1032
+ kb->state = KB_DONE;
1033
+ }
1176
1034
 
1177
- bool
1178
- _mongocrypt_key_broker_restart (_mongocrypt_key_broker_t *kb)
1179
- {
1180
- BSON_ASSERT_PARAM (kb);
1181
- if (kb->state != KB_DONE) {
1182
- return _key_broker_fail_w_msg (
1183
- kb, "_mongocrypt_key_broker_restart called in wrong state");
1184
- }
1185
- kb->state = KB_REQUESTING;
1186
- _mongocrypt_buffer_cleanup (&kb->filter);
1187
- _mongocrypt_buffer_init (&kb->filter);
1188
- return true;
1035
+ bool _mongocrypt_key_broker_restart(_mongocrypt_key_broker_t *kb) {
1036
+ BSON_ASSERT_PARAM(kb);
1037
+ if (kb->state != KB_DONE) {
1038
+ return _key_broker_fail_w_msg(kb, "_mongocrypt_key_broker_restart called in wrong state");
1039
+ }
1040
+ kb->state = KB_REQUESTING;
1041
+ _mongocrypt_buffer_cleanup(&kb->filter);
1042
+ _mongocrypt_buffer_init(&kb->filter);
1043
+ return true;
1189
1044
  }