builder_test.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. package tka
  4. import (
  5. "crypto/ed25519"
  6. "testing"
  7. "github.com/google/go-cmp/cmp"
  8. "tailscale.com/types/tkatype"
  9. )
  10. type signer25519 ed25519.PrivateKey
  11. func (s signer25519) SignAUM(sigHash tkatype.AUMSigHash) ([]tkatype.Signature, error) {
  12. priv := ed25519.PrivateKey(s)
  13. key := Key{Kind: Key25519, Public: priv.Public().(ed25519.PublicKey)}
  14. return []tkatype.Signature{{
  15. KeyID: key.MustID(),
  16. Signature: ed25519.Sign(priv, sigHash[:]),
  17. }}, nil
  18. }
  19. func TestAuthorityBuilderAddKey(t *testing.T) {
  20. pub, priv := testingKey25519(t, 1)
  21. key := Key{Kind: Key25519, Public: pub, Votes: 2}
  22. storage := &Mem{}
  23. a, _, err := Create(storage, State{
  24. Keys: []Key{key},
  25. DisablementSecrets: [][]byte{DisablementKDF([]byte{1, 2, 3})},
  26. }, signer25519(priv))
  27. if err != nil {
  28. t.Fatalf("Create() failed: %v", err)
  29. }
  30. pub2, _ := testingKey25519(t, 2)
  31. key2 := Key{Kind: Key25519, Public: pub2, Votes: 1}
  32. b := a.NewUpdater(signer25519(priv))
  33. if err := b.AddKey(key2); err != nil {
  34. t.Fatalf("AddKey(%v) failed: %v", key2, err)
  35. }
  36. updates, err := b.Finalize(storage)
  37. if err != nil {
  38. t.Fatalf("Finalize() failed: %v", err)
  39. }
  40. // See if the update is valid by applying it to the authority
  41. // + checking if the new key is there.
  42. if err := a.Inform(storage, updates); err != nil {
  43. t.Fatalf("could not apply generated updates: %v", err)
  44. }
  45. if _, err := a.state.GetKey(key2.MustID()); err != nil {
  46. t.Errorf("could not read new key: %v", err)
  47. }
  48. }
  49. func TestAuthorityBuilderRemoveKey(t *testing.T) {
  50. pub, priv := testingKey25519(t, 1)
  51. key := Key{Kind: Key25519, Public: pub, Votes: 2}
  52. pub2, _ := testingKey25519(t, 2)
  53. key2 := Key{Kind: Key25519, Public: pub2, Votes: 1}
  54. storage := &Mem{}
  55. a, _, err := Create(storage, State{
  56. Keys: []Key{key, key2},
  57. DisablementSecrets: [][]byte{DisablementKDF([]byte{1, 2, 3})},
  58. }, signer25519(priv))
  59. if err != nil {
  60. t.Fatalf("Create() failed: %v", err)
  61. }
  62. b := a.NewUpdater(signer25519(priv))
  63. if err := b.RemoveKey(key2.MustID()); err != nil {
  64. t.Fatalf("RemoveKey(%v) failed: %v", key2, err)
  65. }
  66. updates, err := b.Finalize(storage)
  67. if err != nil {
  68. t.Fatalf("Finalize() failed: %v", err)
  69. }
  70. // See if the update is valid by applying it to the authority
  71. // + checking if the key has been removed.
  72. if err := a.Inform(storage, updates); err != nil {
  73. t.Fatalf("could not apply generated updates: %v", err)
  74. }
  75. if _, err := a.state.GetKey(key2.MustID()); err != ErrNoSuchKey {
  76. t.Errorf("GetKey(key2).err = %v, want %v", err, ErrNoSuchKey)
  77. }
  78. }
  79. func TestAuthorityBuilderSetKeyVote(t *testing.T) {
  80. pub, priv := testingKey25519(t, 1)
  81. key := Key{Kind: Key25519, Public: pub, Votes: 2}
  82. storage := &Mem{}
  83. a, _, err := Create(storage, State{
  84. Keys: []Key{key},
  85. DisablementSecrets: [][]byte{DisablementKDF([]byte{1, 2, 3})},
  86. }, signer25519(priv))
  87. if err != nil {
  88. t.Fatalf("Create() failed: %v", err)
  89. }
  90. b := a.NewUpdater(signer25519(priv))
  91. if err := b.SetKeyVote(key.MustID(), 5); err != nil {
  92. t.Fatalf("SetKeyVote(%v) failed: %v", key.MustID(), err)
  93. }
  94. updates, err := b.Finalize(storage)
  95. if err != nil {
  96. t.Fatalf("Finalize() failed: %v", err)
  97. }
  98. // See if the update is valid by applying it to the authority
  99. // + checking if the update is there.
  100. if err := a.Inform(storage, updates); err != nil {
  101. t.Fatalf("could not apply generated updates: %v", err)
  102. }
  103. k, err := a.state.GetKey(key.MustID())
  104. if err != nil {
  105. t.Fatal(err)
  106. }
  107. if got, want := k.Votes, uint(5); got != want {
  108. t.Errorf("key.Votes = %d, want %d", got, want)
  109. }
  110. }
  111. func TestAuthorityBuilderSetKeyMeta(t *testing.T) {
  112. pub, priv := testingKey25519(t, 1)
  113. key := Key{Kind: Key25519, Public: pub, Votes: 2, Meta: map[string]string{"a": "b"}}
  114. storage := &Mem{}
  115. a, _, err := Create(storage, State{
  116. Keys: []Key{key},
  117. DisablementSecrets: [][]byte{DisablementKDF([]byte{1, 2, 3})},
  118. }, signer25519(priv))
  119. if err != nil {
  120. t.Fatalf("Create() failed: %v", err)
  121. }
  122. b := a.NewUpdater(signer25519(priv))
  123. if err := b.SetKeyMeta(key.MustID(), map[string]string{"b": "c"}); err != nil {
  124. t.Fatalf("SetKeyMeta(%v) failed: %v", key, err)
  125. }
  126. updates, err := b.Finalize(storage)
  127. if err != nil {
  128. t.Fatalf("Finalize() failed: %v", err)
  129. }
  130. // See if the update is valid by applying it to the authority
  131. // + checking if the update is there.
  132. if err := a.Inform(storage, updates); err != nil {
  133. t.Fatalf("could not apply generated updates: %v", err)
  134. }
  135. k, err := a.state.GetKey(key.MustID())
  136. if err != nil {
  137. t.Fatal(err)
  138. }
  139. if diff := cmp.Diff(map[string]string{"b": "c"}, k.Meta); diff != "" {
  140. t.Errorf("updated meta differs (-want, +got):\n%s", diff)
  141. }
  142. }
  143. func TestAuthorityBuilderMultiple(t *testing.T) {
  144. pub, priv := testingKey25519(t, 1)
  145. key := Key{Kind: Key25519, Public: pub, Votes: 2}
  146. storage := &Mem{}
  147. a, _, err := Create(storage, State{
  148. Keys: []Key{key},
  149. DisablementSecrets: [][]byte{DisablementKDF([]byte{1, 2, 3})},
  150. }, signer25519(priv))
  151. if err != nil {
  152. t.Fatalf("Create() failed: %v", err)
  153. }
  154. pub2, _ := testingKey25519(t, 2)
  155. key2 := Key{Kind: Key25519, Public: pub2, Votes: 1}
  156. b := a.NewUpdater(signer25519(priv))
  157. if err := b.AddKey(key2); err != nil {
  158. t.Fatalf("AddKey(%v) failed: %v", key2, err)
  159. }
  160. if err := b.SetKeyVote(key2.MustID(), 42); err != nil {
  161. t.Fatalf("SetKeyVote(%v) failed: %v", key2, err)
  162. }
  163. if err := b.RemoveKey(key.MustID()); err != nil {
  164. t.Fatalf("RemoveKey(%v) failed: %v", key, err)
  165. }
  166. updates, err := b.Finalize(storage)
  167. if err != nil {
  168. t.Fatalf("Finalize() failed: %v", err)
  169. }
  170. // See if the update is valid by applying it to the authority
  171. // + checking if the update is there.
  172. if err := a.Inform(storage, updates); err != nil {
  173. t.Fatalf("could not apply generated updates: %v", err)
  174. }
  175. k, err := a.state.GetKey(key2.MustID())
  176. if err != nil {
  177. t.Fatal(err)
  178. }
  179. if got, want := k.Votes, uint(42); got != want {
  180. t.Errorf("key.Votes = %d, want %d", got, want)
  181. }
  182. if _, err := a.state.GetKey(key.MustID()); err != ErrNoSuchKey {
  183. t.Errorf("GetKey(key).err = %v, want %v", err, ErrNoSuchKey)
  184. }
  185. }
  186. func TestAuthorityBuilderCheckpointsAfterXUpdates(t *testing.T) {
  187. pub, priv := testingKey25519(t, 1)
  188. key := Key{Kind: Key25519, Public: pub, Votes: 2}
  189. storage := &Mem{}
  190. a, _, err := Create(storage, State{
  191. Keys: []Key{key},
  192. DisablementSecrets: [][]byte{DisablementKDF([]byte{1, 2, 3})},
  193. }, signer25519(priv))
  194. if err != nil {
  195. t.Fatalf("Create() failed: %v", err)
  196. }
  197. for i := 0; i <= checkpointEvery; i++ {
  198. pub2, _ := testingKey25519(t, int64(i+2))
  199. key2 := Key{Kind: Key25519, Public: pub2, Votes: 1}
  200. b := a.NewUpdater(signer25519(priv))
  201. if err := b.AddKey(key2); err != nil {
  202. t.Fatalf("AddKey(%v) failed: %v", key2, err)
  203. }
  204. updates, err := b.Finalize(storage)
  205. if err != nil {
  206. t.Fatalf("Finalize() failed: %v", err)
  207. }
  208. // See if the update is valid by applying it to the authority
  209. // + checking if the new key is there.
  210. if err := a.Inform(storage, updates); err != nil {
  211. t.Fatalf("could not apply generated updates: %v", err)
  212. }
  213. if _, err := a.state.GetKey(key2.MustID()); err != nil {
  214. t.Fatal(err)
  215. }
  216. wantKind := AUMAddKey
  217. if i == checkpointEvery-1 { // Genesis + 49 updates == 50 (the value of checkpointEvery)
  218. wantKind = AUMCheckpoint
  219. }
  220. lastAUM, err := storage.AUM(a.Head())
  221. if err != nil {
  222. t.Fatal(err)
  223. }
  224. if lastAUM.MessageKind != wantKind {
  225. t.Errorf("[%d] HeadAUM.MessageKind = %v, want %v", i, lastAUM.MessageKind, wantKind)
  226. }
  227. }
  228. // Try starting an authority just based on storage.
  229. a2, err := Open(storage)
  230. if err != nil {
  231. t.Fatalf("Failed to open from stored AUMs: %v", err)
  232. }
  233. if a.Head() != a2.Head() {
  234. t.Errorf("stored and computed HEAD differ: got %v, want %v", a2.Head(), a.Head())
  235. }
  236. }