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  }