Skip to content

Commit 0c27b17

Browse files
auto commit
1 parent 9efb7f8 commit 0c27b17

File tree

2 files changed

+130
-1
lines changed
  • DynamoDbEncryption/runtimes/go/ImplementationFromDafny-go
  • TestVectors/runtimes/go/TestsFromDafny-go

2 files changed

+130
-1
lines changed
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package the_program
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/aws/aws-database-encryption-sdk-dynamodb/awscryptographydbencryptionsdkdynamodbsmithygeneratedtypes"
8+
"github.com/aws/aws-database-encryption-sdk-dynamodb/awscryptographydbencryptionsdkdynamodbtransformssmithygenerated"
9+
"github.com/aws/aws-database-encryption-sdk-dynamodb/awscryptographydbencryptionsdkdynamodbtransformssmithygeneratedtypes"
10+
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
11+
"github.com/aws/smithy-go/middleware"
12+
)
13+
14+
// DbEsdkInterceptor handles encryption/decryption of DynamoDB items
15+
type DbEsdkMiddleware struct {
16+
client *awscryptographydbencryptionsdkdynamodbtransformssmithygenerated.Client
17+
originalRequests map[string]interface{}
18+
}
19+
20+
func NewDbEsdkMiddleware(config awscryptographydbencryptionsdkdynamodbsmithygeneratedtypes.DynamoDbTablesEncryptionConfig) (*DbEsdkMiddleware, error) {
21+
client, err := awscryptographydbencryptionsdkdynamodbtransformssmithygenerated.NewClient(config)
22+
if err != nil {
23+
return nil, err
24+
}
25+
return &DbEsdkMiddleware{
26+
client: client,
27+
originalRequests: make(map[string]interface{}),
28+
}, nil
29+
}
30+
31+
func (m DbEsdkMiddleware) CreateMiddleware() func(options *dynamodb.Options) {
32+
return func(options *dynamodb.Options) {
33+
options.APIOptions = append(options.APIOptions, func(stack *middleware.Stack) error {
34+
// Add request interceptor at the beginning of Initialize step
35+
requestIntercetor := m.createRequestInterceptor()
36+
if err := stack.Initialize.Add(requestIntercetor, middleware.Before); err != nil {
37+
return err
38+
}
39+
// Add response interceptor at the end of Finalize step
40+
return stack.Finalize.Add(m.createResponseInterceptor(), middleware.After)
41+
})
42+
}
43+
}
44+
45+
func (m DbEsdkMiddleware) createRequestInterceptor() middleware.InitializeMiddleware {
46+
return middleware.InitializeMiddlewareFunc("RequestInterceptor", func(
47+
ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,
48+
) (
49+
out middleware.InitializeOutput, metadata middleware.Metadata, err error,
50+
) {
51+
m.handleRequestInterception(ctx, in.Parameters)
52+
return next.HandleInitialize(ctx, in)
53+
})
54+
}
55+
56+
// handleRequestInterception handles the interception logic before the DynamoDB operation
57+
func (m DbEsdkMiddleware) handleRequestInterception(ctx context.Context, params interface{}) context.Context {
58+
if v, ok := params.(*dynamodb.PutItemInput); ok {
59+
ctx = middleware.WithStackValue(ctx, "originalInput", v)
60+
transformedRequest, err := m.client.PutItemInputTransform(context.TODO(), awscryptographydbencryptionsdkdynamodbtransformssmithygeneratedtypes.PutItemInputTransformInput{
61+
SdkInput: *v,
62+
})
63+
if err != nil {
64+
fmt.Println(err)
65+
}
66+
*v = transformedRequest.TransformedInput
67+
}
68+
if v, ok := params.(*dynamodb.BatchExecuteStatementInput); ok {
69+
BatchExecuteStatementInputTransformOutput, err := m.client.BatchExecuteStatementInputTransform(context.TODO(), awscryptographydbencryptionsdkdynamodbtransformssmithygeneratedtypes.BatchExecuteStatementInputTransformInput{
70+
SdkInput: *v,
71+
})
72+
if err != nil {
73+
fmt.Println(err)
74+
}
75+
*v = BatchExecuteStatementInputTransformOutput.TransformedInput
76+
}
77+
return ctx
78+
}
79+
80+
// createResponseInterceptor creates and returns the middleware interceptor for responses
81+
func (m DbEsdkMiddleware) createResponseInterceptor() middleware.FinalizeMiddleware {
82+
return middleware.FinalizeMiddlewareFunc("ResponseInterceptor", func(
83+
ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,
84+
) (
85+
out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
86+
) {
87+
// First let the request complete
88+
result, metadata, err := next.HandleFinalize(ctx, in)
89+
if err != nil {
90+
return result, metadata, err
91+
}
92+
// Then intercept the response
93+
m.handleResponseInterception(ctx, result.Result)
94+
return result, metadata, err
95+
})
96+
}
97+
98+
// handleResponseInterception handles the interception logic after the DynamoDB operation
99+
func (m DbEsdkMiddleware) handleResponseInterception(ctx context.Context, response interface{}) {
100+
if v, ok := response.(*dynamodb.PutItemOutput); ok {
101+
fmt.Println(ctx.Value("originalInput").(dynamodb.PutItemInput))
102+
transformedRequest, err := m.client.PutItemOutputTransform(context.TODO(), awscryptographydbencryptionsdkdynamodbtransformssmithygeneratedtypes.PutItemOutputTransformInput{
103+
OriginalInput: m.originalRequests["PutItemInput"].(dynamodb.PutItemInput),
104+
SdkOutput: *v,
105+
})
106+
if err != nil {
107+
fmt.Println(err)
108+
}
109+
*v = transformedRequest.TransformedOutput
110+
}
111+
// if getItemOutput, ok := response.(*dynamodb.GetItemOutput); ok {
112+
// fmt.Println("GetItemOutput Response intercepted:")
113+
// if age, ok := getItemOutput.Item["Age"].(*types.AttributeValueMemberN); ok {
114+
// fmt.Println("Age:", age.Value)
115+
// }
116+
// if id, ok := getItemOutput.Item["ID"].(*types.AttributeValueMemberN); ok {
117+
// fmt.Println("ID:", id.Value)
118+
// }
119+
// if name, ok := getItemOutput.Item["Name"].(*types.AttributeValueMemberS); ok {
120+
// fmt.Println("Name:", name.Value)
121+
// }
122+
// if intercepted, ok := getItemOutput.Item["intercepted attribute"].(*types.AttributeValueMemberS); ok {
123+
// fmt.Println("intercepted attribute:", intercepted.Value)
124+
// }
125+
// getItemOutput.Item["intercepted attribute"] = &types.AttributeValueMemberS{Value: "I read your data "}
126+
// // You can modify the response here if needed
127+
// }
128+
}

TestVectors/runtimes/go/TestsFromDafny-go/go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ require (
2626
)
2727

2828
require (
29+
github.com/aws/aws-sdk-go v1.55.6 // indirect
2930
github.com/aws/aws-sdk-go-v2 v1.32.8 // indirect
3031
github.com/aws/aws-sdk-go-v2/config v1.28.10 // indirect
3132
github.com/aws/aws-sdk-go-v2/credentials v1.17.51 // indirect
@@ -44,4 +45,4 @@ require (
4445
github.com/aws/smithy-go v1.22.1 // indirect
4546
github.com/google/uuid v1.6.0 // indirect
4647
github.com/jmespath/go-jmespath v0.4.0 // indirect
47-
)
48+
)

0 commit comments

Comments
 (0)