@@ -42,10 +42,12 @@ module SearchConfigToInfo {
4242 requires ValidSearchConfig (outer.search)
4343 requires outer. search. Some? ==> ValidSharedCache (outer.search.value.versions[0].keySource)
4444 modifies if outer. search. Some? then outer. search. value. versions[0]. keyStore. Modifies else {}
45+ modifies if outer. search. Some? && outer. search. value. versions[0]. bucketSelector. Some? then outer. search. value. versions[0]. bucketSelector. value. Modifies else {}
4546 ensures outer. search. Some? ==> ValidSharedCache (outer.search.value.versions[0].keySource)
4647 ensures output. Success? && output. value. Some? ==>
4748 && output. value. value. ValidState ()
4849 && fresh (output. value. value. versions[0]. keySource. client)
50+ && fresh (output. value. value. versions[0]. bucketSelector)
4951 // = specification/searchable-encryption/search-config.md#initialization
5052 // = type=implication
5153 // # Initialization MUST fail if the [version number](#version-number) is not `1`.
@@ -242,10 +244,13 @@ module SearchConfigToInfo {
242244 requires ValidBeaconVersion (config)
243245 requires ValidSharedCache (config.keySource)
244246 modifies config. keyStore. Modifies
247+ modifies if config. bucketSelector. Some? then config. bucketSelector. value. Modifies else {}
245248 ensures ValidSharedCache (config.keySource)
246249 ensures output. Success? ==>
247250 && output. value. ValidState ()
248251 && fresh (output. value. keySource. client)
252+ && fresh (output. value. bucketSelector)
253+ && fresh (output. value. bucketSelector. Modifies)
249254
250255 // = specification/searchable-encryption/search-config.md#beacon-version-initialization
251256 // = type=implication
@@ -264,7 +269,8 @@ module SearchConfigToInfo {
264269 var maybePrimitives := Primitives. AtomicPrimitives ();
265270 var primitives :- maybePrimitives. MapFailure (e => AwsCryptographyPrimitives(e));
266271 var source :- MakeKeySource (outer, config.keyStore, config.keySource, primitives);
267- output := ConvertVersionWithSource (outer, config, source);
272+ var version :- ConvertVersionWithSource (outer, config, source);
273+ return Success (version);
268274 }
269275
270276 class DefaultBucketSelector extends IBucketSelector
@@ -321,6 +327,8 @@ module SearchConfigToInfo {
321327 ensures output. Success? ==>
322328 && output. value. ValidState ()
323329 && output. value. keySource == source
330+ && fresh (output. value. bucketSelector)
331+ && fresh (output. value. bucketSelector. Modifies)
324332 {
325333 var maxBuckets : BucketCount := config. maximumNumberOfBuckets. UnwrapOr (1);
326334 var defaultBuckets : BucketCount := config. defaultNumberOfBuckets. UnwrapOr (maxBuckets);
@@ -376,15 +384,17 @@ module SearchConfigToInfo {
376384 bucketSelector := new DefaultBucketSelector ();
377385 }
378386
379- return I. MakeBeaconVersion (
380- config.version as I.VersionNumber,
381- source,
382- beacons,
383- virtualFields,
384- outer.attributeActionsOnEncrypt,
385- bucketSelector,
386- maxBuckets
387- );
387+ var ret :- I. MakeBeaconVersion (
388+ config.version as I.VersionNumber,
389+ source,
390+ beacons,
391+ virtualFields,
392+ outer.attributeActionsOnEncrypt,
393+ bucketSelector,
394+ maxBuckets
395+ );
396+ assume {:axiom} fresh (ret. bucketSelector);
397+ return Success (ret);
388398 }
389399
390400 // convert configured VirtualFieldList to internal VirtualFieldMap
0 commit comments