Skip to content

Commit ae0ef6f

Browse files
committed
m
1 parent 05cc97d commit ae0ef6f

File tree

9 files changed

+359
-14
lines changed

9 files changed

+359
-14
lines changed

DynamoDbEncryption/dafny/DynamoDbEncryption/src/Beacon.dfy

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,11 @@ module BaseBeacon {
154154
if numberOfBuckets == 0 || |bucket| as uint64 == 0 then
155155
bucket
156156
else
157-
[bucket[0] % numberOfBuckets]
157+
var newBucket : uint8 := bucket[0] % numberOfBuckets;
158+
if newBucket == 0 then
159+
[]
160+
else
161+
[newBucket]
158162
}
159163
function method {:opaque} hash(val : Bytes, key : Bytes, bucket : Bytes)
160164
: (ret : Result<string, Error>)

DynamoDbEncryption/dafny/DynamoDbEncryptionTransforms/src/AttributeResolver.dfy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ module AttributeResolver {
3232
);
3333
} else {
3434
var tableConfig := config.tableEncryptionConfigs[input.TableName];
35-
var bucket :- GetRandomBucket(tableConfig);
35+
var bucket :- GetRandomBucket(tableConfig, input.Item);
3636
var vf :- GetVirtualFields(tableConfig.search.value, input.Item, input.Version);
3737
var cb :- GetCompoundBeacons(tableConfig.search.value, input.Item, input.Version, bucket);
3838
return Success(

DynamoDbEncryption/dafny/DynamoDbEncryptionTransforms/src/BatchWriteItemTransform.dfy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ module BatchWriteItemTransform {
5454
//# The Item MUST be [writable](ddb-support.md#writable).
5555
var _ :- IsWriteable(tableConfig, req.PutRequest.value.Item);
5656

57-
var bucket :- GetRandomBucket(tableConfig);
57+
var bucket :- GetRandomBucket(tableConfig, req.PutRequest.value.Item);
5858
var item :- AddSignedBeacons(tableConfig, req.PutRequest.value.Item, bucket);
5959

6060
var encryptRes := tableConfig.itemEncryptor.EncryptItem(EncTypes.EncryptItemInput(plaintextItem:=item));

DynamoDbEncryption/dafny/DynamoDbEncryptionTransforms/src/DdbMiddlewareConfig.dfy

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ module DdbMiddlewareConfig {
5353
}
5454

5555
datatype TableConfig = TableConfig(
56-
physicalTableName: ComAmazonawsDynamodbTypes.TableName,
56+
physicalTableName: DDB.TableName,
5757
logicalTableName: string,
5858
partitionKeyName: string,
5959
sortKeyName: Option<string>,
@@ -70,7 +70,7 @@ module DdbMiddlewareConfig {
7070
|| config.tableEncryptionConfigs[tableName].plaintextOverride == AwsCryptographyDbEncryptionSdkDynamoDbTypes.PlaintextOverride.FORCE_PLAINTEXT_WRITE_ALLOW_PLAINTEXT_READ
7171
}
7272

73-
method GetRandomBucket(config : TableConfig) returns (output : Result<seq<uint8>, Error>)
73+
method GetRandomBucket(config : TableConfig, item : DDB.AttributeMap) returns (output : Result<seq<uint8>, Error>)
7474
modifies config.bucketSelector.Modifies
7575
requires config.bucketSelector.ValidState()
7676
ensures config.bucketSelector.ValidState()
@@ -86,9 +86,8 @@ module DdbMiddlewareConfig {
8686
return Failure(E("Number of buckets exceeds 255"));
8787
}
8888

89-
var outR := config.bucketSelector.GetBucketNumber(DDBE.GetBucketNumberInput( item := map[], numberOfBuckets := numBuckets as DDBE.BucketCount));
89+
var outR := config.bucketSelector.GetBucketNumber(DDBE.GetBucketNumberInput(item := item, numberOfBuckets := numBuckets as DDBE.BucketCount));
9090
var out :- outR.MapFailure(e => AwsCryptographyDbEncryptionSdkDynamoDb(e));
91-
9291
if out.bucketNumber == 0 {
9392
return Success([]);
9493
} else if numBuckets as DDBE.BucketCount <= out.bucketNumber {

DynamoDbEncryption/dafny/DynamoDbEncryptionTransforms/src/PutItemTransform.dfy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ module PutItemTransform {
5858
input.sdkInput.ConditionExpression,
5959
input.sdkInput.ExpressionAttributeNames,
6060
input.sdkInput.ExpressionAttributeValues);
61-
var bucket :- GetRandomBucket(tableConfig);
61+
var bucket :- GetRandomBucket(tableConfig, input.sdkInput.Item);
6262
var item :- AddSignedBeacons(tableConfig, input.sdkInput.Item, bucket);
6363
var encryptRes := tableConfig.itemEncryptor.EncryptItem(
6464
EncTypes.EncryptItemInput(plaintextItem:=item)

DynamoDbEncryption/dafny/DynamoDbEncryptionTransforms/src/TransactWriteItemsTransform.dfy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ module TransactWriteItemsTransform {
8989
item.Put.value.ExpressionAttributeNames,
9090
item.Put.value.ExpressionAttributeValues);
9191

92-
var bucket :- GetRandomBucket(tableConfig);
92+
var bucket :- GetRandomBucket(tableConfig, item.Put.value.Item);
9393
var beaconItem :- AddSignedBeacons(tableConfig, item.Put.value.Item, bucket);
9494

9595
var encryptRes := tableConfig.itemEncryptor.EncryptItem(

TestVectors/dafny/DDBEncryption/src/JsonConfig.dfy

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,7 @@ module {:options "-functionSyntax:4"} JsonConfig {
499499
var compoundBeacons : seq<Types.CompoundBeacon> := [];
500500
var virtualFields : seq<Types.VirtualField> := [];
501501
var keySource : Option<Types.BeaconKeySource> := None;
502+
var numberOfBuckets: Option<Types.BucketCount> := None;
502503

503504
for i := 0 to |data.obj| {
504505
var obj := data.obj[i];
@@ -507,6 +508,13 @@ module {:options "-functionSyntax:4"} JsonConfig {
507508
case "standardBeacons" => standardBeacons :- GetStandardBeacons(obj.1);
508509
case "compoundBeacons" => compoundBeacons :- GetCompoundBeacons(obj.1);
509510
case "virtualFields" => virtualFields :- GetVirtualFields(obj.1);
511+
case "numberOfBuckets" =>
512+
:- Need(obj.1.Number?, "numberOfBuckets must be of type Number.");
513+
var num :- DecimalToNat(obj.1.num);
514+
expect 0 < num < INT32_MAX_LIMIT;
515+
var num2 := num as int32;
516+
expect Types.IsValid_BucketCount(num2);
517+
numberOfBuckets := Some(num as Types.BucketCount);
510518
case _ => return Failure("Unexpected part of a beacon version : '" + obj.0 + "'");
511519
}
512520
}
@@ -529,7 +537,8 @@ module {:options "-functionSyntax:4"} JsonConfig {
529537
compoundBeacons := OptSeq(compoundBeacons),
530538
virtualFields := OptSeq(virtualFields),
531539
encryptedParts := None,
532-
signedParts := None
540+
signedParts := None,
541+
numberOfBuckets := numberOfBuckets
533542
)
534543
);
535544
}
@@ -628,7 +637,7 @@ module {:options "-functionSyntax:4"} JsonConfig {
628637
var results := prev;
629638
for i := 0 to |gsi| {
630639
for j := 0 to |gsi[i].KeySchema| {
631-
if forall k <- prev :: k.AttributeName != gsi[i].KeySchema[j].AttributeName {
640+
if forall k <- results :: k.AttributeName != gsi[i].KeySchema[j].AttributeName {
632641
results := results + [DDB.AttributeDefinition(AttributeName := gsi[i].KeySchema[j].AttributeName, AttributeType := DDB.ScalarAttributeType.S)];
633642
}
634643
}
@@ -1096,6 +1105,8 @@ module {:options "-functionSyntax:4"} JsonConfig {
10961105
var name : string := "";
10971106
var length : int := -1;
10981107
var loc : Option<Types.TerminalLocation> := None;
1108+
var numberOfBuckets: Option<Types.BucketCount> := None;
1109+
10991110
for i := 0 to |data.obj| {
11001111
var obj := data.obj[i];
11011112
match obj.0 {
@@ -1109,12 +1120,19 @@ module {:options "-functionSyntax:4"} JsonConfig {
11091120
:- Need(obj.1.String?, "Standard Beacon Location must be a string");
11101121
:- Need(0 < |obj.1.str|, "Standard Beacon Location must nt be an empty string.");
11111122
loc := Some(obj.1.str);
1123+
case "numberOfBuckets" =>
1124+
:- Need(obj.1.Number?, "numberOfBuckets must be of type Number.");
1125+
var num :- DecimalToNat(obj.1.num);
1126+
expect 0 < num < INT32_MAX_LIMIT;
1127+
var num2 := num as int32;
1128+
expect Types.IsValid_BucketCount(num2);
1129+
numberOfBuckets := Some(num as Types.BucketCount);
11121130
case _ => return Failure("Unexpected part of a standard beacon : '" + data.obj[i].0 + "'");
11131131
}
11141132
}
11151133
:- Need(0 < |name|, "Each Standard Beacon needs a name.");
11161134
:- Need(0 < length < 100 && Types.IsValid_BeaconBitLength(length as int32), "Each Standard Beacon needs a length between 1 and 63.");
1117-
return Success(Types.StandardBeacon(name := name, length := length as Types.BeaconBitLength, loc := loc, style := None));
1135+
return Success(Types.StandardBeacon(name := name, length := length as Types.BeaconBitLength, loc := loc, style := None, numberOfBuckets := numberOfBuckets));
11181136
}
11191137

11201138
method GetGSIs(data : JSON) returns (output : Result<seq<DDB.GlobalSecondaryIndex> , string>)
@@ -1152,10 +1170,15 @@ module {:options "-functionSyntax:4"} JsonConfig {
11521170
IndexName := data.arr[0].str,
11531171
KeySchema := schema,
11541172
Projection := DDB.Projection(
1155-
ProjectionType := None,
1173+
ProjectionType := Some(DDB.ProjectionType.ALL),
11561174
NonKeyAttributes := None
11571175
),
1158-
ProvisionedThroughput := None
1176+
ProvisionedThroughput := Some(
1177+
DDB.ProvisionedThroughput (
1178+
ReadCapacityUnits:= 5,
1179+
WriteCapacityUnits:= 5
1180+
)
1181+
)
11591182
));
11601183
}
11611184

0 commit comments

Comments
 (0)