libmongocrypt-helper 1.13.2.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 (250) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libmongocrypt/libmongocrypt/CHANGELOG.md +8 -0
  3. data/ext/libmongocrypt/libmongocrypt/CMakeLists.txt +5 -1
  4. data/ext/libmongocrypt/libmongocrypt/CODEOWNERS +4 -1
  5. data/ext/libmongocrypt/libmongocrypt/Earthfile +18 -17
  6. data/ext/libmongocrypt/libmongocrypt/README.md +8 -8
  7. data/ext/libmongocrypt/libmongocrypt/bindings/python/CHANGELOG.rst +7 -0
  8. data/ext/libmongocrypt/libmongocrypt/bindings/python/CONTRIBUTING.md +34 -0
  9. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/asynchronous/state_machine.py +6 -2
  10. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/binding.py +18 -2
  11. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/mongocrypt.py +9 -1
  12. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/options.py +14 -0
  13. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/synchronous/state_machine.py +6 -2
  14. data/ext/libmongocrypt/libmongocrypt/bindings/python/pymongocrypt/version.py +1 -1
  15. data/ext/libmongocrypt/libmongocrypt/bindings/python/sbom.json +8 -8
  16. data/ext/libmongocrypt/libmongocrypt/bindings/python/scripts/libmongocrypt-version.txt +1 -0
  17. data/ext/libmongocrypt/libmongocrypt/bindings/python/{release.sh → scripts/release.sh} +9 -3
  18. data/ext/libmongocrypt/libmongocrypt/bindings/python/{synchro.py → scripts/synchro.py} +16 -9
  19. data/ext/libmongocrypt/libmongocrypt/bindings/python/scripts/synchro.sh +8 -0
  20. data/ext/libmongocrypt/libmongocrypt/bindings/python/scripts/update-version.sh +27 -0
  21. data/ext/libmongocrypt/libmongocrypt/bindings/python/scripts/update_binding.py +78 -0
  22. data/ext/libmongocrypt/libmongocrypt/bindings/python/test/test_mongocrypt.py +15 -0
  23. data/ext/libmongocrypt/libmongocrypt/doc/releasing.md +25 -18
  24. data/ext/libmongocrypt/libmongocrypt/etc/calc_release_version.py +39 -13
  25. data/ext/libmongocrypt/libmongocrypt/etc/calc_release_version_selftest.sh +1 -1
  26. data/ext/libmongocrypt/libmongocrypt/etc/cyclonedx.sbom.json +2 -2
  27. data/ext/libmongocrypt/libmongocrypt/kms-message/CMakeLists.txt +1 -1
  28. data/ext/libmongocrypt/libmongocrypt/kms-message/src/hexlify.c +5 -0
  29. data/ext/libmongocrypt/libmongocrypt/kms-message/src/hexlify.h +1 -1
  30. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_azure_request.c +1 -1
  31. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_gcp_request.c +1 -1
  32. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_kmip_reader_writer.c +4 -2
  33. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_kmip_request.c +1 -2
  34. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_message_private.h +5 -1
  35. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_request.c +1 -1
  36. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_request_opt.c +1 -1
  37. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_request_str.c +2 -8
  38. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_request_str.h +9 -0
  39. data/ext/libmongocrypt/libmongocrypt/kms-message/src/kms_response_parser.c +0 -1
  40. data/ext/libmongocrypt/libmongocrypt/kms-message/src/sort.c +7 -3
  41. data/ext/libmongocrypt/libmongocrypt/kms-message/src/sort.h +2 -0
  42. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kmip_reader_writer.c +8 -1
  43. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_assert.h +5 -4
  44. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_azure_online.c +1 -1
  45. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_gcp_online.c +1 -1
  46. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_kmip_request.c +4 -0
  47. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_kmip_response.c +3 -0
  48. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_kmip_response_parser.c +4 -0
  49. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_online_util.c +1 -1
  50. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_online_util.h +1 -1
  51. data/ext/libmongocrypt/libmongocrypt/kms-message/test/test_kms_request.c +39 -39
  52. data/ext/libmongocrypt/libmongocrypt/src/crypto/libcrypto.c +235 -65
  53. data/ext/libmongocrypt/libmongocrypt/src/crypto/none.c +1 -1
  54. data/ext/libmongocrypt/libmongocrypt/src/csfle-markup.cpp +4 -2
  55. data/ext/libmongocrypt/libmongocrypt/src/mc-dec128.h +2 -2
  56. data/ext/libmongocrypt/libmongocrypt/src/mc-dec128.test.cpp +2 -2
  57. data/ext/libmongocrypt/libmongocrypt/src/mc-efc-private.h +1 -4
  58. data/ext/libmongocrypt/libmongocrypt/src/mc-efc.c +9 -11
  59. data/ext/libmongocrypt/libmongocrypt/src/mc-fle-blob-subtype-private.h +1 -0
  60. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-encryption-placeholder-private.h +10 -8
  61. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-encryption-placeholder.c +167 -176
  62. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-equality-payload-v2.c +6 -17
  63. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-equality-payload.c +6 -17
  64. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-range-payload-private-v2.h +1 -1
  65. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-range-payload-v2.c +25 -26
  66. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-range-payload.c +2 -1
  67. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-text-payload-private.h +122 -0
  68. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-find-text-payload.c +477 -0
  69. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-insert-update-payload-private-v2.h +1 -3
  70. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-insert-update-payload-v2.c +28 -43
  71. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-insert-update-payload.c +6 -17
  72. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-iev-v2.c +6 -5
  73. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-iev.c +13 -10
  74. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-payload-uev-common.c +3 -2
  75. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-rfds.c +7 -6
  76. data/ext/libmongocrypt/libmongocrypt/src/mc-fle2-tag-and-encrypted-metadata-block.c +4 -3
  77. data/ext/libmongocrypt/libmongocrypt/src/mc-optional-private.h +1 -1
  78. data/ext/libmongocrypt/libmongocrypt/src/mc-parse-utils-private.h +27 -0
  79. data/ext/libmongocrypt/libmongocrypt/src/mc-parse-utils.c +48 -0
  80. data/ext/libmongocrypt/libmongocrypt/src/mc-range-edge-generation-private.h +5 -5
  81. data/ext/libmongocrypt/libmongocrypt/src/mc-range-edge-generation.c +15 -20
  82. data/ext/libmongocrypt/libmongocrypt/src/mc-range-encoding-private.h +4 -6
  83. data/ext/libmongocrypt/libmongocrypt/src/mc-range-encoding.c +9 -18
  84. data/ext/libmongocrypt/libmongocrypt/src/mc-range-mincover-generator.template.h +4 -5
  85. data/ext/libmongocrypt/libmongocrypt/src/mc-range-mincover-private.h +5 -9
  86. data/ext/libmongocrypt/libmongocrypt/src/mc-range-mincover.c +14 -19
  87. data/ext/libmongocrypt/libmongocrypt/src/mc-rangeopts-private.h +2 -4
  88. data/ext/libmongocrypt/libmongocrypt/src/mc-rangeopts.c +109 -119
  89. data/ext/libmongocrypt/libmongocrypt/src/mc-reader-private.h +2 -2
  90. data/ext/libmongocrypt/libmongocrypt/src/mc-reader.c +4 -2
  91. data/ext/libmongocrypt/libmongocrypt/src/mc-schema-broker-private.h +0 -3
  92. data/ext/libmongocrypt/libmongocrypt/src/mc-schema-broker.c +4 -14
  93. data/ext/libmongocrypt/libmongocrypt/src/mc-str-encode-string-sets-private.h +1 -1
  94. data/ext/libmongocrypt/libmongocrypt/src/mc-str-encode-string-sets.c +3 -3
  95. data/ext/libmongocrypt/libmongocrypt/src/mc-text-search-str-encode-private.h +8 -1
  96. data/ext/libmongocrypt/libmongocrypt/src/mc-text-search-str-encode.c +78 -2
  97. data/ext/libmongocrypt/libmongocrypt/src/mc-tokens-private.h +34 -16
  98. data/ext/libmongocrypt/libmongocrypt/src/mc-tokens.c +66 -74
  99. data/ext/libmongocrypt/libmongocrypt/src/mc-writer-private.h +1 -1
  100. data/ext/libmongocrypt/libmongocrypt/src/mc-writer.c +4 -2
  101. data/ext/libmongocrypt/libmongocrypt/src/mlib/error.h +1 -1
  102. data/ext/libmongocrypt/libmongocrypt/src/mlib/int128.h +12 -1
  103. data/ext/libmongocrypt/libmongocrypt/src/mlib/int128.test.cpp +5 -0
  104. data/ext/libmongocrypt/libmongocrypt/src/mlib/path.h +5 -5
  105. data/ext/libmongocrypt/libmongocrypt/src/mlib/path.test.c +2 -5
  106. data/ext/libmongocrypt/libmongocrypt/src/mlib/str.h +65 -58
  107. data/ext/libmongocrypt/libmongocrypt/src/mlib/str.test.c +3 -3
  108. data/ext/libmongocrypt/libmongocrypt/src/mlib/thread.h +1 -1
  109. data/ext/libmongocrypt/libmongocrypt/src/mlib/user-check.h +1 -1
  110. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-cache-collinfo-private.h +1 -1
  111. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-cache-collinfo.c +4 -0
  112. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ciphertext-private.h +1 -1
  113. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-crypto-private.h +4 -4
  114. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-crypto.c +29 -25
  115. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-datakey.c +3 -2
  116. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-decrypt.c +6 -3
  117. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-encrypt.c +48 -58
  118. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx-rewrap-many-datakey.c +12 -0
  119. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-ctx.c +5 -13
  120. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-dll-private.h +19 -2
  121. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-key-broker.c +9 -9
  122. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-marking-private.h +3 -4
  123. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-marking.c +285 -89
  124. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-opts-private.h +0 -2
  125. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-opts.c +0 -1
  126. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-private.h +1 -1
  127. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt-util.c +4 -1
  128. data/ext/libmongocrypt/libmongocrypt/src/mongocrypt.c +47 -31
  129. data/ext/libmongocrypt/libmongocrypt/src/os_posix/os_dll.c +2 -0
  130. data/ext/libmongocrypt/libmongocrypt/src/os_posix/os_mutex.c +1 -1
  131. data/ext/libmongocrypt/libmongocrypt/src/os_win/os_dll.c +3 -1
  132. data/ext/libmongocrypt/libmongocrypt/src/os_win/os_mutex.c +1 -1
  133. data/ext/libmongocrypt/libmongocrypt/src/unicode/case-fold-map.c +1 -1
  134. data/ext/libmongocrypt/libmongocrypt/src/unicode/diacritic-fold-map.c +1 -1
  135. data/ext/libmongocrypt/libmongocrypt/src/unicode/fold.c +1 -1
  136. data/ext/libmongocrypt/libmongocrypt/test/crypt_shared-stub.cpp +0 -14
  137. data/ext/libmongocrypt/libmongocrypt/test/data/compact/success/encrypted-field-config-map.json +6 -1
  138. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2InsertUpdatePayloadV2-RangeV2.json +8 -0
  139. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date-v2/encrypted-field-map.json +1 -1
  140. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date-v2/encrypted-payload.json +6 -4
  141. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/date-v2/mongocryptd-reply.json +1 -1
  142. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision-v2/encrypted-field-map.json +1 -1
  143. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision-v2/encrypted-payload.json +6 -4
  144. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-precision-v2/mongocryptd-reply.json +2 -2
  145. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-v2/encrypted-field-map.json +1 -1
  146. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-v2/encrypted-payload.json +6 -4
  147. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/decimal128-v2/mongocryptd-reply.json +1 -1
  148. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-precision-v2/encrypted-payload.json +14 -6
  149. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-v2/encrypted-field-map.json +1 -1
  150. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-v2/encrypted-payload.json +6 -4
  151. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/double-v2/mongocryptd-reply.json +1 -1
  152. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32-v2/encrypted-field-map.json +1 -1
  153. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32-v2/encrypted-payload.json +6 -4
  154. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int32-v2/mongocryptd-reply.json +1 -1
  155. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64-v2/encrypted-field-map.json +1 -1
  156. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64-v2/encrypted-payload.json +6 -4
  157. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range/int64-v2/mongocryptd-reply.json +1 -1
  158. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/double/encrypted-payload-v2.json +1 -1
  159. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/double-precision/encrypted-payload-v2.json +1 -1
  160. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32/encrypted-payload-v2.json +1 -1
  161. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-find-range-explicit/int32-openinterval/encrypted-payload-v2.json +1 -1
  162. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date-v2/encrypted-field-map.json +1 -1
  163. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date-v2/encrypted-payload.json +6 -4
  164. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/date-v2/mongocryptd-reply.json +1 -1
  165. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision-v2/encrypted-field-map.json +1 -1
  166. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision-v2/encrypted-payload.json +6 -4
  167. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-precision-v2/mongocryptd-reply.json +1 -1
  168. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-v2/encrypted-field-map.json +1 -1
  169. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-v2/encrypted-payload.json +6 -4
  170. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/decimal128-v2/mongocryptd-reply.json +1 -1
  171. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-precision-v2/encrypted-payload.json +14 -6
  172. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-v2/encrypted-field-map.json +1 -1
  173. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-v2/encrypted-payload.json +6 -4
  174. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/double-v2/mongocryptd-reply.json +1 -1
  175. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32-v2/encrypted-field-map.json +1 -1
  176. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32-v2/encrypted-payload.json +3 -3
  177. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int32-v2/mongocryptd-reply.json +1 -1
  178. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64-v2/encrypted-field-map.json +1 -1
  179. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64-v2/encrypted-payload.json +6 -4
  180. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range/int64-v2/mongocryptd-reply.json +1 -1
  181. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/double/encrypted-payload-v2.json +1 -1
  182. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/double-precision/encrypted-payload-v2.json +1 -1
  183. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/int32/encrypted-payload-v2.json +1 -1
  184. data/ext/libmongocrypt/libmongocrypt/test/data/fle2-insert-range-explicit/sparsity-2/encrypted-payload-v2.json +1 -1
  185. data/ext/libmongocrypt/libmongocrypt/test/data/tokens/mc.json +8 -0
  186. data/ext/libmongocrypt/libmongocrypt/test/data/tokens/server.json +8 -0
  187. data/ext/libmongocrypt/libmongocrypt/test/example-state-machine.c +5 -5
  188. data/ext/libmongocrypt/libmongocrypt/test/test-dll.cpp +11 -5
  189. data/ext/libmongocrypt/libmongocrypt/test/test-gcp-auth.c +2 -2
  190. data/ext/libmongocrypt/libmongocrypt/test/test-mc-efc.c +9 -11
  191. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-encryption-placeholder.c +18 -29
  192. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-find-equality-payload-v2.c +1 -1
  193. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-find-range-payload-v2.c +2 -18
  194. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-find-text-payload.c +320 -0
  195. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-iup-v2.c +2 -17
  196. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-payload-iup.c +1 -1
  197. data/ext/libmongocrypt/libmongocrypt/test/test-mc-fle2-rfds.c +8 -5
  198. data/ext/libmongocrypt/libmongocrypt/test/test-mc-range-edge-generation.c +6 -10
  199. data/ext/libmongocrypt/libmongocrypt/test/test-mc-range-encoding.c +29 -33
  200. data/ext/libmongocrypt/libmongocrypt/test/test-mc-range-mincover.c +12 -20
  201. data/ext/libmongocrypt/libmongocrypt/test/test-mc-rangeopts.c +5 -20
  202. data/ext/libmongocrypt/libmongocrypt/test/test-mc-reader.c +5 -5
  203. data/ext/libmongocrypt/libmongocrypt/test/test-mc-text-search-str-encode.c +147 -18
  204. data/ext/libmongocrypt/libmongocrypt/test/test-mc-tokens.c +35 -14
  205. data/ext/libmongocrypt/libmongocrypt/test/test-mc-writer.c +10 -10
  206. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-assert-match-bson.c +3 -7
  207. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-assert.h +36 -24
  208. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-buffer.c +4 -4
  209. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-cache.c +2 -2
  210. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ciphertext.c +13 -13
  211. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-cleanup.c +49 -55
  212. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-compact.c +64 -67
  213. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-crypto-hooks.c +18 -18
  214. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-crypto-std-hooks.c +4 -0
  215. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-crypto.c +4 -3
  216. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-csfle-lib.c +13 -3
  217. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ctx-decrypt.c +31 -13
  218. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ctx-encrypt.c +35 -52
  219. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ctx-rewrap-many-datakey.c +28 -1
  220. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-ctx-setopt.c +50 -91
  221. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-datakey.c +1 -1
  222. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-dll.c +7 -4
  223. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-endpoint.c +1 -1
  224. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-kek.c +1 -1
  225. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-key-cache.c +3 -5
  226. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-kms-ctx.c +2 -2
  227. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-local-kms.c +1 -1
  228. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-log.c +2 -2
  229. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-marking.c +527 -225
  230. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-status.c +1 -1
  231. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt.c +45 -56
  232. data/ext/libmongocrypt/libmongocrypt/test/test-mongocrypt.h +12 -3
  233. data/ext/libmongocrypt/libmongocrypt/test/test-named-kms-providers.c +11 -11
  234. data/ext/libmongocrypt/libmongocrypt/test/test-unicode-fold.c +6 -2
  235. data/ext/libmongocrypt/libmongocrypt/test/util/HELP.autogen +1 -1
  236. data/ext/libmongocrypt/libmongocrypt/test/util/csfle.c +1 -1
  237. data/ext/libmongocrypt/libmongocrypt/test/util/util.c +5 -5
  238. data/ext/libmongocrypt/libmongocrypt/test/util/util.h +7 -6
  239. data/lib/libmongocrypt_helper/version.rb +2 -2
  240. metadata +17 -13
  241. data/ext/libmongocrypt/libmongocrypt/bindings/python/libmongocrypt-version.txt +0 -1
  242. data/ext/libmongocrypt/libmongocrypt/bindings/python/strip_header.py +0 -50
  243. data/ext/libmongocrypt/libmongocrypt/bindings/python/update-sbom.sh +0 -14
  244. data/ext/libmongocrypt/libmongocrypt/test/data/cleanup/success/encrypted-payload.json +0 -29
  245. data/ext/libmongocrypt/libmongocrypt/test/data/compact/success/encrypted-payload.json +0 -29
  246. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2EqualityIndexedValueV2.json +0 -8
  247. data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/FLE2RangeIndexedValueV2.json +0 -8
  248. /data/ext/libmongocrypt/libmongocrypt/bindings/python/{build-manylinux-wheel.sh → scripts/build-manylinux-wheel.sh} +0 -0
  249. /data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/{FLE2InsertUpdatePayload-with-edges.json → FLE2InsertUpdatePayload-RangeV1.json} +0 -0
  250. /data/ext/libmongocrypt/libmongocrypt/test/data/explicit-decrypt/{FLE2InsertUpdatePayload-with-edges-V2.json → FLE2InsertUpdatePayloadV2-RangeV1.json} +0 -0
@@ -0,0 +1,477 @@
1
+ /*
2
+ * Copyright 2025-present MongoDB, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #include <bson/bson.h>
18
+ #include <stdlib.h>
19
+
20
+ #include "mc-fle2-find-text-payload-private.h"
21
+ #include "mc-parse-utils-private.h"
22
+ #include "mongocrypt-buffer-private.h"
23
+ #include "mongocrypt-util-private.h"
24
+ #include "mongocrypt.h"
25
+
26
+ #define IF_FIELD(Name) \
27
+ if (0 == strcmp(field, #Name)) { \
28
+ if (has_##Name) { \
29
+ CLIENT_ERR("Error parsing %s: Duplicate field '" #Name "'", class_name); \
30
+ goto fail; \
31
+ } \
32
+ has_##Name = true;
33
+
34
+ #define END_IF_FIELD \
35
+ continue; \
36
+ }
37
+
38
+ #define CHECK_HAS(Name) \
39
+ if (!has_##Name) { \
40
+ CLIENT_ERR("Error parsing %s: Missing required field '" #Name "'", class_name); \
41
+ goto fail; \
42
+ }
43
+
44
+ #define PARSE_BINARY(Name, Dest) \
45
+ IF_FIELD(Name) { \
46
+ if (!parse_bindata(BSON_SUBTYPE_BINARY, &iter, Dest, status)) { \
47
+ goto fail; \
48
+ } \
49
+ } \
50
+ END_IF_FIELD
51
+
52
+ typedef struct {
53
+ _mongocrypt_buffer_t *edcDerivedToken;
54
+ _mongocrypt_buffer_t *escDerivedToken;
55
+ _mongocrypt_buffer_t *serverDerivedToken;
56
+ } mc_TextFindTokenSetIndirection_t;
57
+
58
+ typedef struct {
59
+ const _mongocrypt_buffer_t *edcDerivedToken;
60
+ const _mongocrypt_buffer_t *escDerivedToken;
61
+ const _mongocrypt_buffer_t *serverDerivedToken;
62
+ } mc_TextFindTokenSetIndirectionConst_t;
63
+
64
+ /* Cleanup code common to all mc_Text<T>FindTokenSet_t types.
65
+ */
66
+ static void mc_TextFindTokenSetIndirection_cleanup(mc_TextFindTokenSetIndirection_t ts) {
67
+ _mongocrypt_buffer_cleanup(ts.edcDerivedToken);
68
+ _mongocrypt_buffer_cleanup(ts.escDerivedToken);
69
+ _mongocrypt_buffer_cleanup(ts.serverDerivedToken);
70
+ }
71
+
72
+ /* Serialization code common to all mc_Text<T>FindTokenSet_t types.
73
+ */
74
+ static bool mc_TextFindTokenSetIndirection_serialize(mc_TextFindTokenSetIndirectionConst_t ts,
75
+ bson_t *parent,
76
+ const char *field_name) {
77
+ BSON_ASSERT_PARAM(ts.edcDerivedToken);
78
+ BSON_ASSERT_PARAM(ts.escDerivedToken);
79
+ BSON_ASSERT_PARAM(ts.serverDerivedToken);
80
+ BSON_ASSERT_PARAM(parent);
81
+ BSON_ASSERT_PARAM(field_name);
82
+ bson_t child;
83
+ if (!BSON_APPEND_DOCUMENT_BEGIN(parent, field_name, &child)) {
84
+ return false;
85
+ }
86
+ if (!_mongocrypt_buffer_append(ts.edcDerivedToken, &child, "d", -1)) {
87
+ return false;
88
+ }
89
+ if (!_mongocrypt_buffer_append(ts.escDerivedToken, &child, "s", -1)) {
90
+ return false;
91
+ }
92
+ if (!_mongocrypt_buffer_append(ts.serverDerivedToken, &child, "l", -1)) {
93
+ return false;
94
+ }
95
+ if (!bson_append_document_end(parent, &child)) {
96
+ return false;
97
+ }
98
+ return true;
99
+ }
100
+
101
+ /* Parsing code common to all mc_Text<T>FindTokenSet_t types.
102
+ */
103
+ static bool mc_TextFindTokenSetIndirection_parse(mc_TextFindTokenSetIndirection_t out,
104
+ const char *class_name,
105
+ const bson_iter_t *in,
106
+ mongocrypt_status_t *status) {
107
+ BSON_ASSERT_PARAM(out.edcDerivedToken);
108
+ BSON_ASSERT_PARAM(out.escDerivedToken);
109
+ BSON_ASSERT_PARAM(out.serverDerivedToken);
110
+ BSON_ASSERT_PARAM(in);
111
+ bson_iter_t iter;
112
+ bool has_d = false, has_s = false, has_l = false;
113
+
114
+ iter = *in;
115
+ if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) {
116
+ CLIENT_ERR("Error parsing %s: field expected to be a document, but got %s",
117
+ class_name,
118
+ mc_bson_type_to_string(bson_iter_type(&iter)));
119
+ return false;
120
+ }
121
+ bson_iter_recurse(&iter, &iter);
122
+ while (bson_iter_next(&iter)) {
123
+ const char *field = bson_iter_key(&iter);
124
+ BSON_ASSERT(field);
125
+
126
+ PARSE_BINARY(d, out.edcDerivedToken);
127
+ PARSE_BINARY(s, out.escDerivedToken);
128
+ PARSE_BINARY(l, out.serverDerivedToken);
129
+
130
+ CLIENT_ERR("Error parsing %s: Unrecognized field '%s'", class_name, field);
131
+ goto fail;
132
+ }
133
+
134
+ CHECK_HAS(d);
135
+ CHECK_HAS(s);
136
+ CHECK_HAS(l);
137
+
138
+ return true;
139
+ fail:
140
+ return false;
141
+ }
142
+
143
+ #define INDIRECT(type, ts) \
144
+ (type) { \
145
+ .edcDerivedToken = &(ts).edcDerivedToken, .escDerivedToken = &(ts).escDerivedToken, \
146
+ .serverDerivedToken = &(ts).serverDerivedFromDataToken \
147
+ }
148
+ #define INDIRECT_TOKENSET(ts) INDIRECT(mc_TextFindTokenSetIndirection_t, ts)
149
+ #define INDIRECT_TOKENSET_CONST(ts) INDIRECT(mc_TextFindTokenSetIndirectionConst_t, ts)
150
+
151
+ #define DEF_TEXT_SEARCH_FIND_TOKEN_SET_CLEANUP(Type) \
152
+ static void mc_Text##Type##FindTokenSet_cleanup(mc_Text##Type##FindTokenSet_t *fts) { \
153
+ if (fts) { \
154
+ mc_TextFindTokenSetIndirection_cleanup(INDIRECT_TOKENSET(*fts)); \
155
+ } \
156
+ }
157
+ DEF_TEXT_SEARCH_FIND_TOKEN_SET_CLEANUP(Exact);
158
+ DEF_TEXT_SEARCH_FIND_TOKEN_SET_CLEANUP(Substring);
159
+ DEF_TEXT_SEARCH_FIND_TOKEN_SET_CLEANUP(Suffix);
160
+ DEF_TEXT_SEARCH_FIND_TOKEN_SET_CLEANUP(Prefix);
161
+
162
+ #define DEF_TEXT_SEARCH_FIND_TOKEN_SET_SERIALIZE(Type) \
163
+ static bool mc_Text##Type##FindTokenSet_serialize(bson_t *parent, \
164
+ const char *field_name, \
165
+ const mc_Text##Type##FindTokenSet_t *ts) { \
166
+ BSON_ASSERT_PARAM(ts); \
167
+ return mc_TextFindTokenSetIndirection_serialize(INDIRECT_TOKENSET_CONST(*ts), parent, field_name); \
168
+ }
169
+ DEF_TEXT_SEARCH_FIND_TOKEN_SET_SERIALIZE(Exact)
170
+ DEF_TEXT_SEARCH_FIND_TOKEN_SET_SERIALIZE(Substring)
171
+ DEF_TEXT_SEARCH_FIND_TOKEN_SET_SERIALIZE(Suffix)
172
+ DEF_TEXT_SEARCH_FIND_TOKEN_SET_SERIALIZE(Prefix)
173
+
174
+ #define DEF_TEXT_SEARCH_FIND_TOKEN_SET_PARSE(Type) \
175
+ static bool mc_Text##Type##FindTokenSet_parse(mc_Text##Type##FindTokenSet_t *out, \
176
+ bson_iter_t *in, \
177
+ mongocrypt_status_t *status) { \
178
+ BSON_ASSERT_PARAM(out); \
179
+ return mc_TextFindTokenSetIndirection_parse(INDIRECT_TOKENSET(*out), "Text" #Type "FindTokenSet", in, status); \
180
+ }
181
+ DEF_TEXT_SEARCH_FIND_TOKEN_SET_PARSE(Exact)
182
+ DEF_TEXT_SEARCH_FIND_TOKEN_SET_PARSE(Substring)
183
+ DEF_TEXT_SEARCH_FIND_TOKEN_SET_PARSE(Suffix)
184
+ DEF_TEXT_SEARCH_FIND_TOKEN_SET_PARSE(Prefix)
185
+
186
+ #undef DEF_TEXT_SEARCH_FIND_TOKEN_SET_CLEANUP
187
+ #undef DEF_TEXT_SEARCH_FIND_TOKEN_SET_SERIALIZE
188
+ #undef DEF_TEXT_SEARCH_FIND_TOKEN_SET_PARSE
189
+ #undef INDIRECT_TOKENSET_CONST
190
+ #undef INDIRECT_TOKENSET
191
+ #undef INDIRECT
192
+
193
+ void mc_FLE2FindTextPayload_init(mc_FLE2FindTextPayload_t *payload) {
194
+ BSON_ASSERT_PARAM(payload);
195
+ memset(payload, 0, sizeof(*payload));
196
+ }
197
+
198
+ void mc_FLE2FindTextPayload_cleanup(mc_FLE2FindTextPayload_t *payload) {
199
+ if (!payload) {
200
+ return;
201
+ }
202
+ mc_TextExactFindTokenSet_cleanup(&payload->tokenSets.exact.value);
203
+ mc_TextSubstringFindTokenSet_cleanup(&payload->tokenSets.substring.value);
204
+ mc_TextSuffixFindTokenSet_cleanup(&payload->tokenSets.suffix.value);
205
+ mc_TextPrefixFindTokenSet_cleanup(&payload->tokenSets.prefix.value);
206
+ }
207
+
208
+ static bool mc_TextSearchFindTokenSets_parse(mc_TextSearchFindTokenSets_t *out,
209
+ const bson_iter_t *in,
210
+ mongocrypt_status_t *status) {
211
+ BSON_ASSERT_PARAM(out);
212
+ BSON_ASSERT_PARAM(in);
213
+
214
+ bson_iter_t iter;
215
+ bool has_e = false, has_s = false, has_u = false, has_p = false;
216
+ uint8_t field_count = 0;
217
+ const char *class_name = "TextSearchFindTokenSets";
218
+
219
+ iter = *in;
220
+ if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) {
221
+ CLIENT_ERR("Error parsing %s: field expected to be a document, but got %s",
222
+ class_name,
223
+ mc_bson_type_to_string(bson_iter_type(&iter)));
224
+ return false;
225
+ }
226
+ bson_iter_recurse(&iter, &iter);
227
+ while (bson_iter_next(&iter)) {
228
+ const char *field = bson_iter_key(&iter);
229
+ BSON_ASSERT(field);
230
+
231
+ IF_FIELD(e) {
232
+ if (!mc_TextExactFindTokenSet_parse(&out->exact.value, &iter, status)) {
233
+ goto fail;
234
+ }
235
+ out->exact.set = true;
236
+ field_count++;
237
+ }
238
+ END_IF_FIELD
239
+
240
+ IF_FIELD(s) {
241
+ if (!mc_TextSubstringFindTokenSet_parse(&out->substring.value, &iter, status)) {
242
+ goto fail;
243
+ }
244
+ out->substring.set = true;
245
+ field_count++;
246
+ }
247
+ END_IF_FIELD
248
+
249
+ IF_FIELD(u) {
250
+ if (!mc_TextSuffixFindTokenSet_parse(&out->suffix.value, &iter, status)) {
251
+ goto fail;
252
+ }
253
+ out->suffix.set = true;
254
+ field_count++;
255
+ }
256
+ END_IF_FIELD
257
+
258
+ IF_FIELD(p) {
259
+ if (!mc_TextPrefixFindTokenSet_parse(&out->prefix.value, &iter, status)) {
260
+ goto fail;
261
+ }
262
+ out->prefix.set = true;
263
+ field_count++;
264
+ }
265
+ END_IF_FIELD
266
+
267
+ CLIENT_ERR("Error parsing %s: Unrecognized field '%s'", class_name, field);
268
+ goto fail;
269
+ }
270
+
271
+ if (!field_count) {
272
+ CLIENT_ERR("Error parsing %s: exactly one optional field is required", class_name);
273
+ goto fail;
274
+ } else if (field_count > 1) {
275
+ CLIENT_ERR("Error parsing %s: cannot have multiple optional fields present", class_name);
276
+ goto fail;
277
+ }
278
+
279
+ return true;
280
+ fail:
281
+ return false;
282
+ }
283
+
284
+ bool mc_FLE2FindTextPayload_parse(mc_FLE2FindTextPayload_t *out, const bson_t *in, mongocrypt_status_t *status) {
285
+ bson_iter_t iter;
286
+ const char *class_name = "FLE2FindTextPayload";
287
+
288
+ bool has_ts = false, has_cm = false, has_cf = false, has_df = false; // required fields
289
+ bool has_ss = false, has_fs = false, has_ps = false; // optional fields
290
+
291
+ BSON_ASSERT_PARAM(out);
292
+ BSON_ASSERT_PARAM(in);
293
+
294
+ mc_FLE2FindTextPayload_init(out);
295
+ if (!bson_validate(in, BSON_VALIDATE_NONE, NULL) || !bson_iter_init(&iter, in)) {
296
+ CLIENT_ERR("invalid BSON");
297
+ return false;
298
+ }
299
+
300
+ while (bson_iter_next(&iter)) {
301
+ const char *field = bson_iter_key(&iter);
302
+ const char *typestr = mc_bson_type_to_string(bson_iter_type(&iter));
303
+ BSON_ASSERT(field);
304
+
305
+ IF_FIELD(ts) {
306
+ if (!mc_TextSearchFindTokenSets_parse(&out->tokenSets, &iter, status)) {
307
+ return false;
308
+ }
309
+ }
310
+ END_IF_FIELD
311
+
312
+ IF_FIELD(cm) {
313
+ if (!BSON_ITER_HOLDS_INT64(&iter)) {
314
+ CLIENT_ERR("Error parsing %s: Field 'cm' expected to be int64, but got %s", class_name, typestr);
315
+ goto fail;
316
+ }
317
+ out->maxContentionFactor = bson_iter_int64(&iter);
318
+ }
319
+ END_IF_FIELD
320
+
321
+ IF_FIELD(cf) {
322
+ if (!BSON_ITER_HOLDS_BOOL(&iter)) {
323
+ CLIENT_ERR("Error parsing %s: Field 'cf' expected to be boolean, but got %s", class_name, typestr);
324
+ goto fail;
325
+ }
326
+ out->caseFold = bson_iter_bool(&iter);
327
+ }
328
+ END_IF_FIELD
329
+
330
+ IF_FIELD(df) {
331
+ if (!BSON_ITER_HOLDS_BOOL(&iter)) {
332
+ CLIENT_ERR("Error parsing %s: Field 'df' expected to be boolean, but got %s", class_name, typestr);
333
+ goto fail;
334
+ }
335
+ out->diacriticFold = bson_iter_bool(&iter);
336
+ }
337
+ END_IF_FIELD
338
+
339
+ IF_FIELD(ss) {
340
+ if (!mc_FLE2SubstringInsertSpec_parse(&out->substringSpec.value, &iter, status)) {
341
+ goto fail;
342
+ }
343
+ out->substringSpec.set = true;
344
+ }
345
+ END_IF_FIELD
346
+
347
+ IF_FIELD(fs) {
348
+ if (!mc_FLE2SuffixInsertSpec_parse(&out->suffixSpec.value, &iter, status)) {
349
+ goto fail;
350
+ }
351
+ out->suffixSpec.set = true;
352
+ }
353
+ END_IF_FIELD
354
+
355
+ IF_FIELD(ps) {
356
+ if (!mc_FLE2PrefixInsertSpec_parse(&out->prefixSpec.value, &iter, status)) {
357
+ goto fail;
358
+ }
359
+ out->prefixSpec.set = true;
360
+ }
361
+ END_IF_FIELD
362
+
363
+ CLIENT_ERR("Error parsing %s: Unrecognized field '%s'", class_name, field);
364
+ goto fail;
365
+ }
366
+
367
+ CHECK_HAS(ts);
368
+ CHECK_HAS(cm);
369
+ CHECK_HAS(cf);
370
+ CHECK_HAS(df);
371
+ return true;
372
+ fail:
373
+ return false;
374
+ }
375
+
376
+ bool mc_FLE2FindTextPayload_serialize(const mc_FLE2FindTextPayload_t *payload, bson_t *out) {
377
+ BSON_ASSERT_PARAM(out);
378
+ BSON_ASSERT_PARAM(payload);
379
+
380
+ // Append token sets "ts"
381
+ {
382
+ bson_t child;
383
+ if (!BSON_APPEND_DOCUMENT_BEGIN(out, "ts", &child)) {
384
+ return false;
385
+ }
386
+ // Append "e" if present
387
+ if (payload->tokenSets.exact.set) {
388
+ mc_TextExactFindTokenSet_serialize(&child, "e", &payload->tokenSets.exact.value);
389
+ }
390
+ // Append "s" if present
391
+ if (payload->tokenSets.substring.set) {
392
+ mc_TextSubstringFindTokenSet_serialize(&child, "s", &payload->tokenSets.substring.value);
393
+ }
394
+ // Append "u" if present
395
+ if (payload->tokenSets.suffix.set) {
396
+ mc_TextSuffixFindTokenSet_serialize(&child, "u", &payload->tokenSets.suffix.value);
397
+ }
398
+ // Append "p" if present
399
+ if (payload->tokenSets.prefix.set) {
400
+ mc_TextPrefixFindTokenSet_serialize(&child, "p", &payload->tokenSets.prefix.value);
401
+ }
402
+ if (!bson_append_document_end(out, &child)) {
403
+ return false;
404
+ }
405
+ }
406
+
407
+ // Append "cm".
408
+ if (!BSON_APPEND_INT64(out, "cm", payload->maxContentionFactor)) {
409
+ return false;
410
+ }
411
+
412
+ // Append "cf".
413
+ if (!BSON_APPEND_BOOL(out, "cf", payload->caseFold)) {
414
+ return false;
415
+ }
416
+
417
+ // Append "df".
418
+ if (!BSON_APPEND_BOOL(out, "df", payload->diacriticFold)) {
419
+ return false;
420
+ }
421
+
422
+ // Append "ss" if present.
423
+ if (payload->substringSpec.set) {
424
+ bson_t child;
425
+ if (!BSON_APPEND_DOCUMENT_BEGIN(out, "ss", &child)) {
426
+ return false;
427
+ }
428
+ if (!BSON_APPEND_INT32(&child, "mlen", (int32_t)payload->substringSpec.value.mlen)) {
429
+ return false;
430
+ }
431
+ if (!BSON_APPEND_INT32(&child, "ub", (int32_t)payload->substringSpec.value.ub)) {
432
+ return false;
433
+ }
434
+ if (!BSON_APPEND_INT32(&child, "lb", (int32_t)payload->substringSpec.value.lb)) {
435
+ return false;
436
+ }
437
+ if (!bson_append_document_end(out, &child)) {
438
+ return false;
439
+ }
440
+ }
441
+
442
+ // Append "fs" if present.
443
+ if (payload->suffixSpec.set) {
444
+ bson_t child;
445
+ if (!BSON_APPEND_DOCUMENT_BEGIN(out, "fs", &child)) {
446
+ return false;
447
+ }
448
+ if (!BSON_APPEND_INT32(&child, "ub", (int32_t)payload->suffixSpec.value.ub)) {
449
+ return false;
450
+ }
451
+ if (!BSON_APPEND_INT32(&child, "lb", (int32_t)payload->suffixSpec.value.lb)) {
452
+ return false;
453
+ }
454
+ if (!bson_append_document_end(out, &child)) {
455
+ return false;
456
+ }
457
+ }
458
+
459
+ // Append "ps" if present.
460
+ if (payload->prefixSpec.set) {
461
+ bson_t child;
462
+ if (!BSON_APPEND_DOCUMENT_BEGIN(out, "ps", &child)) {
463
+ return false;
464
+ }
465
+ if (!BSON_APPEND_INT32(&child, "ub", (int32_t)payload->prefixSpec.value.ub)) {
466
+ return false;
467
+ }
468
+ if (!BSON_APPEND_INT32(&child, "lb", (int32_t)payload->prefixSpec.value.lb)) {
469
+ return false;
470
+ }
471
+ if (!bson_append_document_end(out, &child)) {
472
+ return false;
473
+ }
474
+ }
475
+
476
+ return true;
477
+ }
@@ -158,9 +158,7 @@ const _mongocrypt_buffer_t *mc_FLE2InsertUpdatePayloadV2_decrypt(_mongocrypt_cry
158
158
 
159
159
  bool mc_FLE2InsertUpdatePayloadV2_serialize(const mc_FLE2InsertUpdatePayloadV2_t *payload, bson_t *out);
160
160
 
161
- bool mc_FLE2InsertUpdatePayloadV2_serializeForRange(const mc_FLE2InsertUpdatePayloadV2_t *payload,
162
- bson_t *out,
163
- bool use_range_v2);
161
+ bool mc_FLE2InsertUpdatePayloadV2_serializeForRange(const mc_FLE2InsertUpdatePayloadV2_t *payload, bson_t *out);
164
162
 
165
163
  bool mc_FLE2InsertUpdatePayloadV2_serializeForTextSearch(const mc_FLE2InsertUpdatePayloadV2_t *payload, bson_t *out);
166
164
 
@@ -17,6 +17,7 @@
17
17
  #include <bson/bson.h>
18
18
 
19
19
  #include "mc-fle2-insert-update-payload-private-v2.h"
20
+ #include "mc-parse-utils-private.h"
20
21
  #include "mongocrypt-buffer-private.h"
21
22
  #include "mongocrypt-util-private.h" // mc_bson_type_to_string
22
23
  #include "mongocrypt.h"
@@ -133,21 +134,7 @@ void mc_FLE2InsertUpdatePayloadV2_cleanup(mc_FLE2InsertUpdatePayloadV2_t *payloa
133
134
 
134
135
  #define PARSE_BINDATA(Name, Type, Dest) \
135
136
  IF_FIELD(Name) { \
136
- bson_subtype_t subtype; \
137
- uint32_t len; \
138
- const uint8_t *data; \
139
- if (bson_iter_type(&iter) != BSON_TYPE_BINARY) { \
140
- CLIENT_ERR("Field '" #Name "' expected to be bindata, got: %d", bson_iter_type(&iter)); \
141
- goto fail; \
142
- } \
143
- bson_iter_binary(&iter, &subtype, &len, &data); \
144
- if (subtype != Type) { \
145
- CLIENT_ERR("Field '" #Name "' expected to be bindata subtype %d, got: %d", Type, subtype); \
146
- goto fail; \
147
- } \
148
- if (!_mongocrypt_buffer_copy_from_binary_iter(&out->Dest, &iter)) { \
149
- CLIENT_ERR("Unable to create mongocrypt buffer for BSON binary " \
150
- "field in '" #Name "'"); \
137
+ if (!parse_bindata(Type, &iter, &out->Dest, status)) { \
151
138
  goto fail; \
152
139
  } \
153
140
  } \
@@ -159,7 +146,8 @@ void mc_FLE2InsertUpdatePayloadV2_cleanup(mc_FLE2InsertUpdatePayloadV2_t *payloa
159
146
  if (!has_##Name) { \
160
147
  CLIENT_ERR("Missing field '" #Name "' in payload"); \
161
148
  goto fail; \
162
- }
149
+ } else \
150
+ ((void)0)
163
151
 
164
152
  bool mc_FLE2InsertUpdatePayloadV2_parse(mc_FLE2InsertUpdatePayloadV2_t *out,
165
153
  const _mongocrypt_buffer_t *in,
@@ -306,7 +294,8 @@ fail:
306
294
  #define IUPS_APPEND_BINDATA(dst, name, subtype, value) \
307
295
  if (!_mongocrypt_buffer_append(&(value), dst, name, -1)) { \
308
296
  return false; \
309
- }
297
+ } else \
298
+ ((void)0)
310
299
 
311
300
  bool mc_FLE2InsertUpdatePayloadV2_serialize(const mc_FLE2InsertUpdatePayloadV2_t *payload, bson_t *out) {
312
301
  BSON_ASSERT_PARAM(out);
@@ -329,9 +318,7 @@ bool mc_FLE2InsertUpdatePayloadV2_serialize(const mc_FLE2InsertUpdatePayloadV2_t
329
318
  return true;
330
319
  }
331
320
 
332
- bool mc_FLE2InsertUpdatePayloadV2_serializeForRange(const mc_FLE2InsertUpdatePayloadV2_t *payload,
333
- bson_t *out,
334
- bool use_range_v2) {
321
+ bool mc_FLE2InsertUpdatePayloadV2_serializeForRange(const mc_FLE2InsertUpdatePayloadV2_t *payload, bson_t *out) {
335
322
  BSON_ASSERT_PARAM(out);
336
323
  BSON_ASSERT_PARAM(payload);
337
324
 
@@ -375,34 +362,32 @@ bool mc_FLE2InsertUpdatePayloadV2_serializeForRange(const mc_FLE2InsertUpdatePay
375
362
  return false;
376
363
  }
377
364
 
378
- if (use_range_v2) {
379
- // Encode parameters that were used to generate the payload.
380
- BSON_ASSERT(payload->sparsity.set);
381
- if (!BSON_APPEND_INT64(out, "sp", payload->sparsity.value)) {
382
- return false;
383
- }
384
-
385
- // Precision may be unset.
386
- if (payload->precision.set) {
387
- if (!BSON_APPEND_INT32(out, "pn", payload->precision.value)) {
388
- return false;
389
- }
390
- }
365
+ // Encode parameters that were used to generate the payload.
366
+ BSON_ASSERT(payload->sparsity.set);
367
+ if (!BSON_APPEND_INT64(out, "sp", payload->sparsity.value)) {
368
+ return false;
369
+ }
391
370
 
392
- BSON_ASSERT(payload->trimFactor.set);
393
- if (!BSON_APPEND_INT32(out, "tf", payload->trimFactor.value)) {
371
+ // Precision may be unset.
372
+ if (payload->precision.set) {
373
+ if (!BSON_APPEND_INT32(out, "pn", payload->precision.value)) {
394
374
  return false;
395
375
  }
376
+ }
396
377
 
397
- BSON_ASSERT(payload->indexMin.value_type != BSON_TYPE_EOD);
398
- if (!BSON_APPEND_VALUE(out, "mn", &payload->indexMin)) {
399
- return false;
400
- }
378
+ BSON_ASSERT(payload->trimFactor.set);
379
+ if (!BSON_APPEND_INT32(out, "tf", payload->trimFactor.value)) {
380
+ return false;
381
+ }
401
382
 
402
- BSON_ASSERT(payload->indexMax.value_type != BSON_TYPE_EOD);
403
- if (!BSON_APPEND_VALUE(out, "mx", &payload->indexMax)) {
404
- return false;
405
- }
383
+ BSON_ASSERT(payload->indexMin.value_type != BSON_TYPE_EOD);
384
+ if (!BSON_APPEND_VALUE(out, "mn", &payload->indexMin)) {
385
+ return false;
386
+ }
387
+
388
+ BSON_ASSERT(payload->indexMax.value_type != BSON_TYPE_EOD);
389
+ if (!BSON_APPEND_VALUE(out, "mx", &payload->indexMax)) {
390
+ return false;
406
391
  }
407
392
 
408
393
  return true;
@@ -17,6 +17,7 @@
17
17
  #include <bson/bson.h>
18
18
 
19
19
  #include "mc-fle2-insert-update-payload-private.h"
20
+ #include "mc-parse-utils-private.h"
20
21
  #include "mongocrypt-buffer-private.h"
21
22
  #include "mongocrypt.h"
22
23
 
@@ -69,21 +70,7 @@ void mc_FLE2InsertUpdatePayload_cleanup(mc_FLE2InsertUpdatePayload_t *payload) {
69
70
 
70
71
  #define PARSE_BINDATA(Name, Type, Dest) \
71
72
  IF_FIELD(Name) { \
72
- bson_subtype_t subtype; \
73
- uint32_t len; \
74
- const uint8_t *data; \
75
- if (bson_iter_type(&iter) != BSON_TYPE_BINARY) { \
76
- CLIENT_ERR("Field '" #Name "' expected to be bindata, got: %d", bson_iter_type(&iter)); \
77
- goto fail; \
78
- } \
79
- bson_iter_binary(&iter, &subtype, &len, &data); \
80
- if (subtype != Type) { \
81
- CLIENT_ERR("Field '" #Name "' expected to be bindata subtype %d, got: %d", Type, subtype); \
82
- goto fail; \
83
- } \
84
- if (!_mongocrypt_buffer_copy_from_binary_iter(&out->Dest, &iter)) { \
85
- CLIENT_ERR("Unable to create mongocrypt buffer for BSON binary " \
86
- "field in '" #Name "'"); \
73
+ if (!parse_bindata(Type, &iter, &out->Dest, status)) { \
87
74
  goto fail; \
88
75
  } \
89
76
  } \
@@ -95,7 +82,8 @@ void mc_FLE2InsertUpdatePayload_cleanup(mc_FLE2InsertUpdatePayload_t *payload) {
95
82
  if (!has_##Name) { \
96
83
  CLIENT_ERR("Missing field '" #Name "' in payload"); \
97
84
  goto fail; \
98
- }
85
+ } else \
86
+ ((void)0)
99
87
 
100
88
  bool mc_FLE2InsertUpdatePayload_parse(mc_FLE2InsertUpdatePayload_t *out,
101
89
  const _mongocrypt_buffer_t *in,
@@ -173,7 +161,8 @@ fail:
173
161
  #define IUPS_APPEND_BINDATA(dst, name, subtype, value) \
174
162
  if (!_mongocrypt_buffer_append(&(value), dst, name, -1)) { \
175
163
  return false; \
176
- }
164
+ } else \
165
+ ((void)0)
177
166
 
178
167
  bool mc_FLE2InsertUpdatePayload_serialize(const mc_FLE2InsertUpdatePayload_t *payload, bson_t *out) {
179
168
  BSON_ASSERT_PARAM(out);