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 }