Skip to content

Commit 38162ec

Browse files
kevinAlbseramongodbNoahStapp
authored
DRIVERS-2927 Make trimFactor and sparsity optional (#1613)
* add test for default `trimFactor` and `sparsity` in auto encryption payload * add prose test for explicit encryption * specify `trimFactor` and `sparsity` as optional * briefly describe `trimFactor` and `sparsity`, `min`, `max`, `precision`, and `contentionFactor` More detailed description is deferred to mongodb.com docs. --------- Co-authored-by: Ezra Chung <[email protected]> Co-authored-by: Noah Stapp <[email protected]>
1 parent 82be6f2 commit 38162ec

File tree

5 files changed

+796
-11
lines changed

5 files changed

+796
-11
lines changed

source/client-side-encryption/client-side-encryption.md

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
- Status: Accepted
44
- Minimum Server Version: 4.2 (CSFLE), 6.0 (Queryable Encryption)
5-
- Version: 1.13.0
5+
- Version: 1.14.0
66

77
______________________________________________________________________
88

@@ -1168,13 +1168,15 @@ class EncryptOpts {
11681168
// min, max, trimFactor, sparsity, and precision must match the values set in the encryptedFields of the destination collection.
11691169
// For double and decimal128, min/max/precision must all be set, or all be unset.
11701170
class RangeOpts {
1171-
// min is required if precision is set.
1171+
// min is the minimum value for the encrypted index. Required if precision is set.
11721172
min: Optional<BSONValue>,
1173-
// max is required if precision is set.
1173+
// max is the maximum value for the encrypted index. Required if precision is set.
11741174
max: Optional<BSONValue>,
1175-
trimFactor: Int32,
1176-
sparsity: Int64,
1177-
// precision may only be set for double or decimal128.
1175+
// trimFactor may be used to tune performance. When omitted, a default value is used.
1176+
trimFactor: Optional<Int32>,
1177+
// sparsity may be used to tune performance. When omitted, a default value is used.
1178+
sparsity: Optional<Int64>,
1179+
// precision determines the number of significant digits after the decimal point. May only be set for double or decimal128.
11781180
precision: Optional<Int32>
11791181
}
11801182
```
@@ -1212,8 +1214,8 @@ query. Drivers MUST document the following behavior:
12121214

12131215
#### contentionFactor
12141216

1215-
contentionFactor only applies when algorithm is "Indexed" or "Range". It is an error to set contentionFactor when
1216-
algorithm is not "Indexed" or "Range".
1217+
contentionFactor may be used to tune performance. Only applies when algorithm is "Indexed" or "Range". libmongocrypt
1218+
returns an error if contentionFactor is set for a non-applicable algorithm.
12171219

12181220
#### queryType
12191221

@@ -1222,15 +1224,16 @@ One of the strings:
12221224
- "equality"
12231225
- "range"
12241226

1225-
queryType only applies when algorithm is "Indexed" or "Range". It is an error to set queryType when algorithm is not
1226-
"Indexed" or "Range".
1227+
queryType only applies when algorithm is "Indexed" or "Range". libmongocrypt returns an error if queryType is set for a
1228+
non-applicable queryType.
12271229

12281230
> [!NOTE]
12291231
> The "range" queryType is currently unstable API and subject to backwards breaking changes.
12301232

12311233
#### rangeOpts
12321234

1233-
rangeOpts only applies when algorithm is "range". It is an error to set rangeOpts when algorithm is not "range".
1235+
rangeOpts only applies when algorithm is "range". libmongocrypt returns an error if rangeOpts is set for a
1236+
non-applicable algorithm.
12341237

12351238
> [!NOTE]
12361239
> rangeOpts is currently unstable API and subject to backwards breaking changes.
@@ -2380,6 +2383,8 @@ explicit session parameter as described in the [Drivers Sessions Specification](
23802383

23812384
## Changelog
23822385

2386+
- 2024-07-22: Make `trimFactor` and `sparsity` optional.
2387+
23832388
- 2024-06-13: Document range as unstable.
23842389

23852390
- 2024-05-31: Replace rangePreview with range.
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
# Test "range" field with defaults for `trimFactor` and `sparsity`.
2+
# Test requires libmongocrypt with changes in 14ccd9ce (MONGOCRYPT-698).
3+
runOn:
4+
- minServerVersion: "8.0.0" # Requires 8.0.0-rc13.
5+
topology: [ "replicaset", "sharded", "load-balanced" ] # Exclude "standalone". QE collections are not supported on standalone.
6+
database_name: &database_name "default"
7+
collection_name: &collection_name "default"
8+
data: []
9+
encrypted_fields: &encrypted_fields {
10+
"fields": [
11+
{
12+
"keyId": {
13+
"$binary": {
14+
"base64": "EjRWeBI0mHYSNBI0VniQEg==",
15+
"subType": "04"
16+
}
17+
},
18+
"path": "encryptedInt",
19+
"bsonType": "int",
20+
"queries": {
21+
"queryType": "range",
22+
# Exclude `trimFactor` and `sparsity`
23+
"contention": { "$numberLong": "0" },
24+
"min": { "$numberInt": "0" },
25+
"max": { "$numberInt": "200" }
26+
}
27+
}
28+
]
29+
}
30+
key_vault_data: [ {{ yamlfile("keys/key1-document.json") }} ]
31+
tests:
32+
- description: "FLE2 Range applies defaults for trimFactor and sparsity"
33+
clientOptions:
34+
autoEncryptOpts:
35+
kmsProviders:
36+
local: {{ local_provider() }}
37+
operations:
38+
- name: insertOne
39+
arguments:
40+
document: &doc0 { _id: 0, encryptedInt: { $numberInt: "0" } }
41+
- name: insertOne
42+
arguments:
43+
document: &doc1 { _id: 1, encryptedInt: { $numberInt: "1" } }
44+
- name: find
45+
arguments:
46+
filter: { encryptedInt: { $gt: { $numberInt: "0" } } }
47+
result: [*doc1]
48+
expectations:
49+
- command_started_event:
50+
command:
51+
listCollections: 1
52+
filter:
53+
name: *collection_name
54+
command_name: listCollections
55+
- command_started_event:
56+
command:
57+
find: datakeys
58+
filter: {
59+
"$or": [
60+
{
61+
"_id": {
62+
"$in": [
63+
{{ yamlfile("keys/key1-id.json") }}
64+
]
65+
}
66+
},
67+
{
68+
"keyAltNames": {
69+
"$in": []
70+
}
71+
}
72+
]
73+
}
74+
$db: keyvault
75+
readConcern: { level: "majority" }
76+
command_name: find
77+
- command_started_event:
78+
command:
79+
insert: *collection_name
80+
documents:
81+
- &doc0_encrypted { "_id": 0, "encryptedInt": { $$type: "binData" } }
82+
ordered: true
83+
encryptionInformation: &encryptionInformation
84+
type: 1
85+
schema:
86+
default.default:
87+
# libmongocrypt applies escCollection and ecocCollection to outgoing command.
88+
escCollection: "enxcol_.default.esc"
89+
ecocCollection: "enxcol_.default.ecoc"
90+
<<: *encrypted_fields
91+
command_name: insert
92+
- command_started_event:
93+
command:
94+
insert: *collection_name
95+
documents:
96+
- &doc1_encrypted { "_id": 1, "encryptedInt": { $$type: "binData" } }
97+
ordered: true
98+
encryptionInformation: *encryptionInformation
99+
command_name: insert
100+
- command_started_event:
101+
command:
102+
find: *collection_name
103+
filter:
104+
"encryptedInt": {
105+
"$gt": {
106+
"$binary": {
107+
"base64": "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",
108+
"subType": "06"
109+
}
110+
}
111+
}
112+
encryptionInformation: *encryptionInformation
113+
command_name: find
114+
outcome:
115+
collection:
116+
data:
117+
-
118+
{
119+
"_id": 0,
120+
"encryptedInt": { $$type: "binData" },
121+
# Expected contents of `__safeContent__` require MONGOCRYPT-698 to apply expected `trimFactor`.
122+
"__safeContent__": [
123+
{
124+
"$binary": {
125+
"base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
126+
"subType": "00"
127+
}
128+
},
129+
{
130+
"$binary": {
131+
"base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
132+
"subType": "00"
133+
}
134+
}
135+
]
136+
}
137+
-
138+
{
139+
"_id": {
140+
"$numberInt": "1"
141+
},
142+
"encryptedInt": { $$type: "binData" },
143+
"__safeContent__": [
144+
{
145+
"$binary": {
146+
"base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
147+
"subType": "00"
148+
}
149+
},
150+
{
151+
"$binary": {
152+
"base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
153+
"subType": "00"
154+
}
155+
}
156+
]
157+
}

source/client-side-encryption/tests/README.md

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3210,3 +3210,88 @@ class EncryptOpts {
32103210
```
32113211
32123212
Assert that an error was raised.
3213+
3214+
### 22. Range Explicit Encryption applies defaults
3215+
3216+
This test requires libmongocrypt with changes in
3217+
[14ccd9ce](https://github.com/mongodb/libmongocrypt/commit/14ccd9ce8a030158aec07f63e8139d34b95d88e6)
3218+
([MONGOCRYPT-698](https://jira.mongodb.org/browse/MONGOCRYPT-698)).
3219+
3220+
#### Test Setup
3221+
3222+
Create a MongoClient named `keyVaultClient`.
3223+
3224+
Create a ClientEncryption object named `clientEncryption` with these options:
3225+
3226+
```typescript
3227+
class ClientEncryptionOpts {
3228+
keyVaultClient: keyVaultClient,
3229+
keyVaultNamespace: "keyvault.datakeys",
3230+
kmsProviders: { "local": { "key": "<base64 decoding of LOCAL_MASTERKEY>" } },
3231+
}
3232+
```
3233+
3234+
Create a key with `clientEncryption.createDataKey`. Store the returned key ID in a variable named `keyId`.
3235+
3236+
Call `clientEncryption.encrypt` to encrypt the int32 value `123` with these options:
3237+
3238+
```typescript
3239+
class EncryptOpts {
3240+
keyId : keyId,
3241+
algorithm: "Range",
3242+
contentionFactor: 0,
3243+
rangeOpts: RangeOpts {
3244+
min: 0,
3245+
max: 1000
3246+
}
3247+
}
3248+
```
3249+
3250+
Store the result in a variable named `payload_defaults`.
3251+
3252+
#### Case 1: Uses libmongocrypt defaults
3253+
3254+
Call `clientEncryption.encrypt` to encrypt the int32 value `123` with these options:
3255+
3256+
```typescript
3257+
class EncryptOpts {
3258+
keyId : keyId,
3259+
algorithm: "Range",
3260+
contentionFactor: 0,
3261+
rangeOpts: RangeOpts {
3262+
min: 0,
3263+
max: 1000,
3264+
sparsity: 2,
3265+
trimFactor: 6
3266+
}
3267+
}
3268+
```
3269+
3270+
Assert the returned payload size equals the size of `payload_defaults`.
3271+
3272+
> [!NOTE]
3273+
> Do not compare the payload contents. The payloads include random data. The `trimFactor` and `sparsity` directly affect
3274+
> the payload size.
3275+
3276+
#### Case 2: Accepts `trimFactor` 0
3277+
3278+
Call `clientEncryption.encrypt` to encrypt the int32 value `123` with these options:
3279+
3280+
```typescript
3281+
class EncryptOpts {
3282+
keyId : keyId,
3283+
algorithm: "Range",
3284+
contentionFactor: 0,
3285+
rangeOpts: RangeOpts {
3286+
min: 0,
3287+
max: 1000,
3288+
trimFactor: 0
3289+
}
3290+
}
3291+
```
3292+
3293+
Assert the returned payload size is greater than the size of `payload_defaults`.
3294+
3295+
> [!NOTE]
3296+
> Do not compare the payload contents. The payloads include random data. The `trimFactor` and `sparsity` directly affect
3297+
> the payload size.

0 commit comments

Comments
 (0)