Skip to content

Commit cab0e6a

Browse files
committed
Fix PublicKey extraction from JWK
Signed-off-by: Dionna Glaze <[email protected]>
1 parent 59105a8 commit cab0e6a

File tree

3 files changed

+72
-44
lines changed

3 files changed

+72
-44
lines changed

corim/signer.go

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"fmt"
1313
"reflect"
1414

15-
"github.com/lestrrat-go/jwx/v2/jwk"
15+
"github.com/lestrrat-go/jwx/v3/jwk"
1616
"github.com/veraison/corim/comid"
1717
"github.com/veraison/corim/encoding"
1818
"github.com/veraison/corim/extensions"
@@ -114,7 +114,7 @@ func (o Signer) MarshalJSON() ([]byte, error) {
114114

115115
const noAlg = cose.Algorithm(-65537)
116116

117-
func getAlgAndKeyFromJWK(j []byte) (cose.Algorithm, crypto.Signer, error) {
117+
func getAlgAndKeyFromJWK(j []byte) (cose.Algorithm, any, error) {
118118
var (
119119
err error
120120
k jwk.Key
@@ -127,31 +127,47 @@ func getAlgAndKeyFromJWK(j []byte) (cose.Algorithm, crypto.Signer, error) {
127127
return noAlg, nil, err
128128
}
129129

130-
var key crypto.Signer
130+
var key any
131131

132-
err = k.Raw(&key)
132+
err = jwk.Export(k, &key)
133133
if err != nil {
134134
return noAlg, nil, err
135135
}
136136

137-
switch v := key.(type) {
138-
case *ecdsa.PrivateKey:
139-
alg = ellipticCurveToAlg(v.Curve)
137+
fromCurve := func(c elliptic.Curve) (cose.Algorithm, any, error) {
138+
alg = ellipticCurveToAlg(c)
140139
if alg == noAlg {
141140
return noAlg, nil, fmt.Errorf("unknown elliptic curve %v", crv)
142141
}
143-
case ed25519.PrivateKey:
144-
alg = cose.AlgorithmEd25519
145-
case *rsa.PrivateKey:
142+
return alg, key, nil
143+
}
144+
isRsa := func() (cose.Algorithm, any, error) {
146145
alg = rsaJWKToAlg(k)
147146
if alg == noAlg {
148-
return noAlg, nil, fmt.Errorf("unknown RSA algorithm %q", k.Algorithm().String())
147+
name := "unnamed"
148+
if jalg, ok := k.Algorithm(); ok {
149+
name = jalg.String()
150+
}
151+
return noAlg, nil, fmt.Errorf("unknown RSA algorithm %q", name)
149152
}
153+
return alg, key, nil
154+
}
155+
switch v := key.(type) {
156+
case *ecdsa.PrivateKey:
157+
return fromCurve(v.Curve)
158+
case *ecdsa.PublicKey:
159+
return fromCurve(v.Curve)
160+
case ed25519.PrivateKey:
161+
return cose.AlgorithmEd25519, key, nil
162+
case ed25519.PublicKey:
163+
return cose.AlgorithmEd25519, key, nil
164+
case *rsa.PrivateKey:
165+
return isRsa()
166+
case *rsa.PublicKey:
167+
return isRsa()
150168
default:
151169
return noAlg, nil, fmt.Errorf("unknown private key type %v", reflect.TypeOf(key))
152170
}
153-
154-
return alg, key, nil
155171
}
156172

157173
func ellipticCurveToAlg(c elliptic.Curve) cose.Algorithm {
@@ -168,7 +184,11 @@ func ellipticCurveToAlg(c elliptic.Curve) cose.Algorithm {
168184
}
169185

170186
func rsaJWKToAlg(k jwk.Key) cose.Algorithm {
171-
switch k.Algorithm().String() {
187+
alg, ok := k.Algorithm()
188+
if !ok {
189+
return noAlg
190+
}
191+
switch alg.String() {
172192
case "PS256":
173193
return cose.AlgorithmPS256
174194
case "PS384":
@@ -185,15 +205,22 @@ func NewSignerFromJWK(j []byte) (cose.Signer, error) {
185205
if err != nil {
186206
return nil, err
187207
}
208+
signer, isSigner := key.(crypto.Signer)
209+
if !isSigner {
210+
return nil, fmt.Errorf("jwk did not contain a private key")
211+
}
188212

189-
return cose.NewSigner(alg, key)
213+
return cose.NewSigner(alg, signer)
190214
}
191215

192216
func NewPublicKeyFromJWK(j []byte) (crypto.PublicKey, error) {
193217
_, key, err := getAlgAndKeyFromJWK(j)
194218
if err != nil {
195219
return nil, err
196220
}
221+
if signer, isSigner := key.(crypto.Signer); isSigner {
222+
return signer.Public(), nil
223+
}
197224

198-
return key.Public(), nil
225+
return key, nil
199226
}

go.mod

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
11
module github.com/veraison/corim
22

3-
go 1.22.0
3+
go 1.23.0
4+
5+
toolchain go1.24.2
46

57
require (
68
github.com/fxamacker/cbor/v2 v2.5.0
79
github.com/google/uuid v1.3.0
8-
github.com/lestrrat-go/jwx/v2 v2.0.21
10+
github.com/lestrrat-go/jwx/v3 v3.0.6
911
github.com/spf13/cast v1.4.1
10-
github.com/stretchr/testify v1.9.0
12+
github.com/stretchr/testify v1.10.0
1113
github.com/veraison/eat v0.0.0-20210331113810-3da8a4dd42ff
1214
github.com/veraison/go-cose v1.2.1
1315
github.com/veraison/swid v1.1.1-0.20230911094910-8ffdd07a22ca
1416
)
1517

1618
require (
1719
github.com/davecgh/go-spew v1.1.1 // indirect
18-
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
19-
github.com/goccy/go-json v0.10.2 // indirect
20+
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
21+
github.com/goccy/go-json v0.10.3 // indirect
2022
github.com/kr/pretty v0.2.0 // indirect
21-
github.com/lestrrat-go/blackmagic v1.0.2 // indirect
23+
github.com/lestrrat-go/blackmagic v1.0.4 // indirect
2224
github.com/lestrrat-go/httpcc v1.0.1 // indirect
23-
github.com/lestrrat-go/httprc v1.0.5 // indirect
24-
github.com/lestrrat-go/iter v1.0.2 // indirect
25+
github.com/lestrrat-go/httprc/v3 v3.0.0 // indirect
2526
github.com/lestrrat-go/option v1.0.1 // indirect
27+
github.com/lestrrat-go/option/v2 v2.0.0 // indirect
2628
github.com/pmezard/go-difflib v1.0.0 // indirect
2729
github.com/segmentio/asm v1.2.0 // indirect
2830
github.com/x448/float16 v0.8.4 // indirect
29-
golang.org/x/crypto v0.31.0 // indirect
30-
golang.org/x/sys v0.28.0 // indirect
31+
golang.org/x/sys v0.33.0 // indirect
3132
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
3233
gopkg.in/yaml.v3 v3.0.1 // indirect
3334
)

go.sum

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
11
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
22
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
33
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4-
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
5-
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
4+
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc=
5+
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
66
github.com/fxamacker/cbor/v2 v2.2.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
77
github.com/fxamacker/cbor/v2 v2.3.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
88
github.com/fxamacker/cbor/v2 v2.5.0 h1:oHsG0V/Q6E/wqTS2O1Cozzsy69nqCiguo5Q1a1ADivE=
99
github.com/fxamacker/cbor/v2 v2.5.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
10-
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
11-
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
10+
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
11+
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
1212
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
1313
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
1414
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
1515
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
1616
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
1717
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
1818
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
19-
github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k=
20-
github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU=
19+
github.com/lestrrat-go/blackmagic v1.0.4 h1:IwQibdnf8l2KoO+qC3uT4OaTWsW7tuRQXy9TRN9QanA=
20+
github.com/lestrrat-go/blackmagic v1.0.4/go.mod h1:6AWFyKNNj0zEXQYfTMPfZrAXUWUfTIZ5ECEUEJaijtw=
2121
github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE=
2222
github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E=
23-
github.com/lestrrat-go/httprc v1.0.5 h1:bsTfiH8xaKOJPrg1R+E3iE/AWZr/x0Phj9PBTG/OLUk=
24-
github.com/lestrrat-go/httprc v1.0.5/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo=
25-
github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI=
26-
github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4=
27-
github.com/lestrrat-go/jwx/v2 v2.0.21 h1:jAPKupy4uHgrHFEdjVjNkUgoBKtVDgrQPB/h55FHrR0=
28-
github.com/lestrrat-go/jwx/v2 v2.0.21/go.mod h1:09mLW8zto6bWL9GbwnqAli+ArLf+5M33QLQPDggkUWM=
23+
github.com/lestrrat-go/httprc/v3 v3.0.0 h1:nZUx/zFg5uc2rhlu1L1DidGr5Sj02JbXvGSpnY4LMrc=
24+
github.com/lestrrat-go/httprc/v3 v3.0.0/go.mod h1:k2U1QIiyVqAKtkffbg+cUmsyiPGQsb9aAfNQiNFuQ9Q=
25+
github.com/lestrrat-go/jwx/v3 v3.0.6 h1:aWM4fQxCncasWolc67qfv6YKo53QBcW6cee2CmT35Qg=
26+
github.com/lestrrat-go/jwx/v3 v3.0.6/go.mod h1:7bi1u/M8ZoyDH4UCTcIMO8l42ETaO4ULYckKRkEWe8Y=
2927
github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU=
3028
github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
29+
github.com/lestrrat-go/option/v2 v2.0.0 h1:XxrcaJESE1fokHy3FpaQ/cXW8ZsIdWcdFzzLOcID3Ss=
30+
github.com/lestrrat-go/option/v2 v2.0.0/go.mod h1:oSySsmzMoR0iRzCDCaUfsCzxQHUEuhOViQObyy7S6Vg=
3131
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
3232
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
3333
github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
@@ -38,8 +38,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
3838
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
3939
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
4040
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
41-
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
42-
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
41+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
42+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
4343
github.com/veraison/eat v0.0.0-20210331113810-3da8a4dd42ff h1:r6I2eJL/z8dp5flsQIKHMeDjyV6UO8If3MaVBLvTjF4=
4444
github.com/veraison/eat v0.0.0-20210331113810-3da8a4dd42ff/go.mod h1:+kxt8iuFiVvKRs2VQ1Ho7bbAScXAB/kHFFuP5Biw19I=
4545
github.com/veraison/go-cose v1.2.1 h1:Gj4x20D0YP79J2+cK3anjGEMwIkg2xX+TKVVGUXwNAc=
@@ -48,10 +48,10 @@ github.com/veraison/swid v1.1.1-0.20230911094910-8ffdd07a22ca h1:osmCKwWO/xM68Kz
4848
github.com/veraison/swid v1.1.1-0.20230911094910-8ffdd07a22ca/go.mod h1:d5jt76uMNbTfQ+f2qU4Lt8RvWOTsv6PFgstIM1QdMH0=
4949
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
5050
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
51-
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
52-
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
53-
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
54-
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
51+
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
52+
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
53+
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
54+
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
5555
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
5656
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
5757
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

0 commit comments

Comments
 (0)