auth/vendor/github.com/lestrrat-go/jwx/v2/internal/base64/base64.go

66 lines
1.2 KiB
Go

package base64
import (
"bytes"
"encoding/base64"
"encoding/binary"
"fmt"
)
func Encode(src []byte) []byte {
enc := base64.RawURLEncoding
dst := make([]byte, enc.EncodedLen(len(src)))
enc.Encode(dst, src)
return dst
}
func EncodeToStringStd(src []byte) string {
return base64.StdEncoding.EncodeToString(src)
}
func EncodeToString(src []byte) string {
return base64.RawURLEncoding.EncodeToString(src)
}
func EncodeUint64ToString(v uint64) string {
data := make([]byte, 8)
binary.BigEndian.PutUint64(data, v)
i := 0
for ; i < len(data); i++ {
if data[i] != 0x0 {
break
}
}
return EncodeToString(data[i:])
}
func Decode(src []byte) ([]byte, error) {
var enc *base64.Encoding
var isRaw = !bytes.HasSuffix(src, []byte{'='})
var isURL = !bytes.ContainsAny(src, "+/")
switch {
case isRaw && isURL:
enc = base64.RawURLEncoding
case isURL:
enc = base64.URLEncoding
case isRaw:
enc = base64.RawStdEncoding
default:
enc = base64.StdEncoding
}
dst := make([]byte, enc.DecodedLen(len(src)))
n, err := enc.Decode(dst, src)
if err != nil {
return nil, fmt.Errorf(`failed to decode source: %w`, err)
}
return dst[:n], nil
}
func DecodeString(src string) ([]byte, error) {
return Decode([]byte(src))
}