authenvelope_test.go raw

   1  package authenvelope
   2  
   3  import (
   4  	"testing"
   5  
   6  	"next.orly.dev/pkg/nostr/encoders/envelopes"
   7  	"next.orly.dev/pkg/nostr/interfaces/signer/p8k"
   8  	"next.orly.dev/pkg/nostr/protocol/auth"
   9  	"next.orly.dev/pkg/nostr/utils"
  10  	"next.orly.dev/pkg/nostr/utils/bufpool"
  11  	"next.orly.dev/pkg/lol/chk"
  12  )
  13  
  14  const relayURL = "wss://example.com"
  15  
  16  func TestAuth(t *testing.T) {
  17  	var err error
  18  	signer := p8k.MustNew()
  19  	if err = signer.Generate(); chk.E(err) {
  20  		t.Fatal(err)
  21  	}
  22  	for _ = range 1000 {
  23  		b1, b2, b3, b4 := bufpool.Get(), bufpool.Get(), bufpool.Get(), bufpool.Get()
  24  		ch := auth.GenerateChallenge()
  25  		chal := Challenge{Challenge: ch}
  26  		b1 = chal.Marshal(b1)
  27  		oChal := make([]byte, len(b1))
  28  		copy(oChal, b1)
  29  		var rem []byte
  30  		var l string
  31  		if l, b1, err = envelopes.Identify(b1); chk.E(err) {
  32  			t.Fatal(err)
  33  		}
  34  		if l != L {
  35  			t.Fatalf("invalid sentinel %s, expect %s", l, L)
  36  		}
  37  		c2 := NewChallenge()
  38  		if rem, err = c2.Unmarshal(b1); chk.E(err) {
  39  			t.Fatal(err)
  40  		}
  41  		if len(rem) != 0 {
  42  			t.Fatalf("remainder should be empty\n%s", rem)
  43  		}
  44  		if !utils.FastEqual(chal.Challenge, c2.Challenge) {
  45  			t.Fatalf(
  46  				"challenge mismatch\n%s\n%s",
  47  				chal.Challenge, c2.Challenge,
  48  			)
  49  		}
  50  		b2 = c2.Marshal(b2)
  51  		if !utils.FastEqual(oChal, b2) {
  52  			t.Fatalf("challenge mismatch\n%s\n%s", oChal, b2)
  53  		}
  54  		resp := Response{
  55  			Event: auth.CreateUnsigned(
  56  				signer.Pub(), ch,
  57  				relayURL,
  58  			),
  59  		}
  60  		if err = resp.Event.Sign(signer); chk.E(err) {
  61  			t.Fatal(err)
  62  		}
  63  		b3 = resp.Marshal(b3)
  64  		oResp := make([]byte, len(b3))
  65  		copy(oResp, b3)
  66  		if l, b3, err = envelopes.Identify(b3); chk.E(err) {
  67  			t.Fatal(err)
  68  		}
  69  		if l != L {
  70  			t.Fatalf("invalid sentinel %s, expect %s", l, L)
  71  		}
  72  		r2 := NewResponse()
  73  		if _, err = r2.Unmarshal(b3); chk.E(err) {
  74  			t.Fatal(err)
  75  		}
  76  		b4 = r2.Marshal(b4)
  77  		if !utils.FastEqual(oResp, b4) {
  78  			t.Fatalf("challenge mismatch\n%s\n%s", oResp, b4)
  79  		}
  80  		bufpool.Put(b1)
  81  		bufpool.Put(b2)
  82  		bufpool.Put(b3)
  83  		bufpool.Put(b4)
  84  		oChal, oResp = oChal[:0], oResp[:0]
  85  	}
  86  }
  87