libmongocrypt-helper 1.12.0.0.1001 → 1.14.0.0.1001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (648) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libmongocrypt/libmongocrypt/CHANGELOG.md +27 -0
  3. data/ext/libmongocrypt/libmongocrypt/CMakeLists.txt +15 -1
  4. data/ext/libmongocrypt/libmongocrypt/CODEOWNERS +3 -3
  5. data/ext/libmongocrypt/libmongocrypt/CONTRIBUTING.md +14 -0
  6. data/ext/libmongocrypt/libmongocrypt/Earthfile +50 -50
  7. data/ext/libmongocrypt/libmongocrypt/README.md +8 -17
  8. data/ext/libmongocrypt/libmongocrypt/bindings/python/CHANGELOG.rst +13 -0
  9. data/ext/libmongocrypt/libmongocrypt/bindings/python/CONTRIBUTING.md +34 -0
  10. data/ext/libmongocrypt/libmongocrypt/bindings/python/README.rst +1 -1
  11. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/asynchronous/state_machine.py +6 -2
  12. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/binding.py +57 -3
  13. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/mongocrypt.py +40 -0
  14. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/options.py +14 -0
  15. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/synchronous/state_machine.py +6 -2
  16. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/version.py +1 -1
  17. data/ext/libmongocrypt/libmongocrypt/bindings/python/sbom.json +8 -8
  18. data/ext/libmongocrypt/libmongocrypt/bindings/python/scripts/libmongocrypt-version.txt +1 -0
  19. data/ext/libmongocrypt/libmongocrypt/bindings/python/{release.sh → scripts/release.sh} +9 -3
  20. data/ext/libmongocrypt/libmongocrypt/bindings/python/{synchro.py → scripts/synchro.py} +16 -9
  21. data/ext/libmongocrypt/libmongocrypt/bindings/python/scripts/synchro.sh +8 -0
  22. data/ext/libmongocrypt/libmongocrypt/bindings/python/scripts/update-version.sh +27 -0
  23. data/ext/libmongocrypt/libmongocrypt/bindings/python/scripts/update_binding.py +78 -0
  24. data/ext/libmongocrypt/libmongocrypt/bindings/python/test/data/compact/success/encrypted-field-config-map.json +0 -1
  25. data/ext/libmongocrypt/libmongocrypt/bindings/python/test/data/encrypted-field-config-map.json +0 -2
  26. data/ext/libmongocrypt/libmongocrypt/bindings/python/test/test_mongocrypt.py +26 -11
  27. data/ext/libmongocrypt/libmongocrypt/cmake/FetchMongoC.cmake +4 -2
  28. data/ext/libmongocrypt/libmongocrypt/cmake/ImportBSON.cmake +3 -5
  29. data/ext/libmongocrypt/libmongocrypt/doc/releasing.md +37 -43
  30. data/ext/libmongocrypt/libmongocrypt/etc/calc_release_version.py +39 -13
  31. data/ext/libmongocrypt/libmongocrypt/etc/calc_release_version_selftest.sh +1 -1
  32. data/ext/libmongocrypt/libmongocrypt/etc/cyclonedx.sbom.json +9 -9
  33. data/ext/libmongocrypt/libmongocrypt/etc/format.sh +0 -2
  34. data/ext/libmongocrypt/libmongocrypt/etc/libbson-remove-GCC-diagnostic-in-functions.patch +158 -0
  35. data/ext/libmongocrypt/libmongocrypt/etc/libbson-remove-GCC-diagnostic-pragma.patch +3 -3
  36. data/ext/libmongocrypt/libmongocrypt/etc/purls.txt +1 -1
  37. data/ext/libmongocrypt/libmongocrypt/integrating.md +42 -11
  38. data/ext/libmongocrypt/libmongocrypt/kms-message/CMakeLists.txt +1 -1
  39. data/ext/libmongocrypt/libmongocrypt/kms-message/src/hexlify.c +5 -0
  40. data/ext/libmongocrypt/libmongocrypt/kms-message/src/hexlify.h +1 -1
  41. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_azure_request.c +1 -1
  42. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_crypto_windows.c +2 -2
  43. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_gcp_request.c +1 -1
  44. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_kmip_reader_writer.c +4 -2
  45. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_kmip_request.c +1 -2
  46. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_message.c +1 -1
  47. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_message_private.h +7 -3
  48. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_request.c +4 -4
  49. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_request_opt.c +1 -1
  50. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_request_str.c +2 -8
  51. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_request_str.h +9 -0
  52. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_response_parser.c +0 -1
  53. data/ext/libmongocrypt/libmongocrypt/kms-message/src/sort.c +7 -3
  54. data/ext/libmongocrypt/libmongocrypt/kms-message/src/sort.h +2 -0
  55. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kmip_reader_writer.c +13 -6
  56. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_assert.h +29 -11
  57. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_azure_online.c +3 -3
  58. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_gcp_online.c +4 -4
  59. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_kmip_request.c +4 -0
  60. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_kmip_response.c +3 -0
  61. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_kmip_response_parser.c +4 -0
  62. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_online_util.c +1 -1
  63. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_online_util.h +1 -1
  64. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_request.c +50 -48
  65. data/ext/libmongocrypt/libmongocrypt/src/crypto/libcrypto.c +235 -65
  66. data/ext/libmongocrypt/libmongocrypt/src/crypto/none.c +1 -1
  67. data/ext/libmongocrypt/libmongocrypt/src/csfle-markup.cpp +4 -2
  68. data/ext/libmongocrypt/libmongocrypt/src/mc-dec128.h +2 -2
  69. data/ext/libmongocrypt/libmongocrypt/src/mc-dec128.test.cpp +2 -2
  70. data/ext/libmongocrypt/libmongocrypt/src/mc-efc-private.h +6 -4
  71. data/ext/libmongocrypt/libmongocrypt/src/mc-efc.c +44 -12
  72. data/ext/libmongocrypt/libmongocrypt/src/mc-fle-blob-subtype-private.h +5 -1
  73. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-encryption-placeholder-private.h +89 -8
  74. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-encryption-placeholder.c +346 -131
  75. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-equality-payload-v2.c +6 -18
  76. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-equality-payload.c +6 -18
  77. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-range-payload-private-v2.h +1 -1
  78. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-range-payload-v2.c +25 -26
  79. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-range-payload.c +2 -1
  80. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-text-payload-private.h +122 -0
  81. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-text-payload.c +477 -0
  82. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-insert-update-payload-private-v2.h +35 -3
  83. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-insert-update-payload-v2.c +193 -44
  84. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-insert-update-payload.c +6 -18
  85. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-iev-private-v2.h +105 -7
  86. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-iev-v2.c +386 -74
  87. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-iev.c +13 -10
  88. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-uev-common.c +3 -2
  89. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-rfds.c +7 -6
  90. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-tag-and-encrypted-metadata-block-private.h +7 -2
  91. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-tag-and-encrypted-metadata-block.c +21 -3
  92. data/ext/libmongocrypt/libmongocrypt/src/mc-optional-private.h +1 -1
  93. data/ext/libmongocrypt/libmongocrypt/{bindings/java/mongocrypt/benchmarks/build.gradle.kts → src/mc-parse-utils-private.h} +10 -11
  94. data/ext/libmongocrypt/libmongocrypt/src/mc-parse-utils.c +48 -0
  95. data/ext/libmongocrypt/libmongocrypt/src/mc-range-edge-generation-private.h +5 -5
  96. data/ext/libmongocrypt/libmongocrypt/src/mc-range-edge-generation.c +15 -20
  97. data/ext/libmongocrypt/libmongocrypt/src/mc-range-encoding-private.h +4 -6
  98. data/ext/libmongocrypt/libmongocrypt/src/mc-range-encoding.c +9 -18
  99. data/ext/libmongocrypt/libmongocrypt/src/mc-range-mincover-generator.template.h +4 -5
  100. data/ext/libmongocrypt/libmongocrypt/src/mc-range-mincover-private.h +5 -9
  101. data/ext/libmongocrypt/libmongocrypt/src/mc-range-mincover.c +14 -19
  102. data/ext/libmongocrypt/libmongocrypt/src/mc-rangeopts-private.h +2 -4
  103. data/ext/libmongocrypt/libmongocrypt/src/mc-rangeopts.c +109 -119
  104. data/ext/libmongocrypt/libmongocrypt/src/mc-reader-private.h +2 -2
  105. data/ext/libmongocrypt/libmongocrypt/src/mc-reader.c +4 -2
  106. data/ext/libmongocrypt/libmongocrypt/src/mc-schema-broker-private.h +123 -0
  107. data/ext/libmongocrypt/libmongocrypt/src/mc-schema-broker.c +1065 -0
  108. data/ext/libmongocrypt/libmongocrypt/src/mc-str-encode-string-sets-private.h +95 -0
  109. data/ext/libmongocrypt/libmongocrypt/src/mc-str-encode-string-sets.c +304 -0
  110. data/ext/libmongocrypt/libmongocrypt/src/mc-text-search-str-encode-private.h +52 -0
  111. data/ext/libmongocrypt/libmongocrypt/src/mc-text-search-str-encode.c +324 -0
  112. data/ext/libmongocrypt/libmongocrypt/src/mc-tokens-private.h +130 -2
  113. data/ext/libmongocrypt/libmongocrypt/src/mc-tokens.c +159 -3
  114. data/ext/libmongocrypt/libmongocrypt/src/mc-writer-private.h +1 -1
  115. data/ext/libmongocrypt/libmongocrypt/src/mc-writer.c +4 -2
  116. data/ext/libmongocrypt/libmongocrypt/src/mlib/error.h +1 -1
  117. data/ext/libmongocrypt/libmongocrypt/src/mlib/int128.h +12 -1
  118. data/ext/libmongocrypt/libmongocrypt/src/mlib/int128.test.cpp +5 -0
  119. data/ext/libmongocrypt/libmongocrypt/src/mlib/path.h +5 -5
  120. data/ext/libmongocrypt/libmongocrypt/src/mlib/path.test.c +2 -5
  121. data/ext/libmongocrypt/libmongocrypt/src/mlib/str.h +65 -58
  122. data/ext/libmongocrypt/libmongocrypt/src/mlib/str.test.c +3 -3
  123. data/ext/libmongocrypt/libmongocrypt/src/mlib/thread.h +1 -1
  124. data/ext/libmongocrypt/libmongocrypt/src/mlib/user-check.h +1 -1
  125. data/ext/libmongocrypt/libmongocrypt/src/mlib/windows-lean.h +2 -0
  126. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-buffer-private.h +11 -0
  127. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-buffer.c +36 -3
  128. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-cache-collinfo-private.h +1 -1
  129. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-cache-collinfo.c +4 -0
  130. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ciphertext-private.h +1 -1
  131. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-crypto-private.h +4 -4
  132. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-crypto.c +29 -25
  133. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-datakey.c +3 -2
  134. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-decrypt.c +14 -7
  135. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-encrypt.c +463 -900
  136. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-private.h +5 -19
  137. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-rewrap-many-datakey.c +12 -0
  138. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx.c +5 -13
  139. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-dll-private.h +19 -2
  140. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-key-broker.c +9 -9
  141. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-kms-ctx.c +1 -1
  142. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-marking-private.h +3 -4
  143. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-marking.c +773 -584
  144. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-opts-private.h +0 -6
  145. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-opts.c +0 -1
  146. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-private.h +8 -13
  147. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-traverse-util.c +1 -1
  148. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-util.c +7 -2
  149. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt.c +53 -40
  150. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt.h +17 -0
  151. data/ext/libmongocrypt/libmongocrypt/src/os_posix/os_dll.c +5 -1
  152. data/ext/libmongocrypt/libmongocrypt/src/os_posix/os_mutex.c +1 -1
  153. data/ext/libmongocrypt/libmongocrypt/src/os_win/os_dll.c +3 -1
  154. data/ext/libmongocrypt/libmongocrypt/src/os_win/os_mutex.c +1 -1
  155. data/ext/libmongocrypt/libmongocrypt/src/unicode/case-fold-map.c +1434 -0
  156. data/ext/libmongocrypt/libmongocrypt/src/unicode/diacritic-fold-map.c +2884 -0
  157. data/ext/libmongocrypt/libmongocrypt/src/unicode/fold.c +139 -0
  158. data/ext/libmongocrypt/libmongocrypt/src/unicode/fold.h +58 -0
  159. data/ext/libmongocrypt/libmongocrypt/test/crypt_shared-stub.cpp +0 -14
  160. data/ext/libmongocrypt/libmongocrypt/test/data/bulkWrite/unencrypted/payload.json +2 -2
  161. data/ext/libmongocrypt/libmongocrypt/test/data/cleanup/missing-key-id/collinfo.json +1 -0
  162. data/ext/libmongocrypt/libmongocrypt/test/data/cleanup/no-fields/collinfo.json +1 -0
  163. data/ext/libmongocrypt/libmongocrypt/test/data/cleanup/success/collinfo.json +1 -0
  164. data/ext/libmongocrypt/libmongocrypt/test/data/compact/anchor-pad/collinfo.json +1 -1
  165. data/ext/libmongocrypt/libmongocrypt/test/data/compact/anchor-pad/encrypted-payload-range-v2.json +20 -21
  166. data/ext/libmongocrypt/libmongocrypt/test/data/compact/missing-key-id/collinfo.json +2 -2
  167. data/ext/libmongocrypt/libmongocrypt/test/data/compact/no-fields/collinfo.json +1 -1
  168. data/ext/libmongocrypt/libmongocrypt/test/data/compact/no-range/collinfo.json +1 -1
  169. data/ext/libmongocrypt/libmongocrypt/test/data/compact/success/collinfo.json +1 -1
  170. data/ext/libmongocrypt/libmongocrypt/test/data/compact/success/encrypted-field-config-map.json +6 -2
  171. data/ext/libmongocrypt/libmongocrypt/test/data/compact/success/encrypted-payload-range-v2.json +20 -21
  172. data/ext/libmongocrypt/libmongocrypt/test/data/dollardb/omitted/cmd-to-mongocryptd.json +1 -2
  173. data/ext/libmongocrypt/libmongocrypt/test/data/dollardb/omitted/collinfo.json +2 -2
  174. data/ext/libmongocrypt/libmongocrypt/test/data/dollardb/omitted/encrypted-payload.json +2 -3
  175. data/ext/libmongocrypt/libmongocrypt/test/data/dollardb/omitted/mongocryptd-reply.json +1 -2
  176. data/ext/libmongocrypt/libmongocrypt/test/data/dollardb/preserved/cmd-to-mongocryptd.json +1 -2
  177. data/ext/libmongocrypt/libmongocrypt/test/data/dollardb/preserved/collinfo.json +2 -2
  178. data/ext/libmongocrypt/libmongocrypt/test/data/dollardb/preserved/encrypted-payload.json +2 -3
  179. data/ext/libmongocrypt/libmongocrypt/test/data/dollardb/preserved/mongocryptd-reply.json +1 -2
  180. data/ext/libmongocrypt/libmongocrypt/test/data/dollardb/preserved_empty/cmd-to-mongocryptd.json +1 -2
  181. data/ext/libmongocrypt/libmongocrypt/test/data/dollardb/preserved_empty/collinfo.json +2 -2
  182. data/ext/libmongocrypt/libmongocrypt/test/data/dollardb/preserved_empty/mongocryptd-reply.json +1 -2
  183. data/ext/libmongocrypt/libmongocrypt/test/data/dollardb/preserved_fle1/collinfo.json +2 -1
  184. data/ext/libmongocrypt/libmongocrypt/test/data/efc/efc-extraField.json +0 -1
  185. data/ext/libmongocrypt/libmongocrypt/test/data/efc/efc-missingKeyId.json +0 -1
  186. data/ext/libmongocrypt/libmongocrypt/test/data/efc/efc-oneField-badVersionSet.json +23 -0
  187. data/ext/libmongocrypt/libmongocrypt/test/data/efc/efc-oneField-goodVersionSet.json +23 -0
  188. data/ext/libmongocrypt/libmongocrypt/test/data/efc/efc-oneField.json +0 -1
  189. data/ext/libmongocrypt/libmongocrypt/test/data/efc/efc-textSearchFields-badVersionSet.json +48 -0
  190. data/ext/libmongocrypt/libmongocrypt/test/data/efc/efc-textSearchFields-goodVersionSet.json +48 -0
  191. data/ext/libmongocrypt/libmongocrypt/test/data/efc/efc-textSearchFields.json +47 -0
  192. data/ext/libmongocrypt/libmongocrypt/test/data/efc/efc-twoFields.json +0 -1
  193. data/ext/libmongocrypt/libmongocrypt/test/data/encrypted-field-config-map.json +1 -3
  194. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE1DeterministicEncryptedValue.json +8 -0
  195. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE1EncryptionPlaceholder.json +8 -0
  196. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE1RandomEncryptedValue.json +8 -0
  197. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2EncryptionPlaceholder.json +8 -0
  198. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2FindEqualityPayloadV2.json +8 -0
  199. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2IndexedEqualityEncryptedValue.json +8 -0
  200. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2IndexedEqualityEncryptedValueV2.json +8 -0
  201. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2IndexedRangeEncryptedValue.json +8 -0
  202. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2IndexedRangeEncryptedValueV2.json +8 -0
  203. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2InsertUpdatePayload-RangeV1.json +8 -0
  204. data/ext/libmongocrypt/libmongocrypt/test/data/{fle2-explicit/insert-indexed.json → explicit-decrypt/FLE2InsertUpdatePayload.json} +1 -1
  205. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2InsertUpdatePayloadV2-RangeV1.json +8 -0
  206. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2InsertUpdatePayloadV2-RangeV2.json +8 -0
  207. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2InsertUpdatePayloadV2.json +8 -0
  208. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2UnindexedEncryptedValue.json +8 -0
  209. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2UnindexedEncryptedValueV2.json +8 -0
  210. data/ext/libmongocrypt/libmongocrypt/test/data/find-with-encryptionInformation.json +0 -1
  211. data/ext/libmongocrypt/libmongocrypt/test/data/fle1-explain/with-csfle/collinfo.json +2 -1
  212. data/ext/libmongocrypt/libmongocrypt/test/data/fle1-explain/with-mongocryptd/collinfo.json +2 -1
  213. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-bad-str-encode-version/bad-collinfo.json +26 -0
  214. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-bad-str-encode-version/bad-create-cmd-mongocryptd-reply.json +51 -0
  215. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-bad-str-encode-version/bad-create-cmd-to-mongocryptd.json +45 -0
  216. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-bad-str-encode-version/bad-create-cmd.json +18 -0
  217. data/ext/libmongocrypt/libmongocrypt/test/data/{fle2-find-range/int32/encrypted-field-map.json → fle2-bad-str-encode-version/bad-encrypted-field-config-map.json} +7 -12
  218. data/ext/libmongocrypt/libmongocrypt/test/data/{fle2-insert → fle2-bad-str-encode-version}/encrypted-payload.json +4 -4
  219. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create/cmd-to-mongocryptd.json +1 -2
  220. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create/encrypted-field-config-map.json +1 -2
  221. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create-encrypted-collection/cmd-to-mongocryptd.json +44 -0
  222. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create-encrypted-collection/cmd.json +17 -0
  223. data/ext/libmongocrypt/libmongocrypt/test/data/{fle2-find-equality/encrypted-field-map.json → fle2-create-encrypted-collection/encrypted-field-config-map.json} +9 -8
  224. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create-encrypted-collection/encrypted-payload.json +17 -0
  225. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create-encrypted-collection/mongocryptd-reply.json +50 -0
  226. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create-encrypted-collection-encrypted-fields-unset-str-encode-version/cmd-to-mongocryptd.json +45 -0
  227. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create-encrypted-collection-encrypted-fields-unset-str-encode-version/mongocryptd-reply.json +51 -0
  228. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create-encrypted-collection-with-str-encode-version/cmd-to-mongocryptd.json +46 -0
  229. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create-encrypted-collection-with-str-encode-version/cmd.json +18 -0
  230. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create-encrypted-collection-with-str-encode-version/encrypted-field-config-map.json +25 -0
  231. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create-encrypted-collection-with-str-encode-version/encrypted-payload.json +18 -0
  232. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create-encrypted-collection-with-str-encode-version/mongocryptd-reply.json +52 -0
  233. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-delete/empty/collinfo.json +1 -1
  234. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-delete/empty/encrypted-field-config-map.json +0 -1
  235. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-delete/empty/encrypted-payload-v2.json +57 -59
  236. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-delete/empty/mongocryptd-reply.json +63 -64
  237. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-delete/success/collinfo.json +1 -1
  238. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-delete/success/encrypted-field-config-map.json +0 -1
  239. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-delete/success/encrypted-payload-v2.json +64 -66
  240. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-delete/success/mongocryptd-reply.json +69 -70
  241. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explain/with-csfle/collinfo.json +1 -1
  242. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explain/with-csfle/encrypted-payload.json +1 -2
  243. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explain/with-mongocryptd/cmd-to-mongocryptd.json +1 -2
  244. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explain/with-mongocryptd/collinfo.json +2 -2
  245. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explain/with-mongocryptd/encrypted-payload.json +2 -3
  246. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explain/with-mongocryptd/mongocryptd-reply.json +1 -2
  247. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-explicit/cmd-to-mongocryptd.json +0 -1
  248. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-explicit/cmd-to-mongod.json +0 -1
  249. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-explicit/reply-from-mongocryptd.json +0 -1
  250. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date-v2/encrypted-field-map.json +1 -1
  251. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date-v2/encrypted-payload.json +6 -4
  252. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date-v2/mongocryptd-reply.json +1 -1
  253. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision-v2/encrypted-field-map.json +1 -1
  254. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision-v2/encrypted-payload.json +6 -4
  255. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision-v2/mongocryptd-reply.json +2 -2
  256. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-v2/encrypted-field-map.json +1 -1
  257. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-v2/encrypted-payload.json +6 -4
  258. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-v2/mongocryptd-reply.json +1 -1
  259. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-precision-v2/encrypted-payload.json +14 -6
  260. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-v2/encrypted-field-map.json +1 -1
  261. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-v2/encrypted-payload.json +6 -4
  262. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-v2/mongocryptd-reply.json +1 -1
  263. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32-v2/encrypted-field-map.json +1 -1
  264. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32-v2/encrypted-payload.json +6 -4
  265. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32-v2/mongocryptd-reply.json +1 -1
  266. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64-v2/encrypted-field-map.json +1 -1
  267. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64-v2/encrypted-payload.json +6 -4
  268. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64-v2/mongocryptd-reply.json +1 -1
  269. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/double/encrypted-payload-v2.json +1 -1
  270. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/double-precision/encrypted-payload-v2.json +1 -1
  271. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32/encrypted-payload-v2.json +1 -1
  272. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32-openinterval/encrypted-payload-v2.json +1 -1
  273. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date-v2/encrypted-field-map.json +1 -1
  274. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date-v2/encrypted-payload.json +6 -4
  275. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date-v2/mongocryptd-reply.json +1 -1
  276. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision-v2/encrypted-field-map.json +1 -1
  277. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision-v2/encrypted-payload.json +6 -4
  278. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision-v2/mongocryptd-reply.json +1 -1
  279. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-v2/encrypted-field-map.json +1 -1
  280. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-v2/encrypted-payload.json +6 -4
  281. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-v2/mongocryptd-reply.json +1 -1
  282. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-precision-v2/encrypted-payload.json +14 -6
  283. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-v2/encrypted-field-map.json +1 -1
  284. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-v2/encrypted-payload.json +6 -4
  285. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-v2/mongocryptd-reply.json +1 -1
  286. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32/encrypted-field-map.json +0 -1
  287. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32-v2/encrypted-field-map.json +1 -1
  288. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32-v2/encrypted-payload.json +3 -3
  289. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32-v2/mongocryptd-reply.json +1 -1
  290. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64-v2/encrypted-field-map.json +1 -1
  291. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64-v2/encrypted-payload.json +6 -4
  292. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64-v2/mongocryptd-reply.json +1 -1
  293. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/double/encrypted-payload-v2.json +1 -1
  294. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/double-precision/encrypted-payload-v2.json +1 -1
  295. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/int32/encrypted-payload-v2.json +1 -1
  296. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/sparsity-2/encrypted-payload-v2.json +1 -1
  297. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-text-search/cmd.json +9 -0
  298. data/ext/libmongocrypt/libmongocrypt/test/data/{fle2-find-range/double → fle2-insert-text-search}/encrypted-field-map.json +10 -9
  299. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-text-search/encrypted-payload.json +47 -0
  300. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-text-search/mongocryptd-reply.json +55 -0
  301. data/ext/libmongocrypt/libmongocrypt/test/data/{fle2-find-range/double-precision → fle2-insert-text-search-with-str-encode-version}/encrypted-field-map.json +12 -13
  302. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-text-search-with-str-encode-version/encrypted-payload.json +47 -0
  303. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-text-search-with-str-encode-version/mongocryptd-reply.json +55 -0
  304. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-v2-with-str-encode-version/cmd.json +9 -0
  305. data/ext/libmongocrypt/libmongocrypt/test/data/{fle2-insert → fle2-insert-v2-with-str-encode-version}/encrypted-field-map.json +2 -2
  306. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-v2-with-str-encode-version/encrypted-payload.json +40 -0
  307. data/ext/libmongocrypt/libmongocrypt/test/data/{fle2-insert → fle2-insert-v2-with-str-encode-version}/mongocryptd-reply.json +2 -2
  308. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-text-search-create-encrypted-collection/cmd-to-mongocryptd.json +55 -0
  309. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-text-search-create-encrypted-collection/cmd.json +22 -0
  310. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-text-search-create-encrypted-collection/encrypted-field-config-map.json +29 -0
  311. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-text-search-create-encrypted-collection/encrypted-payload.json +23 -0
  312. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-text-search-create-encrypted-collection/mongocryptd-reply.json +61 -0
  313. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-text-search-create-encrypted-collection-with-str-encode-version/cmd-to-mongocryptd.json +56 -0
  314. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-text-search-create-encrypted-collection-with-str-encode-version/cmd.json +23 -0
  315. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-text-search-create-encrypted-collection-with-str-encode-version/encrypted-field-config-map.json +30 -0
  316. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-text-search-create-encrypted-collection-with-str-encode-version/encrypted-payload.json +23 -0
  317. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-text-search-create-encrypted-collection-with-str-encode-version/mongocryptd-reply.json +62 -0
  318. data/ext/libmongocrypt/libmongocrypt/test/data/iev-v2/FLECrudTest-insertOneText.json +20 -0
  319. data/ext/libmongocrypt/libmongocrypt/test/data/iev-v2/FLECrudTest-insertOneTextLarge.json +930 -0
  320. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle/cmd-to-mongocryptd.json +60 -0
  321. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle/cmd.json +14 -0
  322. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle/collInfo-c1.json +39 -0
  323. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle/collInfo-c2.json +39 -0
  324. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-facet/cmd.json +20 -0
  325. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-mismatch/cmd.json +14 -0
  326. data/ext/libmongocrypt/libmongocrypt/{bindings/java/mongocrypt/src/test/resources/collection-info.json → test/data/lookup/csfle-mismatch/collInfo-c1.json} +13 -11
  327. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-mismatch/collInfo-c3.json +39 -0
  328. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-nested/cmd.json +24 -0
  329. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-only-schemaMap/cmd-to-mongocryptd.json +60 -0
  330. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-only-schemaMap/cmd.json +14 -0
  331. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-only-schemaMap/schemaMap.json +40 -0
  332. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-schemaMap/cmd-to-mongocryptd.json +60 -0
  333. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-schemaMap/cmd.json +14 -0
  334. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-schemaMap/collInfo-c1.json +39 -0
  335. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-schemaMap/schemaMap.json +21 -0
  336. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-self/cmd-to-mongocryptd.json +34 -0
  337. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-self/cmd.json +14 -0
  338. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-self/collInfo-c1.json +39 -0
  339. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-sibling/cmd-to-mongocryptd.json +49 -0
  340. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-sibling/cmd.json +14 -0
  341. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-sibling/collInfo-c1.json +39 -0
  342. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-sibling/collInfo-c2.json +29 -0
  343. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-sibling/reply-from-mongocryptd.json +18 -0
  344. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-unionWith/cmd.json +21 -0
  345. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-view/cmd.json +14 -0
  346. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-view/collInfo-c1.json +39 -0
  347. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/csfle-view/collInfo-v1.json +11 -0
  348. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/csfle/cmd-to-mongocryptd.json +65 -0
  349. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/csfle/cmd-to-mongod.json +26 -0
  350. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/csfle/cmd.json +19 -0
  351. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/csfle/collInfo-c1.json +39 -0
  352. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/csfle/collInfo-c2.json +39 -0
  353. data/ext/libmongocrypt/libmongocrypt/{bindings/java/mongocrypt/src/test/resources/keys/ABCDEFAB123498761234123456789012-local-document.json → test/data/lookup/mixed/csfle/csfle/key-doc.json} +4 -4
  354. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/csfle/reply-from-mongocryptd.json +33 -0
  355. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/no-schema/cmd-to-mongocryptd.json +47 -0
  356. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/no-schema/cmd-to-mongod.json +26 -0
  357. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/no-schema/cmd.json +19 -0
  358. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/no-schema/collInfo-c1.json +39 -0
  359. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/no-schema/collInfo-c2.json +17 -0
  360. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/no-schema/key-doc.json +30 -0
  361. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/no-schema/reply-from-mongocryptd.json +33 -0
  362. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/qe/cmd-to-mongocryptd.json +70 -0
  363. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/qe/cmd.json +19 -0
  364. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/qe/collInfo-c1.json +39 -0
  365. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/csfle/qe/collInfo-c2.json +42 -0
  366. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/csfle/cmd-to-mongocryptd.json +47 -0
  367. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/csfle/cmd-to-mongod.json +26 -0
  368. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/csfle/cmd.json +19 -0
  369. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/csfle/collInfo-c1.json +17 -0
  370. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/csfle/collInfo-c2.json +39 -0
  371. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/csfle/key-doc.json +30 -0
  372. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/csfle/reply-from-mongocryptd.json +33 -0
  373. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/no-schema/cmd-to-mongocryptd.json +29 -0
  374. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/no-schema/cmd-to-mongod.json +19 -0
  375. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/no-schema/cmd.json +19 -0
  376. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/no-schema/collInfo-c1.json +17 -0
  377. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/no-schema/collInfo-c2.json +17 -0
  378. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/no-schema/reply-from-mongocryptd.json +26 -0
  379. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/qe/cmd-to-mongocryptd.json +53 -0
  380. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/qe/cmd-to-mongod.json +58 -0
  381. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/qe/cmd.json +19 -0
  382. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/qe/collInfo-c1.json +17 -0
  383. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/qe/collInfo-c2.json +42 -0
  384. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/qe/key-doc.json +30 -0
  385. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/no-schema/qe/reply-from-mongocryptd.json +65 -0
  386. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/csfle/cmd-to-mongocryptd.json +70 -0
  387. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/csfle/cmd.json +19 -0
  388. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/csfle/collInfo-c1.json +42 -0
  389. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/csfle/collInfo-c2.json +39 -0
  390. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/no-schema/cmd-to-mongocryptd.json +53 -0
  391. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/no-schema/cmd-to-mongod.json +56 -0
  392. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/no-schema/cmd.json +19 -0
  393. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/no-schema/collInfo-c1.json +42 -0
  394. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/no-schema/collInfo-c2.json +17 -0
  395. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/no-schema/key-doc.json +30 -0
  396. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/no-schema/reply-from-mongocryptd.json +63 -0
  397. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/qe/cmd-to-mongocryptd.json +66 -0
  398. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/qe/cmd-to-mongod.json +71 -0
  399. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/qe/cmd.json +19 -0
  400. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/qe/collInfo-c1.json +42 -0
  401. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/qe/collInfo-c2.json +42 -0
  402. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/qe/key-doc.json +30 -0
  403. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/mixed/qe/qe/reply-from-mongocryptd.json +78 -0
  404. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe/cmd-to-mongocryptd.json +61 -0
  405. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe/cmd-to-mongod.json +14 -0
  406. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe/cmd.json +14 -0
  407. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe/collInfo-c1.json +42 -0
  408. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe/collInfo-c2.json +42 -0
  409. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe/reply-from-mongocryptd.json +68 -0
  410. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-encryptedFieldsMap/cmd-to-mongocryptd.json +66 -0
  411. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-encryptedFieldsMap/cmd-to-mongod.json +71 -0
  412. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-encryptedFieldsMap/cmd.json +19 -0
  413. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-encryptedFieldsMap/collInfo-c1.json +42 -0
  414. data/ext/libmongocrypt/libmongocrypt/test/data/{fle2-insert-unindexed/encrypted-field-map.json → lookup/qe-encryptedFieldsMap/encryptedFieldsMap.json} +6 -7
  415. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-encryptedFieldsMap/key-doc.json +30 -0
  416. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-encryptedFieldsMap/reply-from-mongocryptd.json +78 -0
  417. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-self/cmd-to-mongocryptd.json +46 -0
  418. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-self/cmd-to-mongod.json +53 -0
  419. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-self/cmd.json +19 -0
  420. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-self/collInfo-c1.json +42 -0
  421. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-self/key-doc.json +30 -0
  422. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-self/reply-from-mongocryptd.json +58 -0
  423. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-with-payload/cmd-to-mongocryptd.json +66 -0
  424. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-with-payload/cmd-to-mongod.json +75 -0
  425. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-with-payload/cmd.json +19 -0
  426. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-with-payload/collInfo-c1.json +42 -0
  427. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-with-payload/collInfo-c2.json +42 -0
  428. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-with-payload/key-doc.json +30 -0
  429. data/ext/libmongocrypt/libmongocrypt/test/data/lookup/qe-with-payload/reply-from-mongocryptd.json +78 -0
  430. data/ext/libmongocrypt/libmongocrypt/test/data/{fle2-create/mongocryptd-ismaster.json → mongocryptd-ismaster-17.json} +1 -1
  431. data/ext/libmongocrypt/libmongocrypt/test/data/mongocryptd-ismaster-26.json +12 -0
  432. data/ext/libmongocrypt/libmongocrypt/test/data/schema-broker/collinfo-encryptedFields.json +42 -0
  433. data/ext/libmongocrypt/libmongocrypt/test/data/schema-broker/collinfo-encryptedFields2.json +42 -0
  434. data/ext/libmongocrypt/libmongocrypt/test/data/schema-broker/collinfo-jsonSchema.json +43 -0
  435. data/ext/libmongocrypt/libmongocrypt/test/data/schema-broker/collinfo-noSchema.json +21 -0
  436. data/ext/libmongocrypt/libmongocrypt/test/data/schema-broker/create-with-jsonSchema.json +24 -0
  437. data/ext/libmongocrypt/libmongocrypt/test/data/schema-broker/encryptedFields.json +20 -0
  438. data/ext/libmongocrypt/libmongocrypt/test/data/schema-broker/encryptedFields2.json +20 -0
  439. data/ext/libmongocrypt/libmongocrypt/test/data/schema-broker/encryptedFieldsMap.json +42 -0
  440. data/ext/libmongocrypt/libmongocrypt/test/data/schema-broker/jsonSchema.json +19 -0
  441. data/ext/libmongocrypt/libmongocrypt/test/data/schema-broker/jsonSchema2.json +19 -0
  442. data/ext/libmongocrypt/libmongocrypt/test/data/schema-broker/schemaMap.json +40 -0
  443. data/ext/libmongocrypt/libmongocrypt/test/data/tokens/mc.json +36 -2
  444. data/ext/libmongocrypt/libmongocrypt/test/data/tokens/server.json +36 -2
  445. data/ext/libmongocrypt/libmongocrypt/test/example-state-machine.c +5 -5
  446. data/ext/libmongocrypt/libmongocrypt/test/test-dll.cpp +11 -5
  447. data/ext/libmongocrypt/libmongocrypt/test/test-gcp-auth.c +2 -2
  448. data/ext/libmongocrypt/libmongocrypt/test/test-mc-efc.c +74 -6
  449. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-encryption-placeholder.c +457 -0
  450. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-find-equality-payload-v2.c +20 -1
  451. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-find-range-payload-v2.c +2 -18
  452. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-find-text-payload.c +320 -0
  453. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-iev-v2.c +286 -24
  454. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-iev.c +1 -1
  455. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-iup-v2.c +24 -17
  456. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-iup.c +24 -1
  457. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-uev.c +2 -2
  458. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-rfds.c +10 -7
  459. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-tag-and-encrypted-metadata-block.c +36 -1
  460. data/ext/libmongocrypt/libmongocrypt/test/test-mc-range-edge-generation.c +12 -17
  461. data/ext/libmongocrypt/libmongocrypt/test/test-mc-range-encoding.c +58 -63
  462. data/ext/libmongocrypt/libmongocrypt/test/test-mc-range-mincover.c +69 -85
  463. data/ext/libmongocrypt/libmongocrypt/test/test-mc-rangeopts.c +7 -22
  464. data/ext/libmongocrypt/libmongocrypt/test/test-mc-reader.c +5 -5
  465. data/ext/libmongocrypt/libmongocrypt/test/test-mc-schema-broker.c +1124 -0
  466. data/ext/libmongocrypt/libmongocrypt/test/test-mc-text-search-str-encode.c +1336 -0
  467. data/ext/libmongocrypt/libmongocrypt/test/test-mc-tokens.c +165 -37
  468. data/ext/libmongocrypt/libmongocrypt/test/test-mc-writer.c +10 -10
  469. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-assert-match-bson.c +16 -21
  470. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-assert.h +55 -26
  471. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-buffer.c +29 -4
  472. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-cache.c +5 -4
  473. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ciphertext.c +13 -13
  474. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-cleanup.c +49 -55
  475. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-compact.c +64 -67
  476. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-crypto-hooks.c +19 -19
  477. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-crypto-std-hooks.c +4 -0
  478. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-crypto.c +41 -10
  479. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-csfle-lib.c +33 -2
  480. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ctx-decrypt.c +247 -149
  481. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ctx-encrypt.c +1342 -1229
  482. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ctx-rewrap-many-datakey.c +28 -1
  483. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ctx-setopt.c +50 -91
  484. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-datakey.c +1 -1
  485. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-dll.c +7 -4
  486. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-endpoint.c +1 -1
  487. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-kek.c +2 -2
  488. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-key-cache.c +9 -11
  489. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-kms-ctx.c +2 -2
  490. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-kms-responses.c +2 -2
  491. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-local-kms.c +1 -1
  492. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-log.c +2 -2
  493. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-marking.c +1101 -161
  494. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-status.c +1 -1
  495. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt.c +157 -82
  496. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt.h +38 -6
  497. data/ext/libmongocrypt/libmongocrypt/test/test-named-kms-providers.c +11 -11
  498. data/ext/libmongocrypt/libmongocrypt/test/test-unicode-fold.c +101 -0
  499. data/ext/libmongocrypt/libmongocrypt/test/util/HELP.autogen +1 -1
  500. data/ext/libmongocrypt/libmongocrypt/test/util/csfle.c +1 -1
  501. data/ext/libmongocrypt/libmongocrypt/test/util/util.c +5 -5
  502. data/ext/libmongocrypt/libmongocrypt/test/util/util.h +7 -6
  503. data/lib/libmongocrypt_helper/version.rb +2 -2
  504. metadata +219 -165
  505. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/README.md +0 -36
  506. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/benchmarks/src/main/java/com/mongodb/crypt/benchmark/BenchmarkRunner.java +0 -217
  507. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/benchmarks/src/main/resources/keyDocument.json +0 -24
  508. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/build.gradle.kts +0 -354
  509. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/gradle/wrapper/gradle-wrapper.jar +0 -0
  510. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/gradle/wrapper/gradle-wrapper.properties +0 -5
  511. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/gradlew +0 -234
  512. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/gradlew.bat +0 -89
  513. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/settings.gradle.kts +0 -1
  514. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/BinaryHolder.java +0 -45
  515. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/CAPI.java +0 -1165
  516. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/CAPIHelper.java +0 -96
  517. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/CipherCallback.java +0 -92
  518. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/DisposableMemory.java +0 -31
  519. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/JULLogger.java +0 -130
  520. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/Logger.java +0 -144
  521. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/Loggers.java +0 -50
  522. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MacCallback.java +0 -60
  523. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MessageDigestCallback.java +0 -55
  524. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoAwsKmsProviderOptions.java +0 -104
  525. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoCrypt.java +0 -100
  526. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoCryptContext.java +0 -137
  527. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoCryptContextImpl.java +0 -164
  528. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoCryptException.java +0 -67
  529. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoCryptImpl.java +0 -423
  530. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoCryptOptions.java +0 -284
  531. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoCrypts.java +0 -38
  532. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoDataKeyOptions.java +0 -125
  533. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoExplicitEncryptOptions.java +0 -227
  534. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoKeyDecryptor.java +0 -76
  535. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoKeyDecryptorImpl.java +0 -105
  536. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoLocalKmsProviderOptions.java +0 -83
  537. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/MongoRewrapManyDataKeyOptions.java +0 -104
  538. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/SLF4JLogger.java +0 -110
  539. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/SecureRandomCallback.java +0 -51
  540. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/SigningRSAESPKCSCallback.java +0 -76
  541. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/java/com/mongodb/crypt/capi/package-info.java +0 -18
  542. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/resources/META-INF/native-image/jni-config.json +0 -180
  543. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/main/resources/META-INF/native-image/reflect-config.json +0 -134
  544. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/java/com/mongodb/crypt/capi/MongoCryptTest.java +0 -389
  545. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/command-reply.json +0 -13
  546. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/command.json +0 -6
  547. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/encrypted-command-reply.json +0 -16
  548. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/encrypted-command.json +0 -11
  549. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/encrypted-value.json +0 -6
  550. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/fle2-find-range-explicit-v2/int32/encrypted-payload.json +0 -26
  551. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/fle2-find-range-explicit-v2/int32/key-filter.json +0 -19
  552. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/fle2-find-range-explicit-v2/int32/rangeopts.json +0 -14
  553. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/fle2-find-range-explicit-v2/int32/value-to-encrypt.json +0 -20
  554. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/json-schema.json +0 -15
  555. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/key-document.json +0 -36
  556. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/key-filter-keyAltName.json +0 -14
  557. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/key-filter.json +0 -19
  558. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/kms-reply.txt +0 -6
  559. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/list-collections-filter.json +0 -3
  560. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/mongocryptd-command.json +0 -22
  561. data/ext/libmongocrypt/libmongocrypt/bindings/java/mongocrypt/src/test/resources/mongocryptd-reply.json +0 -18
  562. data/ext/libmongocrypt/libmongocrypt/bindings/python/libmongocrypt-version.txt +0 -1
  563. data/ext/libmongocrypt/libmongocrypt/bindings/python/strip_header.py +0 -50
  564. data/ext/libmongocrypt/libmongocrypt/bindings/python/update-sbom.sh +0 -14
  565. data/ext/libmongocrypt/libmongocrypt/etc/silk-create-asset-group.sh +0 -70
  566. data/ext/libmongocrypt/libmongocrypt/test/data/bulkWrite/jsonSchema/cmd.json +0 -20
  567. data/ext/libmongocrypt/libmongocrypt/test/data/cleanup/success/encrypted-payload.json +0 -29
  568. data/ext/libmongocrypt/libmongocrypt/test/data/collection-info-no-schema.json +0 -19
  569. data/ext/libmongocrypt/libmongocrypt/test/data/compact/no-range/encrypted-field-config-map.json +0 -47
  570. data/ext/libmongocrypt/libmongocrypt/test/data/compact/success/encrypted-payload.json +0 -29
  571. data/ext/libmongocrypt/libmongocrypt/test/data/fle1-collMod/insert/cmd.json +0 -8
  572. data/ext/libmongocrypt/libmongocrypt/test/data/fle1-collMod/insert/collinfo.json +0 -9
  573. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-create/ismaster-to-mongocryptd.json +0 -3
  574. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-delete/empty/encrypted-payload.json +0 -91
  575. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-delete/success/encrypted-payload.json +0 -98
  576. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explicit/find-indexed-contentionFactor1.json +0 -8
  577. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explicit/insert-indexed-contentionFactor1.json +0 -8
  578. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-explicit/insert-indexed-same-user-and-index-key.json +0 -8
  579. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-equality/cmd.json +0 -6
  580. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-equality/encrypted-payload.json +0 -41
  581. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-equality/mongocryptd-reply.json +0 -19
  582. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date/cmd.json +0 -10
  583. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date/encrypted-field-map.json +0 -28
  584. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date/encrypted-payload.json +0 -42
  585. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date/mongocryptd-reply.json +0 -50
  586. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128/cmd.json +0 -6
  587. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128/encrypted-field-map.json +0 -28
  588. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128/encrypted-payload.json +0 -42
  589. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128/mongocryptd-reply.json +0 -50
  590. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision/cmd.json +0 -6
  591. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision/encrypted-field-map.json +0 -31
  592. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision/encrypted-payload.json +0 -51
  593. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision/mongocryptd-reply.json +0 -59
  594. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double/cmd.json +0 -8
  595. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double/encrypted-payload.json +0 -42
  596. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double/mongocryptd-reply.json +0 -50
  597. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-precision/cmd.json +0 -8
  598. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-precision/encrypted-payload.json +0 -45
  599. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-precision/mongocryptd-reply.json +0 -53
  600. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32/cmd.json +0 -8
  601. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32/encrypted-payload.json +0 -42
  602. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32/mongocryptd-reply.json +0 -50
  603. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64/cmd.json +0 -8
  604. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64/encrypted-field-map.json +0 -28
  605. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64/encrypted-payload.json +0 -42
  606. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64/mongocryptd-reply.json +0 -50
  607. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/double/encrypted-payload.json +0 -26
  608. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/double-precision/encrypted-payload.json +0 -26
  609. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32/encrypted-payload.json +0 -26
  610. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32-nominmax/encrypted-payload-v2.json +0 -26
  611. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32-openinterval/encrypted-payload.json +0 -16
  612. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date/cmd.json +0 -13
  613. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date/encrypted-field-map.json +0 -28
  614. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date/encrypted-payload.json +0 -45
  615. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date/mongocryptd-reply.json +0 -53
  616. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128/cmd.json +0 -9
  617. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128/encrypted-field-map.json +0 -28
  618. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128/encrypted-payload.json +0 -45
  619. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128/mongocryptd-reply.json +0 -53
  620. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision/cmd.json +0 -9
  621. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision/encrypted-field-map.json +0 -31
  622. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision/encrypted-payload.json +0 -54
  623. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision/mongocryptd-reply.json +0 -62
  624. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double/cmd.json +0 -11
  625. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double/encrypted-field-map.json +0 -28
  626. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double/encrypted-payload.json +0 -45
  627. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double/mongocryptd-reply.json +0 -53
  628. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-precision/cmd.json +0 -11
  629. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-precision/encrypted-field-map.json +0 -31
  630. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-precision/encrypted-payload.json +0 -48
  631. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-precision/mongocryptd-reply.json +0 -56
  632. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32/encrypted-payload.json +0 -45
  633. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32/mongocryptd-reply.json +0 -53
  634. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64/cmd.json +0 -11
  635. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64/encrypted-field-map.json +0 -28
  636. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64/encrypted-payload.json +0 -45
  637. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64/mongocryptd-reply.json +0 -53
  638. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/double/encrypted-payload.json +0 -8
  639. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/double-precision/encrypted-payload.json +0 -8
  640. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/int32-nominmax/encrypted-payload-v2.json +0 -8
  641. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/sparsity-2/encrypted-payload.json +0 -8
  642. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-unindexed/cmd.json +0 -9
  643. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-unindexed/encrypted-payload.json +0 -14
  644. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-unindexed/mongocryptd-reply.json +0 -46
  645. data/ext/libmongocrypt/libmongocrypt/test/data/schema.json +0 -19
  646. /data/ext/libmongocrypt/libmongocrypt/bindings/python/{build-manylinux-wheel.sh → scripts/build-manylinux-wheel.sh} +0 -0
  647. /data/ext/libmongocrypt/libmongocrypt/test/data/{fle2-explicit/find-indexed.json → explicit-decrypt/FLE2FindEqualityPayload.json} +0 -0
  648. /data/ext/libmongocrypt/libmongocrypt/test/data/{fle2-insert → fle2-insert-text-search-with-str-encode-version}/cmd.json +0 -0
@@ -0,0 +1,1065 @@
1
+ /*
2
+ * Copyright 2018-present MongoDB, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #include "mc-schema-broker-private.h"
18
+
19
+ #include "mc-efc-private.h" // mc_EncryptedFieldConfig_t
20
+ #include "mongocrypt-cache-collinfo-private.h"
21
+ #include "mongocrypt-key-broker-private.h"
22
+ #include "mongocrypt-private.h"
23
+ #include "mongocrypt-status-private.h"
24
+ #include "mongocrypt-util-private.h"
25
+ #include <bson/bson.h>
26
+
27
+ typedef struct mc_schema_entry_t {
28
+ char *coll;
29
+
30
+ struct {
31
+ bool set;
32
+ _mongocrypt_buffer_t buf; // Owns document.
33
+ bson_t bson; // Non-owning view into buf.
34
+ bool is_remote;
35
+ } jsonSchema;
36
+
37
+ struct {
38
+ bool set;
39
+ _mongocrypt_buffer_t buf; // Owns document.
40
+ bson_t bson; // Non-owning view into buf.
41
+ mc_EncryptedFieldConfig_t efc;
42
+ } encryptedFields;
43
+
44
+ struct mc_schema_entry_t *next;
45
+ bool satisfied; // true once a schema is found and applied, or an empty schema is applied.
46
+ } mc_schema_entry_t;
47
+
48
+ // mc_schema_broker_t stores schemas for an auto encryption operation.
49
+ struct mc_schema_broker_t {
50
+ char *db; // Database shared by all schemas.
51
+ mc_schema_entry_t *ll;
52
+ size_t ll_len;
53
+ };
54
+
55
+ mc_schema_broker_t *mc_schema_broker_new(void) {
56
+ return bson_malloc0(sizeof(mc_schema_broker_t));
57
+ }
58
+
59
+ bool mc_schema_broker_request(mc_schema_broker_t *sb, const char *db, const char *coll, mongocrypt_status_t *status) {
60
+ BSON_ASSERT_PARAM(sb);
61
+ BSON_ASSERT_PARAM(db);
62
+ BSON_ASSERT_PARAM(coll);
63
+
64
+ if (sb->db && 0 != strcmp(sb->db, db)) {
65
+ CLIENT_ERR("Cannot request schemas for different databases. Requested schemas for '%s' and '%s'.", sb->db, db);
66
+ return false;
67
+ }
68
+
69
+ // Check for duplicates. Keep pointer to last node.
70
+ mc_schema_entry_t *last = NULL;
71
+ for (mc_schema_entry_t *it = sb->ll; it != NULL; it = it->next) {
72
+ if (0 == strcmp(it->coll, coll)) {
73
+ return true;
74
+ }
75
+ last = it;
76
+ }
77
+
78
+ mc_schema_entry_t *se = bson_malloc0(sizeof *se);
79
+ se->coll = bson_strdup(coll);
80
+ if (NULL == last) {
81
+ sb->ll = se;
82
+ sb->db = bson_strdup(db);
83
+ } else {
84
+ last->next = se;
85
+ }
86
+ sb->ll_len++;
87
+ return true;
88
+ }
89
+
90
+ bool mc_schema_broker_has_multiple_requests(const mc_schema_broker_t *sb) {
91
+ BSON_ASSERT_PARAM(sb);
92
+ return sb->ll_len > 1;
93
+ }
94
+
95
+ void mc_schema_broker_destroy(mc_schema_broker_t *sb) {
96
+ if (!sb) {
97
+ return;
98
+ }
99
+ mc_schema_entry_t *it = sb->ll;
100
+ while (it != NULL) {
101
+ bson_free(it->coll);
102
+ // Always clean it->encryptedFields and it->jsonSchema. May be partially set.
103
+ mc_EncryptedFieldConfig_cleanup(&it->encryptedFields.efc);
104
+ _mongocrypt_buffer_cleanup(&it->encryptedFields.buf);
105
+ _mongocrypt_buffer_cleanup(&it->jsonSchema.buf);
106
+ mc_schema_entry_t *tmp = it->next;
107
+ bson_free(it);
108
+ it = tmp;
109
+ }
110
+ bson_free(sb->db);
111
+ bson_free(sb);
112
+ return;
113
+ }
114
+
115
+ bool mc_schema_broker_has_any_qe_schemas(const mc_schema_broker_t *sb) {
116
+ BSON_ASSERT_PARAM(sb);
117
+ for (mc_schema_entry_t *se = sb->ll; se != NULL; se = se->next) {
118
+ BSON_ASSERT(se->satisfied);
119
+ if (se->encryptedFields.set) {
120
+ return true;
121
+ }
122
+ }
123
+ return false;
124
+ }
125
+
126
+ // TRY_BSON_OR is a checks a BSON operation and sets a generic error status on failure.
127
+ #define TRY_BSON_OR(stmt) if (!try_or(stmt, "BSON failure", BSON_FUNC, status))
128
+
129
+ static bool try_or(bool val, const char *msg, const char *func, mongocrypt_status_t *status) {
130
+ if (!val) {
131
+ CLIENT_ERR("[%s] statement failed: %s", func, msg);
132
+ }
133
+ return val;
134
+ }
135
+
136
+ bool mc_schema_broker_append_listCollections_filter(const mc_schema_broker_t *sb,
137
+ bson_t *out,
138
+ mongocrypt_status_t *status) {
139
+ BSON_ASSERT_PARAM(sb);
140
+ BSON_ASSERT_PARAM(out);
141
+
142
+ size_t num_unsatisfied = 0;
143
+ for (mc_schema_entry_t *se = sb->ll; se != NULL; se = se->next) {
144
+ if (!se->satisfied) {
145
+ num_unsatisfied++;
146
+ }
147
+ }
148
+
149
+ if (num_unsatisfied == 0) {
150
+ CLIENT_ERR("Unexpected: attempting to create listCollections filter but no schemas needed");
151
+ return false;
152
+ } else if (num_unsatisfied == 1) {
153
+ // One request. Append as: { "name": <name> }
154
+ for (mc_schema_entry_t *se = sb->ll; se != NULL; se = se->next) {
155
+ if (se->satisfied) {
156
+ continue;
157
+ }
158
+
159
+ TRY_BSON_OR(BSON_APPEND_UTF8(out, "name", se->coll)) {
160
+ return false;
161
+ }
162
+ break;
163
+ }
164
+ } else {
165
+ // Multiple requests. Append as: { "name": { "$in": [ <name1>, <name2>, ... ] } }
166
+ bson_t in, in_array;
167
+ TRY_BSON_OR(BSON_APPEND_DOCUMENT_BEGIN(out, "name", &in)) {
168
+ return false;
169
+ }
170
+ TRY_BSON_OR(BSON_APPEND_ARRAY_BEGIN(&in, "$in", &in_array)) {
171
+ return false;
172
+ }
173
+
174
+ size_t idx = 0;
175
+ for (mc_schema_entry_t *se = sb->ll; se != NULL; se = se->next) {
176
+ if (se->satisfied) {
177
+ continue;
178
+ }
179
+
180
+ char idx_str[32];
181
+ int ret = bson_snprintf(idx_str, sizeof idx_str, "%zu", idx);
182
+ BSON_ASSERT(ret > 0 && ret <= (int)sizeof idx_str);
183
+
184
+ TRY_BSON_OR(BSON_APPEND_UTF8(&in_array, idx_str, se->coll)) {
185
+ return false;
186
+ }
187
+
188
+ idx++;
189
+ }
190
+ TRY_BSON_OR(bson_append_array_end(&in, &in_array)) {
191
+ return false;
192
+ }
193
+ TRY_BSON_OR(bson_append_document_end(out, &in)) {
194
+ return false;
195
+ }
196
+ }
197
+
198
+ return true;
199
+ }
200
+
201
+ static inline bool mc_schema_entry_satisfy_from_collinfo(mc_schema_entry_t *se,
202
+ const bson_t *collinfo,
203
+ const char *coll,
204
+ const char *db,
205
+ mongocrypt_status_t *status) {
206
+ BSON_ASSERT_PARAM(se);
207
+ BSON_ASSERT_PARAM(collinfo);
208
+ BSON_ASSERT_PARAM(coll);
209
+ BSON_ASSERT_PARAM(db);
210
+
211
+ if (se->satisfied) {
212
+ CLIENT_ERR("unexpected duplicate collinfo result for collection: %s.%s", db, coll);
213
+ return false;
214
+ }
215
+
216
+ bson_iter_t collinfo_iter;
217
+
218
+ if (!bson_iter_init(&collinfo_iter, collinfo)) {
219
+ CLIENT_ERR("failed to iterate collinfo for collection: %s.%s", db, coll);
220
+ return false;
221
+ }
222
+
223
+ // Disallow views.
224
+ bson_iter_t type_iter = collinfo_iter;
225
+ if (bson_iter_find(&type_iter, "type") && BSON_ITER_HOLDS_UTF8(&type_iter) && bson_iter_utf8(&type_iter, NULL)
226
+ && 0 == strcmp("view", bson_iter_utf8(&type_iter, NULL))) {
227
+ CLIENT_ERR("cannot auto encrypt a view: %s.%s", db, coll);
228
+ return false;
229
+ }
230
+
231
+ // Check if collection is configured for QE.
232
+ bson_iter_t encryptedFields_iter = collinfo_iter;
233
+ if (bson_iter_find_descendant(&encryptedFields_iter, "options.encryptedFields", &encryptedFields_iter)) {
234
+ if (!BSON_ITER_HOLDS_DOCUMENT(&encryptedFields_iter)) {
235
+ CLIENT_ERR("expected document for `options.encryptedFields` but got %s for collection %s.%s",
236
+ mc_bson_type_to_string(bson_iter_type(&encryptedFields_iter)),
237
+ db,
238
+ coll);
239
+ return false;
240
+ }
241
+ if (!_mongocrypt_buffer_copy_from_document_iter(&se->encryptedFields.buf, &encryptedFields_iter)) {
242
+ CLIENT_ERR("failed to copy `options.encryptedFields` for collection: %s.%s", db, coll);
243
+ return false;
244
+ }
245
+
246
+ if (!_mongocrypt_buffer_to_bson(&se->encryptedFields.buf, &se->encryptedFields.bson)) {
247
+ CLIENT_ERR("unable to create BSON from `options.encryptedFields` for collection: %s.%s", db, coll);
248
+ return false;
249
+ }
250
+
251
+ if (!mc_EncryptedFieldConfig_parse(&se->encryptedFields.efc, &se->encryptedFields.bson, status)) {
252
+ return false;
253
+ }
254
+ se->encryptedFields.set = true;
255
+ }
256
+
257
+ // Check if collection is configured for CSFLE.
258
+ bool found_jsonSchema = false;
259
+ bson_iter_t validator_iter = collinfo_iter;
260
+ if (bson_iter_find_descendant(&validator_iter, "options.validator", &validator_iter)
261
+ && BSON_ITER_HOLDS_DOCUMENT(&validator_iter)) {
262
+ if (!bson_iter_recurse(&validator_iter, &validator_iter)) {
263
+ CLIENT_ERR("failed to iterate `options.validator` for collection: %s.%s", db, coll);
264
+ return false;
265
+ }
266
+ while (bson_iter_next(&validator_iter)) {
267
+ const char *key = bson_iter_key(&validator_iter);
268
+ if (0 == strcmp("$jsonSchema", key)) {
269
+ if (found_jsonSchema) {
270
+ CLIENT_ERR("duplicate `$jsonSchema` fields found for collection: %s.%s", db, coll);
271
+ return false;
272
+ }
273
+
274
+ if (!_mongocrypt_buffer_copy_from_document_iter(&se->jsonSchema.buf, &validator_iter)) {
275
+ CLIENT_ERR("unable to copy `$jsonSchema` for collection: %s.%s", db, coll);
276
+ return false;
277
+ }
278
+
279
+ if (!_mongocrypt_buffer_to_bson(&se->jsonSchema.buf, &se->jsonSchema.bson)) {
280
+ CLIENT_ERR("unable to create BSON from `$jsonSchema` for collection: %s.%s", db, coll);
281
+ return false;
282
+ }
283
+
284
+ found_jsonSchema = true;
285
+ BSON_ASSERT(!se->jsonSchema.set);
286
+ se->jsonSchema.set = true;
287
+ se->jsonSchema.is_remote = true;
288
+ }
289
+ }
290
+ }
291
+
292
+ se->satisfied = true;
293
+ return true;
294
+ }
295
+
296
+ bool mc_schema_broker_satisfy_from_collinfo(mc_schema_broker_t *sb,
297
+ const bson_t *collinfo,
298
+ _mongocrypt_cache_t *collinfo_cache,
299
+ mongocrypt_status_t *status) {
300
+ BSON_ASSERT_PARAM(sb);
301
+ BSON_ASSERT_PARAM(collinfo);
302
+ BSON_ASSERT_PARAM(collinfo_cache);
303
+
304
+ bson_iter_t collinfo_iter;
305
+
306
+ if (!bson_iter_init(&collinfo_iter, collinfo)) {
307
+ CLIENT_ERR("failed to iterate collinfo in database: %s", sb->db);
308
+ return false;
309
+ }
310
+
311
+ // Parse the collection from the `collinfo`.
312
+ const char *coll;
313
+ {
314
+ bson_iter_t name_iter = collinfo_iter;
315
+ if (!bson_iter_find(&name_iter, "name") || !BSON_ITER_HOLDS_UTF8(&name_iter)) {
316
+ CLIENT_ERR("failed to find 'name' in collinfo in database: %s", sb->db);
317
+ return false;
318
+ }
319
+ coll = bson_iter_utf8(&name_iter, NULL);
320
+ }
321
+
322
+ // Cache the received collinfo.
323
+ {
324
+ char *ns = bson_strdup_printf("%s.%s", sb->db, coll);
325
+ if (!_mongocrypt_cache_add_copy(collinfo_cache, ns, (void *)collinfo, status)) {
326
+ bson_free(ns);
327
+ return false;
328
+ }
329
+ bson_free(ns);
330
+ }
331
+
332
+ // Find matching entry.
333
+ mc_schema_entry_t *se = NULL;
334
+ {
335
+ for (mc_schema_entry_t *it = sb->ll; it != NULL; it = it->next) {
336
+ if (0 == strcmp(it->coll, coll)) {
337
+ se = it;
338
+ break;
339
+ }
340
+ }
341
+ if (!se) {
342
+ CLIENT_ERR("got unexpected collinfo result for collection: %s.%s", sb->db, coll);
343
+ return false;
344
+ }
345
+ }
346
+
347
+ if (!mc_schema_entry_satisfy_from_collinfo(se, collinfo, coll, sb->db, status)) {
348
+ return false;
349
+ }
350
+
351
+ return true;
352
+ }
353
+
354
+ bool mc_schema_broker_satisfy_from_schemaMap(mc_schema_broker_t *sb,
355
+ const bson_t *schema_map,
356
+ mongocrypt_status_t *status) {
357
+ BSON_ASSERT_PARAM(sb);
358
+ BSON_ASSERT_PARAM(schema_map);
359
+
360
+ for (mc_schema_entry_t *it = sb->ll; it != NULL; it = it->next) {
361
+ if (it->satisfied) {
362
+ continue;
363
+ }
364
+
365
+ bool loop_ok = false;
366
+ char *ns = bson_strdup_printf("%s.%s", sb->db, it->coll);
367
+ bson_iter_t iter;
368
+
369
+ if (bson_iter_init_find(&iter, schema_map, ns)) {
370
+ if (!_mongocrypt_buffer_copy_from_document_iter(&it->jsonSchema.buf, &iter)) {
371
+ CLIENT_ERR("failed to read schema from schema map for collection: %s", ns);
372
+ goto loop_fail;
373
+ }
374
+
375
+ if (!_mongocrypt_buffer_to_bson(&it->jsonSchema.buf, &it->jsonSchema.bson)) {
376
+ CLIENT_ERR("unable to create BSON from schema map for collection: %s", ns);
377
+ goto loop_fail;
378
+ }
379
+
380
+ BSON_ASSERT(!it->jsonSchema.set);
381
+ it->jsonSchema.set = true;
382
+ it->jsonSchema.is_remote = false;
383
+ it->satisfied = true;
384
+ }
385
+
386
+ loop_ok = true;
387
+ loop_fail:
388
+ bson_free(ns);
389
+ if (!loop_ok) {
390
+ return false;
391
+ }
392
+ }
393
+ return true;
394
+ }
395
+
396
+ bool mc_schema_broker_satisfy_from_encryptedFieldsMap(mc_schema_broker_t *sb,
397
+ const bson_t *ef_map,
398
+ mongocrypt_status_t *status) {
399
+ BSON_ASSERT_PARAM(sb);
400
+ BSON_ASSERT_PARAM(ef_map);
401
+
402
+ for (mc_schema_entry_t *it = sb->ll; it != NULL; it = it->next) {
403
+ if (it->satisfied) {
404
+ continue;
405
+ }
406
+
407
+ bool loop_ok = false;
408
+ char *ns = bson_strdup_printf("%s.%s", sb->db, it->coll);
409
+ bson_iter_t iter;
410
+
411
+ if (bson_iter_init_find(&iter, ef_map, ns)) {
412
+ if (!_mongocrypt_buffer_copy_from_document_iter(&it->encryptedFields.buf, &iter)) {
413
+ CLIENT_ERR("failed to read encryptedFields from encryptedFields map for collection: %s", ns);
414
+ goto loop_fail;
415
+ }
416
+
417
+ if (!_mongocrypt_buffer_to_bson(&it->encryptedFields.buf, &it->encryptedFields.bson)) {
418
+ CLIENT_ERR("failed to create BSON from encryptedFields map for collection: %s", ns);
419
+ goto loop_fail;
420
+ }
421
+
422
+ if (!mc_EncryptedFieldConfig_parse(&it->encryptedFields.efc, &it->encryptedFields.bson, status)) {
423
+ goto loop_fail;
424
+ }
425
+
426
+ BSON_ASSERT(!it->encryptedFields.set);
427
+ it->encryptedFields.set = true;
428
+ it->satisfied = true;
429
+ }
430
+
431
+ loop_ok = true;
432
+ loop_fail:
433
+ bson_free(ns);
434
+ if (!loop_ok) {
435
+ return false;
436
+ }
437
+ }
438
+
439
+ return true;
440
+ }
441
+
442
+ bool mc_schema_broker_satisfy_from_cache(mc_schema_broker_t *sb,
443
+ _mongocrypt_cache_t *listCollections_cache,
444
+ mongocrypt_status_t *status) {
445
+ BSON_ASSERT_PARAM(sb);
446
+ BSON_ASSERT_PARAM(listCollections_cache);
447
+
448
+ for (mc_schema_entry_t *it = sb->ll; it != NULL; it = it->next) {
449
+ if (it->satisfied) {
450
+ continue;
451
+ }
452
+ char *ns = bson_strdup_printf("%s.%s", sb->db, it->coll);
453
+
454
+ // Check if there is a listCollections result cached.
455
+ bool loop_ok = false;
456
+ bson_t *collinfo = NULL;
457
+ if (!_mongocrypt_cache_get(listCollections_cache, ns, (void **)&collinfo)) {
458
+ CLIENT_ERR("failed to retrieve from listCollections cache for entry: %s", ns);
459
+ goto loop_fail;
460
+ }
461
+
462
+ if (!collinfo) {
463
+ goto loop_skip;
464
+ }
465
+
466
+ if (!mc_schema_entry_satisfy_from_collinfo(it, collinfo, sb->db, it->coll, status)) {
467
+ goto loop_fail;
468
+ }
469
+
470
+ loop_skip:
471
+ loop_ok = true;
472
+ loop_fail:
473
+ bson_destroy(collinfo);
474
+ bson_free(ns);
475
+ if (!loop_ok) {
476
+ return false;
477
+ }
478
+ }
479
+ return true;
480
+ }
481
+
482
+ bool mc_schema_broker_satisfy_from_create_or_collMod(mc_schema_broker_t *sb,
483
+ const bson_t *cmd,
484
+ mongocrypt_status_t *status) {
485
+ BSON_ASSERT_PARAM(sb);
486
+ BSON_ASSERT_PARAM(cmd);
487
+
488
+ bson_iter_t iter;
489
+ if (!bson_iter_init(&iter, cmd) || !bson_iter_next(&iter)) {
490
+ CLIENT_ERR("Failed to get command name");
491
+ return false;
492
+ }
493
+
494
+ const char *cmd_name = bson_iter_key(&iter);
495
+ if (0 != strcmp(cmd_name, "create") && 0 != strcmp(cmd_name, "collMod")) {
496
+ // Ignore other commands.
497
+ return true;
498
+ }
499
+
500
+ if (!BSON_ITER_HOLDS_UTF8(&iter)) {
501
+ CLIENT_ERR("Failed to get collection name from command");
502
+ return false;
503
+ }
504
+ const char *coll = bson_iter_utf8(&iter, NULL);
505
+
506
+ // Check if schema was requested.
507
+ mc_schema_entry_t *found = NULL;
508
+ for (mc_schema_entry_t *it = sb->ll; it != NULL; it = it->next) {
509
+ if (0 == strcmp(it->coll, coll)) {
510
+ found = it;
511
+ break;
512
+ }
513
+ }
514
+
515
+ if (!found) {
516
+ // Command is for a collection that is not needed.
517
+ return true;
518
+ }
519
+
520
+ if (found->satisfied) {
521
+ return true;
522
+ }
523
+
524
+ if (bson_iter_find_descendant(&iter, "validator.$jsonSchema", &iter)) {
525
+ if (!_mongocrypt_buffer_copy_from_document_iter(&found->jsonSchema.buf, &iter)) {
526
+ CLIENT_ERR("failed to read schema from schema map for collection: %s", coll);
527
+ return false;
528
+ }
529
+
530
+ if (!_mongocrypt_buffer_to_bson(&found->jsonSchema.buf, &found->jsonSchema.bson)) {
531
+ CLIENT_ERR("unable to create BSON from schema map for collection: %s", coll);
532
+ return false;
533
+ }
534
+
535
+ found->jsonSchema.set = true;
536
+ found->jsonSchema.is_remote = true; // Mark remote. Schema may have non-CSFLE validators.
537
+ found->satisfied = true;
538
+ return true;
539
+ }
540
+
541
+ // Command does not have a schema. Not an error.
542
+ return true;
543
+ }
544
+
545
+ bool mc_schema_broker_satisfy_remaining_with_empty_schemas(mc_schema_broker_t *sb,
546
+ _mongocrypt_cache_t *collinfo_cache /* may be NULL */,
547
+ mongocrypt_status_t *status) {
548
+ BSON_ASSERT_PARAM(sb);
549
+
550
+ for (mc_schema_entry_t *it = sb->ll; it != NULL; it = it->next) {
551
+ if (it->satisfied) {
552
+ continue;
553
+ }
554
+
555
+ // Cache the received collinfo.
556
+ if (collinfo_cache) {
557
+ char *ns = bson_strdup_printf("%s.%s", sb->db, it->coll);
558
+ bson_t empty = BSON_INITIALIZER;
559
+ if (!_mongocrypt_cache_add_copy(collinfo_cache, ns, &empty, status)) {
560
+ bson_destroy(&empty);
561
+ bson_free(ns);
562
+ return false;
563
+ }
564
+ bson_destroy(&empty);
565
+ bson_free(ns);
566
+ }
567
+
568
+ it->satisfied = true;
569
+ }
570
+
571
+ return true;
572
+ }
573
+
574
+ bool mc_schema_broker_need_more_schemas(const mc_schema_broker_t *sb) {
575
+ BSON_ASSERT_PARAM(sb);
576
+ for (const mc_schema_entry_t *it = sb->ll; it != NULL; it = it->next) {
577
+ if (!it->satisfied) {
578
+ return true;
579
+ }
580
+ }
581
+ return false;
582
+ }
583
+
584
+ const mc_EncryptedFieldConfig_t *
585
+ mc_schema_broker_get_encryptedFields(const mc_schema_broker_t *sb, const char *coll, mongocrypt_status_t *status) {
586
+ BSON_ASSERT_PARAM(sb);
587
+ BSON_ASSERT_PARAM(coll);
588
+
589
+ for (const mc_schema_entry_t *it = sb->ll; it != NULL; it = it->next) {
590
+ BSON_ASSERT(it->satisfied);
591
+ if (0 != strcmp(it->coll, coll)) {
592
+ continue;
593
+ }
594
+ if (!it->encryptedFields.set) {
595
+ CLIENT_ERR("Expected encryptedFields for '%s', but none set", coll);
596
+ return NULL;
597
+ }
598
+ return &it->encryptedFields.efc;
599
+ }
600
+ CLIENT_ERR("Expected encryptedFields for '%s', but did not find entry", coll);
601
+ return NULL;
602
+ }
603
+
604
+ static bool append_encryptedFields(const bson_t *encryptedFields,
605
+ const char *coll,
606
+ uint8_t default_strEncodeVersion,
607
+ bson_t *out,
608
+ mongocrypt_status_t *status) {
609
+ BSON_ASSERT_PARAM(encryptedFields); // May be an empty BSON document.
610
+ BSON_ASSERT_PARAM(out);
611
+ BSON_ASSERT_PARAM(coll);
612
+
613
+ bool ok = false;
614
+
615
+ bool has_escCollection = false;
616
+ bool has_ecocCollection = false;
617
+ bool has_fields = false;
618
+ bool has_strEncodeVersion = false;
619
+
620
+ char *default_escCollection = NULL;
621
+ char *default_ecocCollection = NULL;
622
+
623
+ bson_iter_t iter;
624
+ TRY_BSON_OR(bson_iter_init(&iter, encryptedFields)) {
625
+ goto fail;
626
+ }
627
+
628
+ // Copy all values. Check if state collections are present.
629
+ while (bson_iter_next(&iter)) {
630
+ if (strcmp(bson_iter_key(&iter), "escCollection") == 0) {
631
+ has_escCollection = true;
632
+ }
633
+ if (strcmp(bson_iter_key(&iter), "ecocCollection") == 0) {
634
+ has_ecocCollection = true;
635
+ }
636
+ if (strcmp(bson_iter_key(&iter), "fields") == 0) {
637
+ has_fields = true;
638
+ }
639
+ if (strcmp(bson_iter_key(&iter), "strEncodeVersion") == 0) {
640
+ has_strEncodeVersion = true;
641
+ }
642
+ TRY_BSON_OR(BSON_APPEND_VALUE(out, bson_iter_key(&iter), bson_iter_value(&iter))) {
643
+ goto fail;
644
+ }
645
+ }
646
+
647
+ if (!has_escCollection) {
648
+ default_escCollection = bson_strdup_printf("enxcol_.%s.esc", coll);
649
+ TRY_BSON_OR(BSON_APPEND_UTF8(out, "escCollection", default_escCollection)) {
650
+ goto fail;
651
+ }
652
+ }
653
+
654
+ if (!has_ecocCollection) {
655
+ default_ecocCollection = bson_strdup_printf("enxcol_.%s.ecoc", coll);
656
+ TRY_BSON_OR(BSON_APPEND_UTF8(out, "ecocCollection", default_ecocCollection)) {
657
+ goto fail;
658
+ }
659
+ }
660
+
661
+ if (!has_fields) {
662
+ bson_t empty = BSON_INITIALIZER;
663
+ TRY_BSON_OR(BSON_APPEND_ARRAY(out, "fields", &empty)) {
664
+ goto fail;
665
+ }
666
+ }
667
+
668
+ if (!has_strEncodeVersion && default_strEncodeVersion != 0) {
669
+ // 0 indicates encryptedFields has no text fields and no set strEncodeVersion.
670
+ // Only add strEncodeVersion if needed since older server components do not recognize it.
671
+ TRY_BSON_OR(BSON_APPEND_INT32(out, "strEncodeVersion", (int32_t)default_strEncodeVersion)) {
672
+ goto fail;
673
+ }
674
+ }
675
+
676
+ ok = true;
677
+ fail:
678
+ bson_free(default_escCollection);
679
+ bson_free(default_ecocCollection);
680
+ return ok;
681
+ }
682
+
683
+ static bool append_encryptionInformation(const mc_schema_broker_t *sb,
684
+ const char *cmd_name,
685
+ bson_t *out,
686
+ mongocrypt_status_t *status) {
687
+ BSON_ASSERT_PARAM(sb);
688
+ BSON_ASSERT_PARAM(cmd_name);
689
+ BSON_ASSERT_PARAM(out);
690
+
691
+ bson_t encryption_information_bson;
692
+ TRY_BSON_OR(BSON_APPEND_DOCUMENT_BEGIN(out, "encryptionInformation", &encryption_information_bson)) {
693
+ return false;
694
+ }
695
+ TRY_BSON_OR(BSON_APPEND_INT32(&encryption_information_bson, "type", 1)) {
696
+ return false;
697
+ }
698
+
699
+ bson_t schema_bson;
700
+ TRY_BSON_OR(BSON_APPEND_DOCUMENT_BEGIN(&encryption_information_bson, "schema", &schema_bson)) {
701
+ return false;
702
+ }
703
+
704
+ for (mc_schema_entry_t *se = sb->ll; se != NULL; se = se->next) {
705
+ BSON_ASSERT(se->satisfied);
706
+ bool loop_ok = false;
707
+ char *ns = bson_strdup_printf("%s.%s", sb->db, se->coll);
708
+ bson_t ns_to_schema_bson;
709
+ TRY_BSON_OR(BSON_APPEND_DOCUMENT_BEGIN(&schema_bson, ns, &ns_to_schema_bson)) {
710
+ goto loop_fail;
711
+ }
712
+
713
+ bson_t empty_encryptedFields = BSON_INITIALIZER; // Use empty encryptedFields if none set.
714
+ const bson_t *encryptedFields = &empty_encryptedFields;
715
+ uint8_t default_strEncodeVersion = 0;
716
+ if (se->encryptedFields.set) {
717
+ encryptedFields = &se->encryptedFields.bson;
718
+ default_strEncodeVersion = se->encryptedFields.efc.str_encode_version;
719
+ }
720
+ if (!append_encryptedFields(encryptedFields, se->coll, default_strEncodeVersion, &ns_to_schema_bson, status)) {
721
+ goto loop_fail;
722
+ }
723
+
724
+ TRY_BSON_OR(bson_append_document_end(&schema_bson, &ns_to_schema_bson)) {
725
+ goto loop_fail;
726
+ }
727
+ loop_ok = true;
728
+ loop_fail:
729
+ bson_free(ns);
730
+ bson_destroy(&empty_encryptedFields);
731
+ if (!loop_ok) {
732
+ return false;
733
+ }
734
+ }
735
+ TRY_BSON_OR(bson_append_document_end(&encryption_information_bson, &schema_bson)) {
736
+ return false;
737
+ }
738
+ TRY_BSON_OR(bson_append_document_end(out, &encryption_information_bson)) {
739
+ return false;
740
+ }
741
+ return true;
742
+ }
743
+
744
+ static const char *get_cmd_name(const bson_t *cmd, mongocrypt_status_t *status) {
745
+ bson_iter_t iter;
746
+ const char *cmd_name;
747
+
748
+ BSON_ASSERT_PARAM(cmd);
749
+
750
+ if (!bson_iter_init(&iter, cmd)) {
751
+ CLIENT_ERR("unable to iterate over command BSON");
752
+ return NULL;
753
+ }
754
+
755
+ /* The command name is the first key. */
756
+ if (!bson_iter_next(&iter)) {
757
+ CLIENT_ERR("unexpected empty BSON for command");
758
+ return NULL;
759
+ }
760
+
761
+ cmd_name = bson_iter_key(&iter);
762
+ if (!cmd_name) {
763
+ CLIENT_ERR("unable to get command name from BSON");
764
+ return NULL;
765
+ }
766
+ return cmd_name;
767
+ }
768
+
769
+ static bool insert_encryptionInformation(const mc_schema_broker_t *sb,
770
+ const char *cmd_name,
771
+ bson_t *cmd /* in and out */,
772
+ mc_cmd_target_t cmd_target,
773
+ mongocrypt_status_t *status) {
774
+ BSON_ASSERT_PARAM(sb);
775
+ BSON_ASSERT_PARAM(cmd_name);
776
+ BSON_ASSERT_PARAM(cmd);
777
+
778
+ bson_t out = BSON_INITIALIZER;
779
+ bson_t explain = BSON_INITIALIZER;
780
+ bson_iter_t iter;
781
+ bool ok = false;
782
+
783
+ // For `bulkWrite`, append `encryptionInformation` inside the `nsInfo.0` document.
784
+ if (0 == strcmp(cmd_name, "bulkWrite")) {
785
+ // Get the single `nsInfo` document from the input command.
786
+ bson_t nsInfo; // Non-owning.
787
+ {
788
+ bson_iter_t nsInfo_iter;
789
+ if (!bson_iter_init(&nsInfo_iter, cmd)) {
790
+ CLIENT_ERR("failed to iterate command");
791
+ goto fail;
792
+ }
793
+ if (!bson_iter_find_descendant(&nsInfo_iter, "nsInfo.0", &nsInfo_iter)) {
794
+ CLIENT_ERR("expected one namespace in `bulkWrite`, but found zero.");
795
+ goto fail;
796
+ }
797
+ if (bson_has_field(cmd, "nsInfo.1")) {
798
+ CLIENT_ERR("expected one namespace in `bulkWrite`, but found more than one. Only one namespace is "
799
+ "supported.");
800
+ goto fail;
801
+ }
802
+ if (!mc_iter_document_as_bson(&nsInfo_iter, &nsInfo, status)) {
803
+ goto fail;
804
+ }
805
+ // Ensure `nsInfo` does not already have an `encryptionInformation` field.
806
+ if (bson_has_field(&nsInfo, "encryptionInformation")) {
807
+ CLIENT_ERR("unexpected `encryptionInformation` present in input `nsInfo`.");
808
+ goto fail;
809
+ }
810
+ }
811
+
812
+ // Copy input and append `encryptionInformation` to `nsInfo`.
813
+ {
814
+ // Append everything from input except `nsInfo`.
815
+ bson_copy_to_excluding_noinit(cmd, &out, "nsInfo", NULL);
816
+ // Append `nsInfo` array.
817
+ bson_t nsInfo_array;
818
+ if (!BSON_APPEND_ARRAY_BEGIN(&out, "nsInfo", &nsInfo_array)) {
819
+ CLIENT_ERR("unable to begin appending 'nsInfo' array");
820
+ goto fail;
821
+ }
822
+ bson_t nsInfo_array_0;
823
+ if (!BSON_APPEND_DOCUMENT_BEGIN(&nsInfo_array, "0", &nsInfo_array_0)) {
824
+ CLIENT_ERR("unable to append 'nsInfo.0' document");
825
+ goto fail;
826
+ }
827
+ // Copy everything from input `nsInfo`.
828
+ if (!bson_concat(&nsInfo_array_0, &nsInfo)) {
829
+ CLIENT_ERR("unable to concat to 'nsInfo.0' document");
830
+ goto fail;
831
+ }
832
+ // And append `encryptionInformation`.
833
+ if (!append_encryptionInformation(sb, cmd_name, &nsInfo_array_0, status)) {
834
+ goto fail;
835
+ }
836
+ if (!bson_append_document_end(&nsInfo_array, &nsInfo_array_0)) {
837
+ CLIENT_ERR("unable to end appending 'nsInfo' document in array");
838
+ }
839
+ if (!bson_append_array_end(&out, &nsInfo_array)) {
840
+ CLIENT_ERR("unable to end appending 'nsInfo' array");
841
+ goto fail;
842
+ }
843
+ // Overwrite `cmd`.
844
+ bson_destroy(cmd);
845
+ if (!bson_steal(cmd, &out)) {
846
+ CLIENT_ERR("failed to steal BSON with encryptionInformation");
847
+ goto fail;
848
+ }
849
+ }
850
+
851
+ goto success;
852
+ }
853
+
854
+ if (0 == strcmp(cmd_name, "explain")
855
+ && (cmd_target == MC_CMD_SCHEMAS_FOR_CRYPT_SHARED || cmd_target == MC_CMD_SCHEMAS_FOR_SERVER)) {
856
+ // The "explain" command is a special case when sent to crypt_shared or the server, which expect
857
+ // "encryptionInformation" nested in the "explain" document instead of at top-level. Example:
858
+ // {
859
+ // "explain": {
860
+ // "find": "to-crypt_shared-or-server"
861
+ // "encryptionInformation": {}
862
+ // }
863
+ // }
864
+ if (!bson_iter_init_find(&iter, cmd, "explain")) {
865
+ CLIENT_ERR("expected to find 'explain' field");
866
+ goto fail;
867
+ }
868
+
869
+ if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) {
870
+ CLIENT_ERR("expected 'explain' to be document");
871
+ goto fail;
872
+ }
873
+
874
+ {
875
+ bson_t tmp;
876
+ if (!mc_iter_document_as_bson(&iter, &tmp, status)) {
877
+ goto fail;
878
+ }
879
+ bson_destroy(&explain);
880
+ bson_copy_to(&tmp, &explain);
881
+ }
882
+
883
+ if (!append_encryptionInformation(sb, cmd_name, &explain, status)) {
884
+ goto fail;
885
+ }
886
+
887
+ if (!BSON_APPEND_DOCUMENT(&out, "explain", &explain)) {
888
+ CLIENT_ERR("unable to append 'explain' document");
889
+ goto fail;
890
+ }
891
+
892
+ bson_copy_to_excluding_noinit(cmd, &out, "explain", NULL);
893
+ bson_destroy(cmd);
894
+ if (!bson_steal(cmd, &out)) {
895
+ CLIENT_ERR("failed to steal BSON with encryptionInformation");
896
+ goto fail;
897
+ }
898
+ goto success;
899
+ }
900
+
901
+ // Default case: append "encryptionInformation" at top-level. Example:
902
+ // {
903
+ // "<command name>": { ... }
904
+ // "encryptionInformation": {}
905
+ // }
906
+ if (!append_encryptionInformation(sb, cmd_name, cmd, status)) {
907
+ goto fail;
908
+ }
909
+
910
+ success:
911
+ ok = true;
912
+ fail:
913
+ bson_destroy(&explain);
914
+ if (!ok) {
915
+ bson_destroy(&out);
916
+ }
917
+ return ok;
918
+ }
919
+
920
+ // insert_csfleEncryptionSchemas appends schema information to a command for CSFLE.
921
+ // Only consumed by query analysis (mongocryptd/crypt_shared).
922
+ // For one JSON schema, use `jsonSchema` for backwards compatibility.
923
+ // For multiple JSON schemas, use `csfleEncryptionSchemas` (added in server 8.2).
924
+ static bool insert_csfleEncryptionSchemas(const mc_schema_broker_t *sb,
925
+ bson_t *cmd /* in/out */,
926
+ mc_cmd_target_t cmd_target,
927
+ mongocrypt_status_t *status) {
928
+ BSON_ASSERT_PARAM(sb);
929
+ BSON_ASSERT_PARAM(cmd);
930
+
931
+ if (cmd_target != MC_CMD_SCHEMAS_FOR_CRYPT_SHARED && cmd_target != MC_CMD_SCHEMAS_FOR_MONGOCRYPTD) {
932
+ // CSFLE schemas are only used for query analysis.
933
+ return true;
934
+ }
935
+
936
+ if (sb->ll_len == 1) {
937
+ // Append the only jsonSchema with the "jsonSchema" field.
938
+ const mc_schema_entry_t *se = sb->ll;
939
+ BSON_ASSERT(se);
940
+ BSON_ASSERT(!se->next);
941
+ BSON_ASSERT(se->satisfied);
942
+ if (se->jsonSchema.set) {
943
+ TRY_BSON_OR(BSON_APPEND_DOCUMENT(cmd, "jsonSchema", &se->jsonSchema.bson)) {
944
+ return false;
945
+ }
946
+ TRY_BSON_OR(BSON_APPEND_BOOL(cmd, "isRemoteSchema", se->jsonSchema.is_remote)) {
947
+ return false;
948
+ }
949
+ } else {
950
+ bson_t empty = BSON_INITIALIZER;
951
+ TRY_BSON_OR(BSON_APPEND_DOCUMENT(cmd, "jsonSchema", &empty)) {
952
+ return false;
953
+ }
954
+ // Append isRemoteSchema:true to preserve existing value. But I expect it can/should be false.
955
+ TRY_BSON_OR(BSON_APPEND_BOOL(cmd, "isRemoteSchema", true)) {
956
+ return false;
957
+ }
958
+ }
959
+ return true;
960
+ }
961
+
962
+ // Append multiple schemas as "csfleEncryptionSchemas"
963
+ bson_t csfleEncryptionSchemas;
964
+ TRY_BSON_OR(BSON_APPEND_DOCUMENT_BEGIN(cmd, "csfleEncryptionSchemas", &csfleEncryptionSchemas)) {
965
+ return false;
966
+ }
967
+
968
+ for (mc_schema_entry_t *se = sb->ll; se != NULL; se = se->next) {
969
+ BSON_ASSERT(se->satisfied);
970
+
971
+ char *ns = bson_strdup_printf("%s.%s", sb->db, se->coll);
972
+ bson_t ns_to_doc;
973
+ TRY_BSON_OR(BSON_APPEND_DOCUMENT_BEGIN(&csfleEncryptionSchemas, ns, &ns_to_doc)) {
974
+ bson_free(ns);
975
+ return false;
976
+ }
977
+ bson_free(ns);
978
+
979
+ if (!se->jsonSchema.set) {
980
+ // Append as an empty document.
981
+ bson_t empty = BSON_INITIALIZER;
982
+ TRY_BSON_OR(BSON_APPEND_DOCUMENT(&ns_to_doc, "jsonSchema", &empty)) {
983
+ return false;
984
+ }
985
+ TRY_BSON_OR(BSON_APPEND_BOOL(&ns_to_doc, "isRemoteSchema", false)) {
986
+ return false;
987
+ }
988
+ } else {
989
+ TRY_BSON_OR(BSON_APPEND_DOCUMENT(&ns_to_doc, "jsonSchema", &se->jsonSchema.bson)) {
990
+ return false;
991
+ }
992
+ TRY_BSON_OR(BSON_APPEND_BOOL(&ns_to_doc, "isRemoteSchema", se->jsonSchema.is_remote)) {
993
+ return false;
994
+ }
995
+ }
996
+ TRY_BSON_OR(bson_append_document_end(&csfleEncryptionSchemas, &ns_to_doc)) {
997
+ return false;
998
+ }
999
+ }
1000
+
1001
+ TRY_BSON_OR(bson_append_document_end(cmd, &csfleEncryptionSchemas)) {
1002
+ return false;
1003
+ }
1004
+
1005
+ return true;
1006
+ }
1007
+
1008
+ bool mc_schema_broker_add_schemas_to_cmd(const mc_schema_broker_t *sb,
1009
+ bson_t *cmd /* in and out */,
1010
+ mc_cmd_target_t cmd_target,
1011
+ mongocrypt_status_t *status) {
1012
+ BSON_ASSERT_PARAM(sb);
1013
+ BSON_ASSERT_PARAM(cmd);
1014
+
1015
+ const char *cmd_name = get_cmd_name(cmd, status);
1016
+ if (!cmd_name) {
1017
+ return false;
1018
+ }
1019
+
1020
+ bool has_encryptedFields = false;
1021
+ bool has_jsonSchema = false;
1022
+ const char *coll_with_encryptedFields = NULL;
1023
+ const char *coll_with_jsonSchema = NULL;
1024
+ for (mc_schema_entry_t *it = sb->ll; it != NULL; it = it->next) {
1025
+ BSON_ASSERT(it->satisfied);
1026
+ if (it->encryptedFields.set) {
1027
+ has_encryptedFields = true;
1028
+ coll_with_encryptedFields = it->coll;
1029
+ } else if (it->jsonSchema.set) {
1030
+ has_jsonSchema = true;
1031
+ coll_with_jsonSchema = it->coll;
1032
+ }
1033
+ }
1034
+
1035
+ if (has_encryptedFields && has_jsonSchema) {
1036
+ // If any collection has encryptedFields, error if any collection only has a JSON Schema.
1037
+ CLIENT_ERR("Collection '%s' has an encryptedFields configured, but collection '%s' has a JSON schema "
1038
+ "configured. This is currently not supported. To ignore the JSON schema, add an empty entry for "
1039
+ "'%s' to AutoEncryptionOpts.encryptedFieldsMap: \"%s\": { \"fields\": [] }",
1040
+ coll_with_encryptedFields,
1041
+ coll_with_jsonSchema,
1042
+ coll_with_jsonSchema,
1043
+ coll_with_jsonSchema);
1044
+ return false;
1045
+ }
1046
+
1047
+ if (has_encryptedFields) {
1048
+ // Use encryptionInformation.
1049
+ return insert_encryptionInformation(sb, cmd_name, cmd, cmd_target, status);
1050
+ }
1051
+
1052
+ if (has_jsonSchema) {
1053
+ // Use csfleEncryptionSchemas / jsonSchema only.
1054
+ return insert_csfleEncryptionSchemas(sb, cmd, cmd_target, status);
1055
+ }
1056
+
1057
+ // Collections have no QE or CSFLE schemas.
1058
+ if (0 == strcmp(cmd_name, "bulkWrite")) {
1059
+ // "bulkWrite" does not support the jsonSchema field. Use encryptionInformation with empty schemas.
1060
+ return insert_encryptionInformation(sb, cmd_name, cmd, cmd_target, status);
1061
+ }
1062
+
1063
+ // Use csfleEncryptionSchemas / jsonSchema with empty schemas.
1064
+ return insert_csfleEncryptionSchemas(sb, cmd, cmd_target, status);
1065
+ }