...

Source file src/github.com/lestrrat-go/jwx/jws/verifier.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 VerifierFactory interface {
     9  	Create() (Verifier, error)
    10  }
    11  type VerifierFactoryFn func() (Verifier, error)
    12  
    13  func (fn VerifierFactoryFn) Create() (Verifier, error) {
    14  	return fn()
    15  }
    16  
    17  var verifierDB map[jwa.SignatureAlgorithm]VerifierFactory
    18  
    19  // RegisterVerifier is used to register a factory object that creates
    20  // Verifier objects based on the given algorithm.
    21  //
    22  // For example, if you would like to provide a custom verifier for
    23  // jwa.EdDSA, use this function to register a `VerifierFactory`
    24  // (probably in your `init()`)
    25  func RegisterVerifier(alg jwa.SignatureAlgorithm, f VerifierFactory) {
    26  	verifierDB[alg] = f
    27  }
    28  
    29  func init() {
    30  	verifierDB = make(map[jwa.SignatureAlgorithm]VerifierFactory)
    31  
    32  	for _, alg := range []jwa.SignatureAlgorithm{jwa.RS256, jwa.RS384, jwa.RS512, jwa.PS256, jwa.PS384, jwa.PS512} {
    33  		RegisterVerifier(alg, func(alg jwa.SignatureAlgorithm) VerifierFactory {
    34  			return VerifierFactoryFn(func() (Verifier, error) {
    35  				return newRSAVerifier(alg), nil
    36  			})
    37  		}(alg))
    38  	}
    39  
    40  	for _, alg := range []jwa.SignatureAlgorithm{jwa.ES256, jwa.ES384, jwa.ES512, jwa.ES256K} {
    41  		RegisterVerifier(alg, func(alg jwa.SignatureAlgorithm) VerifierFactory {
    42  			return VerifierFactoryFn(func() (Verifier, error) {
    43  				return newECDSAVerifier(alg), nil
    44  			})
    45  		}(alg))
    46  	}
    47  
    48  	for _, alg := range []jwa.SignatureAlgorithm{jwa.HS256, jwa.HS384, jwa.HS512} {
    49  		RegisterVerifier(alg, func(alg jwa.SignatureAlgorithm) VerifierFactory {
    50  			return VerifierFactoryFn(func() (Verifier, error) {
    51  				return newHMACVerifier(alg), nil
    52  			})
    53  		}(alg))
    54  	}
    55  
    56  	RegisterVerifier(jwa.EdDSA, VerifierFactoryFn(func() (Verifier, error) {
    57  		return newEdDSAVerifier(), nil
    58  	}))
    59  }
    60  
    61  // NewVerifier creates a verifier that signs payloads using the given signature algorithm.
    62  func NewVerifier(alg jwa.SignatureAlgorithm) (Verifier, error) {
    63  	f, ok := verifierDB[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