1package claude
2
3import (
4 "crypto/rand"
5 "crypto/sha256"
6 "encoding/base64"
7 "strings"
8)
9
10// GetChallenge generates a PKCE verifier and its corresponding challenge.
11func GetChallenge() (verifier string, challenge string, err error) {
12 bytes := make([]byte, 32)
13 if _, err := rand.Read(bytes); err != nil {
14 return "", "", err
15 }
16 verifier = encodeBase64(bytes)
17 hash := sha256.Sum256([]byte(verifier))
18 challenge = encodeBase64(hash[:])
19 return verifier, challenge, nil
20}
21
22func encodeBase64(input []byte) (encoded string) {
23 encoded = base64.StdEncoding.EncodeToString(input)
24 encoded = strings.ReplaceAll(encoded, "=", "")
25 encoded = strings.ReplaceAll(encoded, "+", "-")
26 encoded = strings.ReplaceAll(encoded, "/", "_")
27 return encoded
28}