45 lines
1.3 KiB
Go
45 lines
1.3 KiB
Go
|
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)
|
||
|
}
|