mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-15 08:12:15 +00:00
feat: sign reconnect authorisations
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package domain
|
||||
|
||||
import (
|
||||
"crypto/hmac"
|
||||
"crypto/sha256"
|
||||
"errors"
|
||||
"testing"
|
||||
"time"
|
||||
@@ -92,3 +94,42 @@ func TestRankedAbandonCooldownUsesRollingSevenDayLadder(t *testing.T) {
|
||||
t.Fatalf("abandonment repeated: %+v", again)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSignedJoinAuthorisationBindsEveryClaimBeforeReclaim(t *testing.T) {
|
||||
now := time.Unix(1000, 0).UTC()
|
||||
r, err := NewRankedConnections("match-1", "server-1", "v1", testRoster(now))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
key := []byte("test-signing-key")
|
||||
sign := func(payload []byte) ([]byte, error) {
|
||||
mac := hmac.New(sha256.New, key)
|
||||
_, _ = mac.Write(payload)
|
||||
return mac.Sum(nil), nil
|
||||
}
|
||||
verify := func(payload, signature []byte) bool {
|
||||
expected, _ := sign(payload)
|
||||
return hmac.Equal(expected, signature)
|
||||
}
|
||||
signed, err := SignJoinAuthorisation(testRoster(now)[0], sign)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if gen, err := r.AdmitSigned(signed, verify, now); err != nil || gen != 1 {
|
||||
t.Fatalf("signed initial admit = %d, %v", gen, err)
|
||||
}
|
||||
if err := r.Disconnect("a", 1, now); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
tampered := signed
|
||||
tampered.Authorisation.Slot = 1
|
||||
if _, err := r.AdmitSigned(tampered, verify, now.Add(time.Second)); !errors.Is(err, ErrJoinAuthorisation) {
|
||||
t.Fatalf("tampered slot accepted: %v", err)
|
||||
}
|
||||
if _, err := r.AdmitSigned(signed, func([]byte, []byte) bool { return false }, now.Add(RankedReconnectGrace)); !errors.Is(err, ErrJoinAuthorisation) {
|
||||
t.Fatalf("unverified signature accepted: %v", err)
|
||||
}
|
||||
if gen, err := r.AdmitSigned(signed, verify, now.Add(RankedReconnectGrace)); err != nil || gen != 2 {
|
||||
t.Fatalf("signed reclaim = %d, %v", gen, err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user