challenge.go

 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}