Skip to content

chore(dafny): Add bucket beacon support #1943

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 57 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
ac87a66
chore(dafny): Add bucket beacon support
ajewellamz Jun 19, 2025
da790a0
m
ajewellamz Jun 19, 2025
c2746c5
m
ajewellamz Jun 20, 2025
7e17008
m
ajewellamz Jun 20, 2025
ab174cb
m
ajewellamz Jun 20, 2025
9130859
m
ajewellamz Jun 20, 2025
082a815
Merge branch 'main' into ajewell/buckets
ajewellamz Jun 21, 2025
bd5e532
m
ajewellamz Jun 23, 2025
4ff8d8c
m
ajewellamz Jun 23, 2025
c3ae7ca
m
ajewellamz Jun 23, 2025
0370e3c
Merge branch 'main' into ajewell/buckets
ajewellamz Jun 27, 2025
fc77ceb
m
ajewellamz Jul 1, 2025
8cd220b
Merge branch 'main' into ajewell/buckets
ajewellamz Jul 7, 2025
2fbfdc5
Merge branch 'main' into ajewell/buckets
ajewellamz Jul 22, 2025
90822df
m
ajewellamz Jul 22, 2025
1388574
m
ajewellamz Jul 23, 2025
bee7476
m
ajewellamz Jul 23, 2025
8ec3cd5
m
ajewellamz Jul 23, 2025
3b71365
m
ajewellamz Jul 23, 2025
05cc97d
m
ajewellamz Jul 23, 2025
ae0ef6f
m
ajewellamz Jul 25, 2025
e96ce28
m
ajewellamz Jul 25, 2025
d622567
m
ajewellamz Jul 25, 2025
a1814ee
m
ajewellamz Jul 28, 2025
d087faf
m
ajewellamz Jul 28, 2025
d0ace70
m
ajewellamz Jul 29, 2025
0b4fd63
m
ajewellamz Jul 30, 2025
09adff0
new smithy-dafny
ajewellamz Jul 30, 2025
57080c2
m
ajewellamz Jul 31, 2025
8cedefa
m
ajewellamz Jul 31, 2025
3efbf18
m
ajewellamz Jul 31, 2025
cfbc2ef
m
ajewellamz Jul 31, 2025
a47d6f8
m
ajewellamz Aug 1, 2025
6ed336b
m
ajewellamz Aug 1, 2025
787a15c
m
ajewellamz Aug 1, 2025
9696cbd
m
ajewellamz Aug 1, 2025
8263d62
m
ajewellamz Aug 1, 2025
95b11fb
Merge branch 'main' into ajewell/buckets
ajewellamz Aug 2, 2025
70f7440
m
ajewellamz Aug 5, 2025
95bd647
m
ajewellamz Aug 5, 2025
cf12f75
m
ajewellamz Aug 5, 2025
324af84
Merge branch 'main' into ajewell/buckets
ajewellamz Aug 5, 2025
9e4115a
m
ajewellamz Aug 5, 2025
91f67cf
m
ajewellamz Aug 6, 2025
5d043c7
m
ajewellamz Aug 6, 2025
fd33688
m
ajewellamz Aug 6, 2025
295c2ae
m
ajewellamz Aug 7, 2025
59a197e
m
ajewellamz Aug 7, 2025
30b774f
m
ajewellamz Aug 7, 2025
25b4904
m
ajewellamz Aug 9, 2025
3d9922c
m
ajewellamz Aug 11, 2025
ef344d9
m
ajewellamz Aug 11, 2025
01079cd
m
ajewellamz Aug 11, 2025
b3b0dc1
m
ajewellamz Aug 11, 2025
3b4940f
m
ajewellamz Aug 11, 2025
b378182
Merge branch 'main' into ajewell/buckets
ajewellamz Aug 12, 2025
9b0df5c
m
ajewellamz Aug 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/ci_codegen.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ jobs:
- uses: actions/checkout@v3
with:
submodules: recursive
- run: git submodule update --init --recursive submodules/smithy-dafny
- run: |
git submodule update --init --recursive submodules/smithy-dafny
git submodule update --init --recursive submodules/MaterialProviders

# Only used to format generated code
# and to translate version strings such as "nightly-latest"
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,51 +1,15 @@
diff --git b/DynamoDbEncryption/runtimes/net/Generated/DynamoDbEncryption/TypeConversion.cs a/DynamoDbEncryption/runtimes/net/Generated/DynamoDbEncryption/TypeConversion.cs
index 9601968..a2a04f8 100644
index 64de7ab2..63a975a6 100644
--- b/DynamoDbEncryption/runtimes/net/Generated/DynamoDbEncryption/TypeConversion.cs
+++ a/DynamoDbEncryption/runtimes/net/Generated/DynamoDbEncryption/TypeConversion.cs
@@ -7,10 +7,43 @@ namespace AWS.Cryptography.DbEncryptionSDK.DynamoDb
@@ -7,10 +7,6 @@ namespace AWS.Cryptography.DbEncryptionSDK.DynamoDb
{
public static class TypeConversion
{
- private const string ISO8601DateFormat = "yyyy-MM-dd\\THH:mm:ss.fff\\Z";
-
- private const string ISO8601DateFormatNoMS = "yyyy-MM-dd\\THH:mm:ss\\Z";
+ // BEGIN MANUAL EDIT
+ public static AWS.Cryptography.KeyStore.KeyStore FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__S17_KeyStoreReference(software.amazon.cryptography.keystore.internaldafny.types.IKeyStoreClient value)
+ {
+ if (value is software.amazon.cryptography.keystore.internaldafny.types.IKeyStoreClient dafnyValue)
+ {
+ return new AWS.Cryptography.KeyStore.KeyStore(dafnyValue);
+ }
+ throw new System.ArgumentException("Custom implementations of AWS.Cryptography.KeyStore.KeyStore are not supported yet");
+ }
+ public static software.amazon.cryptography.keystore.internaldafny.types.IKeyStoreClient ToDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__S17_KeyStoreReference(AWS.Cryptography.KeyStore.KeyStore value)
+ {
+ if (value is AWS.Cryptography.KeyStore.KeyStore nativeValue)
+ {
+ return nativeValue.impl();
+ }
+ throw new System.ArgumentException("Custom implementations of AWS.Cryptography.KeyStore.KeyStore are not supported yet");
+ }
+ public static AWS.Cryptography.DbEncryptionSDK.DynamoDb.ILegacyDynamoDbEncryptor FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__S32_LegacyDynamoDbEncryptorReference(software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types.ILegacyDynamoDbEncryptor value)
+ {
+ if (value is NativeWrapper_LegacyDynamoDbEncryptor nativeWrapper) return nativeWrapper._impl;
+ return new LegacyDynamoDbEncryptor(value);

+ }
+ public static software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types.ILegacyDynamoDbEncryptor ToDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__S32_LegacyDynamoDbEncryptorReference(AWS.Cryptography.DbEncryptionSDK.DynamoDb.ILegacyDynamoDbEncryptor value)
+ {
+ switch (value)
+ {
+ case LegacyDynamoDbEncryptor valueWithImpl:
+ return valueWithImpl._impl;
+ case LegacyDynamoDbEncryptorBase nativeImpl:
+ return new NativeWrapper_LegacyDynamoDbEncryptor(nativeImpl);
+ default:
+ throw new System.ArgumentException(
+ "Custom implementations of LegacyDynamoDbEncryptor must extend LegacyDynamoDbEncryptorBase.");
+ }
+ }
+ // END MANUAL EDIT
public static AWS.Cryptography.DbEncryptionSDK.DynamoDb.BeaconKeySource FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__S15_BeaconKeySource(software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types._IBeaconKeySource value)
-
public static AWS.Cryptography.DbEncryptionSDK.DynamoDb.AsSet FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__S5_AsSet(software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types._IAsSet value)
{
software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types.BeaconKeySource concrete = (software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types.BeaconKeySource)value;
software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types.AsSet concrete = (software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types.AsSet)value; AWS.Cryptography.DbEncryptionSDK.DynamoDb.AsSet converted = new AWS.Cryptography.DbEncryptionSDK.DynamoDb.AsSet(); return converted;
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
diff --git b/DynamoDbEncryption/runtimes/net/Generated/DynamoDbEncryptionTransforms/TypeConversion.cs a/DynamoDbEncryption/runtimes/net/Generated/DynamoDbEncryptionTransforms/TypeConversion.cs
index 2f95341..36226d3 100644
index b7d2a823..0c973183 100644
--- b/DynamoDbEncryption/runtimes/net/Generated/DynamoDbEncryptionTransforms/TypeConversion.cs
+++ a/DynamoDbEncryption/runtimes/net/Generated/DynamoDbEncryptionTransforms/TypeConversion.cs
@@ -7,10 +7,6 @@ namespace AWS.Cryptography.DbEncryptionSDK.DynamoDb.Transforms
Expand All @@ -10,6 +10,6 @@ index 2f95341..36226d3 100644
-
- private const string ISO8601DateFormatNoMS = "yyyy-MM-dd\\THH:mm:ss\\Z";
-
public static AWS.Cryptography.DbEncryptionSDK.DynamoDb.DynamoDbTablesEncryptionConfig FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__S30_DynamoDbTablesEncryptionConfig(software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types._IDynamoDbTablesEncryptionConfig value)
public static AWS.Cryptography.DbEncryptionSDK.DynamoDb.AsSet FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__S5_AsSet(software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types._IAsSet value)
{
software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types.DynamoDbTablesEncryptionConfig concrete = (software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types.DynamoDbTablesEncryptionConfig)value; AWS.Cryptography.DbEncryptionSDK.DynamoDb.DynamoDbTablesEncryptionConfig converted = new AWS.Cryptography.DbEncryptionSDK.DynamoDb.DynamoDbTablesEncryptionConfig(); converted.TableEncryptionConfigs = (System.Collections.Generic.Dictionary<string, AWS.Cryptography.DbEncryptionSDK.DynamoDb.DynamoDbTableEncryptionConfig>)FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__S30_DynamoDbTablesEncryptionConfig__M22_tableEncryptionConfigs(concrete._tableEncryptionConfigs); return converted;
software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types.AsSet concrete = (software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types.AsSet)value; AWS.Cryptography.DbEncryptionSDK.DynamoDb.AsSet converted = new AWS.Cryptography.DbEncryptionSDK.DynamoDb.AsSet(); return converted;
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
diff --git b/DynamoDbEncryption/runtimes/net/Generated/DynamoDbItemEncryptor/TypeConversion.cs a/DynamoDbEncryption/runtimes/net/Generated/DynamoDbItemEncryptor/TypeConversion.cs
index da904fc..c5b0bed 100644
index b4a90d1b..b5d5046a 100644
--- b/DynamoDbEncryption/runtimes/net/Generated/DynamoDbItemEncryptor/TypeConversion.cs
+++ a/DynamoDbEncryption/runtimes/net/Generated/DynamoDbItemEncryptor/TypeConversion.cs
@@ -7,10 +7,6 @@ namespace AWS.Cryptography.DbEncryptionSDK.DynamoDb.ItemEncryptor
Expand All @@ -10,6 +10,6 @@ index da904fc..c5b0bed 100644
-
- private const string ISO8601DateFormatNoMS = "yyyy-MM-dd\\THH:mm:ss\\Z";
-
public static AWS.Cryptography.DbEncryptionSDK.DynamoDb.ItemEncryptor.DecryptItemInput FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__N13_itemEncryptor__S16_DecryptItemInput(software.amazon.cryptography.dbencryptionsdk.dynamodb.itemencryptor.internaldafny.types._IDecryptItemInput value)
public static System.Collections.Generic.Dictionary<string, AWS.Cryptography.DbEncryptionSDK.StructuredEncryption.CryptoAction> FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__S16_AttributeActions(Dafny.IMap<Dafny.ISequence<char>, software.amazon.cryptography.dbencryptionsdk.structuredencryption.internaldafny.types._ICryptoAction> value)
{
software.amazon.cryptography.dbencryptionsdk.dynamodb.itemencryptor.internaldafny.types.DecryptItemInput concrete = (software.amazon.cryptography.dbencryptionsdk.dynamodb.itemencryptor.internaldafny.types.DecryptItemInput)value; AWS.Cryptography.DbEncryptionSDK.DynamoDb.ItemEncryptor.DecryptItemInput converted = new AWS.Cryptography.DbEncryptionSDK.DynamoDb.ItemEncryptor.DecryptItemInput(); converted.EncryptedItem = (System.Collections.Generic.Dictionary<string, Amazon.DynamoDBv2.Model.AttributeValue>)FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__N13_itemEncryptor__S16_DecryptItemInput__M13_encryptedItem(concrete._encryptedItem); return converted;
return value.ItemEnumerable.ToDictionary(pair => FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__S16_AttributeActions__M3_key(pair.Car), pair => FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N8_dynamoDb__S16_AttributeActions__M5_value(pair.Cdr));
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
diff --git b/DynamoDbEncryption/runtimes/net/Generated/StructuredEncryption/TypeConversion.cs a/DynamoDbEncryption/runtimes/net/Generated/StructuredEncryption/TypeConversion.cs
index d0a4e58..4e9890c 100644
index df81f311..ac28fc2a 100644
--- b/DynamoDbEncryption/runtimes/net/Generated/StructuredEncryption/TypeConversion.cs
+++ a/DynamoDbEncryption/runtimes/net/Generated/StructuredEncryption/TypeConversion.cs
@@ -7,10 +7,6 @@ namespace AWS.Cryptography.DbEncryptionSDK.StructuredEncryption
Expand All @@ -10,6 +10,6 @@ index d0a4e58..4e9890c 100644
-
- private const string ISO8601DateFormatNoMS = "yyyy-MM-dd\\THH:mm:ss\\Z";
-
public static AWS.Cryptography.DbEncryptionSDK.StructuredEncryption.AuthenticateAction FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N20_structuredEncryption__S18_AuthenticateAction(software.amazon.cryptography.dbencryptionsdk.structuredencryption.internaldafny.types._IAuthenticateAction value)
public static AWS.Cryptography.Primitives.AtomicPrimitives FromDafny_N3_aws__N12_cryptography__N15_dbEncryptionSdk__N20_structuredEncryption__S25_AtomicPrimitivesReference(software.amazon.cryptography.primitives.internaldafny.types.IAwsCryptographicPrimitivesClient value)
{
if (value.is_SIGN) return AWS.Cryptography.DbEncryptionSDK.StructuredEncryption.AuthenticateAction.SIGN;
if (value is software.amazon.cryptography.primitives.internaldafny.types.IAwsCryptographicPrimitivesClient dafnyValue)
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,88 @@ module {:extern "software.amazon.cryptography.dbencryptionsdk.dynamodb.internald
nameonly compoundBeacons: Option<CompoundBeaconList> := Option.None ,
nameonly virtualFields: Option<VirtualFieldList> := Option.None ,
nameonly encryptedParts: Option<EncryptedPartsList> := Option.None ,
nameonly signedParts: Option<SignedPartsList> := Option.None
nameonly signedParts: Option<SignedPartsList> := Option.None ,
nameonly maximumNumberOfBuckets: Option<BucketCount> := Option.None ,
nameonly defaultNumberOfBuckets: Option<BucketCount> := Option.None ,
nameonly bucketSelector: Option<IBucketSelector> := Option.None
)
type BeaconVersionList = x: seq<BeaconVersion> | IsValid_BeaconVersionList(x) witness *
predicate method IsValid_BeaconVersionList(x: seq<BeaconVersion>) {
( 1 <= |x| <= 1 )
}
type BucketCount = x: int32 | IsValid_BucketCount(x) witness *
predicate method IsValid_BucketCount(x: int32) {
( 1 <= x <= 255 )
}
type BucketNumber = x: int32 | IsValid_BucketNumber(x) witness *
predicate method IsValid_BucketNumber(x: int32) {
( 0 <= x <= 254 )
}
class IBucketSelectorCallHistory {
ghost constructor() {
GetBucketNumber := [];
}
ghost var GetBucketNumber: seq<DafnyCallEvent<GetBucketNumberInput, Result<GetBucketNumberOutput, Error>>>
}
trait {:termination false} IBucketSelector
{
// Helper to define any additional modifies/reads clauses.
// If your operations need to mutate state,
// add it in your constructor function:
// Modifies := {your, fields, here, History};
// If you do not need to mutate anything:
// Modifies := {History};

ghost const Modifies: set<object>
// For an unassigned field defined in a trait,
// Dafny can only assign a value in the constructor.
// This means that for Dafny to reason about this value,
// it needs some way to know (an invariant),
// about the state of the object.
// This builds on the Valid/Repr paradigm
// To make this kind requires safe to add
// to methods called from unverified code,
// the predicate MUST NOT take any arguments.
// This means that the correctness of this requires
// MUST only be evaluated by the class itself.
// If you require any additional mutation,
// then you MUST ensure everything you need in ValidState.
// You MUST also ensure ValidState in your constructor.
predicate ValidState()
ensures ValidState() ==> History in Modifies
ghost const History: IBucketSelectorCallHistory
predicate GetBucketNumberEnsuresPublicly(input: GetBucketNumberInput , output: Result<GetBucketNumberOutput, Error>)
// The public method to be called by library consumers
method GetBucketNumber ( input: GetBucketNumberInput )
returns (output: Result<GetBucketNumberOutput, Error>)
requires
&& ValidState()
modifies Modifies - {History} ,
History`GetBucketNumber
// Dafny will skip type parameters when generating a default decreases clause.
decreases Modifies - {History}
ensures
&& ValidState()
ensures GetBucketNumberEnsuresPublicly(input, output)
ensures History.GetBucketNumber == old(History.GetBucketNumber) + [DafnyCallEvent(input, output)]
{
output := GetBucketNumber' (input);
History.GetBucketNumber := History.GetBucketNumber + [DafnyCallEvent(input, output)];
}
// The method to implement in the concrete class.
method GetBucketNumber' ( input: GetBucketNumberInput )
returns (output: Result<GetBucketNumberOutput, Error>)
requires
&& ValidState()
modifies Modifies - {History}
// Dafny will skip type parameters when generating a default decreases clause.
decreases Modifies - {History}
ensures
&& ValidState()
ensures GetBucketNumberEnsuresPublicly(input, output)
ensures unchanged(History)

}
type Char = x: string | IsValid_Char(x) witness *
predicate method IsValid_Char(x: string) {
( 1 <= |x| <= 1 )
Expand Down Expand Up @@ -272,6 +348,13 @@ module {:extern "software.amazon.cryptography.dbencryptionsdk.dynamodb.internald
datatype GetBranchKeyIdFromDdbKeyOutput = | GetBranchKeyIdFromDdbKeyOutput (
nameonly branchKeyId: string
)
datatype GetBucketNumberInput = | GetBucketNumberInput (
nameonly item: ComAmazonawsDynamodbTypes.AttributeMap ,
nameonly numberOfBuckets: BucketCount
)
datatype GetBucketNumberOutput = | GetBucketNumberOutput (
nameonly bucketNumber: BucketNumber
)
datatype GetEncryptedDataKeyDescriptionInput = | GetEncryptedDataKeyDescriptionInput (
nameonly input: GetEncryptedDataKeyDescriptionUnion
)
Expand Down Expand Up @@ -397,7 +480,8 @@ module {:extern "software.amazon.cryptography.dbencryptionsdk.dynamodb.internald
nameonly name: string ,
nameonly length: BeaconBitLength ,
nameonly loc: Option<TerminalLocation> := Option.None ,
nameonly style: Option<BeaconStyle> := Option.None
nameonly style: Option<BeaconStyle> := Option.None ,
nameonly numberOfBuckets: Option<BucketCount> := Option.None
)
type StandardBeaconList = x: seq<StandardBeacon> | IsValid_StandardBeaconList(x) witness *
predicate method IsValid_StandardBeaconList(x: seq<StandardBeacon>) {
Expand Down
Loading
Loading