package jose import "encoding/base64" // Encoder is satisfied if the type can marshal itself into a valid // structure for a JWS. type Encoder interface { // Base64 implies T -> JSON -> RawURLEncodingBase64 Base64() ([]byte, error) } // Base64Decode decodes a base64-encoded byte slice. func Base64Decode(b []byte) ([]byte, error) { buf := make([]byte, base64.RawURLEncoding.DecodedLen(len(b))) n, err := base64.RawURLEncoding.Decode(buf, b) return buf[:n], err } // Base64Encode encodes a byte slice. func Base64Encode(b []byte) []byte { buf := make([]byte, base64.RawURLEncoding.EncodedLen(len(b))) base64.RawURLEncoding.Encode(buf, b) return buf } // EncodeEscape base64-encodes a byte slice but escapes it for JSON. // It'll return the format: `"base64"` func EncodeEscape(b []byte) []byte { buf := make([]byte, base64.RawURLEncoding.EncodedLen(len(b))+2) buf[0] = '"' base64.RawURLEncoding.Encode(buf[1:], b) buf[len(buf)-1] = '"' return buf } // DecodeEscaped decodes a base64-encoded byte slice straight from a JSON // structure. It assumes it's in the format: `"base64"`, but can handle // cases where it's not. func DecodeEscaped(b []byte) ([]byte, error) { if len(b) > 1 && b[0] == '"' && b[len(b)-1] == '"' { b = b[1 : len(b)-1] } return Base64Decode(b) }