Skip to content

Commit 393d1fb

Browse files
committed
refactor(config,jwx): update from lestrrat-go/jwx v3 to v4 and integrate SignatureAlgorithm for YAML compatibility
1 parent a96db03 commit 393d1fb

4 files changed

Lines changed: 27 additions & 39 deletions

File tree

internal/config/config.go

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ var defaultConfig = Config{
5050
},
5151
Signing: signingConfs{
5252
Mytoken: signingConf{
53-
Alg: SignatureAlgorithm{SignatureAlgorithm: jwa.ES512()},
53+
Alg: "ES512",
5454
RSAKeyLen: 2048,
5555
},
5656
OIDC: oidcSigningConf{
@@ -126,7 +126,7 @@ var defaultConfig = Config{
126126
Enabled: false,
127127
EntityConfigurationLifetime: 7 * 24 * 60 * 60,
128128
Signing: signingConf{
129-
Alg: SignatureAlgorithm{SignatureAlgorithm: jwa.ES512()},
129+
Alg: "ES512",
130130
RSAKeyLen: 2048,
131131
},
132132
OPDiscovery: opDiscoveryConf{
@@ -453,33 +453,9 @@ type signingConfs struct {
453453
}
454454

455455
type signingConf struct {
456-
Alg SignatureAlgorithm `yaml:"alg"`
457-
KeyFile string `yaml:"key_file"`
458-
RSAKeyLen int `yaml:"rsa_key_len"`
459-
}
460-
461-
// SignatureAlgorithm is a jwa.SignatureAlgorithm that can be marshalled to and unmarshalled from YAML.
462-
type SignatureAlgorithm struct {
463-
jwa.SignatureAlgorithm
464-
}
465-
466-
// UnmarshalYAML implements yaml.Unmarshaler for SignatureAlgorithm.
467-
func (a *SignatureAlgorithm) UnmarshalYAML(value *yaml.Node) error {
468-
var s string
469-
if err := value.Decode(&s); err != nil {
470-
return errors.Wrap(err, "invalid signing algorithm")
471-
}
472-
alg, ok := jwa.LookupSignatureAlgorithm(s)
473-
if !ok {
474-
return errors.Errorf("unknown signing algorithm '%s'", s)
475-
}
476-
a.SignatureAlgorithm = alg
477-
return nil
478-
}
479-
480-
// MarshalYAML implements yaml.Marshaler for SignatureAlgorithm.
481-
func (a SignatureAlgorithm) MarshalYAML() (interface{}, error) {
482-
return a.String(), nil
456+
Alg string `yaml:"alg"`
457+
KeyFile string `yaml:"key_file"`
458+
RSAKeyLen int `yaml:"rsa_key_len"`
483459
}
484460

485461
// oidcSigningConf holds configuration for OIDC signing with multiple algorithms
@@ -653,9 +629,12 @@ func (f *federationConf) validate() (err error) {
653629
if f.Signing.KeyFile == "" {
654630
return errors.New("federation enabled, but no signing keyfile specified")
655631
}
656-
if f.Signing.Alg.String() == "" {
632+
if f.Signing.Alg == "" {
657633
return errors.New("federation enabled, but no signing alg specified")
658634
}
635+
if _, ok := jwa.LookupSignatureAlgorithm(f.Signing.Alg); !ok {
636+
return errors.Errorf("federation enabled, but unknown signing alg '%s' specified", f.Signing.Alg)
637+
}
659638
if f.EntityConfigurationLifetime == 0 {
660639
f.EntityConfigurationLifetime = 7 * 24 * 60 * 60
661640
}
@@ -819,9 +798,12 @@ func validateSigningConfig() error {
819798
if conf.Signing.Mytoken.KeyFile == "" {
820799
return errors.New("invalid config: signing keyfile not set")
821800
}
822-
if conf.Signing.Mytoken.Alg.String() == "" {
801+
if conf.Signing.Mytoken.Alg == "" {
823802
return errors.New("invalid config: token signing alg not set")
824803
}
804+
if _, ok := jwa.LookupSignatureAlgorithm(conf.Signing.Mytoken.Alg); !ok {
805+
return errors.Errorf("invalid config: unknown token signing alg '%s'", conf.Signing.Mytoken.Alg)
806+
}
825807
return nil
826808
}
827809

internal/endpoints/configuration/configurationEndpoint.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func basicConfiguration() *pkg.MytokenConfiguration {
8181
ProfilesEndpoint: utils.CombineURLPath(config.Get().IssuerURL, apiPaths.ProfilesEndpoint),
8282
JWKSURI: utils.CombineURLPath(config.Get().IssuerURL, otherPaths.JWKSEndpoint),
8383
ProvidersSupported: getProvidersFromConfig(),
84-
TokenSigningAlgValue: config.Get().Signing.Mytoken.Alg.String(),
84+
TokenSigningAlgValue: config.Get().Signing.Mytoken.Alg,
8585
ServiceDocumentation: config.Get().ServiceDocumentation,
8686
Version: version.VERSION,
8787
},

internal/jws/jws.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,24 @@ import (
2424
// GenerateMytokenSigningKeyPair generates a cryptographic key pair for mytoken signing with the algorithm specified in
2525
// the mytoken config.
2626
func GenerateMytokenSigningKeyPair() (sk crypto.Signer, pk crypto.PublicKey, err error) {
27-
return generateKeyPair(config.Get().Signing.Mytoken.Alg.SignatureAlgorithm, config.Get().Signing.Mytoken.RSAKeyLen)
27+
return generateKeyPair(algFromConfig(config.Get().Signing.Mytoken.Alg), config.Get().Signing.Mytoken.RSAKeyLen)
2828
}
2929

3030
// GenerateFederationSigningKeyPair generates a cryptographic key pair for federation signing with the algorithm
3131
// specified in the config.
3232
func GenerateFederationSigningKeyPair() (sk crypto.Signer, pk crypto.PublicKey, err error) {
3333
return generateKeyPair(
34-
config.Get().Features.Federation.Signing.Alg.SignatureAlgorithm,
34+
algFromConfig(config.Get().Features.Federation.Signing.Alg),
3535
config.Get().Features.Federation.Signing.RSAKeyLen,
3636
)
3737
}
3838

39+
// algFromConfig converts a signing algorithm string from the config to a jwa.SignatureAlgorithm.
40+
func algFromConfig(s string) jwa.SignatureAlgorithm {
41+
alg, _ := jwa.LookupSignatureAlgorithm(s)
42+
return alg
43+
}
44+
3945
// generateKeyPair generates a cryptographic key pair with the passed properties
4046
func generateKeyPair(alg jwa.SignatureAlgorithm, rsaKeyLen int) (
4147
sk crypto.Signer, pk crypto.PublicKey,
@@ -185,9 +191,9 @@ func GetVersatileSigner(usage KeyUsage) jwx.VersatileSigner {
185191
var alg jwa.SignatureAlgorithm
186192
switch usage {
187193
case KeyUsageMytokenSigning:
188-
alg = config.Get().Signing.Mytoken.Alg.SignatureAlgorithm
194+
alg = algFromConfig(config.Get().Signing.Mytoken.Alg)
189195
case KeyUsageFederation:
190-
alg = config.Get().Features.Federation.Signing.Alg.SignatureAlgorithm
196+
alg = algFromConfig(config.Get().Features.Federation.Signing.Alg)
191197
}
192198
return jwx.NewSingleKeyVersatileSigner(k.SK, alg)
193199
}
@@ -196,7 +202,7 @@ func GetVersatileSigner(usage KeyUsage) jwx.VersatileSigner {
196202
func LoadMytokenSigningKey() {
197203
loadKey(
198204
config.Get().Signing.Mytoken.KeyFile, KeyUsageMytokenSigning,
199-
config.Get().Signing.Mytoken.Alg.SignatureAlgorithm,
205+
algFromConfig(config.Get().Signing.Mytoken.Alg),
200206
)
201207
}
202208

@@ -249,7 +255,7 @@ func LoadOIDCSigningKey() error {
249255
func LoadFederationKey() {
250256
loadKey(
251257
config.Get().Features.Federation.Signing.KeyFile, KeyUsageFederation,
252-
config.Get().Features.Federation.Signing.Alg.SignatureAlgorithm,
258+
algFromConfig(config.Get().Features.Federation.Signing.Alg),
253259
)
254260
}
255261

internal/mytoken/pkg/mytoken.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ func (mt *Mytoken) ToJWT() (string, error) {
281281
}
282282
var err error
283283
j := jwt.NewWithClaims(
284-
jwt.GetSigningMethod(config.Get().Signing.Mytoken.Alg.String()), mt,
284+
jwt.GetSigningMethod(config.Get().Signing.Mytoken.Alg), mt,
285285
)
286286
j.Header["typ"] = "MT+JWT"
287287
mt.jwt, err = j.SignedString(jws.GetSigningKey(jws.KeyUsageMytokenSigning))

0 commit comments

Comments
 (0)