github.com/aarzilli/tools@v0.0.0-20151123112009-0d27094f75e0/appengine/login/googlesignin/jwt-go/hmac.go (about) 1 package jwt 2 3 import ( 4 "crypto" 5 "crypto/hmac" 6 "errors" 7 ) 8 9 // Implements the HMAC-SHA family of signing methods signing methods 10 type SigningMethodHMAC struct { 11 Name string 12 Hash crypto.Hash 13 } 14 15 // Specific instances for HS256 and company 16 var ( 17 SigningMethodHS256 *SigningMethodHMAC 18 SigningMethodHS384 *SigningMethodHMAC 19 SigningMethodHS512 *SigningMethodHMAC 20 ErrSignatureInvalid = errors.New("signature is invalid") 21 ) 22 23 func init() { 24 // HS256 25 SigningMethodHS256 = &SigningMethodHMAC{"HS256", crypto.SHA256} 26 RegisterSigningMethod(SigningMethodHS256.Alg(), func() SigningMethod { 27 return SigningMethodHS256 28 }) 29 30 // HS384 31 SigningMethodHS384 = &SigningMethodHMAC{"HS384", crypto.SHA384} 32 RegisterSigningMethod(SigningMethodHS384.Alg(), func() SigningMethod { 33 return SigningMethodHS384 34 }) 35 36 // HS512 37 SigningMethodHS512 = &SigningMethodHMAC{"HS512", crypto.SHA512} 38 RegisterSigningMethod(SigningMethodHS512.Alg(), func() SigningMethod { 39 return SigningMethodHS512 40 }) 41 } 42 43 func (m *SigningMethodHMAC) Alg() string { 44 return m.Name 45 } 46 47 func (m *SigningMethodHMAC) Verify(signingString, signature string, key interface{}) error { 48 if keyBytes, ok := key.([]byte); ok { 49 var sig []byte 50 var err error 51 if sig, err = DecodeSegment(signature); err == nil { 52 if !m.Hash.Available() { 53 return ErrHashUnavailable 54 } 55 56 hasher := hmac.New(m.Hash.New, keyBytes) 57 hasher.Write([]byte(signingString)) 58 59 if !hmac.Equal(sig, hasher.Sum(nil)) { 60 err = ErrSignatureInvalid 61 } 62 } 63 return err 64 } 65 66 return ErrInvalidKey 67 } 68 69 // Implements the Sign method from SigningMethod for this signing method. 70 // Key must be []byte 71 func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) { 72 if keyBytes, ok := key.([]byte); ok { 73 if !m.Hash.Available() { 74 return "", ErrHashUnavailable 75 } 76 77 hasher := hmac.New(m.Hash.New, keyBytes) 78 hasher.Write([]byte(signingString)) 79 80 return EncodeSegment(hasher.Sum(nil)), nil 81 } 82 83 return "", ErrInvalidKey 84 }