| 1 | import crypto.sha1 |
| 2 | import encoding.hex |
| 3 | |
| 4 | const seed = 'dd4df644eaf3d85bace2b21accaa22b28821f5cd' |
| 5 | |
| 6 | struct MonteTestCase { |
| 7 | name string |
| 8 | count int |
| 9 | digest string |
| 10 | } |
| 11 | |
| 12 | const monte_cases = [ |
| 13 | MonteTestCase{ |
| 14 | name: 'checkpoint 0' |
| 15 | count: 0 |
| 16 | digest: '11f5c38b4479d4ad55cb69fadf62de0b036d5163' |
| 17 | }, |
| 18 | MonteTestCase{ |
| 19 | name: 'checkpoint 1' |
| 20 | count: 1 |
| 21 | digest: '5c26de848c21586bec36995809cb02d3677423d9' |
| 22 | }, |
| 23 | MonteTestCase{ |
| 24 | name: 'checkpoint 2' |
| 25 | count: 2 |
| 26 | digest: '453b5fcf263d01c891d7897d4013990f7c1fb0ab' |
| 27 | }, |
| 28 | MonteTestCase{ |
| 29 | name: 'checkpoint 3' |
| 30 | count: 3 |
| 31 | digest: '36d0273ae363f992bbc313aa4ff602e95c207be3' |
| 32 | }, |
| 33 | MonteTestCase{ |
| 34 | name: 'checkpoint 4' |
| 35 | count: 4 |
| 36 | digest: 'd1c65e9ac55727fbf30eaf5f00cc22b9bab81a2c' |
| 37 | }, |
| 38 | MonteTestCase{ |
| 39 | name: 'checkpoint 5' |
| 40 | count: 5 |
| 41 | digest: '2c477cd77e5749da7fc4e5ca7eed77166e8ceae6' |
| 42 | }, |
| 43 | MonteTestCase{ |
| 44 | name: 'checkpoint 6' |
| 45 | count: 6 |
| 46 | digest: '60b11211137f46863501a32a435976eabd4532f3' |
| 47 | }, |
| 48 | MonteTestCase{ |
| 49 | name: 'checkpoint 7' |
| 50 | count: 7 |
| 51 | digest: '0894f4f012a1e5344044e0ecfa6f078382064602' |
| 52 | }, |
| 53 | MonteTestCase{ |
| 54 | name: 'checkpoint 8' |
| 55 | count: 8 |
| 56 | digest: '06b6222855cae9bed77e9e3050d164a98286ea5f' |
| 57 | }, |
| 58 | MonteTestCase{ |
| 59 | name: 'checkpoint 9' |
| 60 | count: 9 |
| 61 | digest: 'e2872694d3d23a68a24419c35bd9ac9006248a8f' |
| 62 | }, |
| 63 | MonteTestCase{ |
| 64 | name: 'checkpoint 10' |
| 65 | count: 10 |
| 66 | digest: 'ea43595eb1cff3a7e045c5868d0775b4409b14a3' |
| 67 | }, |
| 68 | MonteTestCase{ |
| 69 | name: 'checkpoint 11' |
| 70 | count: 11 |
| 71 | digest: '05a9e94fdc792a61aa60bcd37592acee1f983280' |
| 72 | }, |
| 73 | MonteTestCase{ |
| 74 | name: 'checkpoint 12' |
| 75 | count: 12 |
| 76 | digest: '7d11aa9413cd89a387a5c0f9aa5ce541be2aa6e8' |
| 77 | }, |
| 78 | MonteTestCase{ |
| 79 | name: 'checkpoint 13' |
| 80 | count: 13 |
| 81 | digest: '37297d053aaa4a845cc9ce0c0165644ab8d0e00b' |
| 82 | }, |
| 83 | MonteTestCase{ |
| 84 | name: 'checkpoint 14' |
| 85 | count: 14 |
| 86 | digest: 'd9dcde396d69748c1fe357f8b662a27ce89082c8' |
| 87 | }, |
| 88 | MonteTestCase{ |
| 89 | name: 'checkpoint 15' |
| 90 | count: 15 |
| 91 | digest: '737a484499b6858b14e656c328979e8aa56b0a43' |
| 92 | }, |
| 93 | MonteTestCase{ |
| 94 | name: 'checkpoint 16' |
| 95 | count: 16 |
| 96 | digest: '4e9c8b3bce910432ac2ad17d51e6b9ec4f92c1ad' |
| 97 | }, |
| 98 | MonteTestCase{ |
| 99 | name: 'checkpoint 17' |
| 100 | count: 17 |
| 101 | digest: '62325b9a7cebcc6da3bfe781d84eb53a6eb7b019' |
| 102 | }, |
| 103 | MonteTestCase{ |
| 104 | name: 'checkpoint 18' |
| 105 | count: 18 |
| 106 | digest: '4710670e071609d470f7d628d8ea978dfb9234ac' |
| 107 | }, |
| 108 | MonteTestCase{ |
| 109 | name: 'checkpoint 19' |
| 110 | count: 19 |
| 111 | digest: '23baee80eee052f3263ac26dd12ea6504a5bd234' |
| 112 | }, |
| 113 | MonteTestCase{ |
| 114 | name: 'checkpoint 20' |
| 115 | count: 20 |
| 116 | digest: '9451efb9c9586a403747acfa3ec74d359bb9d7ff' |
| 117 | }, |
| 118 | MonteTestCase{ |
| 119 | name: 'checkpoint 21' |
| 120 | count: 21 |
| 121 | digest: '37e9d7c81b79f090c8e05848050936c64a1bd662' |
| 122 | }, |
| 123 | MonteTestCase{ |
| 124 | name: 'checkpoint 22' |
| 125 | count: 22 |
| 126 | digest: 'a6489ff37141f7a86dd978f685fdd4789d1993dc' |
| 127 | }, |
| 128 | MonteTestCase{ |
| 129 | name: 'checkpoint 23' |
| 130 | count: 23 |
| 131 | digest: '39650d32501dfcee212d0de10af9db47e4e5af65' |
| 132 | }, |
| 133 | MonteTestCase{ |
| 134 | name: 'checkpoint 24' |
| 135 | count: 24 |
| 136 | digest: 'cd4ea3474e046b281da5a4bf69fd873ef8d568d6' |
| 137 | }, |
| 138 | MonteTestCase{ |
| 139 | name: 'checkpoint 25' |
| 140 | count: 25 |
| 141 | digest: '0d7b518c07c6da877eee35301a99c7563f1840df' |
| 142 | }, |
| 143 | MonteTestCase{ |
| 144 | name: 'checkpoint 26' |
| 145 | count: 26 |
| 146 | digest: '68a70ae466532f7f61af138889c0d3f9670f3590' |
| 147 | }, |
| 148 | MonteTestCase{ |
| 149 | name: 'checkpoint 27' |
| 150 | count: 27 |
| 151 | digest: 'c0222aae5fd2b9eff143ac93c4493abe5c8806af' |
| 152 | }, |
| 153 | MonteTestCase{ |
| 154 | name: 'checkpoint 28' |
| 155 | count: 28 |
| 156 | digest: 'd2efc5aa0b29db15f3e5de82aaa0a8ce888ffb2f' |
| 157 | }, |
| 158 | MonteTestCase{ |
| 159 | name: 'checkpoint 29' |
| 160 | count: 29 |
| 161 | digest: 'eec4f55d02c627dcee36b5b5606603bdc9a94a26' |
| 162 | }, |
| 163 | MonteTestCase{ |
| 164 | name: 'checkpoint 30' |
| 165 | count: 30 |
| 166 | digest: '0e706fb1a1fa26aab74efcef57ab6a49c07ca7bd' |
| 167 | }, |
| 168 | MonteTestCase{ |
| 169 | name: 'checkpoint 31' |
| 170 | count: 31 |
| 171 | digest: '2ea392ca8043686424f7e9500edfb9e9297943f7' |
| 172 | }, |
| 173 | MonteTestCase{ |
| 174 | name: 'checkpoint 32' |
| 175 | count: 32 |
| 176 | digest: '74737ef257b32a4cb9428c866b65bee62ccbe653' |
| 177 | }, |
| 178 | MonteTestCase{ |
| 179 | name: 'checkpoint 33' |
| 180 | count: 33 |
| 181 | digest: 'df3e86e49a0429fa81f553b04b9fc003510e9a51' |
| 182 | }, |
| 183 | MonteTestCase{ |
| 184 | name: 'checkpoint 34' |
| 185 | count: 34 |
| 186 | digest: '79c3049944fbf8b80dadadc7f5174e5cfdf996de' |
| 187 | }, |
| 188 | MonteTestCase{ |
| 189 | name: 'checkpoint 35' |
| 190 | count: 35 |
| 191 | digest: 'f25e2eca4cfb6da8e8b7b62f581672fab80754fa' |
| 192 | }, |
| 193 | MonteTestCase{ |
| 194 | name: 'checkpoint 36' |
| 195 | count: 36 |
| 196 | digest: '76509239d9fd6c6f050c0d9b3777b5645e4d4c70' |
| 197 | }, |
| 198 | MonteTestCase{ |
| 199 | name: 'checkpoint 37' |
| 200 | count: 37 |
| 201 | digest: 'cf4bb3e1f330c862e239d9b010bd842f302bd227' |
| 202 | }, |
| 203 | MonteTestCase{ |
| 204 | name: 'checkpoint 38' |
| 205 | count: 38 |
| 206 | digest: '4eeac7ab2ac9e4c81ed1a93a300b2af75beddb08' |
| 207 | }, |
| 208 | MonteTestCase{ |
| 209 | name: 'checkpoint 39' |
| 210 | count: 39 |
| 211 | digest: '46443ba72a64fff4b5252fbac9ef93c2949f8585' |
| 212 | }, |
| 213 | MonteTestCase{ |
| 214 | name: 'checkpoint 40' |
| 215 | count: 40 |
| 216 | digest: '5e9c42482343a54aadb11ab00c2e00cbe25ec91a' |
| 217 | }, |
| 218 | MonteTestCase{ |
| 219 | name: 'checkpoint 41' |
| 220 | count: 41 |
| 221 | digest: '93acee1977128f2a4218678b32e2844f23eb526b' |
| 222 | }, |
| 223 | MonteTestCase{ |
| 224 | name: 'checkpoint 42' |
| 225 | count: 42 |
| 226 | digest: '226065d299b2d6c582d386897b93f2adf14de00b' |
| 227 | }, |
| 228 | MonteTestCase{ |
| 229 | name: 'checkpoint 43' |
| 230 | count: 43 |
| 231 | digest: '672fed0d90c21d4ec0111a7284bcf1bbd72af9bd' |
| 232 | }, |
| 233 | MonteTestCase{ |
| 234 | name: 'checkpoint 44' |
| 235 | count: 44 |
| 236 | digest: '90d642f12f28cb3dad7daad84cf0f94ded1137ae' |
| 237 | }, |
| 238 | MonteTestCase{ |
| 239 | name: 'checkpoint 45' |
| 240 | count: 45 |
| 241 | digest: '4a2815b58ffc858e5e7e9e6106765458d2af4ec3' |
| 242 | }, |
| 243 | MonteTestCase{ |
| 244 | name: 'checkpoint 46' |
| 245 | count: 46 |
| 246 | digest: '29fa3679032421b78b7a08c54766c1592f6739c1' |
| 247 | }, |
| 248 | MonteTestCase{ |
| 249 | name: 'checkpoint 47' |
| 250 | count: 47 |
| 251 | digest: '19f4e30393eb66c6e200744fa8999d224e6df173' |
| 252 | }, |
| 253 | MonteTestCase{ |
| 254 | name: 'checkpoint 48' |
| 255 | count: 48 |
| 256 | digest: '30650026be77212088ab50438e04b4b8e3761977' |
| 257 | }, |
| 258 | MonteTestCase{ |
| 259 | name: 'checkpoint 49' |
| 260 | count: 49 |
| 261 | digest: '993d0e135bcd598fa673c6f19251bcbde18b7b34' |
| 262 | }, |
| 263 | MonteTestCase{ |
| 264 | name: 'checkpoint 50' |
| 265 | count: 50 |
| 266 | digest: 'c9eaf20b473219a70efe85940620426c6ff6f4a4' |
| 267 | }, |
| 268 | MonteTestCase{ |
| 269 | name: 'checkpoint 51' |
| 270 | count: 51 |
| 271 | digest: '6325d0b83c308bd42854ce69446e85ba36348d7d' |
| 272 | }, |
| 273 | MonteTestCase{ |
| 274 | name: 'checkpoint 52' |
| 275 | count: 52 |
| 276 | digest: '2fb354f8a68030efb747f78812060a9c05e92164' |
| 277 | }, |
| 278 | MonteTestCase{ |
| 279 | name: 'checkpoint 53' |
| 280 | count: 53 |
| 281 | digest: 'a7e33bd16f770c17e8818ad5a5fc4fee673eae56' |
| 282 | }, |
| 283 | MonteTestCase{ |
| 284 | name: 'checkpoint 54' |
| 285 | count: 54 |
| 286 | digest: 'ff23e7105bc9f4dad0fb9c6519d1eae16439a5d6' |
| 287 | }, |
| 288 | MonteTestCase{ |
| 289 | name: 'checkpoint 55' |
| 290 | count: 55 |
| 291 | digest: 'a31aca821e163213cd2ae84cf56c1134daa4a621' |
| 292 | }, |
| 293 | MonteTestCase{ |
| 294 | name: 'checkpoint 56' |
| 295 | count: 56 |
| 296 | digest: '94ab9cfd4cf9bf2e4409dbcdc9ef2c8b611cc69d' |
| 297 | }, |
| 298 | MonteTestCase{ |
| 299 | name: 'checkpoint 57' |
| 300 | count: 57 |
| 301 | digest: 'c0194064ce48dde771b7871efa86a4a6e87eec76' |
| 302 | }, |
| 303 | MonteTestCase{ |
| 304 | name: 'checkpoint 58' |
| 305 | count: 58 |
| 306 | digest: 'f1a9065e3e7f98753c6f833f5ffe74133f6b887f' |
| 307 | }, |
| 308 | MonteTestCase{ |
| 309 | name: 'checkpoint 59' |
| 310 | count: 59 |
| 311 | digest: 'b8b3cd6ca1d5b5610e43212f8df75211aaddcf96' |
| 312 | }, |
| 313 | MonteTestCase{ |
| 314 | name: 'checkpoint 60' |
| 315 | count: 60 |
| 316 | digest: '33c3a8d739cc2f83be597aa11c43e2ad6f0d2436' |
| 317 | }, |
| 318 | MonteTestCase{ |
| 319 | name: 'checkpoint 61' |
| 320 | count: 61 |
| 321 | digest: '4f5c67e5110f3663b7aa88759dbba6fa82f2d705' |
| 322 | }, |
| 323 | MonteTestCase{ |
| 324 | name: 'checkpoint 62' |
| 325 | count: 62 |
| 326 | digest: 'b1ebc87c7b2b8fe73e7a882d3f4f0492946e0d7c' |
| 327 | }, |
| 328 | MonteTestCase{ |
| 329 | name: 'checkpoint 63' |
| 330 | count: 63 |
| 331 | digest: '01566616fe4a8c7cf22f21031ac6ea7fb7ce15db' |
| 332 | }, |
| 333 | MonteTestCase{ |
| 334 | name: 'checkpoint 64' |
| 335 | count: 64 |
| 336 | digest: '5650f3517a393792781d23b4c9d360bf8bd31d65' |
| 337 | }, |
| 338 | MonteTestCase{ |
| 339 | name: 'checkpoint 65' |
| 340 | count: 65 |
| 341 | digest: 'a4fdbd24cb4a328b898b804b103caa98baedd3fa' |
| 342 | }, |
| 343 | MonteTestCase{ |
| 344 | name: 'checkpoint 66' |
| 345 | count: 66 |
| 346 | digest: '0cf01eecec4b85aa39f40aa9b4dce208d68eb17b' |
| 347 | }, |
| 348 | MonteTestCase{ |
| 349 | name: 'checkpoint 67' |
| 350 | count: 67 |
| 351 | digest: 'ae9ac147bab7c10609abe6e931a5ab087a41dc5a' |
| 352 | }, |
| 353 | MonteTestCase{ |
| 354 | name: 'checkpoint 68' |
| 355 | count: 68 |
| 356 | digest: 'c0328145ce63fb0aceeb414e791d2be92009b1ec' |
| 357 | }, |
| 358 | MonteTestCase{ |
| 359 | name: 'checkpoint 69' |
| 360 | count: 69 |
| 361 | digest: '60343e5fb7eee00d31ea507b820ddbb7ef405dc7' |
| 362 | }, |
| 363 | MonteTestCase{ |
| 364 | name: 'checkpoint 70' |
| 365 | count: 70 |
| 366 | digest: 'e0b97cd9149ff9955b6a35b3a79ecb3bdbd2a5a5' |
| 367 | }, |
| 368 | MonteTestCase{ |
| 369 | name: 'checkpoint 71' |
| 370 | count: 71 |
| 371 | digest: '4e4fdcd382ae0f3f4fbda5fd934eee0d6ad37df5' |
| 372 | }, |
| 373 | MonteTestCase{ |
| 374 | name: 'checkpoint 72' |
| 375 | count: 72 |
| 376 | digest: '9d97dd237d193482cf3ab862a38843762e69077f' |
| 377 | }, |
| 378 | MonteTestCase{ |
| 379 | name: 'checkpoint 73' |
| 380 | count: 73 |
| 381 | digest: '2bc927d17ff2f8a844f6f36a944a64d73d431192' |
| 382 | }, |
| 383 | MonteTestCase{ |
| 384 | name: 'checkpoint 74' |
| 385 | count: 74 |
| 386 | digest: 'b91200306b769aab18e5e411b5bd5e7bce1cc80e' |
| 387 | }, |
| 388 | MonteTestCase{ |
| 389 | name: 'checkpoint 75' |
| 390 | count: 75 |
| 391 | digest: 'c47493a666085e1b7a75618761a80c402f46546d' |
| 392 | }, |
| 393 | MonteTestCase{ |
| 394 | name: 'checkpoint 76' |
| 395 | count: 76 |
| 396 | digest: '31355869b80ff84fac239db694ada07d3be26b15' |
| 397 | }, |
| 398 | MonteTestCase{ |
| 399 | name: 'checkpoint 77' |
| 400 | count: 77 |
| 401 | digest: '1a2022f6330bf96f025cb7d8f0201a7d70b3b58e' |
| 402 | }, |
| 403 | MonteTestCase{ |
| 404 | name: 'checkpoint 78' |
| 405 | count: 78 |
| 406 | digest: '0f60d7c5ad49efce939c3a27da9973f7f1747848' |
| 407 | }, |
| 408 | MonteTestCase{ |
| 409 | name: 'checkpoint 79' |
| 410 | count: 79 |
| 411 | digest: 'ceada087801616fc6c08cfa469658f3dc5239ca7' |
| 412 | }, |
| 413 | MonteTestCase{ |
| 414 | name: 'checkpoint 80' |
| 415 | count: 80 |
| 416 | digest: '4ad0cf9181122b06df714397bd5366aa90bfc9fa' |
| 417 | }, |
| 418 | MonteTestCase{ |
| 419 | name: 'checkpoint 81' |
| 420 | count: 81 |
| 421 | digest: 'ac6404e6b9d5c0fa17fa77fd39850f22b76ecd83' |
| 422 | }, |
| 423 | MonteTestCase{ |
| 424 | name: 'checkpoint 82' |
| 425 | count: 82 |
| 426 | digest: 'f0658218adffb9ee9328577854b6387393957a3a' |
| 427 | }, |
| 428 | MonteTestCase{ |
| 429 | name: 'checkpoint 83' |
| 430 | count: 83 |
| 431 | digest: '6fe9992747897389957b9a91467a4ec983829ab6' |
| 432 | }, |
| 433 | MonteTestCase{ |
| 434 | name: 'checkpoint 84' |
| 435 | count: 84 |
| 436 | digest: '74320b3ddde6dbfbdad3ad29a7695f5a275b2105' |
| 437 | }, |
| 438 | MonteTestCase{ |
| 439 | name: 'checkpoint 85' |
| 440 | count: 85 |
| 441 | digest: '2009ea5d6452f51d12477740e374e0e313134779' |
| 442 | }, |
| 443 | MonteTestCase{ |
| 444 | name: 'checkpoint 86' |
| 445 | count: 86 |
| 446 | digest: '7dbf33d7125709f101fea4ec03436ab95a900c28' |
| 447 | }, |
| 448 | MonteTestCase{ |
| 449 | name: 'checkpoint 87' |
| 450 | count: 87 |
| 451 | digest: '0c05b78e324cb265bd6adc7452249eaa85bccb3f' |
| 452 | }, |
| 453 | MonteTestCase{ |
| 454 | name: 'checkpoint 88' |
| 455 | count: 88 |
| 456 | digest: '10c1b9b2de8a9050fb6f4b10a99f7e1e47159f25' |
| 457 | }, |
| 458 | MonteTestCase{ |
| 459 | name: 'checkpoint 89' |
| 460 | count: 89 |
| 461 | digest: '20072c1f691142d9b83a090dd01f446b4e325a1c' |
| 462 | }, |
| 463 | MonteTestCase{ |
| 464 | name: 'checkpoint 90' |
| 465 | count: 90 |
| 466 | digest: 'ffcb6a1525f20803cfc79deb40addfd3e7b2f05c' |
| 467 | }, |
| 468 | MonteTestCase{ |
| 469 | name: 'checkpoint 91' |
| 470 | count: 91 |
| 471 | digest: 'bdcbb4ed636e244bb0fe6af4bc53998936df4ebc' |
| 472 | }, |
| 473 | MonteTestCase{ |
| 474 | name: 'checkpoint 92' |
| 475 | count: 92 |
| 476 | digest: 'f58ccbc65a2ffa5b35274dd0ceb4ea70eb73c26a' |
| 477 | }, |
| 478 | MonteTestCase{ |
| 479 | name: 'checkpoint 93' |
| 480 | count: 93 |
| 481 | digest: 'fbe95ac75e4b9cccd1a5debf757fa1a502d07944' |
| 482 | }, |
| 483 | MonteTestCase{ |
| 484 | name: 'checkpoint 94' |
| 485 | count: 94 |
| 486 | digest: 'a8babac55950dba4993601d35adff874a2b9bb2a' |
| 487 | }, |
| 488 | MonteTestCase{ |
| 489 | name: 'checkpoint 95' |
| 490 | count: 95 |
| 491 | digest: '594db79de71c7651e9eef2f08bb7be3d26b6ee99' |
| 492 | }, |
| 493 | MonteTestCase{ |
| 494 | name: 'checkpoint 96' |
| 495 | count: 96 |
| 496 | digest: '63377d45d0e2d0c987bebe8086c76a5e8b63a14b' |
| 497 | }, |
| 498 | MonteTestCase{ |
| 499 | name: 'checkpoint 97' |
| 500 | count: 97 |
| 501 | digest: 'cd1e7a192130866aa87fd1c8b43e9b7a0eab7615' |
| 502 | }, |
| 503 | MonteTestCase{ |
| 504 | name: 'checkpoint 98' |
| 505 | count: 98 |
| 506 | digest: 'b3c69ad5dbdd34b7b45b2a89dad72f4cf1d8fd73' |
| 507 | }, |
| 508 | MonteTestCase{ |
| 509 | name: 'checkpoint 99' |
| 510 | count: 99 |
| 511 | digest: '01b7be5b70ef64843a03fdbb3b247a6278d2cbe1' |
| 512 | }, |
| 513 | ] |
| 514 | |
| 515 | fn test_monte_messages() { |
| 516 | mut msg_seed := hex.decode(seed)! |
| 517 | |
| 518 | for c in monte_cases { |
| 519 | mut md0 := msg_seed.clone() |
| 520 | mut md1 := msg_seed.clone() |
| 521 | mut md2 := msg_seed.clone() |
| 522 | mut md3 := msg_seed.clone() |
| 523 | |
| 524 | mut mi := []u8{len: 0, cap: 64} |
| 525 | |
| 526 | for _ in 0 .. 1000 { |
| 527 | mi.clear() |
| 528 | mi << md0 |
| 529 | mi << md1 |
| 530 | mi << md2 |
| 531 | |
| 532 | md3 = sha1.sum(mi) |
| 533 | |
| 534 | md0 = md1.clone() |
| 535 | md1 = md2.clone() |
| 536 | md2 = md3.clone() |
| 537 | } |
| 538 | |
| 539 | msg_seed = md3.clone() |
| 540 | |
| 541 | expected_result := hex.decode(c.digest)! |
| 542 | |
| 543 | assert md3 == expected_result, 'failed ${c.name}' |
| 544 | } |
| 545 | } |
| 546 | |