github.com/yggdrasil-network/yggdrasil-go@v0.5.6/src/core/version_test.go (about)

     1  package core
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/ed25519"
     6  	"reflect"
     7  	"testing"
     8  )
     9  
    10  func TestVersionPasswordAuth(t *testing.T) {
    11  	for _, tt := range []struct {
    12  		password1 []byte // The password on node 1
    13  		password2 []byte // The password on node 2
    14  		allowed   bool   // Should the connection have been allowed?
    15  	}{
    16  		{nil, nil, true},                      // Allow:  No passwords (both nil)
    17  		{nil, []byte(""), true},               // Allow:  No passwords (mixed nil and empty string)
    18  		{nil, []byte("foo"), false},           // Reject: One node has a password, the other doesn't
    19  		{[]byte("foo"), []byte(""), false},    // Reject: One node has a password, the other doesn't
    20  		{[]byte("foo"), []byte("foo"), true},  // Allow:  Same password
    21  		{[]byte("foo"), []byte("bar"), false}, // Reject: Different passwords
    22  	} {
    23  		pk1, sk1, err := ed25519.GenerateKey(nil)
    24  		if err != nil {
    25  			t.Fatalf("Node 1 failed to generate key: %s", err)
    26  		}
    27  
    28  		metadata1 := &version_metadata{
    29  			publicKey: pk1,
    30  		}
    31  		encoded, err := metadata1.encode(sk1, tt.password1)
    32  		if err != nil {
    33  			t.Fatalf("Node 1 failed to encode metadata: %s", err)
    34  		}
    35  
    36  		var decoded version_metadata
    37  		if allowed := decoded.decode(bytes.NewBuffer(encoded), tt.password2) == nil; allowed != tt.allowed {
    38  			t.Fatalf("Permutation %q -> %q should have been %v but was %v", tt.password1, tt.password2, tt.allowed, allowed)
    39  		}
    40  	}
    41  }
    42  
    43  func TestVersionRoundtrip(t *testing.T) {
    44  	for _, password := range [][]byte{
    45  		nil, []byte(""), []byte("foo"),
    46  	} {
    47  		for _, test := range []*version_metadata{
    48  			{majorVer: 1},
    49  			{majorVer: 256},
    50  			{majorVer: 2, minorVer: 4},
    51  			{majorVer: 2, minorVer: 257},
    52  			{majorVer: 258, minorVer: 259},
    53  			{majorVer: 3, minorVer: 5, priority: 6},
    54  			{majorVer: 260, minorVer: 261, priority: 7},
    55  		} {
    56  			// Generate a random public key for each time, since it is
    57  			// a required field.
    58  			pk, sk, err := ed25519.GenerateKey(nil)
    59  			if err != nil {
    60  				t.Fatal(err)
    61  			}
    62  
    63  			test.publicKey = pk
    64  			meta, err := test.encode(sk, password)
    65  			if err != nil {
    66  				t.Fatal(err)
    67  			}
    68  			encoded := bytes.NewBuffer(meta)
    69  			decoded := &version_metadata{}
    70  			if err := decoded.decode(encoded, password); err != nil {
    71  				t.Fatalf("failed to decode: %s", err)
    72  			}
    73  			if !reflect.DeepEqual(test, decoded) {
    74  				t.Fatalf("round-trip failed\nwant: %+v\n got: %+v", test, decoded)
    75  			}
    76  		}
    77  	}
    78  }