Skip to content

Commit d04ddc0

Browse files
chore(test vectors): Add interop test in Go with CI (#731)
1 parent d66248b commit d04ddc0

File tree

10 files changed

+376
-15
lines changed

10 files changed

+376
-15
lines changed

.github/workflows/library_go_tests.yml

+17-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
strategy:
2020
fail-fast: false
2121
matrix:
22-
library: [AwsEncryptionSDK]
22+
library: [AwsEncryptionSDK, TestVectors]
2323
go-version: [ "1.23" ]
2424
os: [
2525
# Sed script doesn't work properly on windows
@@ -74,6 +74,22 @@ jobs:
7474
# This works because `node` is installed by default on GHA runners
7575
CORES=$(node -e 'console.log(os.cpus().length)')
7676
make transpile_go CORES=$CORES
77+
78+
- name: Unzip .NET Retry Flag Manifests
79+
shell: bash
80+
working-directory: TestVectors/dafny/TestVectors/test/
81+
run: |
82+
unzip invalid-Net-4.0.0.zip -d invalid-Net-4.0.0
83+
unzip v4-Net-4.0.1.zip -d v4-Net-4.0.1
84+
unzip valid-Net-4.0.0.zip -d valid-Net-4.0.0
85+
86+
# TODO: Remove this after Go polymorph does not generate unwanted duplicate code.
87+
- name: Purge polymorph code in Go
88+
if: matrix.library == 'TestVectors'
89+
working-directory: ./${{ matrix.library }}
90+
shell: bash
91+
run: |
92+
make purge_polymorph_code
7793
7894
- name: Test Go
7995
working-directory: ${{ matrix.library }}

.github/workflows/library_interop_test_vectors.yml

+61-9
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
ubuntu-latest,
2626
macos-13,
2727
]
28-
language: [java, net, rust]
28+
language: [java, net, rust, go]
2929
# https://taskei.amazon.dev/tasks/CrypTool-5284
3030
dotnet-version: ["6.0.x"]
3131
runs-on: ${{ matrix.os }}
@@ -43,7 +43,7 @@ jobs:
4343
uses: aws-actions/configure-aws-credentials@v2
4444
with:
4545
aws-region: us-west-2
46-
role-to-assume: arn:aws:iam::370957321024:role/GitHub-CI-Public-ESDK-Dafny-Role-us-west-2
46+
role-to-assume: arn:aws:iam::370957321024:role/GitHub-CI-Public-ESDK-Dafny-Role-us-west-2
4747
role-session-name: InterOpTests
4848

4949
- uses: actions/checkout@v3
@@ -75,7 +75,7 @@ jobs:
7575
# TODO - uncomment this after Rust formatter works
7676
# - name: Rustfmt Check
7777
# uses: actions-rust-lang/rustfmt@v1
78-
78+
7979
# TODO: Remove this after the formatting in Rust starts working
8080
- name: smithy-dafny Rust hacks
8181
if: matrix.language == 'rust'
@@ -87,6 +87,15 @@ jobs:
8787
sed -i 's|rustfmt --edition 2021 runtimes/rust/src/implementation_from_dafny.rs|#&|' mpl/smithy-dafny/SmithyDafnyMakefile.mk
8888
fi
8989
90+
- name: Setup Go
91+
uses: actions/setup-go@v5
92+
with:
93+
go-version: "1.23"
94+
95+
- name: Install Go imports
96+
run: |
97+
go install golang.org/x/tools/cmd/goimports@latest
98+
9099
- name: Setup NASM for Windows in Rust (aws-lc-sys)
91100
if: matrix.language == 'rust' && matrix.os == 'windows-latest'
92101
uses: ilammy/setup-nasm@v1
@@ -122,26 +131,43 @@ jobs:
122131
# This works because `node` is installed by default on GHA runners
123132
CORES=$(node -e 'console.log(os.cpus().length)')
124133
make transpile_net
125-
134+
126135
- name: Install Smithy-Dafny codegen dependencies
127136
if: matrix.language == 'rust'
128137
uses: ./.github/actions/install_smithy_dafny_codegen_dependencies
129-
138+
130139
# TODO: Remove this after checking in Rust polymorph code
131140
- name: Run make polymorph_rust
132141
if: matrix.language == 'rust'
133142
shell: bash
134143
working-directory: ./${{ matrix.library }}
135144
run: |
136145
make polymorph_rust
137-
146+
138147
- name: Build ${{ matrix.library }} implementation in Rust
139148
if: matrix.language == 'rust'
140149
shell: bash
141150
working-directory: ./${{ matrix.library }}
142151
run: |
143152
CORES=$(node -e 'console.log(os.cpus().length)')
144153
make transpile_rust CORES=$CORES
154+
155+
- name: Build ${{ matrix.library }} implementation in Go
156+
if: matrix.language == 'go'
157+
shell: bash
158+
working-directory: ./${{ matrix.library }}
159+
run: |
160+
# This works because `node` is installed by default on GHA runners
161+
CORES=$(node -e 'console.log(os.cpus().length)')
162+
make transpile_go
163+
164+
# TODO: Remove this after Go polymorph does not generate unwanted duplicate code.
165+
- name: Purge polymorph code in Go
166+
if: matrix.language == 'go'
167+
shell: bash
168+
working-directory: ./${{ matrix.library }}
169+
run: |
170+
make purge_polymorph_code
145171
146172
- name: Setup gradle
147173
if: matrix.language == 'java'
@@ -177,8 +203,8 @@ jobs:
177203
ubuntu-latest,
178204
macos-13,
179205
]
180-
encrypting_language: [java, net, rust]
181-
decrypting_language: [java, net, rust]
206+
encrypting_language: [java, net, rust, go]
207+
decrypting_language: [java, net, rust, go]
182208
# https://taskei.amazon.dev/tasks/CrypTool-5284
183209
dotnet-version: ["6.0.x"]
184210
runs-on: ${{ matrix.os }}
@@ -240,6 +266,15 @@ jobs:
240266
sed -i 's|rustfmt --edition 2021 runtimes/rust/src/implementation_from_dafny.rs|#&|' mpl/smithy-dafny/SmithyDafnyMakefile.mk
241267
fi
242268
269+
- name: Setup Go
270+
uses: actions/setup-go@v5
271+
with:
272+
go-version: "1.23"
273+
274+
- name: Install Go imports
275+
run: |
276+
go install golang.org/x/tools/cmd/goimports@latest
277+
243278
- name: Setup NASM for Windows in Rust (aws-lc-sys)
244279
if: matrix.decrypting_language == 'rust' && matrix.os == 'windows-latest'
245280
uses: ilammy/setup-nasm@v1
@@ -279,7 +314,7 @@ jobs:
279314
- name: Install Smithy-Dafny codegen dependencies
280315
if: matrix.decrypting_language == 'rust'
281316
uses: ./.github/actions/install_smithy_dafny_codegen_dependencies
282-
317+
283318
# TODO: Remove this after checking in Rust polymorph code
284319
- name: Run make polymorph_rust
285320
if: matrix.decrypting_language == 'rust'
@@ -295,6 +330,23 @@ jobs:
295330
run: |
296331
CORES=$(node -e 'console.log(os.cpus().length)')
297332
make transpile_rust CORES=$CORES
333+
334+
- name: Build ${{ matrix.library }} implementation in Go
335+
if: matrix.decrypting_language == 'go'
336+
shell: bash
337+
working-directory: ./${{ matrix.library }}
338+
run: |
339+
# This works because `node` is installed by default on GHA runners
340+
CORES=$(node -e 'console.log(os.cpus().length)')
341+
make transpile_go
342+
343+
# TODO: Remove this after Go polymorph does not generate unwanted duplicate code.
344+
- name: Purge polymorph code in Go
345+
if: matrix.decrypting_language == 'go'
346+
shell: bash
347+
working-directory: ./${{ matrix.library }}
348+
run: |
349+
make purge_polymorph_code
298350
299351
- name: Download Encrypt Manifest Artifact
300352
uses: actions/download-artifact@v4

TestVectors/Makefile

+74-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
CORES=2
5-
5+
ENABLE_EXTERN_PROCESSING=1
66
TRANSPILE_TESTS_IN_RUST=1
77

88
include ../SharedMakefileV2.mk
@@ -101,6 +101,10 @@ IMPLEMENTATION_FROM_DAFNY_TV_RUST_ESDK_MAIN= \
101101
let dafny_args = dafny_runtime::Sequence::from_array_owned(dafny_strings);\
102102
r\#_WrappedESDKMain_Compile::_default::Main2(\&dafny_args);"
103103

104+
IMPLEMENTATION_FROM_DAFNY_TV_GO_FILE=runtimes/go/ImplementationFromDafny-go/ImplementationFromDafny.go
105+
IMPLEMENTATION_FROM_DAFNY_TV_GO_MPL_MAIN="m_WrappedMaterialProvidersMain.Companion_Default___.Main(_dafny.FromMainArguments(os.Args))"
106+
IMPLEMENTATION_FROM_DAFNY_TV_GO_ESDK_MAIN="m_WrappedESDKMain.Companion_Default___.Main2(_dafny.FromMainArguments(os.Args))"
107+
104108
# TODO: Remove after wrapped client issue is fixed in Rust
105109
REMOVE_WRAPPED_CLIENT_AFTER_POLYMORPH_RUST_PRIMITIVES=runtimes/rust/src/deps/aws_cryptography_primitives.rs
106110
REMOVE_WRAPPED_CLIENT_AFTER_POLYMORPH_RUST_KEYSTORE=runtimes/rust/src/deps/aws_cryptography_keyStore.rs
@@ -109,9 +113,54 @@ REMOVE_WRAPPED_CLIENT_AFTER_POLYMORPH_RUST_FROM_2 := 'pub mod wrapped;'
109113
REMOVE_WRAPPED_CLIENT_AFTER_POLYMORPH_RUST_TO_1 := '\/\/ removed wrapped-client feature using sed;'
110114
REMOVE_WRAPPED_CLIENT_AFTER_POLYMORPH_RUST_TO_2 := '\/\/ removed wrapped module using sed;'
111115

116+
# Go
117+
118+
GO_MODULE_NAME="github.com/aws/aws-encryption-sdk/testvectors"
119+
120+
GO_DEPENDENCY_MODULE_NAMES := \
121+
--dependency-library-name=aws.cryptography.encryptionSdk=github.com/aws/aws-encryption-sdk \
122+
--dependency-library-name=com.amazonaws.dynamodb=github.com/aws/aws-cryptographic-material-providers-library/dynamodb \
123+
--dependency-library-name=com.amazonaws.kms=github.com/aws/aws-cryptographic-material-providers-library/kms \
124+
--dependency-library-name=aws.cryptography.keyStore=github.com/aws/aws-cryptographic-material-providers-library/mpl \
125+
--dependency-library-name=aws.cryptography.primitives=github.com/aws/aws-cryptographic-material-providers-library/primitives \
126+
--dependency-library-name=aws.cryptography.materialProviders=github.com/aws/aws-cryptographic-material-providers-library/mpl \
127+
--dependency-library-name=sdk.com.amazonaws.dynamodb=github.com/aws/aws-sdk-go-v2/service/dynamodb \
128+
--dependency-library-name=sdk.com.amazonaws.kms=github.com/aws/aws-sdk-go-v2/service/kms
129+
130+
TRANSLATION_RECORD_GO := \
131+
AwsEncryptionSDK/runtimes/go/ImplementationFromDafny-go/ImplementationFromDafny-go.dtr \
132+
mpl/StandardLibrary/runtimes/go/ImplementationFromDafny-go/ImplementationFromDafny-go.dtr \
133+
mpl/ComAmazonawsKms/runtimes/go/ImplementationFromDafny-go/ImplementationFromDafny-go.dtr \
134+
mpl/ComAmazonawsDynamodb/runtimes/go/ImplementationFromDafny-go/ImplementationFromDafny-go.dtr \
135+
mpl/AwsCryptographyPrimitives/runtimes/go/ImplementationFromDafny-go/ImplementationFromDafny-go.dtr \
136+
mpl/AwsCryptographicMaterialProviders/runtimes/go/ImplementationFromDafny-go/ImplementationFromDafny-go.dtr \
137+
mpl/TestVectorsAwsCryptographicMaterialProviders/runtimes/go/ImplementationFromDafny-go/ImplementationFromDafny-go.dtr
138+
139+
# Constants for languages that drop extern names (Go)
140+
141+
WRAPPED_INDEX_FILE_PATH=dafny/TestVectors/src/LibraryIndex.dfy
142+
WRAPPED_INDEX_FILE_WITH_EXTERN_STRING="module {:extern \"software.amazon.cryptography.encryptionsdk.internaldafny.wrapped\" } WrappedESDK refines WrappedAbstractAwsCryptographyEncryptionSdkService"
143+
WRAPPED_INDEX_FILE_WITHOUT_EXTERN_STRING="module WrappedESDK refines WrappedAbstractAwsCryptographyEncryptionSdkService"
144+
112145
transpile_implementation_java: _replace_main_method_name_java
113146
transpile_implementation_net: _replace_main_method_name_net
114147
transpile_implementation_rust: _replace_main_method_name_rust
148+
transpile_implementation_go: _replace_main_method_name_go
149+
150+
_polymorph_go: purge_polymorph_code
151+
152+
# Smithy-dafny generated shim needs a long term fix.
153+
# TODO: Remove this commands once smithy-dafny is fixed
154+
# This commands does not work on windows
155+
# https://taskei.amazon.dev/tasks/CrypTool-5283
156+
purge_polymorph_code:
157+
find .. -name "shim.go" | xargs sed -i $(SED_PARAMETER) 's/(_static \*CompanionStruct_Default___)//g'
158+
rm -rf runtimes/go/ImplementationFromDafny-go/awscryptographyencryptionsdksmithygenerated \
159+
runtimes/go/ImplementationFromDafny-go/awscryptographyencryptionsdksmithygeneratedtypes \
160+
runtimes/go/ImplementationFromDafny-go/WrappedAwsCryptographyEncryptionSdkService \
161+
runtimes/go/TestsFromDafny-go/awscryptographyencryptionsdksmithygenerated \
162+
runtimes/go/TestsFromDafny-go/awscryptographyencryptionsdksmithygeneratedtypes \
163+
runtimes/go/TestsFromDafny-go/WrappedAwsCryptographyEncryptionSdkService
115164

116165
# TODO: Remove after wrapped client issue is fixed in Rust
117166
_polymorph_rust: _remove_wrapped_client_rust
@@ -125,6 +174,9 @@ _replace_main_method_name_net:
125174
_replace_main_method_name_rust:
126175
$(MAKE) _sed_file SED_FILE_PATH=$(IMPLEMENTATION_FROM_DAFNY_TV_RUST_FILE) SED_BEFORE_STRING=$(IMPLEMENTATION_FROM_DAFNY_TV_RUST_MPL_MAIN) SED_AFTER_STRING=$(IMPLEMENTATION_FROM_DAFNY_TV_RUST_ESDK_MAIN)
127176

177+
_replace_main_method_name_go:
178+
$(MAKE) _sed_file SED_FILE_PATH=$(IMPLEMENTATION_FROM_DAFNY_TV_GO_FILE) SED_BEFORE_STRING=$(IMPLEMENTATION_FROM_DAFNY_TV_GO_MPL_MAIN) SED_AFTER_STRING=$(IMPLEMENTATION_FROM_DAFNY_TV_GO_ESDK_MAIN)
179+
128180
# TODO: Remove after wrapped client issue is fixed in Rust
129181
_remove_wrapped_client_rust:
130182
$(MAKE) _sed_file SED_FILE_PATH=$(REMOVE_WRAPPED_CLIENT_AFTER_POLYMORPH_RUST_PRIMITIVES) SED_BEFORE_STRING=$(REMOVE_WRAPPED_CLIENT_AFTER_POLYMORPH_RUST_FROM_1) SED_AFTER_STRING=$(REMOVE_WRAPPED_CLIENT_AFTER_POLYMORPH_RUST_TO_1)
@@ -150,6 +202,10 @@ test_generate_vectors_rust:
150202
cd ../../
151203
cp dafny/TestVectors/test/keys.json runtimes/rust/
152204

205+
test_generate_vectors_go:
206+
go -C runtimes/go/ImplementationFromDafny-go run ImplementationFromDafny.go encrypt-manifest --encrypt-manifest-output ../
207+
cp dafny/TestVectors/test/keys.json runtimes/go
208+
153209
test_encrypt_vectors_java:
154210
gradle -p runtimes/java run --args="encrypt --manifest-path . --decrypt-manifest-path ."
155211

@@ -164,6 +220,9 @@ test_encrypt_vectors_rust:
164220
cargo run --bin test-vectors --features="wrapped-client" --release -- encrypt --manifest-path . --decrypt-manifest-path . && \
165221
cd ../../
166222

223+
test_encrypt_vectors_go:
224+
go -C runtimes/go/ImplementationFromDafny-go run ImplementationFromDafny.go encrypt --manifest-path=.. --decrypt-manifest-path=..
225+
167226
test_decrypt_encrypt_vectors_java:
168227
gradle -p runtimes/java run --args="decrypt --manifest-path . --manifest-name decrypt-manifest.json"
169228

@@ -184,6 +243,20 @@ test_decrypt_encrypt_vectors_rust:
184243
cargo run --bin test-vectors --features="wrapped-client" --release -- decrypt --manifest-path . --manifest-name decrypt-manifest.json && \
185244
cd ../../
186245

246+
test_decrypt_encrypt_vectors_go:
247+
go -C runtimes/go/ImplementationFromDafny-go run ImplementationFromDafny.go decrypt --manifest-path=.. --manifest-name=decrypt-manifest.json
248+
187249
_polymorph_dependencies:
188250
@echo "No polymorphing of dependency"
189251

252+
_sed_types_file_remove_extern:
253+
@echo "No extern to process for ESDK TestVectors"
254+
255+
_sed_index_file_remove_extern:
256+
@echo "No extern to process for ESDK TestVectors"
257+
258+
_sed_types_file_add_extern:
259+
@echo "No extern to process for ESDK TestVectors"
260+
261+
_sed_index_file_add_extern:
262+
@echo "No extern to process for ESDK TestVectors"

TestVectors/dafny/TestVectors/src/LibraryIndex.dfy

+2-4
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33

44
include "../Model/AwsCryptographyEncryptionSdkTypesWrapped.dfy"
55

6-
module
7-
{:extern "software.amazon.cryptography.encryptionsdk.internaldafny.wrapped" }
8-
WrappedESDK refines WrappedAbstractAwsCryptographyEncryptionSdkService
6+
module {:extern "software.amazon.cryptography.encryptionsdk.internaldafny.wrapped" } WrappedESDK refines WrappedAbstractAwsCryptographyEncryptionSdkService
97
{
108
import WrappedService = ESDK
119

@@ -51,4 +49,4 @@ module
5149
netV4_0_0_RetryPolicy := Some(netV4_0_0_RetryPolicy)
5250
)
5351
}
54-
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package WrappedESDK
2+
3+
import (
4+
"github.com/aws/aws-encryption-sdk/AwsCryptographyEncryptionSdkTypes"
5+
"github.com/aws/aws-encryption-sdk/test/WrappedAwsCryptographyEncryptionSdkService"
6+
"github.com/dafny-lang/DafnyStandardLibGo/Wrappers"
7+
)
8+
9+
func (_static CompanionStruct_Default___) WrappedESDK(config AwsCryptographyEncryptionSdkTypes.AwsEncryptionSdkConfig) Wrappers.Result {
10+
return WrappedAwsCryptographyEncryptionSdkService.WrappedESDK(config)
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
module github.com/aws/aws-encryption-sdk/testvectors
2+
3+
go 1.23.2
4+
5+
replace (
6+
github.com/aws/aws-cryptographic-material-providers-library/dynamodb v0.0.0 => ../../../../mpl/ComAmazonawsDynamodb/runtimes/go/ImplementationFromDafny-go/
7+
github.com/aws/aws-cryptographic-material-providers-library/kms v0.0.0 => ../../../../mpl/ComAmazonawsKms/runtimes/go/ImplementationFromDafny-go/
8+
github.com/aws/aws-cryptographic-material-providers-library/mpl v0.0.0 => ../../../../mpl/AwsCryptographicMaterialProviders/runtimes/go/ImplementationFromDafny-go/
9+
github.com/aws/aws-cryptographic-material-providers-library/primitives v0.0.0 => ../../../../mpl/AwsCryptographyPrimitives/runtimes/go/ImplementationFromDafny-go/
10+
github.com/aws/aws-cryptographic-material-providers-library/testvectors v0.0.0 => ../../../../mpl/TestVectorsAwsCryptographicMaterialProviders/runtimes/go/ImplementationFromDafny-go/
11+
github.com/aws/aws-encryption-sdk v0.0.0 => ../../../../AwsEncryptionSDK/runtimes/go/ImplementationFromDafny-go/
12+
github.com/aws/aws-encryption-sdk/test v0.0.0 => ../../../../AwsEncryptionSDK/runtimes/go/TestsFromDafny-go/
13+
github.com/dafny-lang/DafnyStandardLibGo v0.0.0 => ../../../../mpl/StandardLibrary/runtimes/go/ImplementationFromDafny-go/
14+
)
15+
16+
require (
17+
github.com/aws/aws-cryptographic-material-providers-library/dynamodb v0.0.0
18+
github.com/aws/aws-cryptographic-material-providers-library/kms v0.0.0
19+
github.com/aws/aws-cryptographic-material-providers-library/mpl v0.0.0
20+
github.com/aws/aws-cryptographic-material-providers-library/primitives v0.0.0
21+
github.com/aws/aws-cryptographic-material-providers-library/testvectors v0.0.0
22+
github.com/aws/aws-encryption-sdk v0.0.0
23+
github.com/aws/aws-encryption-sdk/test v0.0.0
24+
github.com/dafny-lang/DafnyRuntimeGo/v4 v4.9.2
25+
github.com/dafny-lang/DafnyStandardLibGo v0.0.0
26+
)
27+
28+
require (
29+
github.com/aws/aws-sdk-go-v2 v1.31.0 // indirect
30+
github.com/aws/aws-sdk-go-v2/config v1.27.37 // indirect
31+
github.com/aws/aws-sdk-go-v2/credentials v1.17.35 // indirect
32+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 // indirect
33+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 // indirect
34+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 // indirect
35+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
36+
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.35.1 // indirect
37+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 // indirect
38+
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.19 // indirect
39+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20 // indirect
40+
github.com/aws/aws-sdk-go-v2/service/kms v1.36.0 // indirect
41+
github.com/aws/aws-sdk-go-v2/service/sso v1.23.1 // indirect
42+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.1 // indirect
43+
github.com/aws/aws-sdk-go-v2/service/sts v1.31.1 // indirect
44+
github.com/aws/smithy-go v1.21.0 // indirect
45+
github.com/google/uuid v1.6.0 // indirect
46+
github.com/jmespath/go-jmespath v0.4.0 // indirect
47+
)

0 commit comments

Comments
 (0)