55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
|
|
package auth
|
||
|
|
|
||
|
|
import (
|
||
|
|
"strings"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
// RFC 7636 Appendix B known vector.
|
||
|
|
// verifier = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
|
||
|
|
// expected challenge (S256) = "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM"
|
||
|
|
const (
|
||
|
|
rfcVerifier = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
|
||
|
|
rfcChallenge = "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestChallengeS256_RFCVector(t *testing.T) {
|
||
|
|
got := ChallengeS256(rfcVerifier)
|
||
|
|
if got != rfcChallenge {
|
||
|
|
t.Errorf("ChallengeS256(%q) = %q, want %q", rfcVerifier, got, rfcChallenge)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGenerateVerifier_Length(t *testing.T) {
|
||
|
|
v, err := GenerateVerifier()
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if len(v) < 43 || len(v) > 128 {
|
||
|
|
t.Errorf("verifier length %d outside [43,128]", len(v))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGenerateVerifier_URLSafe(t *testing.T) {
|
||
|
|
for range 20 {
|
||
|
|
v, err := GenerateVerifier()
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
for _, c := range v {
|
||
|
|
if !strings.ContainsRune("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~", c) {
|
||
|
|
t.Errorf("verifier %q contains non-URL-safe char %q", v, c)
|
||
|
|
break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGenerateVerifier_Unique(t *testing.T) {
|
||
|
|
a, _ := GenerateVerifier()
|
||
|
|
b, _ := GenerateVerifier()
|
||
|
|
if a == b {
|
||
|
|
t.Error("two calls returned the same verifier")
|
||
|
|
}
|
||
|
|
}
|