store_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. package shachain
  2. import (
  3. "bytes"
  4. "testing"
  5. "github.com/btcsuite/btcd/chaincfg/chainhash"
  6. )
  7. type testInsert struct {
  8. index index
  9. secret string
  10. successful bool
  11. }
  12. // tests encodes the test vectors specified in BOLT-03, Appendix D,
  13. // Storage Tests.
  14. var tests = []struct {
  15. name string
  16. inserts []testInsert
  17. }{
  18. {
  19. name: "insert_secret correct sequence",
  20. inserts: []testInsert{
  21. {
  22. index: 281474976710655,
  23. secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
  24. "e6e8db3be6854c475621e007a5dc",
  25. successful: true,
  26. },
  27. {
  28. index: 281474976710654,
  29. secret: "c7518c8ae4660ed02894df8976fa1a3659c1" +
  30. "a8b4b5bec0c4b872abeba4cb8964",
  31. successful: true,
  32. },
  33. {
  34. index: 281474976710653,
  35. secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
  36. "cbf9cd7c043a7d6456b7fc275ad8",
  37. successful: true,
  38. },
  39. {
  40. index: 281474976710652,
  41. secret: "27cddaa5624534cb6cb9d7da077cf2b22ab2" +
  42. "1e9b506fd4998a51d54502e99116",
  43. successful: true,
  44. },
  45. {
  46. index: 281474976710651,
  47. secret: "c65716add7aa98ba7acb236352d665cab173" +
  48. "45fe45b55fb879ff80e6bd0c41dd",
  49. successful: true,
  50. },
  51. {
  52. index: 281474976710650,
  53. secret: "969660042a28f32d9be17344e09374b37996" +
  54. "2d03db1574df5a8a5a47e19ce3f2",
  55. successful: true,
  56. },
  57. {
  58. index: 281474976710649,
  59. secret: "a5a64476122ca0925fb344bdc1854c1c0a59" +
  60. "fc614298e50a33e331980a220f32",
  61. successful: true,
  62. },
  63. {
  64. index: 281474976710648,
  65. secret: "05cde6323d949933f7f7b78776bcc1ea6d9b" +
  66. "31447732e3802e1f7ac44b650e17",
  67. successful: true,
  68. },
  69. },
  70. },
  71. {
  72. name: "insert_secret #1 incorrect",
  73. inserts: []testInsert{
  74. {
  75. index: 281474976710655,
  76. secret: "02a40c85b6f28da08dfdbe0926c53fab2d" +
  77. "e6d28c10301f8f7c4073d5e42e3148",
  78. successful: true,
  79. },
  80. {
  81. index: 281474976710654,
  82. secret: "c7518c8ae4660ed02894df8976fa1a3659" +
  83. "c1a8b4b5bec0c4b872abeba4cb8964",
  84. successful: false,
  85. },
  86. },
  87. },
  88. {
  89. name: "insert_secret #2 incorrect (#1 derived from incorrect)",
  90. inserts: []testInsert{
  91. {
  92. index: 281474976710655,
  93. secret: "02a40c85b6f28da08dfdbe0926c53fab2de6" +
  94. "d28c10301f8f7c4073d5e42e3148",
  95. successful: true,
  96. },
  97. {
  98. index: 281474976710654,
  99. secret: "dddc3a8d14fddf2b68fa8c7fbad274827493" +
  100. "7479dd0f8930d5ebb4ab6bd866a3",
  101. successful: true,
  102. },
  103. {
  104. index: 281474976710653,
  105. secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
  106. "cbf9cd7c043a7d6456b7fc275ad8",
  107. successful: true,
  108. },
  109. {
  110. index: 281474976710652,
  111. secret: "27cddaa5624534cb6cb9d7da077cf2b22a" +
  112. "b21e9b506fd4998a51d54502e99116",
  113. successful: false,
  114. },
  115. },
  116. },
  117. {
  118. name: "insert_secret #3 incorrect",
  119. inserts: []testInsert{
  120. {
  121. index: 281474976710655,
  122. secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
  123. "e6e8db3be6854c475621e007a5dc",
  124. successful: true,
  125. },
  126. {
  127. index: 281474976710654,
  128. secret: "c7518c8ae4660ed02894df8976fa1a3659c1" +
  129. "a8b4b5bec0c4b872abeba4cb8964",
  130. successful: true,
  131. },
  132. {
  133. index: 281474976710653,
  134. secret: "c51a18b13e8527e579ec56365482c62f180b" +
  135. "7d5760b46e9477dae59e87ed423a",
  136. successful: true,
  137. },
  138. {
  139. index: 281474976710652,
  140. secret: "27cddaa5624534cb6cb9d7da077cf2b22ab2" +
  141. "1e9b506fd4998a51d54502e99116",
  142. successful: false,
  143. },
  144. },
  145. },
  146. {
  147. name: "insert_secret #4 incorrect (1,2,3 derived from incorrect)",
  148. inserts: []testInsert{
  149. {
  150. index: 281474976710655,
  151. secret: "02a40c85b6f28da08dfdbe0926c53fab2de6" +
  152. "d28c10301f8f7c4073d5e42e3148",
  153. successful: true,
  154. },
  155. {
  156. index: 281474976710654,
  157. secret: "dddc3a8d14fddf2b68fa8c7fbad274827493" +
  158. "7479dd0f8930d5ebb4ab6bd866a3",
  159. successful: true,
  160. },
  161. {
  162. index: 281474976710653,
  163. secret: "c51a18b13e8527e579ec56365482c62f18" +
  164. "0b7d5760b46e9477dae59e87ed423a",
  165. successful: true,
  166. },
  167. {
  168. index: 281474976710652,
  169. secret: "ba65d7b0ef55a3ba300d4e87af29868f39" +
  170. "4f8f138d78a7011669c79b37b936f4",
  171. successful: true,
  172. },
  173. {
  174. index: 281474976710651,
  175. secret: "c65716add7aa98ba7acb236352d665cab1" +
  176. "7345fe45b55fb879ff80e6bd0c41dd",
  177. successful: true,
  178. },
  179. {
  180. index: 281474976710650,
  181. secret: "969660042a28f32d9be17344e09374b379" +
  182. "962d03db1574df5a8a5a47e19ce3f2",
  183. successful: true,
  184. },
  185. {
  186. index: 281474976710649,
  187. secret: "a5a64476122ca0925fb344bdc1854c1c0a" +
  188. "59fc614298e50a33e331980a220f32",
  189. successful: true,
  190. },
  191. {
  192. index: 281474976710649,
  193. secret: "05cde6323d949933f7f7b78776bcc1ea6d9b" +
  194. "31447732e3802e1f7ac44b650e17",
  195. successful: false,
  196. },
  197. },
  198. },
  199. {
  200. name: "insert_secret #5 incorrect",
  201. inserts: []testInsert{
  202. {
  203. index: 281474976710655,
  204. secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
  205. "e6e8db3be6854c475621e007a5dc",
  206. successful: true,
  207. },
  208. {
  209. index: 281474976710654,
  210. secret: "c7518c8ae4660ed02894df8976fa1a3659c1a" +
  211. "8b4b5bec0c4b872abeba4cb8964",
  212. successful: true,
  213. },
  214. {
  215. index: 281474976710653,
  216. secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
  217. "cbf9cd7c043a7d6456b7fc275ad8",
  218. successful: true,
  219. },
  220. {
  221. index: 281474976710652,
  222. secret: "27cddaa5624534cb6cb9d7da077cf2b22ab21" +
  223. "e9b506fd4998a51d54502e99116",
  224. successful: true,
  225. },
  226. {
  227. index: 281474976710651,
  228. secret: "631373ad5f9ef654bb3dade742d09504c567" +
  229. "edd24320d2fcd68e3cc47e2ff6a6",
  230. successful: true,
  231. },
  232. {
  233. index: 281474976710650,
  234. secret: "969660042a28f32d9be17344e09374b37996" +
  235. "2d03db1574df5a8a5a47e19ce3f2",
  236. successful: false,
  237. },
  238. },
  239. },
  240. {
  241. name: "insert_secret #6 incorrect (5 derived from incorrect)",
  242. inserts: []testInsert{
  243. {
  244. index: 281474976710655,
  245. secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
  246. "e6e8db3be6854c475621e007a5dc",
  247. successful: true,
  248. },
  249. {
  250. index: 281474976710654,
  251. secret: "c7518c8ae4660ed02894df8976fa1a3659c1a" +
  252. "8b4b5bec0c4b872abeba4cb8964",
  253. successful: true,
  254. },
  255. {
  256. index: 281474976710653,
  257. secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
  258. "cbf9cd7c043a7d6456b7fc275ad8",
  259. successful: true,
  260. },
  261. {
  262. index: 281474976710652,
  263. secret: "27cddaa5624534cb6cb9d7da077cf2b22ab21" +
  264. "e9b506fd4998a51d54502e99116",
  265. successful: true,
  266. },
  267. {
  268. index: 281474976710651,
  269. secret: "631373ad5f9ef654bb3dade742d09504c567" +
  270. "edd24320d2fcd68e3cc47e2ff6a6",
  271. successful: true,
  272. },
  273. {
  274. index: 281474976710650,
  275. secret: "b7e76a83668bde38b373970155c868a65330" +
  276. "4308f9896692f904a23731224bb1",
  277. successful: true,
  278. },
  279. {
  280. index: 281474976710649,
  281. secret: "a5a64476122ca0925fb344bdc1854c1c0a59f" +
  282. "c614298e50a33e331980a220f32",
  283. successful: true,
  284. },
  285. {
  286. index: 281474976710648,
  287. secret: "05cde6323d949933f7f7b78776bcc1ea6d9b" +
  288. "31447732e3802e1f7ac44b650e17",
  289. successful: false,
  290. },
  291. },
  292. },
  293. {
  294. name: "insert_secret #7 incorrect",
  295. inserts: []testInsert{
  296. {
  297. index: 281474976710655,
  298. secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
  299. "e6e8db3be6854c475621e007a5dc",
  300. successful: true,
  301. },
  302. {
  303. index: 281474976710654,
  304. secret: "c7518c8ae4660ed02894df8976fa1a3659c1a" +
  305. "8b4b5bec0c4b872abeba4cb8964",
  306. successful: true,
  307. },
  308. {
  309. index: 281474976710653,
  310. secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
  311. "cbf9cd7c043a7d6456b7fc275ad8",
  312. successful: true,
  313. },
  314. {
  315. index: 281474976710652,
  316. secret: "27cddaa5624534cb6cb9d7da077cf2b22ab21" +
  317. "e9b506fd4998a51d54502e99116",
  318. successful: true,
  319. },
  320. {
  321. index: 281474976710651,
  322. secret: "c65716add7aa98ba7acb236352d665cab173" +
  323. "45fe45b55fb879ff80e6bd0c41dd",
  324. successful: true,
  325. },
  326. {
  327. index: 281474976710650,
  328. secret: "969660042a28f32d9be17344e09374b37996" +
  329. "2d03db1574df5a8a5a47e19ce3f2",
  330. successful: true,
  331. },
  332. {
  333. index: 281474976710649,
  334. secret: "e7971de736e01da8ed58b94c2fc216cb1d" +
  335. "ca9e326f3a96e7194fe8ea8af6c0a3",
  336. successful: true,
  337. },
  338. {
  339. index: 281474976710648,
  340. secret: "05cde6323d949933f7f7b78776bcc1ea6d" +
  341. "9b31447732e3802e1f7ac44b650e17",
  342. successful: false,
  343. },
  344. },
  345. },
  346. {
  347. name: "insert_secret #8 incorrect",
  348. inserts: []testInsert{
  349. {
  350. index: 281474976710655,
  351. secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
  352. "e6e8db3be6854c475621e007a5dc",
  353. successful: true,
  354. },
  355. {
  356. index: 281474976710654,
  357. secret: "c7518c8ae4660ed02894df8976fa1a3659c1a" +
  358. "8b4b5bec0c4b872abeba4cb8964",
  359. successful: true,
  360. },
  361. {
  362. index: 281474976710653,
  363. secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
  364. "cbf9cd7c043a7d6456b7fc275ad8",
  365. successful: true,
  366. },
  367. {
  368. index: 281474976710652,
  369. secret: "27cddaa5624534cb6cb9d7da077cf2b22ab21" +
  370. "e9b506fd4998a51d54502e99116",
  371. successful: true,
  372. },
  373. {
  374. index: 281474976710651,
  375. secret: "c65716add7aa98ba7acb236352d665cab173" +
  376. "45fe45b55fb879ff80e6bd0c41dd",
  377. successful: true,
  378. },
  379. {
  380. index: 281474976710650,
  381. secret: "969660042a28f32d9be17344e09374b37996" +
  382. "2d03db1574df5a8a5a47e19ce3f2",
  383. successful: true,
  384. },
  385. {
  386. index: 281474976710649,
  387. secret: "a5a64476122ca0925fb344bdc1854c1c0a" +
  388. "59fc614298e50a33e331980a220f32",
  389. successful: true,
  390. },
  391. {
  392. index: 281474976710648,
  393. secret: "a7efbc61aac46d34f77778bac22c8a20c6" +
  394. "a46ca460addc49009bda875ec88fa4",
  395. successful: false,
  396. },
  397. },
  398. },
  399. }
  400. // TestSpecificationShaChainInsert is used to check the consistency with
  401. // specification hash insert function.
  402. func TestSpecificationShaChainInsert(t *testing.T) {
  403. t.Parallel()
  404. for _, test := range tests {
  405. receiver := NewRevocationStore()
  406. for _, insert := range test.inserts {
  407. secret, err := hashFromString(insert.secret)
  408. if err != nil {
  409. t.Fatal(err)
  410. }
  411. if err := receiver.AddNextEntry(secret); err != nil {
  412. if insert.successful {
  413. t.Fatalf("Failed (%v): error was "+
  414. "received but it shouldn't: "+
  415. "%v", test.name, err)
  416. }
  417. } else {
  418. if !insert.successful {
  419. t.Fatalf("Failed (%v): error wasn't "+
  420. "received", test.name)
  421. }
  422. }
  423. }
  424. t.Logf("Passed (%v)", test.name)
  425. }
  426. }
  427. // TestShaChainStore checks the ability of shachain store to hold the produced
  428. // secrets after recovering from bytes data.
  429. func TestShaChainStore(t *testing.T) {
  430. t.Parallel()
  431. seed := chainhash.DoubleHashH([]byte("shachaintest"))
  432. sender := NewRevocationProducer(seed)
  433. receiver := NewRevocationStore()
  434. for n := uint64(0); n < 10000; n++ {
  435. sha, err := sender.AtIndex(n)
  436. if err != nil {
  437. t.Fatal(err)
  438. }
  439. if err = receiver.AddNextEntry(sha); err != nil {
  440. t.Fatal(err)
  441. }
  442. }
  443. var b bytes.Buffer
  444. if err := receiver.Encode(&b); err != nil {
  445. t.Fatal(err)
  446. }
  447. newReceiver, err := NewRevocationStoreFromBytes(&b)
  448. if err != nil {
  449. t.Fatal(err)
  450. }
  451. for n := uint64(0); n < 10000; n++ {
  452. if _, err := newReceiver.LookUp(n); err != nil {
  453. t.Fatal(err)
  454. }
  455. }
  456. }