jws: minor stylistic changes and dead code removal
diff --git a/crypto/ecdsa.go b/crypto/ecdsa.go
index c518c9d..3ef12ba 100644
--- a/crypto/ecdsa.go
+++ b/crypto/ecdsa.go
@@ -101,7 +101,9 @@
 }
 
 // Hasher implements the Hasher method from SigningMethod.
-func (m *SigningMethodECDSA) Hasher() crypto.Hash { return m.Hash }
+func (m *SigningMethodECDSA) Hasher() crypto.Hash {
+	return m.Hash
+}
 
 // MarshalJSON is in case somebody decides to place SigningMethodECDSA
 // inside the Header, presumably because they (wrongly) decided it was a good
diff --git a/crypto/none.go b/crypto/none.go
index 2b27af4..db3d139 100644
--- a/crypto/none.go
+++ b/crypto/none.go
@@ -7,24 +7,28 @@
 	"io"
 )
 
-func init() { crypto.RegisterHash(crypto.Hash(0), h) }
+func init() {
+	crypto.RegisterHash(crypto.Hash(0), h)
+}
 
 // h is passed to crypto.RegisterHash.
-func h() hash.Hash { return &f{Writer: nil} }
+func h() hash.Hash {
+	return &f{Writer: nil}
+}
 
 type f struct{ io.Writer }
 
 // Sum helps implement the hash.Hash interface.
-func (f *f) Sum(b []byte) []byte { return nil }
+func (_ *f) Sum(b []byte) []byte { return nil }
 
 // Reset helps implement the hash.Hash interface.
-func (f *f) Reset() {}
+func (_ *f) Reset() {}
 
 // Size helps implement the hash.Hash interface.
-func (f *f) Size() int { return -1 }
+func (_ *f) Size() int { return -1 }
 
 // BlockSize helps implement the hash.Hash interface.
-func (f *f) BlockSize() int { return -1 }
+func (_ *f) BlockSize() int { return -1 }
 
 // Unsecured is the default "none" algorithm.
 var Unsecured = &SigningMethodNone{
@@ -40,20 +44,24 @@
 }
 
 // Verify helps implement the SigningMethod interface.
-func (m *SigningMethodNone) Verify(_ []byte, _ Signature, _ interface{}) error {
+func (_ *SigningMethodNone) Verify(_ []byte, _ Signature, _ interface{}) error {
 	return nil
 }
 
 // Sign helps implement the SigningMethod interface.
-func (m *SigningMethodNone) Sign(_ []byte, _ interface{}) (Signature, error) {
+func (_ *SigningMethodNone) Sign(_ []byte, _ interface{}) (Signature, error) {
 	return nil, nil
 }
 
 // Alg helps implement the SigningMethod interface.
-func (m *SigningMethodNone) Alg() string { return m.Name }
+func (m *SigningMethodNone) Alg() string {
+	return m.Name
+}
 
 // Hasher helps implement the SigningMethod interface.
-func (m *SigningMethodNone) Hasher() crypto.Hash { return m.Hash }
+func (m *SigningMethodNone) Hasher() crypto.Hash {
+	return m.Hash
+}
 
 // MarshalJSON implements json.Marshaler.
 // See SigningMethodECDSA.MarshalJSON() for information.
diff --git a/header.go b/header.go
index 4bf64c5..4499a76 100644
--- a/header.go
+++ b/header.go
@@ -32,7 +32,7 @@
 
 // MarshalJSON implements json.Marshaler for Header.
 func (h Header) MarshalJSON() ([]byte, error) {
-	if h == nil || len(h) == 0 {
+	if len(h) == 0 {
 		return nil, nil
 	}
 	b, err := json.Marshal(map[string]interface{}(h))
@@ -52,23 +52,11 @@
 	if b == nil {
 		return nil
 	}
-
 	b, err := DecodeEscaped(b)
 	if err != nil {
 		return err
 	}
-
-	// Since json.Unmarshal calls UnmarshalJSON,
-	// calling json.Unmarshal on *p would be infinitely recursive
-	// A temp variable is needed because &map[string]interface{}(*p) is
-	// invalid Go.
-
-	tmp := map[string]interface{}(*h)
-	if err = json.Unmarshal(b, &tmp); err != nil {
-		return err
-	}
-	*h = tmp
-	return nil
+	return json.Unmarshal(b, (*map[string]interface{})(h))
 }
 
 // Protected Headers are base64-encoded after they're marshaled into
@@ -131,4 +119,6 @@
 var (
 	_ json.Marshaler   = (Protected)(nil)
 	_ json.Unmarshaler = (*Protected)(nil)
+	_ json.Marshaler   = (Header)(nil)
+	_ json.Unmarshaler = (*Header)(nil)
 )
diff --git a/jws/jws.go b/jws/jws.go
index a0b929d..29ae67c 100644
--- a/jws/jws.go
+++ b/jws/jws.go
@@ -16,17 +16,21 @@
 	Payload() interface{}
 
 	// SetPayload sets the payload with the given value.
-	SetPayload(interface{})
+	SetPayload(p interface{})
 
 	// Protected returns the JWS' Protected Header.
+	Protected() jose.Protected
+
+	// ProtectedAt returns the JWS' Protected Header.
 	// i represents the index of the Protected Header.
-	// Left empty, it defaults to 0.
-	Protected(...int) jose.Protected
+	ProtectedAt(i int) jose.Protected
 
 	// Header returns the JWS' unprotected Header.
-	// i represents the index of the Protected Header.
-	// Left empty, it defaults to 0.
-	Header(...int) jose.Header
+	Header() jose.Header
+
+	// HeaderAt returns the JWS' unprotected Header.
+	// i represents the index of the unprotected Header.
+	HeaderAt(i int) jose.Header
 
 	// Verify validates the current JWS' signature as-is. Refer to
 	// ValidateMulti for more information.
@@ -74,29 +78,36 @@
 }
 
 // Payload returns the jws' payload.
-func (j *jws) Payload() interface{} { return j.payload.v }
+func (j *jws) Payload() interface{} {
+	return j.payload.v
+}
 
 // SetPayload sets the jws' raw, unexported payload.
-func (j *jws) SetPayload(val interface{}) { j.payload.v = val }
+func (j *jws) SetPayload(val interface{}) {
+	j.payload.v = val
+}
+
+// Protected returns the JWS' Protected Header.
+func (j *jws) Protected() jose.Protected {
+	return j.sb[0].protected
+}
 
 // Protected returns the JWS' Protected Header.
 // i represents the index of the Protected Header.
 // Left empty, it defaults to 0.
-func (j *jws) Protected(i ...int) jose.Protected {
-	if len(i) == 0 {
-		return j.sb[0].protected
-	}
-	return j.sb[i[0]].protected
+func (j *jws) ProtectedAt(i int) jose.Protected {
+	return j.sb[i].protected
 }
 
 // Header returns the JWS' unprotected Header.
-// i represents the index of the Protected Header.
-// Left empty, it defaults to 0.
-func (j *jws) Header(i ...int) jose.Header {
-	if len(i) == 0 {
-		return j.sb[0].unprotected
-	}
-	return j.sb[i[0]].unprotected
+func (j *jws) Header() jose.Header {
+	return j.sb[0].unprotected
+}
+
+// HeaderAt returns the JWS' unprotected Header.
+// |i| is the index of the unprotected Header.
+func (j *jws) HeaderAt(i int) jose.Header {
+	return j.sb[i].unprotected
 }
 
 // sigHead represents the 'signatures' member of the jws' "general"
@@ -121,10 +132,7 @@
 	if err := s.protected.UnmarshalJSON(s.Protected); err != nil {
 		return err
 	}
-	if err := s.unprotected.UnmarshalJSON(s.Unprotected); err != nil {
-		return err
-	}
-	return nil
+	return s.unprotected.UnmarshalJSON(s.Unprotected)
 }
 
 // New creates a JWS with the provided crypto.SigningMethods.
@@ -155,7 +163,6 @@
 	if sm == nil {
 		return ErrNoAlgorithm
 	}
-
 	s.method = sm
 	return nil
 }
@@ -236,10 +243,10 @@
 		if err := g.Signatures[i].assignMethod(g.Signatures[i].protected); err != nil {
 			return nil, err
 		}
-
-		g.clean = true
 	}
 
+	g.clean = len(g.Signatures) != 0
+
 	return &jws{
 		payload: &p,
 		plcache: g.Payload,
@@ -390,11 +397,12 @@
 	Compact
 )
 
-var parseJumpTable = [^Format(0)]func([]byte, ...json.Unmarshaler) (JWS, error){
-	Unknown: Parse,
-	Flat:    ParseFlat,
-	General: ParseGeneral,
-	Compact: ParseCompact,
+var parseJumpTable = [...]func([]byte, ...json.Unmarshaler) (JWS, error){
+	Unknown:  Parse,
+	Flat:     ParseFlat,
+	General:  ParseGeneral,
+	Compact:  ParseCompact,
+	1<<8 - 1: Parse, // Max uint8.
 }
 
 func init() {
diff --git a/jws/jws_serialize.go b/jws/jws_serialize.go
index 9cb53af..923fdc2 100644
--- a/jws/jws_serialize.go
+++ b/jws/jws_serialize.go
@@ -100,36 +100,28 @@
 }
 
 // cache marshals the payload, but only if it's changed since the last cache.
-func (j *jws) cache() error {
+func (j *jws) cache() (err error) {
 	if !j.clean {
-		var err error
 		j.plcache, err = j.payload.Base64()
 		j.clean = err == nil
-		return err
 	}
-	return nil
+	return err
 }
 
 // cache marshals the protected and unprotected headers, but only if
 // they've changed since their last cache.
-func (s *sigHead) cache() error {
+func (s *sigHead) cache() (err error) {
 	if !s.clean {
-		var err error
-
 		s.Protected, err = s.protected.Base64()
 		if err != nil {
-			goto err_return
+			return err
 		}
-
 		s.Unprotected, err = s.unprotected.Base64()
 		if err != nil {
-			goto err_return
+			return err
 		}
-
-	err_return:
-		s.clean = err == nil
-		return err
 	}
+	s.clean = true
 	return nil
 }
 
diff --git a/jws/jwt.go b/jws/jwt.go
index 9720613..f98edf1 100644
--- a/jws/jwt.go
+++ b/jws/jwt.go
@@ -64,7 +64,9 @@
 }
 
 // IsJWT returns true if the JWS is a JWT.
-func (j *jws) IsJWT() bool { return j.isJWT }
+func (j *jws) IsJWT() bool {
+	return j.isJWT
+}
 
 func (j *jws) Validate(key interface{}, m crypto.SigningMethod, v ...*jwt.Validator) error {
 	if j.isJWT {
diff --git a/jws/payload.go b/jws/payload.go
index 34ba6d8..58bfd06 100644
--- a/jws/payload.go
+++ b/jws/payload.go
@@ -37,13 +37,11 @@
 	if err != nil {
 		return err
 	}
-
 	if p.u != nil {
 		err := p.u.UnmarshalJSON(b2)
 		p.v = p.u
 		return err
 	}
-
 	return json.Unmarshal(b2, &p.v)
 }
 
diff --git a/jws/signing_methods.go b/jws/signing_methods.go
index 1b6665f..525806f 100644
--- a/jws/signing_methods.go
+++ b/jws/signing_methods.go
@@ -7,7 +7,7 @@
 )
 
 var (
-	mu = &sync.RWMutex{}
+	mu sync.RWMutex
 
 	signingMethods = map[string]crypto.SigningMethod{
 		crypto.SigningMethodES256.Alg(): crypto.SigningMethodES256,
@@ -33,7 +33,8 @@
 // RegisterSigningMethod registers the crypto.SigningMethod in the global map.
 // This is typically done inside the caller's init function.
 func RegisterSigningMethod(sm crypto.SigningMethod) {
-	if GetSigningMethod(sm.Alg()) != nil {
+	alg := sm.Alg()
+	if GetSigningMethod(alg) != nil {
 		panic("jose/jws: cannot duplicate signing methods")
 	}
 
@@ -42,7 +43,7 @@
 	}
 
 	mu.Lock()
-	signingMethods[sm.Alg()] = sm
+	signingMethods[alg] = sm
 	mu.Unlock()
 }
 
@@ -54,8 +55,9 @@
 }
 
 // GetSigningMethod retrieves a crypto.SigningMethod from the global map.
-func GetSigningMethod(alg string) crypto.SigningMethod {
+func GetSigningMethod(alg string) (method crypto.SigningMethod) {
 	mu.RLock()
-	defer mu.RUnlock()
-	return signingMethods[alg]
+	method = signingMethods[alg]
+	mu.RUnlock()
+	return method
 }
diff --git a/jwt/claims.go b/jwt/claims.go
index d4f94b8..ae41e7d 100644
--- a/jwt/claims.go
+++ b/jwt/claims.go
@@ -61,7 +61,7 @@
 	return json.Marshal(map[string]interface{}(c))
 }
 
-// Base64 implements the Encoder interface.
+// Base64 implements the jose.Encoder interface.
 func (c Claims) Base64() ([]byte, error) {
 	b, err := c.MarshalJSON()
 	if err != nil {