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