Files
narco/jwt/base64.go
Alexandre Tuleu 00c5853b45 Adds JWS encode and decode
It also adds interfaces Signer and HS256 and RS256 implementation.
2015-08-18 16:11:56 +02:00

64 lines
1.6 KiB
Go

package jwt
import (
"encoding/base64"
"fmt"
)
// Base64EncodedBufferLen return the size needed to encode the
// Base64Encode (padding '=' would be added, can be stripped with
// Base64DecodedStrippedLen
func Base64EncodedBufferLen(n int) int {
return base64.URLEncoding.EncodedLen(n)
}
// Base64EncodedStrippedLen return the size of the encoded slice with no
// padding.
func Base64EncodedStrippedLen(n int) int {
eN := Base64EncodedBufferLen(n)
mod := n % 3
if mod == 0 {
return eN
}
return eN - (3 - mod)
}
// Base64DecodedStrippedLen returns the size of the data, without 0
// bit padding, from the stripped length n.
func Base64DecodedStrippedLen(n int) int {
return Base64DecodedLenFromStripped(n) + n - ((n+3)/4)*4
}
// Base64DecodedLenFromStripped returns the size of the data, with 0
// bit padding, from the stripped length n.
func Base64DecodedLenFromStripped(n int) int {
return base64.URLEncoding.DecodedLen(4 * ((n + 3) / 4))
}
// Base64Decode decodes a payload of data as a []byte, from a stripped
// '=' encoded string.
func Base64Decode(dst, src []byte) error {
switch len(src) % 4 {
// in this case, we have to copy the src, in order to allow decode part of the input
case 2:
oldSrc := src
src = make([]byte, len(src)+2)
copy(src, oldSrc)
src[len(src)-2] = '='
src[len(src)-1] = '='
case 3:
oldSrc := src
src = make([]byte, len(src)+1)
copy(src, oldSrc)
src[len(src)-1] = '='
case 1:
return fmt.Errorf("jwt: Invalid base64 string (length:%d %% 4 == 1): '%s'", len(src), src)
}
_, err := base64.URLEncoding.Decode(dst, src)
if err != nil {
return fmt.Errorf("jwt: %s", err)
}
return nil
}