| package jose |
| |
| import ( |
| "fmt" |
| "strings" |
| ) |
| |
| type JWS struct { |
| RawHeader string |
| Header JOSEHeader |
| RawPayload string |
| Payload []byte |
| Signature []byte |
| } |
| |
| // Given a raw encoded JWS token parses it and verifies the structure. |
| func ParseJWS(raw string) (JWS, error) { |
| parts := strings.Split(raw, ".") |
| if len(parts) != 3 { |
| return JWS{}, fmt.Errorf("malformed JWS, only %d segments", len(parts)) |
| } |
| |
| rawSig := parts[2] |
| jws := JWS{ |
| RawHeader: parts[0], |
| RawPayload: parts[1], |
| } |
| |
| header, err := decodeHeader(jws.RawHeader) |
| if err != nil { |
| return JWS{}, fmt.Errorf("malformed JWS, unable to decode header, %s", err) |
| } |
| if err = header.Validate(); err != nil { |
| return JWS{}, fmt.Errorf("malformed JWS, %s", err) |
| } |
| jws.Header = header |
| |
| payload, err := decodeSegment(jws.RawPayload) |
| if err != nil { |
| return JWS{}, fmt.Errorf("malformed JWS, unable to decode payload: %s", err) |
| } |
| jws.Payload = payload |
| |
| sig, err := decodeSegment(rawSig) |
| if err != nil { |
| return JWS{}, fmt.Errorf("malformed JWS, unable to decode signature: %s", err) |
| } |
| jws.Signature = sig |
| |
| return jws, nil |
| } |