76 lines
2.2 KiB
Go
76 lines
2.2 KiB
Go
package economy
|
|
|
|
import (
|
|
"context"
|
|
"crypto"
|
|
"crypto/rand"
|
|
"crypto/rsa"
|
|
"crypto/sha1"
|
|
"crypto/x509"
|
|
"encoding/base64"
|
|
"testing"
|
|
)
|
|
|
|
// TestBazaarRSAVerify امضای معتبر را میپذیرد و امضای/دیتای دستکاریشده را رد میکند.
|
|
func TestBazaarRSAVerify(t *testing.T) {
|
|
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
der, err := x509.MarshalPKIXPublicKey(&key.PublicKey)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
pubB64 := base64.StdEncoding.EncodeToString(der) // مثلِ خروجیِ کنسولِ کافهبازار
|
|
|
|
v, err := NewBazaarRSAVerifier(pubB64)
|
|
if err != nil {
|
|
t.Fatalf("new verifier: %v", err)
|
|
}
|
|
|
|
data := `{"orderId":"1","productId":"coin_small","purchaseToken":"tok123","purchaseState":0}`
|
|
h := sha1.Sum([]byte(data))
|
|
sig, err := rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA1, h[:])
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
sigB64 := base64.StdEncoding.EncodeToString(sig)
|
|
|
|
ctx := context.Background()
|
|
|
|
ok, err := v.Verify(ctx, IAPProof{PurchaseData: data, Signature: sigB64})
|
|
if err != nil || !ok {
|
|
t.Fatalf("valid signature rejected: ok=%v err=%v", ok, err)
|
|
}
|
|
|
|
// دیتای دستکاریشده ⇒ رد
|
|
ok, _ = v.Verify(ctx, IAPProof{PurchaseData: data + " ", Signature: sigB64})
|
|
if ok {
|
|
t.Fatal("tampered data accepted")
|
|
}
|
|
|
|
// امضای دستکاریشده ⇒ رد
|
|
bad := base64.StdEncoding.EncodeToString([]byte("not-a-real-signature"))
|
|
ok, _ = v.Verify(ctx, IAPProof{PurchaseData: data, Signature: bad})
|
|
if ok {
|
|
t.Fatal("bad signature accepted")
|
|
}
|
|
}
|
|
|
|
// TestStoreRouter مسیردهی بر اساس store و fallback را بررسی میکند.
|
|
func TestStoreRouter(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
// بدونِ پیکربندی و بدونِ fallback ⇒ خطا.
|
|
r := StoreRouter{}
|
|
if ok, err := r.Verify(ctx, IAPProof{Store: "myket", Token: "x"}); ok || err == nil {
|
|
t.Fatal("unconfigured store should error")
|
|
}
|
|
|
|
// با devFallback ⇒ توکنِ غیرخالی معتبر است.
|
|
r = StoreRouter{DevFallback: true}
|
|
if ok, err := r.Verify(ctx, IAPProof{Store: "bazaar", Token: "x"}); err != nil || !ok {
|
|
t.Fatalf("dev fallback failed: ok=%v err=%v", ok, err)
|
|
}
|
|
}
|