Skip to content

Commit cb548d0

Browse files
authored
Merge pull request #136 from ApplauseOSS/feat/migrate-2-aws-sdk2
feat: migrate to aws-sdk-go-v2
2 parents b652b09 + 519ef49 commit cb548d0

File tree

9 files changed

+138
-69
lines changed

9 files changed

+138
-69
lines changed

.github/workflows/golangci-lint.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
steps:
1616
- uses: actions/setup-go@v5
1717
with:
18-
go-version: 1.21
18+
go-version: 1.25
1919
- uses: actions/checkout@v5
2020
- name: golangci-lint
2121
uses: golangci/golangci-lint-action@v8

.github/workflows/publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ jobs:
5454
- uses: actions/checkout@v5
5555
- uses: actions/setup-go@v5
5656
with:
57-
go-version: 1.21
57+
go-version: 1.25
5858
- name: Build binary
5959
run: GOOS=${{ matrix.os }} GOARCH=${{ matrix.arch }} make build
6060
- name: Upload release asset

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@ supplied shell script, `decrypt-and-start`.
1717
It can be run as:
1818

1919
```bash
20-
$ decrypt-and-start some other program
20+
decrypt-and-start some other program
2121
```
2222

2323
It can also take an optional flag to control the number of parallel workers:
2424

2525
```bash
26-
$ decrypt-and-start -p 20 -- some other program
26+
decrypt-and-start -p 20 -- some other program
2727
```
2828

2929
Tool can also assume other role for kms access
3030

3131
```bash
32-
$ decrypt-and-start --assume-role arn:aws:iam::XXXXXXXXX:role/YYYY some other program
32+
decrypt-and-start --assume-role arn:aws:iam::XXXXXXXXX:role/YYYY some other program
3333
```

ci/test.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#!/bin/bash
22

33
ENC_VAR=$(go run test/encrypt-string.go)
4-
./decrypt-and-start env | grep ENV_VAR
4+
echo $ENC_VAR
5+
export ENC_VAR="decrypt:$ENC_VAR"
6+
./decrypt-and-start env | grep ENC_VAR

go.mod

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,24 @@
11
module github.com/applauseoss/decrypt-and-start
22

3-
go 1.23.0
4-
5-
toolchain go1.23.6
3+
go 1.25.0
64

75
require (
8-
github.com/aws/aws-sdk-go v1.55.7
6+
github.com/aws/aws-sdk-go-v2 v1.38.0
7+
github.com/aws/aws-sdk-go-v2/config v1.31.0
8+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.3
9+
github.com/aws/aws-sdk-go-v2/service/kms v1.44.0
10+
github.com/aws/aws-sdk-go-v2/service/sts v1.37.0
911
golang.org/x/crypto v0.41.0
1012
)
1113

12-
require github.com/jmespath/go-jmespath v0.4.0 // indirect
14+
require (
15+
github.com/aws/aws-sdk-go-v2/credentials v1.18.4 // indirect
16+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.3 // indirect
17+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.3 // indirect
18+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
19+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect
20+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.3 // indirect
21+
github.com/aws/aws-sdk-go-v2/service/sso v1.28.0 // indirect
22+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.33.0 // indirect
23+
github.com/aws/smithy-go v1.22.5 // indirect
24+
)

go.sum

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
1-
github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE=
2-
github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
3-
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
4-
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5-
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
6-
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
7-
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
8-
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
9-
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
10-
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
11-
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
1+
github.com/aws/aws-sdk-go-v2 v1.38.0 h1:UCRQ5mlqcFk9HJDIqENSLR3wiG1VTWlyUfLDEvY7RxU=
2+
github.com/aws/aws-sdk-go-v2 v1.38.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg=
3+
github.com/aws/aws-sdk-go-v2/config v1.31.0 h1:9yH0xiY5fUnVNLRWO0AtayqwU1ndriZdN78LlhruJR4=
4+
github.com/aws/aws-sdk-go-v2/config v1.31.0/go.mod h1:VeV3K72nXnhbe4EuxxhzsDc/ByrCSlZwUnWH52Nde/I=
5+
github.com/aws/aws-sdk-go-v2/credentials v1.18.4 h1:IPd0Algf1b+Qy9BcDp0sCUcIWdCQPSzDoMK3a8pcbUM=
6+
github.com/aws/aws-sdk-go-v2/credentials v1.18.4/go.mod h1:nwg78FjH2qvsRM1EVZlX9WuGUJOL5od+0qvm0adEzHk=
7+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.3 h1:GicIdnekoJsjq9wqnvyi2elW6CGMSYKhdozE7/Svh78=
8+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.3/go.mod h1:R7BIi6WNC5mc1kfRM7XM/VHC3uRWkjc396sfabq4iOo=
9+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.3 h1:o9RnO+YZ4X+kt5Z7Nvcishlz0nksIt2PIzDglLMP0vA=
10+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.3/go.mod h1:+6aLJzOG1fvMOyzIySYjOFjcguGvVRL68R+uoRencN4=
11+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.3 h1:joyyUFhiTQQmVK6ImzNU9TQSNRNeD9kOklqTzyk5v6s=
12+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.3/go.mod h1:+vNIyZQP3b3B1tSLI0lxvrU9cfM7gpdRXMFfm67ZcPc=
13+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
14+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
15+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM=
16+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44=
17+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.3 h1:ieRzyHXypu5ByllM7Sp4hC5f/1Fy5wqxqY0yB85hC7s=
18+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.3/go.mod h1:O5ROz8jHiOAKAwx179v+7sHMhfobFVi6nZt8DEyiYoM=
19+
github.com/aws/aws-sdk-go-v2/service/kms v1.44.0 h1:Z95XCqqSnwXr0AY7PgsiOUBhUG2GoDM5getw6RfD1Lg=
20+
github.com/aws/aws-sdk-go-v2/service/kms v1.44.0/go.mod h1:DqcSngL7jJeU1fOzh5Ll5rSvX/MlMV6OZlE4mVdFAQc=
21+
github.com/aws/aws-sdk-go-v2/service/sso v1.28.0 h1:Mc/MKBf2m4VynyJkABoVEN+QzkfLqGj0aiJuEe7cMeM=
22+
github.com/aws/aws-sdk-go-v2/service/sso v1.28.0/go.mod h1:iS5OmxEcN4QIPXARGhavH7S8kETNL11kym6jhoS7IUQ=
23+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.33.0 h1:6csaS/aJmqZQbKhi1EyEMM7yBW653Wy/B9hnBofW+sw=
24+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.33.0/go.mod h1:59qHWaY5B+Rs7HGTuVGaC32m0rdpQ68N8QCN3khYiqs=
25+
github.com/aws/aws-sdk-go-v2/service/sts v1.37.0 h1:MG9VFW43M4A8BYeAfaJJZWrroinxeTi2r3+SnmLQfSA=
26+
github.com/aws/aws-sdk-go-v2/service/sts v1.37.0/go.mod h1:JdeBDPgpJfuS6rU/hNglmOigKhyEZtBmbraLE4GK1J8=
27+
github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw=
28+
github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
1229
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
1330
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
14-
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
15-
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
16-
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

lib/aws_encryption_sdk/kms_helper.go

Lines changed: 56 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,71 @@ package aws_encryption_sdk
22

33
import (
44
"bytes"
5+
"context"
56
"crypto/aes"
67
"crypto/cipher"
78
"encoding/binary"
89
"errors"
910
"strings"
1011

11-
"github.com/aws/aws-sdk-go/aws"
12-
"github.com/aws/aws-sdk-go/aws/credentials/stscreds"
13-
"github.com/aws/aws-sdk-go/aws/session"
14-
"github.com/aws/aws-sdk-go/service/kms"
12+
"github.com/aws/aws-sdk-go-v2/aws"
13+
"github.com/aws/aws-sdk-go-v2/config"
14+
"github.com/aws/aws-sdk-go-v2/service/kms"
15+
"github.com/aws/aws-sdk-go-v2/service/sts"
1516
"golang.org/x/crypto/hkdf"
1617
)
1718

1819
type KmsHelper struct {
19-
client *kms.KMS
20+
client *kms.Client
2021
}
2122

2223
func NewKmsHelper(region string, assumedRole string) *KmsHelper {
23-
k := &KmsHelper{}
24-
// Set up AWS KMS session
25-
conf := aws.NewConfig().WithRegion(region)
26-
sess := session.Must(session.NewSession(conf))
24+
ctx := context.Background()
25+
var cfg aws.Config
26+
var err error
2727
if assumedRole != "" {
28-
creds := stscreds.NewCredentials(sess, assumedRole)
29-
k.client = kms.New(sess, &aws.Config{Credentials: creds})
28+
// Load default config
29+
cfg, err = config.LoadDefaultConfig(ctx, config.WithRegion(region))
30+
if err != nil {
31+
panic(err)
32+
}
33+
// Assume role
34+
stsClient := sts.NewFromConfig(cfg)
35+
resp, err := stsClient.AssumeRole(ctx, &sts.AssumeRoleInput{
36+
RoleArn: aws.String(assumedRole),
37+
RoleSessionName: aws.String("decrypt-and-start-session"),
38+
})
39+
if err != nil {
40+
panic(err)
41+
}
42+
43+
// Get a new config with the assumed role credentials
44+
var optFns []func(*config.LoadOptions) error
45+
optFns = append(optFns, config.WithRegion(region))
46+
optFns = append(optFns, config.WithCredentialsProvider(
47+
aws.CredentialsProviderFunc(func(ctx context.Context) (aws.Credentials, error) {
48+
return aws.Credentials{
49+
AccessKeyID: *resp.Credentials.AccessKeyId,
50+
SecretAccessKey: *resp.Credentials.SecretAccessKey,
51+
SessionToken: *resp.Credentials.SessionToken,
52+
CanExpire: true,
53+
Expires: *resp.Credentials.Expiration,
54+
}, nil
55+
}),
56+
))
57+
58+
newCfg, err := config.LoadDefaultConfig(ctx, optFns...)
59+
if err != nil {
60+
panic(err)
61+
}
62+
cfg = newCfg
3063
} else {
31-
k.client = kms.New(sess)
64+
cfg, err = config.LoadDefaultConfig(ctx, config.WithRegion(region))
65+
if err != nil {
66+
panic(err)
67+
}
3268
}
33-
return k
69+
return &KmsHelper{client: kms.NewFromConfig(cfg)}
3470
}
3571

3672
// Decrypt encrypted data keys
@@ -88,17 +124,15 @@ func (k *KmsHelper) buildContentAAD(m *Message, f *Frame) ([]byte, error) {
88124

89125
// Decrypt using KMS
90126
func (k *KmsHelper) kmsDecrypt(data []byte, m *Message) ([]byte, error) {
91-
input := &kms.DecryptInput{
127+
ctx := context.Background()
128+
in := &kms.DecryptInput{
92129
CiphertextBlob: data,
93130
}
94-
if m != nil {
95-
context := make(map[string]*string)
96-
for key, value := range m.EncContext {
97-
context[key] = &value
98-
}
99-
input.EncryptionContext = context
131+
if m != nil && len(m.EncContext) > 0 {
132+
in.EncryptionContext = m.EncContext
100133
}
101-
result, err := k.client.Decrypt(input)
134+
135+
result, err := k.client.Decrypt(ctx, in)
102136
if err != nil {
103137
return nil, err
104138
}
@@ -114,7 +148,7 @@ func (k *KmsHelper) Decrypt(data []byte) ([]byte, error) {
114148
// Try simple KMS decryption first
115149
if plaintext, err = k.kmsDecrypt(data, nil); err == nil {
116150
return plaintext, nil
117-
} else if strings.HasPrefix(err.Error(), kms.ErrCodeInvalidCiphertextException) {
151+
} else if strings.Contains(err.Error(), "InvalidCiphertextException") {
118152
// Do nothing for an InvalidCiphertextException error
119153
} else {
120154
// Unknown error

lib/region.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package lib
22

33
import (
4-
"github.com/aws/aws-sdk-go/aws/ec2metadata"
5-
"github.com/aws/aws-sdk-go/aws/session"
4+
"context"
65
"os"
6+
7+
"github.com/aws/aws-sdk-go-v2/config"
8+
"github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
79
)
810

911
func GetRegion() string {
@@ -12,11 +14,14 @@ func GetRegion() string {
1214
return region
1315
}
1416
// EC2 instance metadata
15-
metaSession, _ := session.NewSession()
16-
metaClient := ec2metadata.New(metaSession)
17-
region, _ := metaClient.Region()
18-
if region != "" {
19-
return region
17+
ctx := context.Background()
18+
cfg, err := config.LoadDefaultConfig(ctx)
19+
if err == nil {
20+
metaClient := imds.NewFromConfig(cfg)
21+
regionOut, err := metaClient.GetRegion(ctx, nil)
22+
if err == nil && regionOut.Region != "" {
23+
return regionOut.Region
24+
}
2025
}
2126
// Sensible fallback
2227
return "us-east-1"

test/encrypt-string.go

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package main
22

33
import (
4+
"context"
45
"encoding/base64"
56
"flag"
67
"fmt"
7-
"github.com/applauseoss/decrypt-and-start/lib"
8-
"github.com/aws/aws-sdk-go/aws"
9-
"github.com/aws/aws-sdk-go/aws/session"
10-
"github.com/aws/aws-sdk-go/service/kms"
118
"log"
129
"os"
1310
"os/exec"
1411
"syscall"
12+
13+
"github.com/applauseoss/decrypt-and-start/lib"
14+
"github.com/aws/aws-sdk-go-v2/aws"
15+
"github.com/aws/aws-sdk-go-v2/config"
16+
"github.com/aws/aws-sdk-go-v2/service/kms"
1517
)
1618

1719
// This function should work like an entrypoint: exec "${@}"
@@ -30,26 +32,26 @@ func Exec() {
3032
}
3133

3234
func main() {
33-
// Initialize KMS session
34-
// sess := session.Must(session.NewSessionWithOptions(session.Options{
35-
// SharedConfigState: session.SharedConfigEnable,
36-
// }))
35+
ctx := context.Background()
3736
region := lib.GetRegion()
38-
sess := session.Must(session.NewSession(&aws.Config{
39-
Region: &region,
40-
}))
41-
cmk_arn := "arn:aws:kms:us-east-1:873559269338:key/1b03c937-31f8-4fa5-a5cf-42e9f437bda2"
37+
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(region))
38+
if err != nil {
39+
log.Fatalf("unable to load SDK config, %v", err)
40+
}
41+
4242
// KMS service client
43-
svc := kms.New(sess)
43+
client := kms.NewFromConfig(cfg)
44+
cmk_arn := "arn:aws:kms:us-east-1:873559269338:alias/dev-secret-encryption"
4445

4546
text := "some-encrypted-string"
47+
// fmt.Println("Encrypting:", text)
4648

47-
result, err := svc.Encrypt(&kms.EncryptInput{
49+
result, err := client.Encrypt(ctx, &kms.EncryptInput{
4850
KeyId: aws.String(cmk_arn),
4951
Plaintext: []byte(text),
5052
})
5153
if err != nil {
5254
log.Fatal(err)
5355
}
54-
fmt.Println(base64.URLEncoding.EncodeToString(result.CiphertextBlob))
56+
fmt.Println(base64.StdEncoding.EncodeToString(result.CiphertextBlob))
5557
}

0 commit comments

Comments
 (0)