github.com/unionj-cloud/go-doudou/v2@v2.3.5/toolkit/memberlist/keyring_test.go (about) 1 package memberlist 2 3 import ( 4 "bytes" 5 "testing" 6 ) 7 8 var TestKeys [][]byte = [][]byte{ 9 []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, 10 []byte{15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, 11 []byte{8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7}, 12 } 13 14 func TestKeyring_EmptyRing(t *testing.T) { 15 // Keyrings can be created with no encryption keys (disabled encryption) 16 keyring, err := NewKeyring(nil, nil) 17 if err != nil { 18 t.Fatalf("err: %s", err) 19 } 20 21 keys := keyring.GetKeys() 22 if len(keys) != 0 { 23 t.Fatalf("Expected 0 keys but have %d", len(keys)) 24 } 25 } 26 27 func TestKeyring_PrimaryOnly(t *testing.T) { 28 // Keyrings can be created using only a primary key 29 keyring, err := NewKeyring(nil, TestKeys[0]) 30 if err != nil { 31 t.Fatalf("err: %s", err) 32 } 33 34 keys := keyring.GetKeys() 35 if len(keys) != 1 { 36 t.Fatalf("Expected 1 key but have %d", len(keys)) 37 } 38 } 39 40 func TestKeyring_GetPrimaryKey(t *testing.T) { 41 keyring, err := NewKeyring(TestKeys, TestKeys[1]) 42 if err != nil { 43 t.Fatalf("err: %s", err) 44 } 45 46 // GetPrimaryKey returns correct key 47 primaryKey := keyring.GetPrimaryKey() 48 if !bytes.Equal(primaryKey, TestKeys[1]) { 49 t.Fatalf("Unexpected primary key: %v", primaryKey) 50 } 51 } 52 53 func TestKeyring_AddRemoveUse(t *testing.T) { 54 keyring, err := NewKeyring(nil, TestKeys[1]) 55 if err != nil { 56 t.Fatalf("err :%s", err) 57 } 58 59 // Use non-existent key throws error 60 if err := keyring.UseKey(TestKeys[2]); err == nil { 61 t.Fatalf("Expected key not installed error") 62 } 63 64 // Add key to ring 65 if err := keyring.AddKey(TestKeys[2]); err != nil { 66 t.Fatalf("err: %s", err) 67 } 68 69 keys := keyring.GetKeys() 70 if !bytes.Equal(keys[0], TestKeys[1]) { 71 t.Fatalf("Unexpected primary key change") 72 } 73 74 if len(keys) != 2 { 75 t.Fatalf("Expected 2 keys but have %d", len(keys)) 76 } 77 78 // Use key that exists should succeed 79 if err := keyring.UseKey(TestKeys[2]); err != nil { 80 t.Fatalf("err: %s", err) 81 } 82 83 primaryKey := keyring.GetPrimaryKey() 84 if !bytes.Equal(primaryKey, TestKeys[2]) { 85 t.Fatalf("Unexpected primary key: %v", primaryKey) 86 } 87 88 // Removing primary key should fail 89 if err := keyring.RemoveKey(TestKeys[2]); err == nil { 90 t.Fatalf("Expected primary key removal error") 91 } 92 93 // Removing non-primary key should succeed 94 if err := keyring.RemoveKey(TestKeys[1]); err != nil { 95 t.Fatalf("err: %s", err) 96 } 97 98 keys = keyring.GetKeys() 99 if len(keys) != 1 { 100 t.Fatalf("Expected 1 key but have %d", len(keys)) 101 } 102 } 103 104 func TestKeyRing_MultiKeyEncryptDecrypt(t *testing.T) { 105 plaintext := []byte("this is a plain text message") 106 extra := []byte("random data") 107 108 keyring, err := NewKeyring(TestKeys, TestKeys[0]) 109 if err != nil { 110 t.Fatalf("err: %s", err) 111 } 112 113 // First encrypt using the primary key and make sure we can decrypt 114 var buf bytes.Buffer 115 err = encryptPayload(1, TestKeys[0], plaintext, extra, &buf) 116 if err != nil { 117 t.Fatalf("err: %v", err) 118 } 119 120 msg, err := decryptPayload(keyring.GetKeys(), buf.Bytes(), extra) 121 if err != nil { 122 t.Fatalf("err: %v", err) 123 } 124 125 if !bytes.Equal(msg, plaintext) { 126 t.Fatalf("bad: %v", msg) 127 } 128 129 // Now encrypt with a secondary key and try decrypting again. 130 buf.Reset() 131 err = encryptPayload(1, TestKeys[2], plaintext, extra, &buf) 132 if err != nil { 133 t.Fatalf("err: %v", err) 134 } 135 136 msg, err = decryptPayload(keyring.GetKeys(), buf.Bytes(), extra) 137 if err != nil { 138 t.Fatalf("err: %v", err) 139 } 140 141 if !bytes.Equal(msg, plaintext) { 142 t.Fatalf("bad: %v", msg) 143 } 144 145 // Remove a key from the ring, and then try decrypting again 146 if err := keyring.RemoveKey(TestKeys[2]); err != nil { 147 t.Fatalf("err: %s", err) 148 } 149 150 msg, err = decryptPayload(keyring.GetKeys(), buf.Bytes(), extra) 151 if err == nil { 152 t.Fatalf("Expected no keys to decrypt message") 153 } 154 }