...

Source file src/github.com/lestrrat-go/jwx/jws/signer.go

Documentation: github.com/lestrrat-go/jwx/jws

     1  package jws
     2  
     3  import (
     4  	"github.com/lestrrat-go/jwx/jwa"
     5  	"github.com/pkg/errors"
     6  )
     7  
     8  type SignerFactory interface {
     9  	Create() (Signer, error)
    10  }
    11  type SignerFactoryFn func() (Signer, error)
    12  
    13  func (fn SignerFactoryFn) Create() (Signer, error) {
    14  	return fn()
    15  }
    16  
    17  var signerDB map[jwa.SignatureAlgorithm]SignerFactory
    18  
    19  // RegisterSigner is used to register a factory object that creates
    20  // Signer objects based on the given algorithm.
    21  //
    22  // For example, if you would like to provide a custom signer for
    23  // jwa.EdDSA, use this function to register a `SignerFactory`
    24  // (probably in your `init()`)
    25  func RegisterSigner(alg jwa.SignatureAlgorithm, f SignerFactory) {
    26  	signerDB[alg] = f
    27  }
    28  
    29  func init() {
    30  	signerDB = make(map[jwa.SignatureAlgorithm]SignerFactory)
    31  
    32  	for _, alg := range []jwa.SignatureAlgorithm{jwa.RS256, jwa.RS384, jwa.RS512, jwa.PS256, jwa.PS384, jwa.PS512} {
    33  		RegisterSigner(alg, func(alg jwa.SignatureAlgorithm) SignerFactory {
    34  			return SignerFactoryFn(func() (Signer, error) {
    35  				return newRSASigner(alg), nil
    36  			})
    37  		}(alg))
    38  	}
    39  
    40  	for _, alg := range []jwa.SignatureAlgorithm{jwa.ES256, jwa.ES384, jwa.ES512, jwa.ES256K} {
    41  		RegisterSigner(alg, func(alg jwa.SignatureAlgorithm) SignerFactory {
    42  			return SignerFactoryFn(func() (Signer, error) {
    43  				return newECDSASigner(alg), nil
    44  			})
    45  		}(alg))
    46  	}
    47  
    48  	for _, alg := range []jwa.SignatureAlgorithm{jwa.HS256, jwa.HS384, jwa.HS512} {
    49  		RegisterSigner(alg, func(alg jwa.SignatureAlgorithm) SignerFactory {
    50  			return SignerFactoryFn(func() (Signer, error) {
    51  				return newHMACSigner(alg), nil
    52  			})
    53  		}(alg))
    54  	}
    55  
    56  	RegisterSigner(jwa.EdDSA, SignerFactoryFn(func() (Signer, error) {
    57  		return newEdDSASigner(), nil
    58  	}))
    59  }
    60  
    61  // NewSigner creates a signer that signs payloads using the given signature algorithm.
    62  func NewSigner(alg jwa.SignatureAlgorithm) (Signer, error) {
    63  	f, ok := signerDB[alg]
    64  	if ok {
    65  		return f.Create()
    66  	}
    67  	return nil, errors.Errorf(`unsupported signature algorithm "%s"`, alg)
    68  }
    69  

View as plain text