Skip to content

Commit

Permalink
Isolate base64 codec (#22)
Browse files Browse the repository at this point in the history
* isolated all calls to encode base64 raw url encoding
  • Loading branch information
sasbury authored and aricart committed Dec 4, 2018
1 parent cd3b5f1 commit c75329a
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 9 deletions.
16 changes: 12 additions & 4 deletions claims.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,20 @@ type Prefix struct {
nkeys.PrefixByte
}

func encodeToString(d []byte) string {
return base64.RawURLEncoding.EncodeToString(d)
}

func decodeString(s string) ([]byte, error) {
return base64.RawURLEncoding.DecodeString(s)
}

func serialize(v interface{}) (string, error) {
j, err := json.Marshal(v)
if err != nil {
return "", err
}
return base64.RawURLEncoding.EncodeToString(j), nil
return encodeToString(j), nil
}

func (c *ClaimsData) doEncode(header *Header, kp nkeys.KeyPair, claim Claims) (string, error) {
Expand Down Expand Up @@ -143,7 +151,7 @@ func (c *ClaimsData) doEncode(header *Header, kp nkeys.KeyPair, claim Claims) (s
if err != nil {
return "", err
}
eSig := base64.RawURLEncoding.EncodeToString(sig)
eSig := encodeToString(sig)
return fmt.Sprintf("%s.%s.%s", h, payload, eSig), nil
}

Expand Down Expand Up @@ -173,7 +181,7 @@ func (c *ClaimsData) String(claim interface{}) string {
}

func parseClaims(s string, target Claims) error {
h, err := base64.RawURLEncoding.DecodeString(s)
h, err := decodeString(s)
if err != nil {
return err
}
Expand Down Expand Up @@ -239,7 +247,7 @@ func Decode(token string, target Claims) error {
return err
}

sig, err := base64.RawURLEncoding.DecodeString(chunks[2])
sig, err := decodeString(chunks[2])
if err != nil {
return err
}
Expand Down
17 changes: 14 additions & 3 deletions decoder_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package jwt

import (
"encoding/base64"
"encoding/json"
"fmt"
"reflect"
Expand Down Expand Up @@ -299,15 +298,15 @@ func TestBadClaimsEncoding(t *testing.T) {
}

func TestBadHeaderJSON(t *testing.T) {
payload := base64.RawURLEncoding.EncodeToString([]byte("{foo: bar}"))
payload := encodeToString([]byte("{foo: bar}"))
_, err := parseHeaders(payload)
if err == nil {
t.Fatal("should have failed bad json")
}
}

func TestBadClaimsJSON(t *testing.T) {
payload := base64.RawURLEncoding.EncodeToString([]byte("{foo: bar}"))
payload := encodeToString([]byte("{foo: bar}"))
c := GenericClaims{}
err := parseClaims(payload, &c)
if err == nil {
Expand Down Expand Up @@ -376,3 +375,15 @@ func TestDoEncodeNilKeyPair(t *testing.T) {
t.Fatalf("unexpected error on encode: %v", err)
}
}

// if this fails, the URL decoder was changed and JWTs will flap
func TestUsingURLDecoder(t *testing.T) {
token := "eyJ0eXAiOiJqd3QiLCJhbGciOiJlZDI1NTE5In0.eyJqdGkiOiJGQ1lZRjJLR0EzQTZHTlZQR0pIVjNUSExYR1VZWkFUREZLV1JTT1czUUo1T0k3QlJST0ZRIiwiaWF0IjoxNTQzOTQzNjc1LCJpc3MiOiJBQ1NKWkhOWlI0QUFUVE1KNzdUV1JONUJHVUZFWFhUS0gzWEtGTldDRkFCVzJRWldOUTRDQkhRRSIsInN1YiI6IkFEVEFHWVZYRkpPRENRM0g0VUZQQU43R1dXWk1BVU9FTTJMMkRWQkFWVFdLM01TU0xUS1JUTzVGIiwidHlwZSI6ImFjdGl2YXRpb24iLCJuYXRzIjp7InN1YmplY3QiOiJmb28iLCJ0eXBlIjoic2VydmljZSJ9fQ.HCZTCF-7wolS3Wjx3swQWMkoDhoo_4gp9EsuM5diJfZrH8s6NTpO0iT7_fKZm7dNDeEoqjwU--3ebp8j-Mm_Aw"
ac, err := DecodeActivationClaims(token)
if err != nil {
t.Fatal("shouldn't have failed to decode", err)
}
if ac == nil {
t.Fatal("should have returned activation")
}
}
3 changes: 1 addition & 2 deletions header.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package jwt

import (
"encoding/base64"
"encoding/json"
"fmt"
"strings"
Expand All @@ -28,7 +27,7 @@ type Header struct {

// Parses a header JWT token
func parseHeaders(s string) (*Header, error) {
h, err := base64.RawURLEncoding.DecodeString(s)
h, err := decodeString(s)
if err != nil {
return nil, err
}
Expand Down

0 comments on commit c75329a

Please sign in to comment.