Skip to content

Commit bda6436

Browse files
Dillon StreatorDillon Streator
authored andcommitted
hmac sign should accept a key as string
1 parent 0c4e387 commit bda6436

File tree

2 files changed

+42
-24
lines changed

2 files changed

+42
-24
lines changed

hmac.go

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ func (m *SigningMethodHMAC) Alg() string {
4848
// Verify implements token verification for the SigningMethod. Returns nil if the signature is valid.
4949
func (m *SigningMethodHMAC) Verify(signingString, signature string, key interface{}) error {
5050
// Verify the key is the right type
51-
keyBytes, ok := key.([]byte)
52-
if !ok {
53-
return ErrInvalidKeyType
51+
keyBytes, err := m.keyBytesFrom(key)
52+
if err != nil {
53+
return err
5454
}
5555

5656
// Decode signature, for comparison
@@ -80,16 +80,28 @@ func (m *SigningMethodHMAC) Verify(signingString, signature string, key interfac
8080
// Sign implements token signing for the SigningMethod.
8181
// Key must be []byte
8282
func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) {
83-
if keyBytes, ok := key.([]byte); ok {
84-
if !m.Hash.Available() {
85-
return "", ErrHashUnavailable
86-
}
87-
88-
hasher := hmac.New(m.Hash.New, keyBytes)
89-
hasher.Write([]byte(signingString))
83+
keyBytes, err := m.keyBytesFrom(key)
84+
if err != nil {
85+
return "", err
86+
}
9087

91-
return EncodeSegment(hasher.Sum(nil)), nil
88+
if !m.Hash.Available() {
89+
return "", ErrHashUnavailable
9290
}
9391

94-
return "", ErrInvalidKeyType
92+
hasher := hmac.New(m.Hash.New, keyBytes)
93+
hasher.Write([]byte(signingString))
94+
95+
return EncodeSegment(hasher.Sum(nil)), nil
96+
}
97+
98+
func (m *SigningMethodHMAC) keyBytesFrom(value interface{}) ([]byte, error) {
99+
switch v := value.(type) {
100+
case []byte:
101+
return v, nil
102+
case string:
103+
return []byte(v), nil
104+
default:
105+
return nil, ErrInvalidKeyType
106+
}
95107
}

hmac_test.go

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,21 @@ var hmacTestData = []struct {
4848
// Sample data from http://tools.ietf.org/html/draft-jones-json-web-signature-04#appendix-A.1
4949
var hmacTestKey, _ = os.ReadFile("test/hmacTestKey")
5050

51+
var hmacTestKeyString = string(hmacTestKey)
52+
5153
func TestHMACVerify(t *testing.T) {
5254
for _, data := range hmacTestData {
5355
parts := strings.Split(data.tokenString, ".")
5456

5557
method := jwt.GetSigningMethod(data.alg)
56-
err := method.Verify(strings.Join(parts[0:2], "."), parts[2], hmacTestKey)
57-
if data.valid && err != nil {
58-
t.Errorf("[%v] Error while verifying key: %v", data.name, err)
59-
}
60-
if !data.valid && err == nil {
61-
t.Errorf("[%v] Invalid key passed validation", data.name)
58+
for _, hmacTestKey := range []interface{}{hmacTestKey, hmacTestKeyString} {
59+
err := method.Verify(strings.Join(parts[0:2], "."), parts[2], hmacTestKey)
60+
if data.valid && err != nil {
61+
t.Errorf("[%v] Error while verifying key: %v", data.name, err)
62+
}
63+
if !data.valid && err == nil {
64+
t.Errorf("[%v] Invalid key passed validation", data.name)
65+
}
6266
}
6367
}
6468
}
@@ -68,12 +72,14 @@ func TestHMACSign(t *testing.T) {
6872
if data.valid {
6973
parts := strings.Split(data.tokenString, ".")
7074
method := jwt.GetSigningMethod(data.alg)
71-
sig, err := method.Sign(strings.Join(parts[0:2], "."), hmacTestKey)
72-
if err != nil {
73-
t.Errorf("[%v] Error signing token: %v", data.name, err)
74-
}
75-
if sig != parts[2] {
76-
t.Errorf("[%v] Incorrect signature.\nwas:\n%v\nexpecting:\n%v", data.name, sig, parts[2])
75+
for _, hmacTestKey := range []interface{}{hmacTestKey, hmacTestKeyString} {
76+
sig, err := method.Sign(strings.Join(parts[0:2], "."), hmacTestKey)
77+
if err != nil {
78+
t.Errorf("[%v] Error signing token: %v", data.name, err)
79+
}
80+
if sig != parts[2] {
81+
t.Errorf("[%v] Incorrect signature.\nwas:\n%v\nexpecting:\n%v", data.name, sig, parts[2])
82+
}
7783
}
7884
}
7985
}

0 commit comments

Comments
 (0)