diff --git a/src/mongocrypt-marking.c b/src/mongocrypt-marking.c index 161f36f04..12c8d0cca 100644 --- a/src/mongocrypt-marking.c +++ b/src/mongocrypt-marking.c @@ -36,6 +36,7 @@ #include "mongocrypt-buffer-private.h" #include "mongocrypt-ciphertext-private.h" #include "mongocrypt-crypto-private.h" +#include "mongocrypt-endian-private.h" #include "mongocrypt-key-broker-private.h" #include "mongocrypt-marking-private.h" #include "mongocrypt-private.h" @@ -1326,15 +1327,39 @@ static bool _fle2_generate_TextSearchTokenSets(_mongocrypt_key_broker_t *kb, mc_TextSubstringTokenSet_cleanup(&tset); goto fail; } - _mongocrypt_buffer_cleanup(&asBsonValue); if (appendCount > 1) { - mc_TextSubstringTokenSet_t tset_copy; - mc_TextSubstringTokenSet_shallow_copy(&tset, &tset_copy); + // Count is only greater than one for padding strings. + BSON_ASSERT(substring[bytelen - 1] == '\xFF'); + + // Make room to append count. + _mongocrypt_buffer_resize(&asBsonValue, asBsonValue.len + (uint32_t)sizeof(uint32_t)); + for (; appendCount > 1; appendCount--) { - _mc_array_append_val(&tsts->substringArray, tset_copy); + // Convert to little-endian (not strictly necessary since count is only appended for uniqueness): + uint32_t count_le = MONGOCRYPT_UINT32_TO_LE(appendCount); + memcpy(asBsonValue.data + asBsonValue.len - sizeof(uint32_t), &count_le, sizeof(uint32_t)); + + mc_TextSubstringTokenSet_t tset_padding = {{0}}; + mc_TextSubstringTokenSet_init(&tset_padding); + if (!_fle2_generate_TextSubstringTokenSet(kb, + &tset_padding, + &asBsonValue, + contentionFactor, + 0 /* msize */, + common.collectionsLevel1Token, + common.serverTokenDerivationLevel1Token, + status)) { + _mongocrypt_buffer_cleanup(&asBsonValue); + mc_TextSubstringTokenSet_cleanup(&tset_padding); + mc_TextSubstringTokenSet_cleanup(&tset); + goto fail; + } + _mc_array_append_val(&tsts->substringArray, tset_padding); // moves ownership of tset_padding } } + + _mongocrypt_buffer_cleanup(&asBsonValue); _mc_array_append_val(&tsts->substringArray, tset); // array now owns tset } } @@ -1367,15 +1392,37 @@ static bool _fle2_generate_TextSearchTokenSets(_mongocrypt_key_broker_t *kb, mc_TextSuffixTokenSet_cleanup(&tset); goto fail; } - _mongocrypt_buffer_cleanup(&asBsonValue); - if (appendCount > 1) { - mc_TextSuffixTokenSet_t tset_copy; - mc_TextSuffixTokenSet_shallow_copy(&tset, &tset_copy); + // Count is only greater than one for padding strings. + BSON_ASSERT(substring[bytelen - 1] == '\xFF'); + + // Make room to append count. + _mongocrypt_buffer_resize(&asBsonValue, asBsonValue.len + (uint32_t)sizeof(uint32_t)); + for (; appendCount > 1; appendCount--) { - _mc_array_append_val(&tsts->suffixArray, tset_copy); + // Convert to little-endian (not strictly necessary since count is only appended for uniqueness): + uint32_t count_le = MONGOCRYPT_UINT32_TO_LE(appendCount); + memcpy(asBsonValue.data + asBsonValue.len - sizeof(uint32_t), &count_le, sizeof(uint32_t)); + + mc_TextSuffixTokenSet_t tset_padding = {{0}}; + mc_TextSuffixTokenSet_init(&tset_padding); + if (!_fle2_generate_TextSuffixTokenSet(kb, + &tset_padding, + &asBsonValue, + contentionFactor, + 0 /* msize */, + common.collectionsLevel1Token, + common.serverTokenDerivationLevel1Token, + status)) { + _mongocrypt_buffer_cleanup(&asBsonValue); + mc_TextSuffixTokenSet_cleanup(&tset_padding); + mc_TextSuffixTokenSet_cleanup(&tset); + goto fail; + } + _mc_array_append_val(&tsts->suffixArray, tset_padding); // moves ownership of tset_padding } } + _mongocrypt_buffer_cleanup(&asBsonValue); _mc_array_append_val(&tsts->suffixArray, tset); // array now owns tset } } @@ -1408,15 +1455,38 @@ static bool _fle2_generate_TextSearchTokenSets(_mongocrypt_key_broker_t *kb, mc_TextPrefixTokenSet_cleanup(&tset); goto fail; } - _mongocrypt_buffer_cleanup(&asBsonValue); if (appendCount > 1) { - mc_TextPrefixTokenSet_t tset_copy; - mc_TextPrefixTokenSet_shallow_copy(&tset, &tset_copy); + // Count is only greater than one for padding strings. + BSON_ASSERT(substring[bytelen - 1] == '\xFF'); + + // Make room to append count. + _mongocrypt_buffer_resize(&asBsonValue, asBsonValue.len + (uint32_t)sizeof(uint32_t)); + for (; appendCount > 1; appendCount--) { - _mc_array_append_val(&tsts->prefixArray, tset_copy); // array now owns tset_copy + // Convert to little-endian (not strictly necessary since count is only appended for uniqueness): + uint32_t count_le = MONGOCRYPT_UINT32_TO_LE(appendCount); + memcpy(asBsonValue.data + asBsonValue.len - sizeof(uint32_t), &count_le, sizeof(uint32_t)); + + mc_TextPrefixTokenSet_t tset_padding = {{0}}; + mc_TextPrefixTokenSet_init(&tset_padding); + if (!_fle2_generate_TextPrefixTokenSet(kb, + &tset_padding, + &asBsonValue, + contentionFactor, + 0 /* msize */, + common.collectionsLevel1Token, + common.serverTokenDerivationLevel1Token, + status)) { + _mongocrypt_buffer_cleanup(&asBsonValue); + mc_TextPrefixTokenSet_cleanup(&tset_padding); + mc_TextPrefixTokenSet_cleanup(&tset); + goto fail; + } + _mc_array_append_val(&tsts->prefixArray, tset_padding); // moves ownership of tset_padding } } + _mongocrypt_buffer_cleanup(&asBsonValue); _mc_array_append_val(&tsts->prefixArray, tset); // moves ownership of tset } } diff --git a/test/data/fle2-explicit/insert-casef-diacf.json b/test/data/fle2-explicit/insert-casef-diacf.json index 13d8c7246..a637b87a5 100644 --- a/test/data/fle2-explicit/insert-casef-diacf.json +++ b/test/data/fle2-explicit/insert-casef-diacf.json @@ -1,7 +1,7 @@ { "v": { "$binary": { - "base64": "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", + "base64": "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", "subType": "06" } } diff --git a/test/data/fle2-explicit/insert-prefix-suffix.json b/test/data/fle2-explicit/insert-prefix-suffix.json index 33db0a126..c8d9aaabf 100644 --- a/test/data/fle2-explicit/insert-prefix-suffix.json +++ b/test/data/fle2-explicit/insert-prefix-suffix.json @@ -1,7 +1,7 @@ { "v": { "$binary": { - "base64": "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", + "base64": "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", "subType": "06" } } diff --git a/test/data/fle2-explicit/insert-prefix.json b/test/data/fle2-explicit/insert-prefix.json index 13d8c7246..a637b87a5 100644 --- a/test/data/fle2-explicit/insert-prefix.json +++ b/test/data/fle2-explicit/insert-prefix.json @@ -1,7 +1,7 @@ { "v": { "$binary": { - "base64": "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", + "base64": "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", "subType": "06" } } diff --git a/test/data/fle2-explicit/insert-substring.json b/test/data/fle2-explicit/insert-substring.json index 196e63b06..d1834d7e8 100644 --- a/test/data/fle2-explicit/insert-substring.json +++ b/test/data/fle2-explicit/insert-substring.json @@ -1,7 +1,7 @@ { "v": { "$binary": { - "base64": "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", + "base64": "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", "subType": "06" } } diff --git a/test/data/fle2-explicit/insert-suffix.json b/test/data/fle2-explicit/insert-suffix.json index 7d2a680a1..5b81cc4a4 100644 --- a/test/data/fle2-explicit/insert-suffix.json +++ b/test/data/fle2-explicit/insert-suffix.json @@ -1,7 +1,7 @@ { "v": { "$binary": { - "base64": "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", + "base64": "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", "subType": "06" } } diff --git a/test/data/fle2-insert-text-search/RNG_DATA.h b/test/data/fle2-insert-text-search/RNG_DATA.h index d3a6a2dc1..04b4ecd46 100644 --- a/test/data/fle2-insert-text-search/RNG_DATA.h +++ b/test/data/fle2-insert-text-search/RNG_DATA.h @@ -67,4 +67,7 @@ "\x94\x7a\x1e\x0b\xc8\xec\x23\xa3\x9d\x6d\x01\x01\x22\xa7\xbd\x96" \ "\x51\xb0\x6a\xab\x98\x7c\xcd\xd3\xff\xf0\x67\x63\x16\xf2\x2f\x62" \ "\x3c\xbd\x8b\x4a\x49\xb0\xe4\xe3\x12\xd4\x6b\x12\x41\x32\x22\xc0" \ - "\x51\x0c\xaf\x7e\x01\x46\x2b\xd5\x50\x9c\xd6\xfd\x42\xb5\x11\x4b" + "\x51\x0c\xaf\x7e\x01\x46\x2b\xd5\x50\x9c\xd6\xfd\x42\xb5\x11\x4b" \ + "\xf0\xd7\x8b\xa0\x4d\xd6\xbb\xdf\x6e\x29\x16\x40\xeb\xac\x89\xa7" \ + "\xbc\xe4\xc3\x66\x3b\x78\x98\x11\x14\xeb\xcc\x44\x5a\xa4\xb3\xbc" \ + "\x84\xc7\xf0\x2c\x07\xb5\x53\x63\xa4\x1b\x8b\xe8\x90\xa3\xc9\xc1" diff --git a/test/test-mongocrypt-ctx-encrypt.c b/test/test-mongocrypt-ctx-encrypt.c index a3f046f17..32f3658e8 100644 --- a/test/test-mongocrypt-ctx-encrypt.c +++ b/test/test-mongocrypt-ctx-encrypt.c @@ -1597,7 +1597,9 @@ static bool _test_rng_source(void *ctx, mongocrypt_binary_t *out, uint32_t count _test_rng_data_source *source = (_test_rng_data_source *)ctx; if ((source->pos + count) > source->buf.len) { - TEST_ERROR("Out of random data, wanted: %" PRIu32, count); + TEST_ERROR("Out of random data, wanted: %" PRIu32 ", but have %" PRIu32 " left", + count, + source->buf.len - source->pos); return false; } diff --git a/test/test-mongocrypt-marking.c b/test/test-mongocrypt-marking.c index 38045359f..23648c0de 100644 --- a/test/test-mongocrypt-marking.c +++ b/test/test-mongocrypt-marking.c @@ -932,6 +932,20 @@ static void get_ciphertext_from_marking_json(_mongocrypt_tester_t *tester, TEST_BIN(16)); } +static bson_t *get_ciphertext_as_bson(_mongocrypt_tester_t *tester, const char *markingJSON) { + bson_t ciphertext_bson; + _mongocrypt_ciphertext_t ciphertext; + _mongocrypt_ciphertext_init(&ciphertext); + mongocrypt_t *crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT); + get_ciphertext_from_marking_json(tester, crypt, markingJSON, &ciphertext); + // Get res.v, and make sure its size steps when we expect. + ASSERT(_mongocrypt_buffer_to_bson(&ciphertext.data, &ciphertext_bson)); + bson_t *to_return = bson_copy(&ciphertext_bson); + _mongocrypt_ciphertext_cleanup(&ciphertext); + mongocrypt_destroy(crypt); + return to_return; +} + // Get the ECOC token to use in decryption. static mc_ECOCToken_t *getECOCToken(mongocrypt_t *crypt) { mongocrypt_status_t *status = mongocrypt_status_new(); @@ -2103,10 +2117,90 @@ static void test_ciphertext_len_steps_fle2_text_search(_mongocrypt_tester_t *tes #undef MARKING_JSON_FORMAT } +static void test_no_repeats(_mongocrypt_tester_t *tester, const char *markingJSON, const char *token_key) { + bson_t *ciphertext_bson = get_ciphertext_as_bson(tester, markingJSON); // FLE2InsertUpdatePayloadV2 + bson_iter_t iter; + bson_iter_t token; + bson_subtype_t subtype; + uint32_t len, prev_len; + const uint8_t *data, *prev_data = NULL; + ASSERT(bson_iter_init(&iter, ciphertext_bson)); + ASSERT(bson_iter_find(&iter, "b")); // "b" for TextSearchTokenSets. + ASSERT(bson_iter_recurse(&iter, &iter)); + ASSERT(bson_iter_find(&iter, token_key)); // "p" for prefix, "u" for suffix, "s" for substring + ASSERT(bson_iter_recurse(&iter, &iter)); + + // Assert each token is different from the previous one. + while (bson_iter_next(&iter)) { + bson_iter_recurse(&iter, &token); + // Value-derived token + ASSERT(bson_iter_find(&token, "d")); + bson_iter_recurse(&token, &token); + ASSERT(BSON_ITER_HOLDS_BINARY(&token)); + bson_iter_binary(&token, &subtype, &len, &data); + ASSERT(data != NULL); + if (prev_data != NULL) { + ASSERT_CMPUINT32(len, ==, prev_len); + ASSERT(memcmp(data, prev_data, len) != 0); // Must differ. + } + prev_data = data; + prev_len = len; + } + bson_destroy(ciphertext_bson); +} + +static void test_no_repeats_in_prefix_tags_fle2_text_search(_mongocrypt_tester_t *tester) { + char *markingJSON = RAW_STRING({ + 't' : 1, + 'a' : 4, + 'v' : { + 'v' : "test", + 'casef' : false, + 'diacf' : false, + 'prefix' : {'lb' : {'$numberInt' : '1'}, 'ub' : {'$numberInt' : '7'}} + }, + 'cm' : {'$numberLong' : '2'} + }); + test_no_repeats(tester, markingJSON, "p"); +} + +static void test_no_repeats_in_suffix_tags_fle2_text_search(_mongocrypt_tester_t *tester) { + char *markingJSON = RAW_STRING({ + 't' : 1, + 'a' : 4, + 'v' : { + 'v' : "test", + 'casef' : false, + 'diacf' : false, + 'suffix' : {'lb' : {'$numberInt' : '1'}, 'ub' : {'$numberInt' : '7'}} + }, + 'cm' : {'$numberLong' : '2'} + }); + test_no_repeats(tester, markingJSON, "u"); +} + +static void test_no_repeats_in_substring_tags_fle2_text_search(_mongocrypt_tester_t *tester) { + char *markingJSON = RAW_STRING({ + 't' : 1, + 'a' : 4, + 'v' : { + 'v' : "test", + 'casef' : false, + 'diacf' : false, + 'substr' : {'lb' : {'$numberInt' : '1'}, 'ub' : {'$numberInt' : '7'}, 'mlen' : {'$numberInt' : '16'}} + }, + 'cm' : {'$numberLong' : '2'} + }); + test_no_repeats(tester, markingJSON, "s"); +} + void _mongocrypt_tester_install_marking(_mongocrypt_tester_t *tester) { INSTALL_TEST(test_mongocrypt_marking_parse); INSTALL_TEST(test_mc_get_mincover_from_FLE2RangeFindSpec); INSTALL_TEST(test_mc_marking_to_ciphertext_fle2_range); INSTALL_TEST(test_mc_marking_to_ciphertext_fle2_text_search); INSTALL_TEST(test_ciphertext_len_steps_fle2_text_search); + INSTALL_TEST(test_no_repeats_in_prefix_tags_fle2_text_search); + INSTALL_TEST(test_no_repeats_in_suffix_tags_fle2_text_search); + INSTALL_TEST(test_no_repeats_in_substring_tags_fle2_text_search); }