52 lines
1.1 KiB
Go
52 lines
1.1 KiB
Go
|
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
|
||
|
}
|