Skip to content

Commit 9cd0b27

Browse files
authored
fix: v6, wrong public key encoding assumed
The KMS GetPublicKey endpoint returns DER encoded key. The library previously assumed PEM encoding.
2 parents c4f25b8 + 6951014 commit 9cd0b27

File tree

9 files changed

+230
-50
lines changed

9 files changed

+230
-50
lines changed

.github/workflows/ci.yaml

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
name: CI
2+
3+
on: [push]
4+
5+
env:
6+
GO_VERSION: '1.23'
7+
8+
9+
jobs:
10+
lint:
11+
name: Lint
12+
runs-on: ubuntu-latest
13+
14+
steps:
15+
- uses: actions/checkout@v4
16+
17+
- uses: actions/setup-go@v5
18+
with:
19+
go-version: "${{ env.GO_VERSION }}"
20+
21+
- name: Mark source directory as safe
22+
run: git config --global --add safe.directory $GITHUB_WORKSPACE
23+
24+
- name: go.mod check
25+
run: |
26+
go mod tidy
27+
git diff --no-patch --exit-code go.mod go.sum
28+
if [ $? -ne 0 ]; then
29+
echo "Please run go mod tidy and commit the changes."
30+
exit 1
31+
fi
32+
33+
- uses: golangci/golangci-lint-action@v6
34+
with:
35+
version: v1.63
36+
37+
test:
38+
name: Test
39+
runs-on: ubuntu-latest
40+
41+
steps:
42+
- uses: actions/checkout@v4
43+
- uses: actions/setup-go@v5
44+
with:
45+
go-version: "${{ env.GO_VERSION }}"
46+
- name: Start LocalStack
47+
uses: LocalStack/[email protected]
48+
with:
49+
image-tag: '4.0.3'
50+
env:
51+
LOCALSTACK_CI_PROJECT: "${{ env.CI_PROJECT }}"
52+
- run: go test -race ./...

.github/workflows/lint.yaml

Lines changed: 0 additions & 28 deletions
This file was deleted.

.github/workflows/test.yaml

Lines changed: 0 additions & 14 deletions
This file was deleted.

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
.PHONY: localstack
3+
localstack:
4+
docker run --rm -it -e SERVICES="kms" -p 4566:4566 localstack/localstack:4.0.3

go.mod

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,17 @@ module github.com/spacelift-io/kmsjwt/v6
22

33
go 1.23
44

5+
// All these versions asssumed the wrong key format returned by kms.GetPublicKey
6+
retract (
7+
v6.2.0
8+
v6.1.0
9+
v6.0.0
10+
)
11+
512
require (
613
github.com/aws/aws-sdk-go-v2 v1.32.7
14+
github.com/aws/aws-sdk-go-v2/config v1.28.7
15+
github.com/aws/aws-sdk-go-v2/credentials v1.17.48
716
github.com/aws/aws-sdk-go-v2/service/kms v1.37.8
817
github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf
918
github.com/golang-jwt/jwt/v4 v4.5.1
@@ -13,14 +22,24 @@ require (
1322
)
1423

1524
require (
25+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 // indirect
1626
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 // indirect
1727
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 // indirect
28+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
29+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect
30+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 // indirect
31+
github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 // indirect
32+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 // indirect
33+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 // indirect
1834
github.com/aws/smithy-go v1.22.1 // indirect
1935
github.com/davecgh/go-spew v1.1.1 // indirect
2036
github.com/google/go-cmp v0.6.0 // indirect
37+
github.com/kr/pretty v0.3.0 // indirect
2138
github.com/pmezard/go-difflib v1.0.0 // indirect
39+
github.com/rogpeppe/go-internal v1.8.1 // indirect
2240
github.com/stretchr/objx v0.5.2 // indirect
2341
golang.org/x/net v0.33.0 // indirect
2442
golang.org/x/text v0.21.0 // indirect
43+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
2544
gopkg.in/yaml.v3 v3.0.1 // indirect
2645
)

go.sum

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,32 @@
11
github.com/aws/aws-sdk-go-v2 v1.32.7 h1:ky5o35oENWi0JYWUZkB7WYvVPP+bcRF5/Iq7JWSb5Rw=
22
github.com/aws/aws-sdk-go-v2 v1.32.7/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U=
3+
github.com/aws/aws-sdk-go-v2/config v1.28.7 h1:GduUnoTXlhkgnxTD93g1nv4tVPILbdNQOzav+Wpg7AE=
4+
github.com/aws/aws-sdk-go-v2/config v1.28.7/go.mod h1:vZGX6GVkIE8uECSUHB6MWAUsd4ZcG2Yq/dMa4refR3M=
5+
github.com/aws/aws-sdk-go-v2/credentials v1.17.48 h1:IYdLD1qTJ0zanRavulofmqut4afs45mOWEI+MzZtTfQ=
6+
github.com/aws/aws-sdk-go-v2/credentials v1.17.48/go.mod h1:tOscxHN3CGmuX9idQ3+qbkzrjVIx32lqDSU1/0d/qXs=
7+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 h1:kqOrpojG71DxJm/KDPO+Z/y1phm1JlC8/iT+5XRmAn8=
8+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22/go.mod h1:NtSFajXVVL8TA2QNngagVZmUtXciyrHOt7xgz4faS/M=
39
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 h1:I/5wmGMffY4happ8NOCuIUEWGUvvFp5NSeQcXl9RHcI=
410
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26/go.mod h1:FR8f4turZtNy6baO0KJ5FJUmXH/cSkI9fOngs0yl6mA=
511
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 h1:zXFLuEuMMUOvEARXFUVJdfqZ4bvvSgdGRq/ATcrQxzM=
612
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26/go.mod h1:3o2Wpy0bogG1kyOPrgkXA8pgIfEEv0+m19O9D5+W8y8=
13+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
14+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
15+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y=
16+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE=
17+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 h1:8eUsivBQzZHqe/3FE+cqwfH+0p5Jo8PFM/QYQSmeZ+M=
18+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7/go.mod h1:kLPQvGUmxn/fqiCrDeohwG33bq2pQpGeY62yRO6Nrh0=
719
github.com/aws/aws-sdk-go-v2/service/kms v1.37.8 h1:KbLZjYqhQ9hyB4HwXiheiflTlYQa0+Fz0Ms/rh5f3mk=
820
github.com/aws/aws-sdk-go-v2/service/kms v1.37.8/go.mod h1:ANs9kBhK4Ghj9z1W+bsr3WsNaPF71qkgd6eE6Ekol/Y=
21+
github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 h1:CvuUmnXI7ebaUAhbJcDy9YQx8wHR69eZ9I7q5hszt/g=
22+
github.com/aws/aws-sdk-go-v2/service/sso v1.24.8/go.mod h1:XDeGv1opzwm8ubxddF0cgqkZWsyOtw4lr6dxwmb6YQg=
23+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 h1:F2rBfNAL5UyswqoeWv9zs74N/NanhK16ydHW1pahX6E=
24+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7/go.mod h1:JfyQ0g2JG8+Krq0EuZNnRwX0mU0HrwY/tG6JNfcqh4k=
25+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 h1:Xgv/hyNgvLda/M9l9qxXc4UFSgppnRczLxlMs5Ae/QY=
26+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.3/go.mod h1:5Gn+d+VaaRgsjewpMvGazt0WfcFO+Md4wLOuBfGR9Bc=
927
github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro=
1028
github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
29+
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
1130
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
1231
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1332
github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf h1:NrF81UtW8gG2LBGkXFQFqlfNnvMt9WdB46sfdJY4oqc=
@@ -22,14 +41,26 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
2241
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
2342
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
2443
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
44+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
45+
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
46+
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
47+
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
48+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
49+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
50+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
51+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
2552
github.com/onsi/ginkgo/v2 v2.22.1 h1:QW7tbJAUDyVDVOM5dFa7qaybo+CRfR7bemlQUN6Z8aM=
2653
github.com/onsi/ginkgo/v2 v2.22.1/go.mod h1:S6aTpoRsSq2cZOd+pssHAlKW/Q/jZt6cPrPlnj4a1xM=
2754
github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
2855
github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
56+
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
2957
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
3058
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
3159
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
3260
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
61+
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
62+
github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg=
63+
github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
3364
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
3465
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
3566
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
@@ -42,7 +73,10 @@ golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
4273
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
4374
golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
4475
golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
45-
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
4676
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
77+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
78+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
79+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
80+
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
4781
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
4882
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

kmsjwt.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package kmsjwt
33
import (
44
"context"
55
"crypto/rsa"
6+
"crypto/x509"
67
"encoding/base64"
78
"sync"
89

@@ -88,17 +89,21 @@ func (k *KMSJWT) getPublicKey(ctx context.Context) (*rsa.PublicKey, error) {
8889
return k.publicKey, nil
8990
}
9091

91-
out, err := k.api.GetPublicKey(ctx, &kms.GetPublicKeyInput{KeyId: aws.String(k.keyID)})
92+
response, err := k.api.GetPublicKey(ctx, &kms.GetPublicKeyInput{KeyId: aws.String(k.keyID)})
9293
if err != nil {
9394
return nil, errors.Wrap(err, "could not retrieve public key")
9495
}
9596

96-
publicKey, err := jwt.ParseRSAPublicKeyFromPEM(out.PublicKey)
97+
publicKey, err := x509.ParsePKIXPublicKey(response.PublicKey)
9798
if err != nil {
9899
return nil, errors.Wrap(err, "could not parse public key")
99100
}
100101

101-
k.publicKey = publicKey
102+
var ok bool
103+
k.publicKey, ok = publicKey.(*rsa.PublicKey)
104+
if !ok {
105+
return nil, errors.Errorf("public key type assertion: cannot assert %T as %T", publicKey, k.publicKey)
106+
}
102107

103-
return publicKey, nil
108+
return k.publicKey, nil
104109
}

kmsjwt_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"crypto/rsa"
66
"encoding/base64"
77
"encoding/hex"
8+
"encoding/pem"
89
"errors"
910
"os"
1011
"testing"
@@ -124,10 +125,16 @@ func TestKMSJWT(t *testing.T) {
124125
var publicKey *rsa.PublicKey
125126

126127
g.BeforeEach(func() {
127-
publicKeyBytes, err = os.ReadFile("testdata/rsa.public")
128+
var pemEncodedBytes []byte
129+
pemEncodedBytes, err = os.ReadFile("testdata/rsa.public")
128130
require.NoError(t, err)
129131

130-
publicKey, err = jwt.ParseRSAPublicKeyFromPEM(publicKeyBytes)
132+
// KMS API returns DER encoded bytes.
133+
var decoded *pem.Block
134+
decoded, _ = pem.Decode(pemEncodedBytes)
135+
publicKeyBytes = decoded.Bytes
136+
137+
publicKey, err = jwt.ParseRSAPublicKeyFromPEM(pemEncodedBytes)
131138
require.NoError(t, err)
132139

133140
signature = expectedSignature
@@ -158,7 +165,7 @@ func TestKMSJWT(t *testing.T) {
158165
})
159166

160167
g.It("returns an error", func() {
161-
Expect(err).To(MatchError("could not parse public key: invalid key: Key must be a PEM encoded PKCS1 or PKCS8 key"))
168+
Expect(err).To(MatchError(ContainSubstring("could not parse public key")))
162169
})
163170
})
164171

ksmjwt_localstack_test.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package kmsjwt_test
2+
3+
import (
4+
"context"
5+
"crypto/rsa"
6+
"crypto/x509"
7+
"testing"
8+
9+
"github.com/aws/aws-sdk-go-v2/config"
10+
"github.com/aws/aws-sdk-go-v2/credentials"
11+
"github.com/aws/aws-sdk-go-v2/service/kms"
12+
"github.com/aws/aws-sdk-go-v2/service/kms/types"
13+
"github.com/golang-jwt/jwt/v4"
14+
"github.com/stretchr/testify/assert"
15+
"github.com/stretchr/testify/require"
16+
17+
"github.com/spacelift-io/kmsjwt/v6"
18+
)
19+
20+
func TestWithLocalStack(t *testing.T) {
21+
const in = "sign me, please"
22+
ctx := context.Background()
23+
client := newClient(t, ctx)
24+
keyID := client.CreateKey(t, ctx)
25+
publicKey := client.GetPublicKey(t, ctx, keyID)
26+
27+
t.Run("new", func(t *testing.T) {
28+
signer := kmsjwt.New(client.KMS, keyID)
29+
30+
signature, err := signer.Sign(in, ctx)
31+
require.NoError(t, err, "sign")
32+
33+
err = signer.Verify(in, signature, ctx)
34+
assert.NoError(t, err, "verify")
35+
})
36+
37+
t.Run("new with public key", func(t *testing.T) {
38+
signer := kmsjwt.NewWithPublicKey(client.KMS, keyID, publicKey)
39+
40+
signature, err := signer.Sign(in, ctx)
41+
require.NoError(t, err, "sign")
42+
43+
err = signer.Verify(in, signature, ctx)
44+
assert.NoError(t, err, "verify")
45+
})
46+
47+
t.Run("RFC compliance", func(t *testing.T) {
48+
signer := kmsjwt.New(client.KMS, keyID)
49+
50+
signature, err := signer.Sign(in, ctx)
51+
require.NoError(t, err, "sign")
52+
53+
builtinSigner := jwt.GetSigningMethod(signer.Alg())
54+
require.NotNil(t, builtinSigner, "unknown algorithm")
55+
56+
err = builtinSigner.Verify(in, signature, publicKey)
57+
assert.NoError(t, err, "verify")
58+
})
59+
}
60+
61+
func newClient(t *testing.T, ctx context.Context) Client {
62+
t.Helper()
63+
64+
cfg, err := config.LoadDefaultConfig(ctx,
65+
config.WithRegion("eu-west-1"),
66+
config.WithBaseEndpoint("http://localhost:4566"),
67+
config.WithCredentialsProvider(
68+
credentials.NewStaticCredentialsProvider("dummy", "dummy", "dummy"),
69+
),
70+
)
71+
require.NoError(t, err, "load AWS config")
72+
73+
return Client{KMS: kms.NewFromConfig(cfg)}
74+
}
75+
76+
type Client struct {
77+
KMS *kms.Client
78+
}
79+
80+
func (c Client) CreateKey(t *testing.T, ctx context.Context) (id string) {
81+
t.Helper()
82+
result, err := c.KMS.CreateKey(ctx, &kms.CreateKeyInput{
83+
KeySpec: types.KeySpecRsa4096,
84+
KeyUsage: types.KeyUsageTypeSignVerify,
85+
})
86+
require.NoError(t, err, "creating KMS key")
87+
return *result.KeyMetadata.KeyId
88+
}
89+
90+
func (c Client) GetPublicKey(t *testing.T, ctx context.Context, id string) *rsa.PublicKey {
91+
t.Helper()
92+
response, err := c.KMS.GetPublicKey(ctx, &kms.GetPublicKeyInput{
93+
KeyId: &id,
94+
})
95+
require.NoError(t, err, "get KMS public key")
96+
97+
key, err := x509.ParsePKIXPublicKey(response.PublicKey)
98+
require.NoError(t, err, "parsing fetched pubic key")
99+
100+
return key.(*rsa.PublicKey)
101+
}

0 commit comments

Comments
 (0)