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
@@ -18,14 +18,17 @@
18
18
 
19
19
  #include "bson/bson.h"
20
20
  #include "mc-fle-blob-subtype-private.h"
21
+ #include "mc-fle2-find-text-payload-private.h"
21
22
  #include "mc-tokens-private.h"
22
23
  #include "mongocrypt-buffer-private.h"
23
24
  #include "mongocrypt-ciphertext-private.h"
24
25
  #include "mongocrypt-marking-private.h"
26
+ #include "mongocrypt-private.h"
25
27
  #include "mongocrypt.h"
26
28
  #include "test-mongocrypt-assert.h"
27
29
  #include "test-mongocrypt.h"
28
30
  #include <stdbool.h>
31
+ #include <string.h>
29
32
 
30
33
  /* Create a basis marking buffer with valid values for the given fields. */
31
34
  static void _make_marking(bson_t *bson, _mongocrypt_buffer_t *buf) {
@@ -67,8 +70,8 @@ static void test_mongocrypt_marking_parse(_mongocrypt_tester_t *tester) {
67
70
  marking_bson = TMP_BSON("{'a': 2, 'v': 'abc', 'ka': 'alt'}");
68
71
  _make_marking(marking_bson, &marking_buf);
69
72
  _parse_ok(&marking_buf, &marking);
70
- BSON_ASSERT(marking.algorithm == MONGOCRYPT_ENCRYPTION_ALGORITHM_RANDOM);
71
- BSON_ASSERT(0 == strcmp("abc", bson_iter_utf8(&marking.v_iter, NULL)));
73
+ BSON_ASSERT(marking.u.fle1.algorithm == MONGOCRYPT_ENCRYPTION_ALGORITHM_RANDOM);
74
+ BSON_ASSERT(0 == strcmp("abc", bson_iter_utf8(&marking.u.fle1.v_iter, NULL)));
72
75
  _mongocrypt_buffer_cleanup(&marking_buf);
73
76
  _mongocrypt_marking_cleanup(&marking);
74
77
 
@@ -197,36 +200,9 @@ static void test_mc_get_mincover_from_FLE2RangeFindSpec(_mongocrypt_tester_t *te
197
200
  mc_optional_int64_t sparsity;
198
201
  const char *expectedError;
199
202
  const char *expectedErrorAtParseTime;
200
- bool disableRangeV2;
201
203
  } testcase_t;
202
204
 
203
205
  testcase_t tests[] = {
204
- {.description = "Range V2 disabled w/ trim factor fails",
205
- .findSpecJSON = RAW_STRING({
206
- "lowerBound" : {"$numberInt" : "7"},
207
- "lbIncluded" : true,
208
- "upperBound" : {"$numberInt" : "32"},
209
- "ubIncluded" : true,
210
- "indexMin" : {"$numberInt" : "0"},
211
- "indexMax" : {"$numberInt" : "32"},
212
- "trimFactor" : 0
213
- }),
214
- .disableRangeV2 = true,
215
- .expectedErrorAtParseTime = "'trimFactor' is not supported for QE range v1"},
216
- {.description = "Range V2 disabled w/ no trim factor succeeds",
217
- .findSpecJSON = RAW_STRING({
218
- "lowerBound" : {"$numberInt" : "7"},
219
- "lbIncluded" : true,
220
- "upperBound" : {"$numberInt" : "32"},
221
- "ubIncluded" : true,
222
- "indexMin" : {"$numberInt" : "0"},
223
- "indexMax" : {"$numberInt" : "32"}
224
- }),
225
- .disableRangeV2 = true,
226
- .expectedMinCover = "000111\n"
227
- "001\n"
228
- "01\n"
229
- "100000\n"},
230
206
  {.description = "Int32 Bounds included",
231
207
  .findSpecJSON = RAW_STRING({
232
208
  "lowerBound" : {"$numberInt" : "7"},
@@ -849,9 +825,9 @@ static void test_mc_get_mincover_from_FLE2RangeFindSpec(_mongocrypt_tester_t *te
849
825
  mongocrypt_status_t *status = mongocrypt_status_new();
850
826
 
851
827
  if (test->description) {
852
- printf(" %zu: %s\n", i, test->description);
828
+ TEST_PRINTF(" %zu: %s\n", i, test->description);
853
829
  } else {
854
- printf(" %zu\n", i);
830
+ TEST_PRINTF(" %zu\n", i);
855
831
  }
856
832
 
857
833
  bson_t *findSpecVal = bson_new_from_json((const uint8_t *)test->findSpecJSON, -1, &error);
@@ -874,7 +850,7 @@ static void test_mc_get_mincover_from_FLE2RangeFindSpec(_mongocrypt_tester_t *te
874
850
  ASSERT(bson_iter_init_find(&findSpecIter, findSpecDoc, "findSpec"));
875
851
 
876
852
  mc_FLE2RangeFindSpec_t findSpec;
877
- bool res = mc_FLE2RangeFindSpec_parse(&findSpec, &findSpecIter, !test->disableRangeV2, status);
853
+ bool res = mc_FLE2RangeFindSpec_parse(&findSpec, &findSpecIter, status);
878
854
  if (test->expectedErrorAtParseTime) {
879
855
  ASSERT(!res);
880
856
  ASSERT_STATUS_CONTAINS(status, test->expectedErrorAtParseTime);
@@ -888,8 +864,7 @@ static void test_mc_get_mincover_from_FLE2RangeFindSpec(_mongocrypt_tester_t *te
888
864
  sparsity = (size_t)test->sparsity.value;
889
865
  }
890
866
 
891
- const bool use_range_v2 = !test->disableRangeV2;
892
- mc_mincover_t *mc = mc_get_mincover_from_FLE2RangeFindSpec(&findSpec, sparsity, status, use_range_v2);
867
+ mc_mincover_t *mc = mc_get_mincover_from_FLE2RangeFindSpec(&findSpec, sparsity, status);
893
868
 
894
869
  if (test->expectedError) {
895
870
  ASSERT(NULL == mc);
@@ -907,27 +882,29 @@ static void test_mc_get_mincover_from_FLE2RangeFindSpec(_mongocrypt_tester_t *te
907
882
  }
908
883
  }
909
884
 
910
- // Runs _mongocrypt_marking_to_ciphertext to compute the ciphertext for the given marking.
911
- static void get_ciphertext_from_marking_json(_mongocrypt_tester_t *tester,
912
- mongocrypt_t *crypt,
913
- const char *markingJSON,
914
- _mongocrypt_ciphertext_t *out) {
885
+ // Helper for get_ciphertext_from_marking_json when we don't want to use extra test buffer space.
886
+ static void get_ciphertext_from_marking_json_with_bufs(mongocrypt_t *crypt,
887
+ bson_t *marking_bson,
888
+ _mongocrypt_ciphertext_t *out,
889
+ mongocrypt_binary_t *cmd,
890
+ mongocrypt_binary_t *keyIdSpace,
891
+ mongocrypt_binary_t *kiSpace,
892
+ mongocrypt_binary_t *kuSpace) {
915
893
  mongocrypt_status_t *status = mongocrypt_status_new();
916
894
  mongocrypt_ctx_t *ctx = mongocrypt_ctx_new(crypt);
917
895
  // Set up encryption environment
918
- ASSERT_OK(mongocrypt_ctx_encrypt_init(ctx, "test", -1, TEST_FILE("./test/example/cmd.json")), ctx);
896
+ ASSERT_OK(mongocrypt_ctx_encrypt_init(ctx, "test", -1, cmd), ctx);
919
897
  // Add a test key
920
898
  _mongocrypt_buffer_t keyId;
921
- _mongocrypt_buffer_from_binary(&keyId, TEST_BIN(16));
899
+ _mongocrypt_buffer_from_binary(&keyId, keyIdSpace);
922
900
  keyId.subtype = BSON_SUBTYPE_UUID;
923
901
  _mongocrypt_key_broker_add_test_key(&ctx->kb, &keyId);
924
902
 
925
903
  _mongocrypt_buffer_t marking_buf;
926
904
  _mongocrypt_marking_t marking;
927
- bson_t *marking_bson = TMP_BSON(markingJSON);
928
905
  // Add key identifier info to the marking
929
- BSON_APPEND_BINARY(marking_bson, "ki", BSON_SUBTYPE_UUID, (TEST_BIN(16))->data, 16);
930
- BSON_APPEND_BINARY(marking_bson, "ku", BSON_SUBTYPE_UUID, (TEST_BIN(16))->data, 16);
906
+ BSON_APPEND_BINARY(marking_bson, "ki", BSON_SUBTYPE_UUID, (kiSpace)->data, 16);
907
+ BSON_APPEND_BINARY(marking_bson, "ku", BSON_SUBTYPE_UUID, (kuSpace)->data, 16);
931
908
  _make_marking(marking_bson, &marking_buf);
932
909
  // Use FLE2 as the subtype (default is FLE1)
933
910
  marking_buf.data[0] = MC_SUBTYPE_FLE2EncryptionPlaceholder;
@@ -941,57 +918,184 @@ static void get_ciphertext_from_marking_json(_mongocrypt_tester_t *tester,
941
918
  mongocrypt_ctx_destroy(ctx);
942
919
  }
943
920
 
944
- // Assert that the encryptedTokens fields in V2 insert/update ciphertext matches our expectations. Specifically, checks
945
- // that the length of these fields are what we expect, and that the "isLeaf" token is appended when using range V2.
946
- static void assert_correctness_of_ciphertext(_mongocrypt_ciphertext_t *ciphertext,
921
+ // Runs _mongocrypt_marking_to_ciphertext to compute the ciphertext for the given marking.
922
+ static void get_ciphertext_from_marking_json(_mongocrypt_tester_t *tester,
947
923
  mongocrypt_t *crypt,
948
- mc_ECOCToken_t *ecocToken,
949
- bool useRangeV2,
950
- uint32_t expectedEdges) {
951
- uint32_t expectedPLength = useRangeV2 ? 33 : 32;
952
- const _mongocrypt_value_encryption_algorithm_t *fle2alg = _mcFLE2Algorithm();
924
+ const char *markingJSON,
925
+ _mongocrypt_ciphertext_t *out) {
926
+ get_ciphertext_from_marking_json_with_bufs(crypt,
927
+ TMP_BSON_STR(markingJSON),
928
+ out,
929
+ TEST_FILE("./test/example/cmd.json"),
930
+ TEST_BIN(16),
931
+ TEST_BIN(16),
932
+ TEST_BIN(16));
933
+ }
934
+
935
+ // Get the ECOC token to use in decryption.
936
+ static mc_ECOCToken_t *getECOCToken(mongocrypt_t *crypt) {
953
937
  mongocrypt_status_t *status = mongocrypt_status_new();
938
+ // Test token key that we added earlier is all zeros.
939
+ _mongocrypt_buffer_t tokenKey;
940
+ _mongocrypt_buffer_init_size(&tokenKey, MONGOCRYPT_TOKEN_KEY_LEN);
941
+ memset(tokenKey.data, 0, MONGOCRYPT_TOKEN_KEY_LEN);
942
+
943
+ mc_CollectionsLevel1Token_t *collectionsLevel1Token =
944
+ mc_CollectionsLevel1Token_new(crypt->crypto, &tokenKey, status);
945
+ mc_ECOCToken_t *ecocToken = mc_ECOCToken_new(crypt->crypto, collectionsLevel1Token, status);
946
+ ASSERT(mongocrypt_status_ok(status));
947
+
948
+ mc_CollectionsLevel1Token_destroy(collectionsLevel1Token);
949
+ _mongocrypt_buffer_cleanup(&tokenKey);
950
+ mongocrypt_status_destroy(status);
951
+ return ecocToken;
952
+ }
953
+
954
+ static mc_ServerDataEncryptionLevel1Token_t *getSDEL1Token(mongocrypt_t *crypt) {
955
+ mongocrypt_status_t *status = mongocrypt_status_new();
956
+ // Test token key that we added earlier is all zeros.
957
+ _mongocrypt_buffer_t tokenKey;
958
+ _mongocrypt_buffer_init_size(&tokenKey, MONGOCRYPT_TOKEN_KEY_LEN);
959
+ memset(tokenKey.data, 0, MONGOCRYPT_TOKEN_KEY_LEN);
960
+
961
+ mc_ServerDataEncryptionLevel1Token_t *token =
962
+ mc_ServerDataEncryptionLevel1Token_new(crypt->crypto, &tokenKey, status);
963
+ ASSERT(mongocrypt_status_ok(status));
964
+ _mongocrypt_buffer_cleanup(&tokenKey);
965
+ mongocrypt_status_destroy(status);
966
+ return token;
967
+ }
968
+
969
+ static void
970
+ validate_and_get_bindata(bson_t *obj, const char *field, bson_subtype_t expected_type, mongocrypt_binary_t *bin_out) {
971
+ bson_iter_t iter;
972
+ ASSERT(bson_iter_init_find(&iter, obj, field));
973
+ ASSERT(BSON_ITER_HOLDS_BINARY(&iter));
974
+
975
+ uint32_t bin_len;
976
+ const uint8_t *bin = NULL;
977
+ bson_subtype_t bin_subtype;
978
+ bson_iter_binary(&iter, &bin_subtype, &bin_len, &bin);
979
+ ASSERT(bin_subtype == expected_type);
980
+ bin_out->data = (void *)bin;
981
+ bin_out->len = bin_len;
982
+ }
983
+
984
+ static void validate_encrypted_token(mongocrypt_t *crypt,
985
+ mongocrypt_binary_t *encrypted_token_bin,
986
+ mongocrypt_binary_t *expected_esc_token,
987
+ bool expect_is_leaf,
988
+ uint8_t *is_leaf_out) {
989
+ mongocrypt_status_t *status = mongocrypt_status_new();
990
+ mc_ECOCToken_t *ecocToken = getECOCToken(crypt);
991
+ const _mongocrypt_value_encryption_algorithm_t *fle2alg = _mcFLE2Algorithm();
992
+
993
+ _mongocrypt_buffer_t p_buf, decrypt_buf;
994
+ uint32_t expect_decrypt_size = expected_esc_token->len + (expect_is_leaf ? 1 : 0);
995
+ ASSERT(_mongocrypt_buffer_copy_from_data_and_size(&p_buf, encrypted_token_bin->data, encrypted_token_bin->len));
996
+
997
+ _mongocrypt_buffer_init_size(&decrypt_buf, expect_decrypt_size);
998
+
999
+ uint32_t decrypt_size;
1000
+ ASSERT_OK_STATUS(
1001
+ fle2alg
1002
+ ->do_decrypt(crypt->crypto, NULL, mc_ECOCToken_get(ecocToken), &p_buf, &decrypt_buf, &decrypt_size, status),
1003
+ status);
1004
+ ASSERT_CMPUINT32(decrypt_size, ==, decrypt_buf.len);
1005
+ ASSERT_CMPUINT32(decrypt_size, ==, expect_decrypt_size);
1006
+
1007
+ ASSERT(0 == memcmp(decrypt_buf.data, expected_esc_token->data, expected_esc_token->len));
1008
+
1009
+ if (expect_is_leaf && is_leaf_out) {
1010
+ *is_leaf_out = decrypt_buf.data[decrypt_buf.len - 1];
1011
+ }
1012
+
1013
+ _mongocrypt_buffer_cleanup(&decrypt_buf);
1014
+ _mongocrypt_buffer_cleanup(&p_buf);
1015
+ mc_ECOCToken_destroy(ecocToken);
1016
+ mongocrypt_status_destroy(status);
1017
+ }
1018
+
1019
+ typedef struct {
1020
+ mongocrypt_binary_t d;
1021
+ mongocrypt_binary_t s;
1022
+ mongocrypt_binary_t p;
1023
+ mongocrypt_binary_t u;
1024
+ mongocrypt_binary_t v;
1025
+ mongocrypt_binary_t e;
1026
+ mongocrypt_binary_t l;
1027
+ uint32_t t;
1028
+ uint64_t k;
1029
+ } iupv2_fields_common;
1030
+
1031
+ static iupv2_fields_common validate_iupv2_common(bson_t *iup_bson) {
1032
+ iupv2_fields_common res;
1033
+ memset(&res, 0, sizeof(res));
1034
+
1035
+ bson_iter_t iter;
1036
+ #define ASSERT_EXISTS_BINDATA_OF_SUBTYPE(Field, Subtype) validate_and_get_bindata(iup_bson, #Field, Subtype, &res.Field)
1037
+
1038
+ #define ASSERT_EXISTS_BINDATA_OF_SUBTYPE_AND_LEN(Field, Subtype, Len) \
1039
+ ASSERT_EXISTS_BINDATA_OF_SUBTYPE(Field, Subtype); \
1040
+ ASSERT(res.Field.len == Len)
1041
+
1042
+ ASSERT_EXISTS_BINDATA_OF_SUBTYPE_AND_LEN(d, BSON_SUBTYPE_BINARY, MONGOCRYPT_HMAC_SHA256_LEN);
1043
+ ASSERT_EXISTS_BINDATA_OF_SUBTYPE_AND_LEN(s, BSON_SUBTYPE_BINARY, MONGOCRYPT_HMAC_SHA256_LEN);
1044
+ ASSERT_EXISTS_BINDATA_OF_SUBTYPE(p, BSON_SUBTYPE_BINARY);
1045
+ ASSERT_EXISTS_BINDATA_OF_SUBTYPE_AND_LEN(u, BSON_SUBTYPE_UUID, 16);
1046
+ ASSERT_EXISTS_BINDATA_OF_SUBTYPE(v, BSON_SUBTYPE_BINARY);
1047
+ ASSERT_EXISTS_BINDATA_OF_SUBTYPE_AND_LEN(e, BSON_SUBTYPE_BINARY, MONGOCRYPT_HMAC_SHA256_LEN);
1048
+ ASSERT_EXISTS_BINDATA_OF_SUBTYPE_AND_LEN(l, BSON_SUBTYPE_BINARY, MONGOCRYPT_HMAC_SHA256_LEN);
1049
+
1050
+ #undef ASSERT_EXISTS_BINDATA_OF_SUBTYPE_AND_LEN
1051
+ #undef ASSERT_EXISTS_AND_BINDATA_OF_LEN
1052
+
1053
+ ASSERT(bson_iter_init_find(&iter, iup_bson, "t"));
1054
+ ASSERT(BSON_ITER_HOLDS_INT32(&iter));
1055
+ res.t = bson_iter_int32(&iter);
1056
+
1057
+ ASSERT(bson_iter_init_find(&iter, iup_bson, "k"));
1058
+ ASSERT(BSON_ITER_HOLDS_INT64(&iter));
1059
+ res.k = bson_iter_int64(&iter);
1060
+
1061
+ return res;
1062
+ }
1063
+
1064
+ // Assert that the encryptedTokens fields in V2 insert/update ciphertext matches our expectations. Specifically, checks
1065
+ // that the length of these fields are what we expect, and that the "isLeaf" token is appended when using range V2.
1066
+ static void
1067
+ validate_range_ciphertext(_mongocrypt_ciphertext_t *ciphertext, mongocrypt_t *crypt, uint32_t expectedEdges) {
1068
+ uint32_t expectedPLength = (MONGOCRYPT_HMAC_SHA256_LEN + 1);
954
1069
 
955
1070
  bson_t ciphertextBSON;
956
1071
  bson_iter_t iter;
957
1072
  ASSERT(_mongocrypt_buffer_to_bson(&ciphertext->data, &ciphertextBSON));
958
1073
 
1074
+ ASSERT(ciphertext->blob_subtype == MC_SUBTYPE_FLE2InsertUpdatePayloadV2);
1075
+ ASSERT(ciphertext->original_bson_type == 0); // unset
1076
+ ASSERT(ciphertext->key_id.len == 0); // unset
1077
+
1078
+ iupv2_fields_common res = validate_iupv2_common(&ciphertextBSON);
1079
+
959
1080
  // 'p' field should be available, length should be 16 bytes of IV + expected bytes
960
- bson_iter_init_find(&iter, &ciphertextBSON, "p");
961
- ASSERT(BSON_ITER_HOLDS_BINARY(&iter));
962
- uint32_t p_len;
963
- const uint8_t *p_data;
964
- bson_iter_binary(&iter, NULL, &p_len, &p_data);
965
- ASSERT_CMPUINT32(p_len, ==, 16 + expectedPLength);
966
-
967
- if (useRangeV2) {
968
- _mongocrypt_buffer_t p_buf, decrypted_buf;
969
- ASSERT(_mongocrypt_buffer_copy_from_data_and_size(&p_buf, p_data, p_len));
970
- _mongocrypt_buffer_init_size(&decrypted_buf, expectedPLength);
971
- uint32_t decryptedBytes;
972
- // Decrypt p. When using range V2, last byte should be 0.
973
- ASSERT_OK_STATUS(fle2alg->do_decrypt(crypt->crypto,
974
- NULL,
975
- mc_ECOCToken_get(ecocToken),
976
- &p_buf,
977
- &decrypted_buf,
978
- &decryptedBytes,
979
- status),
980
- status);
981
- ASSERT_CMPUINT32(decryptedBytes, ==, expectedPLength);
982
- ASSERT_CMPUINT8(decrypted_buf.data[decrypted_buf.len - 1], ==, 0);
983
- _mongocrypt_buffer_cleanup(&decrypted_buf);
984
- _mongocrypt_buffer_cleanup(&p_buf);
985
- }
1081
+ ASSERT(res.p.len == 16 + expectedPLength);
1082
+
1083
+ // validate crypto of 'p'
1084
+ uint8_t is_leaf = 255;
1085
+ validate_encrypted_token(crypt, &res.p, &res.s, true, &is_leaf);
1086
+ // isLeaf byte should be 0.
1087
+ ASSERT(is_leaf == 0);
986
1088
 
987
1089
  // 'g' field should be available
988
- bson_iter_init_find(&iter, &ciphertextBSON, "g");
1090
+ ASSERT(bson_iter_init_find(&iter, &ciphertextBSON, "g"));
989
1091
  ASSERT(BSON_ITER_HOLDS_ARRAY(&iter));
990
- uint32_t g_buf_len;
991
- const uint8_t *g_buf;
992
1092
  bson_t g_arr;
993
- bson_iter_array(&iter, &g_buf_len, &g_buf);
994
- ASSERT(bson_init_static(&g_arr, g_buf, g_buf_len));
1093
+ {
1094
+ uint32_t g_buf_len;
1095
+ const uint8_t *g_buf;
1096
+ bson_iter_array(&iter, &g_buf_len, &g_buf);
1097
+ ASSERT(bson_init_static(&g_arr, g_buf, g_buf_len));
1098
+ }
995
1099
 
996
1100
  bson_iter_t g_iter;
997
1101
  bson_iter_init(&g_iter, &g_arr);
@@ -1000,84 +1104,47 @@ static void assert_correctness_of_ciphertext(_mongocrypt_ciphertext_t *ciphertex
1000
1104
  while (bson_iter_next(&g_iter)) {
1001
1105
  g_count++;
1002
1106
  ASSERT(BSON_ITER_HOLDS_DOCUMENT(&g_iter));
1003
- uint32_t subdoc_len;
1004
- const uint8_t *subdoc_buf;
1005
1107
  bson_t subdoc;
1006
- bson_iter_document(&g_iter, &subdoc_len, &subdoc_buf);
1007
- ASSERT(bson_init_static(&subdoc, subdoc_buf, subdoc_len));
1008
-
1009
- bson_iter_t sub_iter;
1010
- bson_iter_init_find(&sub_iter, &subdoc, "p");
1011
- ASSERT(BSON_ITER_HOLDS_BINARY(&sub_iter));
1012
- bson_iter_binary(&sub_iter, NULL, &p_len, &p_data);
1013
- ASSERT_CMPUINT32(p_len, ==, 16 + expectedPLength);
1014
-
1015
- if (useRangeV2) {
1016
- _mongocrypt_buffer_t p_buf, decrypted_buf;
1017
- ASSERT(_mongocrypt_buffer_copy_from_data_and_size(&p_buf, p_data, p_len));
1018
- _mongocrypt_buffer_init_size(&decrypted_buf, expectedPLength);
1019
-
1020
- // Decrypt p. If useRangeV2, the last byte should be 0 or 1, depending on whether isLeaf.
1021
- uint32_t decrypted_bytes;
1022
- ASSERT_OK_STATUS(fle2alg->do_decrypt(crypt->crypto,
1023
- NULL,
1024
- mc_ECOCToken_get(ecocToken),
1025
- &p_buf,
1026
- &decrypted_buf,
1027
- &decrypted_bytes,
1028
- status),
1029
- status);
1030
- ASSERT_CMPUINT32(decrypted_bytes, ==, expectedPLength);
1031
- if (decrypted_buf.data[decrypted_buf.len - 1] == 1) {
1032
- leaf_count++;
1033
- } else {
1034
- ASSERT_CMPUINT8(decrypted_buf.data[decrypted_buf.len - 1], ==, 0)
1035
- }
1108
+ {
1109
+ uint32_t subdoc_len;
1110
+ const uint8_t *subdoc_buf;
1111
+ bson_iter_document(&g_iter, &subdoc_len, &subdoc_buf);
1112
+ ASSERT(bson_init_static(&subdoc, subdoc_buf, subdoc_len));
1113
+ }
1036
1114
 
1037
- _mongocrypt_buffer_cleanup(&decrypted_buf);
1038
- _mongocrypt_buffer_cleanup(&p_buf);
1115
+ mongocrypt_binary_t encrypted_token_bin, esc_token_bin;
1116
+ validate_and_get_bindata(&subdoc, "p", BSON_SUBTYPE_BINARY, &encrypted_token_bin);
1117
+ validate_and_get_bindata(&subdoc, "s", BSON_SUBTYPE_BINARY, &esc_token_bin);
1118
+ ASSERT_CMPUINT32(encrypted_token_bin.len, ==, 16 + expectedPLength);
1119
+ ASSERT_CMPUINT32(esc_token_bin.len, ==, MONGOCRYPT_HMAC_SHA256_LEN);
1120
+
1121
+ uint8_t is_leaf = 255;
1122
+ validate_encrypted_token(crypt, &encrypted_token_bin, &esc_token_bin, true, &is_leaf);
1123
+ // isLeaf byte should be either 0 or 1.
1124
+ if (is_leaf == 1) {
1125
+ leaf_count++;
1126
+ } else {
1127
+ ASSERT_CMPUINT8(is_leaf, ==, 0);
1039
1128
  }
1040
1129
  }
1041
1130
  ASSERT_CMPSIZE_T(g_count, ==, expectedEdges);
1042
- if (useRangeV2) {
1043
- // There should be exactly one leaf in any insert call.
1044
- ASSERT_CMPSIZE_T(leaf_count, ==, 1);
1045
- }
1131
+ // There should be exactly one leaf in any insert call.
1132
+ ASSERT_CMPSIZE_T(leaf_count, ==, 1);
1046
1133
  bson_destroy(&ciphertextBSON);
1047
- mongocrypt_status_destroy(status);
1048
- }
1049
-
1050
- // Get the ECOC token to use in decryption.
1051
- static mc_ECOCToken_t *getECOCToken(mongocrypt_t *crypt) {
1052
- mongocrypt_status_t *status = mongocrypt_status_new();
1053
- // Test token key that we added earlier is all zeros.
1054
- _mongocrypt_buffer_t tokenKey;
1055
- _mongocrypt_buffer_init_size(&tokenKey, MONGOCRYPT_TOKEN_KEY_LEN);
1056
- memset(tokenKey.data, 0, MONGOCRYPT_TOKEN_KEY_LEN);
1057
-
1058
- mc_CollectionsLevel1Token_t *collectionsLevel1Token =
1059
- mc_CollectionsLevel1Token_new(crypt->crypto, &tokenKey, status);
1060
- mc_ECOCToken_t *ecocToken = mc_ECOCToken_new(crypt->crypto, collectionsLevel1Token, status);
1061
- ASSERT(mongocrypt_status_ok(status));
1062
-
1063
- mc_CollectionsLevel1Token_destroy(collectionsLevel1Token);
1064
- _mongocrypt_buffer_cleanup(&tokenKey);
1065
- mongocrypt_status_destroy(status);
1066
- return ecocToken;
1067
1134
  }
1068
1135
 
1069
- static void test_mc_marking_to_ciphertext(_mongocrypt_tester_t *tester) {
1136
+ static void test_mc_marking_to_ciphertext_fle2_range(_mongocrypt_tester_t *tester) {
1070
1137
  if (!_aes_ctr_is_supported_by_os) {
1071
- printf("Common Crypto with no CTR support detected. Skipping.");
1138
+ TEST_PRINTF("Common Crypto with no CTR support detected. Skipping.");
1072
1139
  return;
1073
1140
  }
1074
1141
 
1075
- // Test that whether range V2 is enabled or disabled, the ciphertext matches our expectations.
1142
+ // Test that ciphertext matches our expectations.
1076
1143
  {
1077
1144
  const char markingJSON[] = RAW_STRING({
1078
1145
  't' : 1,
1079
1146
  'a' : 3,
1080
- 'v' : {'min' : 0, 'max' : 7, 'v' : 5},
1147
+ 'v' : {'min' : 0, 'max' : 7, 'v' : 5, 'trimFactor' : 0},
1081
1148
  's' : {'$numberLong' : '1'},
1082
1149
  'cm' : {'$numberLong' : '1'}
1083
1150
  });
@@ -1087,37 +1154,910 @@ static void test_mc_marking_to_ciphertext(_mongocrypt_tester_t *tester) {
1087
1154
 
1088
1155
  get_ciphertext_from_marking_json(tester, crypt, markingJSON, &ciphertext);
1089
1156
 
1090
- mc_ECOCToken_t *ecocToken = getECOCToken(crypt);
1091
- assert_correctness_of_ciphertext(&ciphertext, crypt, ecocToken, false, 4);
1157
+ validate_range_ciphertext(&ciphertext, crypt, 4);
1092
1158
  _mongocrypt_ciphertext_cleanup(&ciphertext);
1093
- mc_ECOCToken_destroy(ecocToken);
1159
+
1094
1160
  mongocrypt_destroy(crypt);
1095
1161
  }
1162
+ }
1163
+
1164
+ static void validate_text_search_token_set_common(bson_iter_t *iter_at_token_set_obj, mongocrypt_t *crypt) {
1165
+ ASSERT(BSON_ITER_HOLDS_DOCUMENT(iter_at_token_set_obj));
1166
+ bson_t ts_bson;
1167
+ {
1168
+ uint32_t len;
1169
+ const uint8_t *buf;
1170
+ bson_iter_document(iter_at_token_set_obj, &len, &buf);
1171
+ ASSERT(bson_init_static(&ts_bson, buf, len));
1172
+ }
1173
+
1174
+ mongocrypt_binary_t token_bin;
1175
+ mongocrypt_binary_t esc_token_bin;
1176
+ mongocrypt_binary_t encrypted_token_bin;
1177
+
1178
+ validate_and_get_bindata(&ts_bson, "d", BSON_SUBTYPE_BINARY, &token_bin);
1179
+ ASSERT_CMPUINT32(token_bin.len, ==, MONGOCRYPT_HMAC_SHA256_LEN);
1180
+
1181
+ validate_and_get_bindata(&ts_bson, "l", BSON_SUBTYPE_BINARY, &token_bin);
1182
+ ASSERT_CMPUINT32(token_bin.len, ==, MONGOCRYPT_HMAC_SHA256_LEN);
1183
+
1184
+ validate_and_get_bindata(&ts_bson, "s", BSON_SUBTYPE_BINARY, &esc_token_bin);
1185
+ ASSERT_CMPUINT32(esc_token_bin.len, ==, MONGOCRYPT_HMAC_SHA256_LEN);
1186
+
1187
+ validate_and_get_bindata(&ts_bson, "p", BSON_SUBTYPE_BINARY, &encrypted_token_bin);
1188
+ ASSERT_CMPUINT32(encrypted_token_bin.len, ==, (16 + MONGOCRYPT_HMAC_SHA256_LEN));
1189
+
1190
+ // validate crypto of p
1191
+ validate_encrypted_token(crypt, &encrypted_token_bin, &esc_token_bin, false, NULL);
1192
+ }
1193
+
1194
+ static size_t validate_text_search_token_set_array_common(bson_iter_t *iter_at_array, mongocrypt_t *crypt) {
1195
+ ASSERT(BSON_ITER_HOLDS_ARRAY(iter_at_array));
1196
+ bson_t arr_bson;
1197
+ {
1198
+ uint32_t subdoc_len;
1199
+ const uint8_t *subdoc_buf;
1200
+ bson_iter_array(iter_at_array, &subdoc_len, &subdoc_buf);
1201
+ ASSERT(bson_init_static(&arr_bson, subdoc_buf, subdoc_len));
1202
+ }
1203
+
1204
+ bson_iter_t iter;
1205
+ bson_iter_init(&iter, &arr_bson);
1206
+
1207
+ size_t count = 0;
1208
+ while (bson_iter_next(&iter)) {
1209
+ count++;
1210
+ validate_text_search_token_set_common(&iter, crypt);
1211
+ }
1212
+ return count;
1213
+ }
1214
+
1215
+ typedef struct {
1216
+ size_t substrings;
1217
+ size_t suffixes;
1218
+ size_t prefixes;
1219
+ } text_search_expected_token_counts;
1220
+
1221
+ // Assert that the fields in a insert/update payload V2 for text search match our expectations.
1222
+ // Specifically, checks that the length of these fields, and the values of deterministic fields,
1223
+ // are what we expect.
1224
+ static void validate_text_search_ciphertext(_mongocrypt_tester_t *tester,
1225
+ _mongocrypt_ciphertext_t *ciphertext,
1226
+ mongocrypt_t *crypt,
1227
+ mc_FLE2TextSearchInsertSpec_t *spec,
1228
+ mongocrypt_fle2_placeholder_type_t type,
1229
+ uint64_t contention_max,
1230
+ text_search_expected_token_counts *expected_tag_counts) {
1231
+ bson_t payload_bson;
1232
+ bson_iter_t iter;
1233
+ ASSERT(_mongocrypt_buffer_to_bson(&ciphertext->data, &payload_bson));
1234
+
1235
+ mc_ServerDataEncryptionLevel1Token_t *sdel1Token = getSDEL1Token(crypt);
1236
+ const mongocrypt_binary_t *keyId = TEST_BIN(16); // don't free!
1237
+
1238
+ if (type == MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT) {
1239
+ ASSERT_CMPUINT8(ciphertext->blob_subtype, ==, MC_SUBTYPE_FLE2InsertUpdatePayloadV2);
1240
+ ASSERT_CMPUINT8(ciphertext->original_bson_type, ==, 0); // unset
1241
+ ASSERT_CMPUINT32(ciphertext->key_id.len, ==, 0); // unset
1242
+
1243
+ iupv2_fields_common res = validate_iupv2_common(&payload_bson);
1244
+
1245
+ // validate u, t, k have correct values
1246
+ ASSERT_CMPBYTES(keyId->data, keyId->len, res.u.data, res.u.len);
1247
+ ASSERT_CMPUINT32(res.t, ==, BSON_TYPE_UTF8);
1248
+ ASSERT_CMPUINT64(res.k, <=, contention_max);
1249
+
1250
+ // validate e is ServerDataEncryptionLevel1Token = HMAC(RootKey, 3)
1251
+ ASSERT_CMPUINT32(res.e.len, ==, mc_ServerDataEncryptionLevel1Token_get(sdel1Token)->len);
1252
+ ASSERT(memcmp(res.e.data, mc_ServerDataEncryptionLevel1Token_get(sdel1Token)->data, res.e.len) == 0);
1253
+
1254
+ // validate crypto of p
1255
+ ASSERT(res.p.len == 16 + MONGOCRYPT_HMAC_SHA256_LEN);
1256
+ validate_encrypted_token(crypt, &res.p, &res.s, false, NULL);
1257
+
1258
+ // validate v decrypts cleanly
1259
+ {
1260
+ mongocrypt_status_t *status = mongocrypt_status_new();
1261
+
1262
+ const _mongocrypt_value_encryption_algorithm_t *fle2alg = _mcFLE2v2AEADAlgorithm();
1263
+ // assert first 16 bytes == userKeyId == indexKeyId
1264
+ ASSERT_CMPUINT32(res.v.len, >, 16);
1265
+ ASSERT_CMPBYTES(keyId->data, keyId->len, res.v.data, 16);
1266
+
1267
+ _mongocrypt_buffer_t key, aad, ctext, ptext;
1268
+ _mongocrypt_buffer_init_size(&key, MONGOCRYPT_KEY_LEN);
1269
+ memset(key.data, 0, key.len);
1270
+ ASSERT(_mongocrypt_buffer_copy_from_data_and_size(&aad, res.v.data, 16));
1271
+ ASSERT(_mongocrypt_buffer_copy_from_data_and_size(&ctext, ((uint8_t *)res.v.data) + 16, res.v.len - 16));
1272
+ uint32_t plen = fle2alg->get_plaintext_len(res.v.len - 16, status);
1273
+ _mongocrypt_buffer_init_size(&ptext, plen);
1274
+
1275
+ uint32_t pbytes;
1276
+ ASSERT_OK_STATUS(fle2alg->do_decrypt(crypt->crypto, &aad, &key, &ctext, &ptext, &pbytes, status), status);
1277
+
1278
+ // BSON strings have 5 (4 for size + 1 null terminator) bytes of overhead
1279
+ ASSERT_CMPUINT32(pbytes, >=, 5);
1280
+ ASSERT_CMPSIZE_T(spec->len, ==, (pbytes - 5));
1281
+ ASSERT_STREQUAL(spec->v, ((char *)(ptext.data + 4)));
1282
+
1283
+ _mongocrypt_buffer_cleanup(&ptext);
1284
+ _mongocrypt_buffer_cleanup(&ctext);
1285
+ _mongocrypt_buffer_cleanup(&aad);
1286
+ _mongocrypt_buffer_cleanup(&key);
1287
+ mongocrypt_status_destroy(status);
1288
+ }
1289
+
1290
+ // assert b exists with correct fields
1291
+ ASSERT(bson_iter_init_find(&iter, &payload_bson, "b"));
1292
+ ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter));
1293
+
1294
+ bson_t b_bson;
1295
+ bson_iter_t b_iter;
1296
+ {
1297
+ uint32_t subdoc_len;
1298
+ const uint8_t *subdoc_buf;
1299
+ bson_iter_document(&iter, &subdoc_len, &subdoc_buf);
1300
+ ASSERT(bson_init_static(&b_bson, subdoc_buf, subdoc_len));
1301
+ }
1302
+
1303
+ ASSERT(bson_iter_init_find(&b_iter, &b_bson, "e"));
1304
+ validate_text_search_token_set_common(&b_iter, crypt);
1305
+
1306
+ size_t tscount = 0;
1307
+ ASSERT(bson_iter_init_find(&b_iter, &b_bson, "s"));
1308
+ tscount = validate_text_search_token_set_array_common(&b_iter, crypt);
1309
+ ASSERT_CMPSIZE_T(expected_tag_counts->substrings, ==, tscount);
1310
+
1311
+ ASSERT(bson_iter_init_find(&b_iter, &b_bson, "u"));
1312
+ tscount = validate_text_search_token_set_array_common(&b_iter, crypt);
1313
+ ASSERT_CMPSIZE_T(expected_tag_counts->suffixes, ==, tscount);
1314
+
1315
+ ASSERT(bson_iter_init_find(&b_iter, &b_bson, "p"));
1316
+ tscount = validate_text_search_token_set_array_common(&b_iter, crypt);
1317
+ ASSERT_CMPSIZE_T(expected_tag_counts->prefixes, ==, tscount);
1318
+ } else {
1319
+ ASSERT_CMPUINT8(ciphertext->blob_subtype, ==, MC_SUBTYPE_FLE2FindTextPayload);
1320
+ ASSERT_CMPUINT8(ciphertext->original_bson_type, ==, 0); // unset
1321
+ ASSERT_CMPUINT32(ciphertext->key_id.len, ==, 0); // unset
1322
+ mc_FLE2FindTextPayload_t parsed;
1323
+ mongocrypt_status_t *status = mongocrypt_status_new();
1324
+
1325
+ ASSERT_OK_STATUS(mc_FLE2FindTextPayload_parse(&parsed, &payload_bson, status), status);
1326
+ ASSERT_CMPUINT64(parsed.maxContentionFactor, ==, contention_max);
1327
+ ASSERT(parsed.caseFold == spec->casef);
1328
+ ASSERT(parsed.diacriticFold == spec->diacf);
1329
+
1330
+ bool exact = !(spec->prefix.set || spec->suffix.set || spec->substr.set);
1331
+ ASSERT(parsed.tokenSets.prefix.set == spec->prefix.set);
1332
+ ASSERT(parsed.tokenSets.substring.set == spec->substr.set);
1333
+ ASSERT(parsed.tokenSets.suffix.set == spec->suffix.set);
1334
+ ASSERT(parsed.tokenSets.exact.set == exact);
1335
+ ASSERT(parsed.prefixSpec.set == spec->prefix.set);
1336
+ ASSERT(parsed.substringSpec.set == spec->substr.set);
1337
+ ASSERT(parsed.suffixSpec.set == spec->suffix.set);
1338
+
1339
+ #define CHECK_TOKENS(Type) \
1340
+ if (parsed.tokenSets.Type.set) { \
1341
+ ASSERT_CMPUINT32(parsed.tokenSets.Type.value.edcDerivedToken.len, ==, MONGOCRYPT_HMAC_SHA256_LEN); \
1342
+ ASSERT_CMPUINT32(parsed.tokenSets.Type.value.escDerivedToken.len, ==, MONGOCRYPT_HMAC_SHA256_LEN); \
1343
+ ASSERT_CMPUINT32(parsed.tokenSets.Type.value.serverDerivedFromDataToken.len, ==, MONGOCRYPT_HMAC_SHA256_LEN); \
1344
+ }
1345
+ CHECK_TOKENS(prefix);
1346
+ CHECK_TOKENS(suffix);
1347
+ CHECK_TOKENS(substring);
1348
+ CHECK_TOKENS(exact);
1349
+ #undef CHECK_TOKENS
1350
+ if (parsed.prefixSpec.set) {
1351
+ ASSERT_CMPUINT32(parsed.prefixSpec.value.lb, ==, spec->prefix.value.lb);
1352
+ ASSERT_CMPUINT32(parsed.prefixSpec.value.ub, ==, spec->prefix.value.ub);
1353
+ }
1354
+ if (parsed.suffixSpec.set) {
1355
+ ASSERT_CMPUINT32(parsed.suffixSpec.value.lb, ==, spec->suffix.value.lb);
1356
+ ASSERT_CMPUINT32(parsed.suffixSpec.value.ub, ==, spec->suffix.value.ub);
1357
+ }
1358
+ if (parsed.substringSpec.set) {
1359
+ ASSERT_CMPUINT32(parsed.substringSpec.value.mlen, ==, spec->substr.value.mlen);
1360
+ ASSERT_CMPUINT32(parsed.substringSpec.value.lb, ==, spec->substr.value.lb);
1361
+ ASSERT_CMPUINT32(parsed.substringSpec.value.ub, ==, spec->substr.value.ub);
1362
+ }
1363
+ mongocrypt_status_destroy(status);
1364
+ mc_FLE2FindTextPayload_cleanup(&parsed);
1365
+ }
1366
+
1367
+ mc_ServerDataEncryptionLevel1Token_destroy(sdel1Token);
1368
+ bson_destroy(&payload_bson);
1369
+ }
1370
+
1371
+ static size_t calculate_expected_substring_tag_count(size_t beta, size_t mlen, size_t ub, size_t lb) {
1372
+ ASSERT_CMPSIZE_T(beta, <=, (SIZE_MAX - 15));
1373
+ ASSERT_CMPSIZE_T(lb, <=, ub);
1374
+ ASSERT_CMPSIZE_T(mlen, >=, ub);
1375
+
1376
+ size_t padded_len = 16 * ((beta + 5 + 15) / 16) - 5;
1377
+ if (beta > mlen || lb > padded_len) {
1378
+ return 0;
1379
+ }
1380
+ size_t maxkgram1 = 0;
1381
+ size_t maxkgram2 = 0;
1382
+ for (size_t j = lb; j <= ub; j++) {
1383
+ maxkgram1 += (mlen - j + 1);
1384
+ }
1385
+ for (size_t j = lb; j <= BSON_MIN(ub, padded_len); j++) {
1386
+ maxkgram2 += (padded_len - j + 1);
1387
+ }
1388
+ return BSON_MIN(maxkgram1, maxkgram2); // msize
1389
+ }
1390
+
1391
+ static size_t calculate_expected_nfix_tag_count(size_t beta, size_t ub, size_t lb) {
1392
+ ASSERT_CMPSIZE_T(beta, <=, (SIZE_MAX - 15));
1393
+ ASSERT_CMPSIZE_T(lb, <=, ub);
1394
+ size_t padded_len = 16 * ((beta + 5 + 15) / 16) - 5;
1395
+ if (lb > padded_len) {
1396
+ return 0;
1397
+ }
1398
+ return BSON_MIN(ub, padded_len) - lb + 1;
1399
+ }
1400
+
1401
+ // Runs _mongocrypt_marking_to_ciphertext to compute the ciphertext for the given marking.
1402
+ static bool test_text_search_marking_to_ciphertext(_mongocrypt_tester_t *tester,
1403
+ mongocrypt_t *crypt,
1404
+ _mongocrypt_ciphertext_t *out,
1405
+ mongocrypt_fle2_placeholder_type_t type,
1406
+ int64_t contention_max,
1407
+ mc_FLE2TextSearchInsertSpec_t *test_spec,
1408
+ mongocrypt_status_t *status) {
1409
+ mongocrypt_ctx_t *ctx = mongocrypt_ctx_new(crypt);
1410
+
1411
+ // Set up encryption environment
1412
+ ASSERT_OK(mongocrypt_ctx_encrypt_init(ctx, "test", -1, TEST_FILE("./test/example/cmd.json")), ctx);
1413
+ // Add a test key
1414
+ _mongocrypt_buffer_t keyId;
1415
+ _mongocrypt_buffer_from_binary(&keyId, TEST_BIN(16));
1416
+ keyId.subtype = BSON_SUBTYPE_UUID;
1417
+ _mongocrypt_key_broker_add_test_key(&ctx->kb, &keyId);
1418
+
1419
+ _mongocrypt_buffer_t marking_buf;
1420
+ _mongocrypt_marking_t marking;
1421
+
1422
+ bson_t *marking_bson = bson_new();
1423
+ BSON_APPEND_INT32(marking_bson, "t", type);
1424
+ BSON_APPEND_INT32(marking_bson, "a", MONGOCRYPT_FLE2_ALGORITHM_TEXT_SEARCH);
1425
+ BSON_APPEND_INT64(marking_bson, "cm", contention_max);
1426
+ bson_t text_spec;
1427
+ BSON_APPEND_DOCUMENT_BEGIN(marking_bson, "v", &text_spec);
1428
+ bson_append_utf8(&text_spec, "v", 1, test_spec->v, test_spec->len);
1429
+ BSON_APPEND_BOOL(&text_spec, "casef", test_spec->casef);
1430
+ BSON_APPEND_BOOL(&text_spec, "diacf", test_spec->diacf);
1431
+ if (test_spec->prefix.set) {
1432
+ bson_t subspec;
1433
+ BSON_APPEND_DOCUMENT_BEGIN(&text_spec, "prefix", &subspec);
1434
+ BSON_APPEND_INT32(&subspec, "ub", test_spec->prefix.value.ub);
1435
+ BSON_APPEND_INT32(&subspec, "lb", test_spec->prefix.value.lb);
1436
+ ASSERT(bson_append_document_end(&text_spec, &subspec));
1437
+ }
1438
+ if (test_spec->substr.set) {
1439
+ bson_t subspec;
1440
+ BSON_APPEND_DOCUMENT_BEGIN(&text_spec, "substr", &subspec);
1441
+ BSON_APPEND_INT32(&subspec, "mlen", test_spec->substr.value.mlen);
1442
+ BSON_APPEND_INT32(&subspec, "ub", test_spec->substr.value.ub);
1443
+ BSON_APPEND_INT32(&subspec, "lb", test_spec->substr.value.lb);
1444
+ ASSERT(bson_append_document_end(&text_spec, &subspec));
1445
+ }
1446
+ if (test_spec->suffix.set) {
1447
+ bson_t subspec;
1448
+ BSON_APPEND_DOCUMENT_BEGIN(&text_spec, "suffix", &subspec);
1449
+ BSON_APPEND_INT32(&subspec, "ub", test_spec->suffix.value.ub);
1450
+ BSON_APPEND_INT32(&subspec, "lb", test_spec->suffix.value.lb);
1451
+ ASSERT(bson_append_document_end(&text_spec, &subspec));
1452
+ }
1453
+ ASSERT(bson_append_document_end(marking_bson, &text_spec));
1454
+
1455
+ // Add key identifier info to the marking
1456
+ BSON_APPEND_BINARY(marking_bson, "ki", BSON_SUBTYPE_UUID, (TEST_BIN(16))->data, 16);
1457
+ BSON_APPEND_BINARY(marking_bson, "ku", BSON_SUBTYPE_UUID, (TEST_BIN(16))->data, 16);
1458
+ _make_marking(marking_bson, &marking_buf);
1459
+ // Use FLE2 as the subtype (default is FLE1)
1460
+ marking_buf.data[0] = MC_SUBTYPE_FLE2EncryptionPlaceholder;
1461
+ _parse_ok(&marking_buf, &marking);
1462
+
1463
+ bool result = _mongocrypt_marking_to_ciphertext((void *)&ctx->kb, &marking, out, status);
1464
+
1465
+ _mongocrypt_buffer_cleanup(&marking_buf);
1466
+ bson_destroy(marking_bson);
1467
+ _mongocrypt_marking_cleanup(&marking);
1468
+ mongocrypt_ctx_destroy(ctx);
1469
+ return result;
1470
+ }
1471
+
1472
+ static void test_mc_marking_to_ciphertext_fle2_text_search(_mongocrypt_tester_t *tester) {
1473
+ if (!_aes_ctr_is_supported_by_os) {
1474
+ TEST_PRINTF("Common Crypto with no CTR support detected. Skipping.");
1475
+ return;
1476
+ }
1477
+
1478
+ // Test substring
1096
1479
  {
1097
- const char markingJSON[] = RAW_STRING({
1098
- 't' : 1,
1099
- 'a' : 3,
1100
- 'v' : {'min' : 0, 'max' : 7, 'v' : 5, 'trimFactor' : 0},
1101
- 's' : {'$numberLong' : '1'},
1102
- 'cm' : {'$numberLong' : '1'}
1103
- });
1104
1480
  _mongocrypt_ciphertext_t ciphertext;
1105
1481
  _mongocrypt_ciphertext_init(&ciphertext);
1106
- mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_WITH_RANGE_V2);
1482
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1483
+ mongocrypt_status_t *status = mongocrypt_status_new();
1484
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "foobar",
1485
+ .len = 6,
1486
+ .substr.set = true,
1487
+ .substr.value = {.mlen = 1000, .ub = 100, .lb = 10}};
1488
+ text_search_expected_token_counts counts = {0};
1489
+ counts.substrings = calculate_expected_substring_tag_count(6, 1000, 100, 10);
1490
+
1491
+ ASSERT_OK_STATUS(test_text_search_marking_to_ciphertext(tester,
1492
+ crypt,
1493
+ &ciphertext,
1494
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1495
+ 2,
1496
+ &spec,
1497
+ status),
1498
+ status);
1499
+ validate_text_search_ciphertext(tester,
1500
+ &ciphertext,
1501
+ crypt,
1502
+ &spec,
1503
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1504
+ 2,
1505
+ &counts);
1107
1506
 
1108
- get_ciphertext_from_marking_json(tester, crypt, markingJSON, &ciphertext);
1507
+ mongocrypt_status_destroy(status);
1508
+ mongocrypt_destroy(crypt);
1509
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1510
+ }
1109
1511
 
1110
- mc_ECOCToken_t *ecocToken = getECOCToken(crypt);
1111
- assert_correctness_of_ciphertext(&ciphertext, crypt, ecocToken, true, 4);
1512
+ // Test suffix + prefix
1513
+ {
1514
+ _mongocrypt_ciphertext_t ciphertext;
1515
+ _mongocrypt_ciphertext_init(&ciphertext);
1516
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1517
+ mongocrypt_status_t *status = mongocrypt_status_new();
1518
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "foobar",
1519
+ .len = 6,
1520
+ .suffix.set = true,
1521
+ .suffix.value = {.ub = 100, .lb = 10},
1522
+ .prefix.set = true,
1523
+ .prefix.value = {.ub = 100, .lb = 10}};
1524
+ text_search_expected_token_counts counts = {0};
1525
+ counts.suffixes = counts.prefixes = calculate_expected_nfix_tag_count(6, 100, 10);
1526
+
1527
+ ASSERT_OK_STATUS(test_text_search_marking_to_ciphertext(tester,
1528
+ crypt,
1529
+ &ciphertext,
1530
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1531
+ 2,
1532
+ &spec,
1533
+ status),
1534
+ status);
1535
+ validate_text_search_ciphertext(tester,
1536
+ &ciphertext,
1537
+ crypt,
1538
+ &spec,
1539
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1540
+ 2,
1541
+ &counts);
1542
+ mongocrypt_status_destroy(status);
1543
+ mongocrypt_destroy(crypt);
1112
1544
  _mongocrypt_ciphertext_cleanup(&ciphertext);
1113
- mc_ECOCToken_destroy(ecocToken);
1545
+ }
1114
1546
 
1547
+ // Test empty string
1548
+ {
1549
+ _mongocrypt_ciphertext_t ciphertext;
1550
+ _mongocrypt_ciphertext_init(&ciphertext);
1551
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1552
+ mongocrypt_status_t *status = mongocrypt_status_new();
1553
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "",
1554
+ .len = 0,
1555
+ .prefix.set = true,
1556
+ .prefix.value = {.ub = 100, .lb = 10}};
1557
+ text_search_expected_token_counts counts = {0};
1558
+
1559
+ // beta is 1 for empty strings
1560
+ counts.prefixes = calculate_expected_nfix_tag_count(1, 100, 10);
1561
+
1562
+ ASSERT_OK_STATUS(test_text_search_marking_to_ciphertext(tester,
1563
+ crypt,
1564
+ &ciphertext,
1565
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1566
+ 2,
1567
+ &spec,
1568
+ status),
1569
+ status);
1570
+ validate_text_search_ciphertext(tester,
1571
+ &ciphertext,
1572
+ crypt,
1573
+ &spec,
1574
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1575
+ 2,
1576
+ &counts);
1577
+ mongocrypt_status_destroy(status);
1115
1578
  mongocrypt_destroy(crypt);
1579
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1116
1580
  }
1581
+
1582
+ // Test string cbc-padded length is less than lb (ie. substring/suffix/prefix tag sets will be
1583
+ // empty)
1584
+ {
1585
+ _mongocrypt_ciphertext_t ciphertext;
1586
+ _mongocrypt_ciphertext_init(&ciphertext);
1587
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1588
+ mongocrypt_status_t *status = mongocrypt_status_new();
1589
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "foobar",
1590
+ .len = 6,
1591
+ .substr.set = true,
1592
+ .substr.value = {.mlen = 1000, .ub = 100, .lb = 20},
1593
+ .prefix.set = true,
1594
+ .prefix.value = {.ub = 100, .lb = 20},
1595
+ .suffix.set = true,
1596
+ .suffix.value = {.ub = 100, .lb = 20}};
1597
+ text_search_expected_token_counts counts = {0};
1598
+
1599
+ ASSERT_OK_STATUS(test_text_search_marking_to_ciphertext(tester,
1600
+ crypt,
1601
+ &ciphertext,
1602
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1603
+ 2,
1604
+ &spec,
1605
+ status),
1606
+ status);
1607
+
1608
+ validate_text_search_ciphertext(tester,
1609
+ &ciphertext,
1610
+ crypt,
1611
+ &spec,
1612
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1613
+ 2,
1614
+ &counts);
1615
+ mongocrypt_status_destroy(status);
1616
+ mongocrypt_destroy(crypt);
1617
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1618
+ }
1619
+
1620
+ // Test string exceeds mlen
1621
+ {
1622
+ _mongocrypt_ciphertext_t ciphertext;
1623
+ _mongocrypt_ciphertext_init(&ciphertext);
1624
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1625
+ mongocrypt_status_t *status = mongocrypt_status_new();
1626
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "foobar",
1627
+ .len = 6,
1628
+ .substr.set = true,
1629
+ .substr.value = {.mlen = 3, .ub = 1, .lb = 1}};
1630
+ ASSERT_FAILS_STATUS(test_text_search_marking_to_ciphertext(tester,
1631
+ crypt,
1632
+ &ciphertext,
1633
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1634
+ 2,
1635
+ &spec,
1636
+ status),
1637
+ status,
1638
+ "longer than the maximum length for substring indexing");
1639
+
1640
+ mongocrypt_status_destroy(status);
1641
+ mongocrypt_destroy(crypt);
1642
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1643
+ }
1644
+
1645
+ // Test string is not valid utf-8
1646
+ {
1647
+ _mongocrypt_ciphertext_t ciphertext;
1648
+ _mongocrypt_ciphertext_init(&ciphertext);
1649
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1650
+ const char *expected_msg = "String passed in was not valid UTF-8";
1651
+ mongocrypt_status_t *status = mongocrypt_status_new();
1652
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "foob\xffr",
1653
+ .len = 6,
1654
+ .substr.set = true,
1655
+ .substr.value = {.mlen = INT32_MAX, .ub = 1, .lb = 1}};
1656
+
1657
+ // invalid utf-8 byte 0xff
1658
+ ASSERT_FAILS_STATUS(test_text_search_marking_to_ciphertext(tester,
1659
+ crypt,
1660
+ &ciphertext,
1661
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1662
+ 2,
1663
+ &spec,
1664
+ status),
1665
+ status,
1666
+ expected_msg);
1667
+ _mongocrypt_status_reset(status);
1668
+
1669
+ // embedded null byte
1670
+ spec.v = "foob\x00r";
1671
+ ASSERT_FAILS_STATUS(test_text_search_marking_to_ciphertext(tester,
1672
+ crypt,
1673
+ &ciphertext,
1674
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1675
+ 2,
1676
+ &spec,
1677
+ status),
1678
+ status,
1679
+ expected_msg);
1680
+ _mongocrypt_status_reset(status);
1681
+
1682
+ // overlong encoding of 'a' (\x61)
1683
+ spec.v = "foob\xE0\x81\xA1r";
1684
+ spec.len = 8;
1685
+ ASSERT_FAILS_STATUS(test_text_search_marking_to_ciphertext(tester,
1686
+ crypt,
1687
+ &ciphertext,
1688
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1689
+ 2,
1690
+ &spec,
1691
+ status),
1692
+ status,
1693
+ expected_msg);
1694
+
1695
+ mongocrypt_status_destroy(status);
1696
+ mongocrypt_destroy(crypt);
1697
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1698
+ }
1699
+
1700
+ // Test string is too large
1701
+ {
1702
+ _mongocrypt_ciphertext_t ciphertext;
1703
+ _mongocrypt_ciphertext_init(&ciphertext);
1704
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1705
+ const char *expected_msg = "String passed in was too long";
1706
+ mongocrypt_status_t *status = mongocrypt_status_new();
1707
+ mc_FLE2TextSearchInsertSpec_t spec = {.substr.set = true,
1708
+ .substr.value = {.mlen = INT32_MAX, .ub = 1, .lb = 1}};
1709
+
1710
+ int len = (16 * 1024 * 1024) + 2;
1711
+ char *large_str = bson_malloc(len);
1712
+ memset(large_str, 'a', len);
1713
+ large_str[len - 1] = '\0';
1714
+ spec.v = large_str;
1715
+ spec.len = len - 1;
1716
+
1717
+ ASSERT_FAILS_STATUS(test_text_search_marking_to_ciphertext(tester,
1718
+ crypt,
1719
+ &ciphertext,
1720
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1721
+ 2,
1722
+ &spec,
1723
+ status),
1724
+ status,
1725
+ expected_msg);
1726
+ bson_free(large_str);
1727
+ mongocrypt_status_destroy(status);
1728
+ mongocrypt_destroy(crypt);
1729
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1730
+ }
1731
+
1732
+ // Test insert placeholder missing substring/suffix/prefix spec
1733
+ {
1734
+ _mongocrypt_ciphertext_t ciphertext;
1735
+ _mongocrypt_ciphertext_init(&ciphertext);
1736
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1737
+ const char *expected_msg = "missing a substring, suffix, or prefix index specification";
1738
+ mongocrypt_status_t *status = mongocrypt_status_new();
1739
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "foo", .len = 3};
1740
+ ASSERT_FAILS_STATUS(test_text_search_marking_to_ciphertext(tester,
1741
+ crypt,
1742
+ &ciphertext,
1743
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_INSERT,
1744
+ 2,
1745
+ &spec,
1746
+ status),
1747
+ status,
1748
+ expected_msg);
1749
+ mongocrypt_status_destroy(status);
1750
+ mongocrypt_destroy(crypt);
1751
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1752
+ }
1753
+
1754
+ // Test find placeholder has multiple query specs
1755
+ {
1756
+ _mongocrypt_ciphertext_t ciphertext;
1757
+ _mongocrypt_ciphertext_init(&ciphertext);
1758
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1759
+ const char *expected_msg = "cannot contain multiple query type specifications";
1760
+ mongocrypt_status_t *status = mongocrypt_status_new();
1761
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "foo",
1762
+ .len = 3,
1763
+ .substr.set = true,
1764
+ .substr.value = {.mlen = 3, .ub = 1, .lb = 1},
1765
+ .prefix.set = true,
1766
+ .prefix.value = {.ub = 1, .lb = 1}};
1767
+
1768
+ ASSERT_FAILS_STATUS(test_text_search_marking_to_ciphertext(tester,
1769
+ crypt,
1770
+ &ciphertext,
1771
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1772
+ 2,
1773
+ &spec,
1774
+ status),
1775
+ status,
1776
+ expected_msg);
1777
+ mongocrypt_status_destroy(status);
1778
+ mongocrypt_destroy(crypt);
1779
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1780
+ }
1781
+
1782
+ // Test find placeholder has invalid UTF-8 string
1783
+ {
1784
+ _mongocrypt_ciphertext_t ciphertext;
1785
+ _mongocrypt_ciphertext_init(&ciphertext);
1786
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1787
+ const char *expected_msg = "String passed in was not valid UTF-8";
1788
+ mongocrypt_status_t *status = mongocrypt_status_new();
1789
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "foob\xffr",
1790
+ .len = 6,
1791
+ .substr.set = true,
1792
+ .substr.value = {.mlen = 50, .ub = 30, .lb = 1}};
1793
+
1794
+ ASSERT_FAILS_STATUS(test_text_search_marking_to_ciphertext(tester,
1795
+ crypt,
1796
+ &ciphertext,
1797
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1798
+ 2,
1799
+ &spec,
1800
+ status),
1801
+ status,
1802
+ expected_msg);
1803
+ mongocrypt_status_destroy(status);
1804
+ mongocrypt_destroy(crypt);
1805
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1806
+ }
1807
+
1808
+ // Test exact match find
1809
+ {
1810
+ _mongocrypt_ciphertext_t ciphertext;
1811
+ _mongocrypt_ciphertext_init(&ciphertext);
1812
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1813
+ mongocrypt_status_t *status = mongocrypt_status_new();
1814
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "foo", .len = 3, .diacf = true, .casef = true};
1815
+ ASSERT_OK_STATUS(test_text_search_marking_to_ciphertext(tester,
1816
+ crypt,
1817
+ &ciphertext,
1818
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1819
+ 7,
1820
+ &spec,
1821
+ status),
1822
+ status);
1823
+ validate_text_search_ciphertext(tester,
1824
+ &ciphertext,
1825
+ crypt,
1826
+ &spec,
1827
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1828
+ 7,
1829
+ NULL);
1830
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1831
+ _mongocrypt_ciphertext_init(&ciphertext);
1832
+
1833
+ // Test empty string case
1834
+ spec.v = "";
1835
+ spec.len = 0;
1836
+ ASSERT_OK_STATUS(test_text_search_marking_to_ciphertext(tester,
1837
+ crypt,
1838
+ &ciphertext,
1839
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1840
+ 7,
1841
+ &spec,
1842
+ status),
1843
+ status);
1844
+ validate_text_search_ciphertext(tester,
1845
+ &ciphertext,
1846
+ crypt,
1847
+ &spec,
1848
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1849
+ 7,
1850
+ NULL);
1851
+
1852
+ mongocrypt_status_destroy(status);
1853
+ mongocrypt_destroy(crypt);
1854
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1855
+ }
1856
+
1857
+ // Test substring find
1858
+ {
1859
+ _mongocrypt_ciphertext_t ciphertext;
1860
+ _mongocrypt_ciphertext_init(&ciphertext);
1861
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1862
+ mongocrypt_status_t *status = mongocrypt_status_new();
1863
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "foo",
1864
+ .len = 3,
1865
+ .diacf = true,
1866
+ .substr.set = true,
1867
+ .substr.value = {.mlen = 300, .ub = 200, .lb = 2}};
1868
+ ASSERT_OK_STATUS(test_text_search_marking_to_ciphertext(tester,
1869
+ crypt,
1870
+ &ciphertext,
1871
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1872
+ 8,
1873
+ &spec,
1874
+ status),
1875
+ status);
1876
+ validate_text_search_ciphertext(tester,
1877
+ &ciphertext,
1878
+ crypt,
1879
+ &spec,
1880
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1881
+ 8,
1882
+ NULL);
1883
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1884
+ _mongocrypt_ciphertext_init(&ciphertext);
1885
+
1886
+ // Test empty string case
1887
+ spec.v = "";
1888
+ spec.len = 0;
1889
+ ASSERT_FAILS_STATUS(test_text_search_marking_to_ciphertext(tester,
1890
+ crypt,
1891
+ &ciphertext,
1892
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1893
+ 8,
1894
+ &spec,
1895
+ status),
1896
+ status,
1897
+ "string value cannot be empty");
1898
+ mongocrypt_status_destroy(status);
1899
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1900
+ mongocrypt_destroy(crypt);
1901
+ }
1902
+
1903
+ // Test suffix find
1904
+ {
1905
+ _mongocrypt_ciphertext_t ciphertext;
1906
+ _mongocrypt_ciphertext_init(&ciphertext);
1907
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1908
+ mongocrypt_status_t *status = mongocrypt_status_new();
1909
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "foo",
1910
+ .len = 3,
1911
+ .casef = true,
1912
+ .suffix.set = true,
1913
+ .suffix.value = {.ub = 100, .lb = 1}};
1914
+ ASSERT_OK_STATUS(test_text_search_marking_to_ciphertext(tester,
1915
+ crypt,
1916
+ &ciphertext,
1917
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1918
+ 9,
1919
+ &spec,
1920
+ status),
1921
+ status);
1922
+ validate_text_search_ciphertext(tester,
1923
+ &ciphertext,
1924
+ crypt,
1925
+ &spec,
1926
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1927
+ 9,
1928
+ NULL);
1929
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1930
+ _mongocrypt_ciphertext_init(&ciphertext);
1931
+
1932
+ // Test empty string case
1933
+ spec.v = "";
1934
+ spec.len = 0;
1935
+ ASSERT_FAILS_STATUS(test_text_search_marking_to_ciphertext(tester,
1936
+ crypt,
1937
+ &ciphertext,
1938
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1939
+ 8,
1940
+ &spec,
1941
+ status),
1942
+ status,
1943
+ "string value cannot be empty");
1944
+ mongocrypt_status_destroy(status);
1945
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1946
+ mongocrypt_destroy(crypt);
1947
+ }
1948
+
1949
+ // Test prefix find
1950
+ {
1951
+ _mongocrypt_ciphertext_t ciphertext;
1952
+ _mongocrypt_ciphertext_init(&ciphertext);
1953
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
1954
+ mongocrypt_status_t *status = mongocrypt_status_new();
1955
+ mc_FLE2TextSearchInsertSpec_t spec = {.v = "foo",
1956
+ .len = 3,
1957
+ .prefix.set = true,
1958
+ .prefix.value = {.ub = 300, .lb = 3}};
1959
+ ASSERT_OK_STATUS(test_text_search_marking_to_ciphertext(tester,
1960
+ crypt,
1961
+ &ciphertext,
1962
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1963
+ 10,
1964
+ &spec,
1965
+ status),
1966
+ status);
1967
+ validate_text_search_ciphertext(tester,
1968
+ &ciphertext,
1969
+ crypt,
1970
+ &spec,
1971
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1972
+ 10,
1973
+ NULL);
1974
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1975
+ _mongocrypt_ciphertext_init(&ciphertext);
1976
+
1977
+ // Test empty string case
1978
+ spec.v = "";
1979
+ spec.len = 0;
1980
+ ASSERT_FAILS_STATUS(test_text_search_marking_to_ciphertext(tester,
1981
+ crypt,
1982
+ &ciphertext,
1983
+ MONGOCRYPT_FLE2_PLACEHOLDER_TYPE_FIND,
1984
+ 8,
1985
+ &spec,
1986
+ status),
1987
+ status,
1988
+ "string value cannot be empty");
1989
+ mongocrypt_status_destroy(status);
1990
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
1991
+ mongocrypt_destroy(crypt);
1992
+ }
1993
+ }
1994
+
1995
+ static void test_ciphertext_len_steps_fle2_text_search(_mongocrypt_tester_t *tester) {
1996
+ #define MARKING_JSON_FORMAT \
1997
+ RAW_STRING({ \
1998
+ 't' : 1, \
1999
+ 'a' : 4, \
2000
+ 'v' : { \
2001
+ 'v' : "%s", \
2002
+ 'casef' : false, \
2003
+ 'diacf' : false, \
2004
+ 'suffix' : {'ub' : {'$numberInt' : '2'}, 'lb' : {'$numberInt' : '1'}} \
2005
+ }, \
2006
+ 'cm' : {'$numberLong' : '2'} \
2007
+ })
2008
+
2009
+ size_t last_len = 0;
2010
+ mongocrypt_binary_t *cmd = TEST_FILE("./test/example/cmd.json");
2011
+ mongocrypt_binary_t *key_file = TEST_BIN(16);
2012
+ mongocrypt_binary_t *ki = TEST_BIN(16);
2013
+ mongocrypt_binary_t *ku = TEST_BIN(16);
2014
+
2015
+ for (size_t str_len = 0; str_len < 256; str_len++) {
2016
+ char *v = bson_malloc0(str_len + 1);
2017
+ memset(v, 'a', str_len);
2018
+ size_t bufsize = snprintf(NULL, 0, MARKING_JSON_FORMAT, v) + 1;
2019
+ char *markingJSON = bson_malloc(bufsize);
2020
+ sprintf(markingJSON, MARKING_JSON_FORMAT, v);
2021
+ bson_t *marking_bson = TMP_BSON_STR(markingJSON);
2022
+
2023
+ _mongocrypt_ciphertext_t ciphertext;
2024
+ _mongocrypt_ciphertext_init(&ciphertext);
2025
+ mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
2026
+
2027
+ get_ciphertext_from_marking_json_with_bufs(crypt, marking_bson, &ciphertext, cmd, key_file, ki, ku);
2028
+
2029
+ // Get res.v, and make sure its size steps when we expect.
2030
+ bson_t ciphertext_bson;
2031
+ ASSERT(_mongocrypt_buffer_to_bson(&ciphertext.data, &ciphertext_bson));
2032
+ iupv2_fields_common res = validate_iupv2_common(&ciphertext_bson);
2033
+ if (str_len != 0) {
2034
+ // We expect a step in ciphertext len iff str_len + 5 goes from 16k-1 to 16k. 5 is the number of overhead
2035
+ // bytes from the BSON header + null byte.
2036
+ if ((str_len + 5) % 16 == 0) {
2037
+ ASSERT_CMPSIZE_T(res.v.len, ==, last_len + 16);
2038
+ } else {
2039
+ ASSERT_CMPSIZE_T(res.v.len, ==, last_len);
2040
+ }
2041
+ }
2042
+ last_len = res.v.len;
2043
+
2044
+ bson_destroy(&ciphertext_bson);
2045
+ bson_free(markingJSON);
2046
+ bson_free(v);
2047
+ mongocrypt_destroy(crypt);
2048
+ _mongocrypt_ciphertext_cleanup(&ciphertext);
2049
+ // Clean up marking_bson and decrement the tester bson_count so we can reuse the space.
2050
+ bson_destroy(marking_bson);
2051
+ tester->bson_count--;
2052
+ }
2053
+
2054
+ #undef MARKING_JSON_FORMAT
1117
2055
  }
1118
2056
 
1119
2057
  void _mongocrypt_tester_install_marking(_mongocrypt_tester_t *tester) {
1120
2058
  INSTALL_TEST(test_mongocrypt_marking_parse);
1121
2059
  INSTALL_TEST(test_mc_get_mincover_from_FLE2RangeFindSpec);
1122
- INSTALL_TEST(test_mc_marking_to_ciphertext);
2060
+ INSTALL_TEST(test_mc_marking_to_ciphertext_fle2_range);
2061
+ INSTALL_TEST(test_mc_marking_to_ciphertext_fle2_text_search);
2062
+ INSTALL_TEST(test_ciphertext_len_steps_fle2_text_search);
1123
2063
  }