func parseCompact(encoded []byte, jwt bool, u ...json.Unmarshaler) (*jws, error) { // This section loosely follows // https://tools.ietf.org/html/rfc7519#section-7.2 // because it's used to parse _both_ jws and JWTs. parts := bytes.Split(encoded, []byte{'.'}) if len(parts) != 3 { return nil, ErrNotCompact } var p jose.Protected if err := p.UnmarshalJSON(parts[0]); err != nil { return nil, err } s := sigHead{ Protected: parts[0], protected: p, Signature: parts[2], clean: true, } if err := s.assignMethod(p); err != nil { return nil, err } var pl payload if len(u) > 0 { pl.u = u[0] } j := jws{ payload: &pl, plcache: parts[1], sb: []sigHead{s}, isJWT: jwt, } if err := j.payload.UnmarshalJSON(parts[1]); err != nil { return nil, err } j.clean = true if err := j.sb[0].Signature.UnmarshalJSON(parts[2]); err != nil { return nil, err } // https://tools.ietf.org/html/rfc7519#section-7.2.8 cty, ok := p.Get("cty").(string) if ok && cty == "JWT" { return &j, ErrHoldsJWE } return &j, nil }
func (s *sigHead) assignMethod(p jose.Protected) error { alg, ok := p.Get("alg").(string) if !ok { return ErrNoAlgorithm } sm := GetSigningMethod(alg) if sm == nil { return ErrNoAlgorithm } s.method = sm return nil }