package auth
import (
crypto_rand "crypto/rand"
"crypto/sha256"
"encoding/base64"
"encoding/binary"
"math/rand"
math_rand "math/rand"
"time"
)
func init() {
PKCEInit()
}
func PKCEInit() {
var seed int64
var b [8]byte
_, err := crypto_rand.Read(b[:])
if err == nil {
seed = int64(binary.LittleEndian.Uint64(b[:]))
} else {
seed = time.Now().UnixNano()
}
math_rand.Seed(seed)
}
func PKCEVerifier(length int) string {
if length > 128 {
length = 128
}
if length < 43 {
length = 43
}
const charset = "abcdefghijklmnopqrstuvwxyz" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~"
b := make([]byte, length)
for i := range b {
b[i] = charset[rand.Intn(len(charset))]
}
return string(b)
}
func PKCEChallenge(verifier string) string {
sum := sha256.Sum256([]byte(verifier))
challenge := base64.URLEncoding.WithPadding(base64.NoPadding).EncodeToString(sum[:])
return (challenge)
}