github.com/waltonchain/waltonchain_gwtc_src@v1.1.4-0.20201225072101-8a298c95a819/crypto/x11/luffa/luffa.go (about) 1 // Use of this source code is governed by an ISC 2 // license that can be found in the LICENSE file. 3 4 package luffa 5 6 import ( 7 "fmt" 8 9 "github.com/wtc/go-wtc/crypto/hash" 10 ) 11 12 // HashSize holds the size of a hash in bytes. 13 const HashSize = int(64) 14 15 // BlockSize holds the size of a block in bytes. 16 const BlockSize = uintptr(32) 17 18 //////////////// 19 20 type digest struct { 21 ptr uintptr 22 23 h [5][8]uint32 24 25 b [32]byte 26 } 27 28 // New returns a new digest compute a LUFFA512 hash. 29 func New() hash.Digest { 30 ref := &digest{} 31 ref.Reset() 32 return ref 33 } 34 35 //////////////// 36 37 // Reset resets the digest to its initial state. 38 func (ref *digest) Reset() { 39 ref.ptr = 0 40 for x := range kInit { 41 for y := range kInit[x] { 42 ref.h[x][y] = kInit[x][y] 43 } 44 } 45 } 46 47 // Sum appends the current hash to dst and returns the result 48 // as a slice. It does not change the underlying hash state. 49 func (ref *digest) Sum(dst []byte) []byte { 50 dgt := *ref 51 hsh := [64]byte{} 52 dgt.Close(hsh[:], 0, 0) 53 return append(dst, hsh[:]...) 54 } 55 56 // Write more data to the running hash, never returns an error. 57 func (ref *digest) Write(src []byte) (int, error) { 58 sln := uintptr(len(src)) 59 fln := len(src) 60 buf := ref.b[:] 61 ptr := ref.ptr 62 63 if sln < (BlockSize - ptr) { 64 copy(ref.b[ptr:], src) 65 ref.ptr += sln 66 return int(sln), nil 67 } 68 69 var V00, V01, V02, V03, V04, V05, V06, V07 uint32 70 var V10, V11, V12, V13, V14, V15, V16, V17 uint32 71 var V20, V21, V22, V23, V24, V25, V26, V27 uint32 72 var V30, V31, V32, V33, V34, V35, V36, V37 uint32 73 var V40, V41, V42, V43, V44, V45, V46, V47 uint32 74 75 V00 = ref.h[0][0] 76 V01 = ref.h[0][1] 77 V02 = ref.h[0][2] 78 V03 = ref.h[0][3] 79 V04 = ref.h[0][4] 80 V05 = ref.h[0][5] 81 V06 = ref.h[0][6] 82 V07 = ref.h[0][7] 83 V10 = ref.h[1][0] 84 V11 = ref.h[1][1] 85 V12 = ref.h[1][2] 86 V13 = ref.h[1][3] 87 V14 = ref.h[1][4] 88 V15 = ref.h[1][5] 89 V16 = ref.h[1][6] 90 V17 = ref.h[1][7] 91 V20 = ref.h[2][0] 92 V21 = ref.h[2][1] 93 V22 = ref.h[2][2] 94 V23 = ref.h[2][3] 95 V24 = ref.h[2][4] 96 V25 = ref.h[2][5] 97 V26 = ref.h[2][6] 98 V27 = ref.h[2][7] 99 V30 = ref.h[3][0] 100 V31 = ref.h[3][1] 101 V32 = ref.h[3][2] 102 V33 = ref.h[3][3] 103 V34 = ref.h[3][4] 104 V35 = ref.h[3][5] 105 V36 = ref.h[3][6] 106 V37 = ref.h[3][7] 107 V40 = ref.h[4][0] 108 V41 = ref.h[4][1] 109 V42 = ref.h[4][2] 110 V43 = ref.h[4][3] 111 V44 = ref.h[4][4] 112 V45 = ref.h[4][5] 113 V46 = ref.h[4][6] 114 V47 = ref.h[4][7] 115 116 for sln > 0 { 117 cln := BlockSize - ptr 118 119 if cln > sln { 120 cln = sln 121 } 122 sln -= cln 123 124 copy(ref.b[ptr:], src[:cln]) 125 src = src[cln:] 126 ptr += cln 127 128 if ptr == BlockSize { 129 { 130 var ts uint32 131 var M0, M1, M2, M3, M4, M5, M6, M7 uint32 132 var a0, a1, a2, a3, a4, a5, a6, a7 uint32 133 var b0, b1, b2, b3, b4, b5, b6, b7 uint32 134 135 M0 = decUInt32be(buf[0:]) 136 M1 = decUInt32be(buf[4:]) 137 M2 = decUInt32be(buf[8:]) 138 M3 = decUInt32be(buf[12:]) 139 M4 = decUInt32be(buf[16:]) 140 M5 = decUInt32be(buf[20:]) 141 M6 = decUInt32be(buf[24:]) 142 M7 = decUInt32be(buf[28:]) 143 144 a0 = V00 ^ V10 145 a1 = V01 ^ V11 146 a2 = V02 ^ V12 147 a3 = V03 ^ V13 148 a4 = V04 ^ V14 149 a5 = V05 ^ V15 150 a6 = V06 ^ V16 151 a7 = V07 ^ V17 152 153 b0 = V20 ^ V30 154 b1 = V21 ^ V31 155 b2 = V22 ^ V32 156 b3 = V23 ^ V33 157 b4 = V24 ^ V34 158 b5 = V25 ^ V35 159 b6 = V26 ^ V36 160 b7 = V27 ^ V37 161 162 a0 ^= b0 163 a1 ^= b1 164 a2 ^= b2 165 a3 ^= b3 166 a4 ^= b4 167 a5 ^= b5 168 a6 ^= b6 169 a7 ^= b7 170 171 a0 ^= V40 172 a1 ^= V41 173 a2 ^= V42 174 a3 ^= V43 175 a4 ^= V44 176 a5 ^= V45 177 a6 ^= V46 178 a7 ^= V47 179 180 ts = a7 181 a7 = a6 182 a6 = a5 183 a5 = a4 184 a4 = a3 ^ ts 185 a3 = a2 ^ ts 186 a2 = a1 187 a1 = a0 ^ ts 188 a0 = ts 189 190 V00 ^= a0 191 V01 ^= a1 192 V02 ^= a2 193 V03 ^= a3 194 V04 ^= a4 195 V05 ^= a5 196 V06 ^= a6 197 V07 ^= a7 198 199 V10 ^= a0 200 V11 ^= a1 201 V12 ^= a2 202 V13 ^= a3 203 V14 ^= a4 204 V15 ^= a5 205 V16 ^= a6 206 V17 ^= a7 207 208 V20 ^= a0 209 V21 ^= a1 210 V22 ^= a2 211 V23 ^= a3 212 V24 ^= a4 213 V25 ^= a5 214 V26 ^= a6 215 V27 ^= a7 216 217 V30 ^= a0 218 V31 ^= a1 219 V32 ^= a2 220 V33 ^= a3 221 V34 ^= a4 222 V35 ^= a5 223 V36 ^= a6 224 V37 ^= a7 225 226 V40 ^= a0 227 V41 ^= a1 228 V42 ^= a2 229 V43 ^= a3 230 V44 ^= a4 231 V45 ^= a5 232 V46 ^= a6 233 V47 ^= a7 234 235 ts = V07 236 b7 = V06 237 b6 = V05 238 b5 = V04 239 b4 = V03 ^ ts 240 b3 = V02 ^ ts 241 b2 = V01 242 b1 = V00 ^ ts 243 b0 = ts 244 245 b0 ^= V10 246 b1 ^= V11 247 b2 ^= V12 248 b3 ^= V13 249 b4 ^= V14 250 b5 ^= V15 251 b6 ^= V16 252 b7 ^= V17 253 254 ts = V17 255 V17 = V16 256 V16 = V15 257 V15 = V14 258 V14 = V13 ^ ts 259 V13 = V12 ^ ts 260 V12 = V11 261 V11 = V10 ^ ts 262 V10 = ts 263 264 V10 ^= V20 265 V11 ^= V21 266 V12 ^= V22 267 V13 ^= V23 268 V14 ^= V24 269 V15 ^= V25 270 V16 ^= V26 271 V17 ^= V27 272 273 ts = V27 274 V27 = V26 275 V26 = V25 276 V25 = V24 277 V24 = V23 ^ ts 278 V23 = V22 ^ ts 279 V22 = V21 280 V21 = V20 ^ ts 281 V20 = ts 282 283 V20 ^= V30 284 V21 ^= V31 285 V22 ^= V32 286 V23 ^= V33 287 V24 ^= V34 288 V25 ^= V35 289 V26 ^= V36 290 V27 ^= V37 291 292 ts = V37 293 V37 = V36 294 V36 = V35 295 V35 = V34 296 V34 = V33 ^ ts 297 V33 = V32 ^ ts 298 V32 = V31 299 V31 = V30 ^ ts 300 V30 = ts 301 302 V30 ^= V40 303 V31 ^= V41 304 V32 ^= V42 305 V33 ^= V43 306 V34 ^= V44 307 V35 ^= V45 308 V36 ^= V46 309 V37 ^= V47 310 311 ts = V47 312 V47 = V46 313 V46 = V45 314 V45 = V44 315 V44 = V43 ^ ts 316 V43 = V42 ^ ts 317 V42 = V41 318 V41 = V40 ^ ts 319 V40 = ts 320 321 V40 ^= V00 322 V41 ^= V01 323 V42 ^= V02 324 V43 ^= V03 325 V44 ^= V04 326 V45 ^= V05 327 V46 ^= V06 328 V47 ^= V07 329 330 ts = b7 331 V07 = b6 332 V06 = b5 333 V05 = b4 334 V04 = b3 ^ ts 335 V03 = b2 ^ ts 336 V02 = b1 337 V01 = b0 ^ ts 338 V00 = ts 339 340 V00 ^= V40 341 V01 ^= V41 342 V02 ^= V42 343 V03 ^= V43 344 V04 ^= V44 345 V05 ^= V45 346 V06 ^= V46 347 V07 ^= V47 348 349 ts = V47 350 V47 = V46 351 V46 = V45 352 V45 = V44 353 V44 = V43 ^ ts 354 V43 = V42 ^ ts 355 V42 = V41 356 V41 = V40 ^ ts 357 V40 = ts 358 359 V40 ^= V30 360 V41 ^= V31 361 V42 ^= V32 362 V43 ^= V33 363 V44 ^= V34 364 V45 ^= V35 365 V46 ^= V36 366 V47 ^= V37 367 368 ts = V37 369 V37 = V36 370 V36 = V35 371 V35 = V34 372 V34 = V33 ^ ts 373 V33 = V32 ^ ts 374 V32 = V31 375 V31 = V30 ^ ts 376 V30 = ts 377 378 V30 ^= V20 379 V31 ^= V21 380 V32 ^= V22 381 V33 ^= V23 382 V34 ^= V24 383 V35 ^= V25 384 V36 ^= V26 385 V37 ^= V27 386 387 ts = V27 388 V27 = V26 389 V26 = V25 390 V25 = V24 391 V24 = V23 ^ ts 392 V23 = V22 ^ ts 393 V22 = V21 394 V21 = V20 ^ ts 395 V20 = ts 396 397 V20 ^= V10 398 V21 ^= V11 399 V22 ^= V12 400 V23 ^= V13 401 V24 ^= V14 402 V25 ^= V15 403 V26 ^= V16 404 V27 ^= V17 405 406 ts = V17 407 V17 = V16 408 V16 = V15 409 V15 = V14 410 V14 = V13 ^ ts 411 V13 = V12 ^ ts 412 V12 = V11 413 V11 = V10 ^ ts 414 V10 = ts 415 416 V10 ^= b0 417 V11 ^= b1 418 V12 ^= b2 419 V13 ^= b3 420 V14 ^= b4 421 V15 ^= b5 422 V16 ^= b6 423 V17 ^= b7 424 425 V00 ^= M0 426 V01 ^= M1 427 V02 ^= M2 428 V03 ^= M3 429 V04 ^= M4 430 V05 ^= M5 431 V06 ^= M6 432 V07 ^= M7 433 434 ts = M7 435 M7 = M6 436 M6 = M5 437 M5 = M4 438 M4 = M3 ^ ts 439 M3 = M2 ^ ts 440 M2 = M1 441 M1 = M0 ^ ts 442 M0 = ts 443 444 V10 ^= M0 445 V11 ^= M1 446 V12 ^= M2 447 V13 ^= M3 448 V14 ^= M4 449 V15 ^= M5 450 V16 ^= M6 451 V17 ^= M7 452 453 ts = M7 454 M7 = M6 455 M6 = M5 456 M5 = M4 457 M4 = M3 ^ ts 458 M3 = M2 ^ ts 459 M2 = M1 460 M1 = M0 ^ ts 461 M0 = ts 462 463 V20 ^= M0 464 V21 ^= M1 465 V22 ^= M2 466 V23 ^= M3 467 V24 ^= M4 468 V25 ^= M5 469 V26 ^= M6 470 V27 ^= M7 471 472 ts = M7 473 M7 = M6 474 M6 = M5 475 M5 = M4 476 M4 = M3 ^ ts 477 M3 = M2 ^ ts 478 M2 = M1 479 M1 = M0 ^ ts 480 M0 = ts 481 482 V30 ^= M0 483 V31 ^= M1 484 V32 ^= M2 485 V33 ^= M3 486 V34 ^= M4 487 V35 ^= M5 488 V36 ^= M6 489 V37 ^= M7 490 491 ts = M7 492 M7 = M6 493 M6 = M5 494 M5 = M4 495 M4 = M3 ^ ts 496 M3 = M2 ^ ts 497 M2 = M1 498 M1 = M0 ^ ts 499 M0 = ts 500 501 V40 ^= M0 502 V41 ^= M1 503 V42 ^= M2 504 V43 ^= M3 505 V44 ^= M4 506 V45 ^= M5 507 V46 ^= M6 508 V47 ^= M7 509 } 510 511 { 512 var ul, uh, vl, vh, tws uint32 513 var W0, W1, W2, W3, W4, W5, W6, W7, tw uint64 514 515 V14 = ((V14 << 1) | (V14 >> (32 - 1))) 516 V15 = ((V15 << 1) | (V15 >> (32 - 1))) 517 V16 = ((V16 << 1) | (V16 >> (32 - 1))) 518 V17 = ((V17 << 1) | (V17 >> (32 - 1))) 519 V24 = ((V24 << 2) | (V24 >> (32 - 2))) 520 V25 = ((V25 << 2) | (V25 >> (32 - 2))) 521 V26 = ((V26 << 2) | (V26 >> (32 - 2))) 522 V27 = ((V27 << 2) | (V27 >> (32 - 2))) 523 V34 = ((V34 << 3) | (V34 >> (32 - 3))) 524 V35 = ((V35 << 3) | (V35 >> (32 - 3))) 525 V36 = ((V36 << 3) | (V36 >> (32 - 3))) 526 V37 = ((V37 << 3) | (V37 >> (32 - 3))) 527 V44 = ((V44 << 4) | (V44 >> (32 - 4))) 528 V45 = ((V45 << 4) | (V45 >> (32 - 4))) 529 V46 = ((V46 << 4) | (V46 >> (32 - 4))) 530 V47 = ((V47 << 4) | (V47 >> (32 - 4))) 531 532 W0 = uint64(V00) | (uint64(V10) << 32) 533 W1 = uint64(V01) | (uint64(V11) << 32) 534 W2 = uint64(V02) | (uint64(V12) << 32) 535 W3 = uint64(V03) | (uint64(V13) << 32) 536 W4 = uint64(V04) | (uint64(V14) << 32) 537 W5 = uint64(V05) | (uint64(V15) << 32) 538 W6 = uint64(V06) | (uint64(V16) << 32) 539 W7 = uint64(V07) | (uint64(V17) << 32) 540 541 for r := uintptr(0); r < 8; r++ { 542 tw = W0 543 W0 |= W1 544 W2 ^= W3 545 W1 = ^W1 546 W0 ^= W3 547 W3 &= tw 548 W1 ^= W3 549 W3 ^= W2 550 W2 &= W0 551 W0 = ^W0 552 W2 ^= W1 553 W1 |= W3 554 tw ^= W1 555 W3 ^= W2 556 W2 &= W1 557 W1 ^= W0 558 W0 = tw 559 560 tw = W5 561 W5 |= W6 562 W7 ^= W4 563 W6 = ^W6 564 W5 ^= W4 565 W4 &= tw 566 W6 ^= W4 567 W4 ^= W7 568 W7 &= W5 569 W5 = ^W5 570 W7 ^= W6 571 W6 |= W4 572 tw ^= W6 573 W4 ^= W7 574 W7 &= W6 575 W6 ^= W5 576 W5 = tw 577 578 W4 ^= W0 579 ul = uint32(W0) 580 uh = uint32((W0 >> 32)) 581 vl = uint32(W4) 582 vh = uint32((W4 >> 32)) 583 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 584 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 585 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 586 vl = ((vl << 1) | (vl >> (32 - 1))) 587 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 588 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 589 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 590 vh = ((vh << 1) | (vh >> (32 - 1))) 591 W0 = uint64(ul) | (uint64(uh) << 32) 592 W4 = uint64(vl) | (uint64(vh) << 32) 593 594 W5 ^= W1 595 ul = uint32(W1) 596 uh = uint32((W1 >> 32)) 597 vl = uint32(W5) 598 vh = uint32((W5 >> 32)) 599 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 600 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 601 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 602 vl = ((vl << 1) | (vl >> (32 - 1))) 603 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 604 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 605 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 606 vh = ((vh << 1) | (vh >> (32 - 1))) 607 W1 = uint64(ul) | (uint64(uh) << 32) 608 W5 = uint64(vl) | (uint64(vh) << 32) 609 610 W6 ^= W2 611 ul = uint32(W2) 612 uh = uint32((W2 >> 32)) 613 vl = uint32(W6) 614 vh = uint32((W6 >> 32)) 615 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 616 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 617 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 618 vl = ((vl << 1) | (vl >> (32 - 1))) 619 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 620 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 621 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 622 vh = ((vh << 1) | (vh >> (32 - 1))) 623 W2 = uint64(ul) | (uint64(uh) << 32) 624 W6 = uint64(vl) | (uint64(vh) << 32) 625 626 W7 ^= W3 627 ul = uint32(W3) 628 uh = uint32((W3 >> 32)) 629 vl = uint32(W7) 630 vh = uint32((W7 >> 32)) 631 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 632 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 633 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 634 vl = ((vl << 1) | (vl >> (32 - 1))) 635 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 636 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 637 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 638 vh = ((vh << 1) | (vh >> (32 - 1))) 639 W3 = uint64(ul) | (uint64(uh) << 32) 640 W7 = uint64(vl) | (uint64(vh) << 32) 641 642 W0 ^= kRCW010[r] 643 W4 ^= kRCW014[r] 644 } 645 646 V00 = uint32(W0) 647 V10 = uint32((W0 >> 32)) 648 V01 = uint32(W1) 649 V11 = uint32((W1 >> 32)) 650 V02 = uint32(W2) 651 V12 = uint32((W2 >> 32)) 652 V03 = uint32(W3) 653 V13 = uint32((W3 >> 32)) 654 V04 = uint32(W4) 655 V14 = uint32((W4 >> 32)) 656 V05 = uint32(W5) 657 V15 = uint32((W5 >> 32)) 658 V06 = uint32(W6) 659 V16 = uint32((W6 >> 32)) 660 V07 = uint32(W7) 661 V17 = uint32((W7 >> 32)) 662 663 W0 = uint64(V20) | (uint64(V30) << 32) 664 W1 = uint64(V21) | (uint64(V31) << 32) 665 W2 = uint64(V22) | (uint64(V32) << 32) 666 W3 = uint64(V23) | (uint64(V33) << 32) 667 W4 = uint64(V24) | (uint64(V34) << 32) 668 W5 = uint64(V25) | (uint64(V35) << 32) 669 W6 = uint64(V26) | (uint64(V36) << 32) 670 W7 = uint64(V27) | (uint64(V37) << 32) 671 672 for r := uintptr(0); r < 8; r++ { 673 tw = W0 674 W0 |= W1 675 W2 ^= W3 676 W1 = ^W1 677 W0 ^= W3 678 W3 &= tw 679 W1 ^= W3 680 W3 ^= W2 681 W2 &= W0 682 W0 = ^W0 683 W2 ^= W1 684 W1 |= W3 685 tw ^= W1 686 W3 ^= W2 687 W2 &= W1 688 W1 ^= W0 689 W0 = tw 690 691 tw = W5 692 W5 |= W6 693 W7 ^= W4 694 W6 = ^W6 695 W5 ^= W4 696 W4 &= tw 697 W6 ^= W4 698 W4 ^= W7 699 W7 &= W5 700 W5 = ^W5 701 W7 ^= W6 702 W6 |= W4 703 tw ^= W6 704 W4 ^= W7 705 W7 &= W6 706 W6 ^= W5 707 W5 = tw 708 709 W4 ^= W0 710 ul = uint32(W0) 711 uh = uint32((W0 >> 32)) 712 vl = uint32(W4) 713 vh = uint32((W4 >> 32)) 714 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 715 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 716 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 717 vl = ((vl << 1) | (vl >> (32 - 1))) 718 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 719 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 720 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 721 vh = ((vh << 1) | (vh >> (32 - 1))) 722 W0 = uint64(ul) | (uint64(uh) << 32) 723 W4 = uint64(vl) | (uint64(vh) << 32) 724 725 W5 ^= W1 726 ul = uint32(W1) 727 uh = uint32((W1 >> 32)) 728 vl = uint32(W5) 729 vh = uint32((W5 >> 32)) 730 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 731 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 732 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 733 vl = ((vl << 1) | (vl >> (32 - 1))) 734 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 735 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 736 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 737 vh = ((vh << 1) | (vh >> (32 - 1))) 738 W1 = uint64(ul) | (uint64(uh) << 32) 739 W5 = uint64(vl) | (uint64(vh) << 32) 740 741 W6 ^= W2 742 ul = uint32(W2) 743 uh = uint32((W2 >> 32)) 744 vl = uint32(W6) 745 vh = uint32((W6 >> 32)) 746 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 747 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 748 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 749 vl = ((vl << 1) | (vl >> (32 - 1))) 750 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 751 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 752 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 753 vh = ((vh << 1) | (vh >> (32 - 1))) 754 W2 = uint64(ul) | (uint64(uh) << 32) 755 W6 = uint64(vl) | (uint64(vh) << 32) 756 757 W7 ^= W3 758 ul = uint32(W3) 759 uh = uint32((W3 >> 32)) 760 vl = uint32(W7) 761 vh = uint32((W7 >> 32)) 762 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 763 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 764 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 765 vl = ((vl << 1) | (vl >> (32 - 1))) 766 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 767 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 768 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 769 vh = ((vh << 1) | (vh >> (32 - 1))) 770 W3 = uint64(ul) | (uint64(uh) << 32) 771 W7 = uint64(vl) | (uint64(vh) << 32) 772 773 W0 ^= kRCW230[r] 774 W4 ^= kRCW234[r] 775 } 776 777 V20 = uint32(W0) 778 V30 = uint32((W0 >> 32)) 779 V21 = uint32(W1) 780 V31 = uint32((W1 >> 32)) 781 V22 = uint32(W2) 782 V32 = uint32((W2 >> 32)) 783 V23 = uint32(W3) 784 V33 = uint32((W3 >> 32)) 785 V24 = uint32(W4) 786 V34 = uint32((W4 >> 32)) 787 V25 = uint32(W5) 788 V35 = uint32((W5 >> 32)) 789 V26 = uint32(W6) 790 V36 = uint32((W6 >> 32)) 791 V27 = uint32(W7) 792 V37 = uint32((W7 >> 32)) 793 794 for r := uintptr(0); r < 8; r++ { 795 tws = V40 796 V40 |= V41 797 V42 ^= V43 798 V41 = ^V41 799 V40 ^= V43 800 V43 &= tws 801 V41 ^= V43 802 V43 ^= V42 803 V42 &= V40 804 V40 = ^V40 805 V42 ^= V41 806 V41 |= V43 807 tws ^= V41 808 V43 ^= V42 809 V42 &= V41 810 V41 ^= V40 811 V40 = tws 812 813 tws = V45 814 V45 |= V46 815 V47 ^= V44 816 V46 = ^V46 817 V45 ^= V44 818 V44 &= tws 819 V46 ^= V44 820 V44 ^= V47 821 V47 &= V45 822 V45 = ^V45 823 V47 ^= V46 824 V46 |= V44 825 tws ^= V46 826 V44 ^= V47 827 V47 &= V46 828 V46 ^= V45 829 V45 = tws 830 831 V44 ^= V40 832 V40 = ((V40 << 2) | (V40 >> (32 - 2))) ^ V44 833 V44 = ((V44 << 14) | (V44 >> (32 - 14))) ^ V40 834 V40 = ((V40 << 10) | (V40 >> (32 - 10))) ^ V44 835 V44 = ((V44 << 1) | (V44 >> (32 - 1))) 836 837 V45 ^= V41 838 V41 = ((V41 << 2) | (V41 >> (32 - 2))) ^ V45 839 V45 = ((V45 << 14) | (V45 >> (32 - 14))) ^ V41 840 V41 = ((V41 << 10) | (V41 >> (32 - 10))) ^ V45 841 V45 = ((V45 << 1) | (V45 >> (32 - 1))) 842 843 V46 ^= V42 844 V42 = ((V42 << 2) | (V42 >> (32 - 2))) ^ V46 845 V46 = ((V46 << 14) | (V46 >> (32 - 14))) ^ V42 846 V42 = ((V42 << 10) | (V42 >> (32 - 10))) ^ V46 847 V46 = ((V46 << 1) | (V46 >> (32 - 1))) 848 849 V47 ^= V43 850 V43 = ((V43 << 2) | (V43 >> (32 - 2))) ^ V47 851 V47 = ((V47 << 14) | (V47 >> (32 - 14))) ^ V43 852 V43 = ((V43 << 10) | (V43 >> (32 - 10))) ^ V47 853 V47 = ((V47 << 1) | (V47 >> (32 - 1))) 854 855 V40 ^= kRC40[r] 856 V44 ^= kRC44[r] 857 } 858 } 859 860 ptr = 0 861 } 862 } 863 864 ref.h[0][0] = V00 865 ref.h[0][1] = V01 866 ref.h[0][2] = V02 867 ref.h[0][3] = V03 868 ref.h[0][4] = V04 869 ref.h[0][5] = V05 870 ref.h[0][6] = V06 871 ref.h[0][7] = V07 872 ref.h[1][0] = V10 873 ref.h[1][1] = V11 874 ref.h[1][2] = V12 875 ref.h[1][3] = V13 876 ref.h[1][4] = V14 877 ref.h[1][5] = V15 878 ref.h[1][6] = V16 879 ref.h[1][7] = V17 880 ref.h[2][0] = V20 881 ref.h[2][1] = V21 882 ref.h[2][2] = V22 883 ref.h[2][3] = V23 884 ref.h[2][4] = V24 885 ref.h[2][5] = V25 886 ref.h[2][6] = V26 887 ref.h[2][7] = V27 888 ref.h[3][0] = V30 889 ref.h[3][1] = V31 890 ref.h[3][2] = V32 891 ref.h[3][3] = V33 892 ref.h[3][4] = V34 893 ref.h[3][5] = V35 894 ref.h[3][6] = V36 895 ref.h[3][7] = V37 896 ref.h[4][0] = V40 897 ref.h[4][1] = V41 898 ref.h[4][2] = V42 899 ref.h[4][3] = V43 900 ref.h[4][4] = V44 901 ref.h[4][5] = V45 902 ref.h[4][6] = V46 903 ref.h[4][7] = V47 904 905 ref.ptr = ptr 906 return fln, nil 907 } 908 909 // Close the digest by writing the last bits and storing the hash 910 // in dst. This prepares the digest for reuse by calling reset. A call 911 // to Close with a dst that is smaller then HashSize will return an error. 912 func (ref *digest) Close(dst []byte, bits uint8, bcnt uint8) error { 913 if ln := len(dst); HashSize > ln { 914 return fmt.Errorf("Luffa Close: dst min length: %d, got %d", HashSize, ln) 915 } 916 917 buf := ref.b[:] 918 ptr := ref.ptr + 1 919 920 { 921 off := uint8(0x80) >> bcnt 922 buf[ref.ptr] = uint8((bits & -off) | off) 923 } 924 925 memset(buf[ptr:], 0) 926 927 var V00, V01, V02, V03, V04, V05, V06, V07 uint32 928 var V10, V11, V12, V13, V14, V15, V16, V17 uint32 929 var V20, V21, V22, V23, V24, V25, V26, V27 uint32 930 var V30, V31, V32, V33, V34, V35, V36, V37 uint32 931 var V40, V41, V42, V43, V44, V45, V46, V47 uint32 932 933 V00 = ref.h[0][0] 934 V01 = ref.h[0][1] 935 V02 = ref.h[0][2] 936 V03 = ref.h[0][3] 937 V04 = ref.h[0][4] 938 V05 = ref.h[0][5] 939 V06 = ref.h[0][6] 940 V07 = ref.h[0][7] 941 V10 = ref.h[1][0] 942 V11 = ref.h[1][1] 943 V12 = ref.h[1][2] 944 V13 = ref.h[1][3] 945 V14 = ref.h[1][4] 946 V15 = ref.h[1][5] 947 V16 = ref.h[1][6] 948 V17 = ref.h[1][7] 949 V20 = ref.h[2][0] 950 V21 = ref.h[2][1] 951 V22 = ref.h[2][2] 952 V23 = ref.h[2][3] 953 V24 = ref.h[2][4] 954 V25 = ref.h[2][5] 955 V26 = ref.h[2][6] 956 V27 = ref.h[2][7] 957 V30 = ref.h[3][0] 958 V31 = ref.h[3][1] 959 V32 = ref.h[3][2] 960 V33 = ref.h[3][3] 961 V34 = ref.h[3][4] 962 V35 = ref.h[3][5] 963 V36 = ref.h[3][6] 964 V37 = ref.h[3][7] 965 V40 = ref.h[4][0] 966 V41 = ref.h[4][1] 967 V42 = ref.h[4][2] 968 V43 = ref.h[4][3] 969 V44 = ref.h[4][4] 970 V45 = ref.h[4][5] 971 V46 = ref.h[4][6] 972 V47 = ref.h[4][7] 973 974 for i := uintptr(0); i < 3; i++ { 975 { 976 var ts uint32 977 var M0, M1, M2, M3, M4, M5, M6, M7 uint32 978 var a0, a1, a2, a3, a4, a5, a6, a7 uint32 979 var b0, b1, b2, b3, b4, b5, b6, b7 uint32 980 981 M0 = decUInt32be(buf[0:]) 982 M1 = decUInt32be(buf[4:]) 983 M2 = decUInt32be(buf[8:]) 984 M3 = decUInt32be(buf[12:]) 985 M4 = decUInt32be(buf[16:]) 986 M5 = decUInt32be(buf[20:]) 987 M6 = decUInt32be(buf[24:]) 988 M7 = decUInt32be(buf[28:]) 989 990 a0 = V00 ^ V10 991 a1 = V01 ^ V11 992 a2 = V02 ^ V12 993 a3 = V03 ^ V13 994 a4 = V04 ^ V14 995 a5 = V05 ^ V15 996 a6 = V06 ^ V16 997 a7 = V07 ^ V17 998 999 b0 = V20 ^ V30 1000 b1 = V21 ^ V31 1001 b2 = V22 ^ V32 1002 b3 = V23 ^ V33 1003 b4 = V24 ^ V34 1004 b5 = V25 ^ V35 1005 b6 = V26 ^ V36 1006 b7 = V27 ^ V37 1007 1008 a0 ^= b0 1009 a1 ^= b1 1010 a2 ^= b2 1011 a3 ^= b3 1012 a4 ^= b4 1013 a5 ^= b5 1014 a6 ^= b6 1015 a7 ^= b7 1016 1017 a0 ^= V40 1018 a1 ^= V41 1019 a2 ^= V42 1020 a3 ^= V43 1021 a4 ^= V44 1022 a5 ^= V45 1023 a6 ^= V46 1024 a7 ^= V47 1025 1026 ts = a7 1027 a7 = a6 1028 a6 = a5 1029 a5 = a4 1030 a4 = a3 ^ ts 1031 a3 = a2 ^ ts 1032 a2 = a1 1033 a1 = a0 ^ ts 1034 a0 = ts 1035 1036 V00 ^= a0 1037 V01 ^= a1 1038 V02 ^= a2 1039 V03 ^= a3 1040 V04 ^= a4 1041 V05 ^= a5 1042 V06 ^= a6 1043 V07 ^= a7 1044 1045 V10 ^= a0 1046 V11 ^= a1 1047 V12 ^= a2 1048 V13 ^= a3 1049 V14 ^= a4 1050 V15 ^= a5 1051 V16 ^= a6 1052 V17 ^= a7 1053 1054 V20 ^= a0 1055 V21 ^= a1 1056 V22 ^= a2 1057 V23 ^= a3 1058 V24 ^= a4 1059 V25 ^= a5 1060 V26 ^= a6 1061 V27 ^= a7 1062 1063 V30 ^= a0 1064 V31 ^= a1 1065 V32 ^= a2 1066 V33 ^= a3 1067 V34 ^= a4 1068 V35 ^= a5 1069 V36 ^= a6 1070 V37 ^= a7 1071 1072 V40 ^= a0 1073 V41 ^= a1 1074 V42 ^= a2 1075 V43 ^= a3 1076 V44 ^= a4 1077 V45 ^= a5 1078 V46 ^= a6 1079 V47 ^= a7 1080 1081 ts = V07 1082 b7 = V06 1083 b6 = V05 1084 b5 = V04 1085 b4 = V03 ^ ts 1086 b3 = V02 ^ ts 1087 b2 = V01 1088 b1 = V00 ^ ts 1089 b0 = ts 1090 1091 b0 ^= V10 1092 b1 ^= V11 1093 b2 ^= V12 1094 b3 ^= V13 1095 b4 ^= V14 1096 b5 ^= V15 1097 b6 ^= V16 1098 b7 ^= V17 1099 1100 ts = V17 1101 V17 = V16 1102 V16 = V15 1103 V15 = V14 1104 V14 = V13 ^ ts 1105 V13 = V12 ^ ts 1106 V12 = V11 1107 V11 = V10 ^ ts 1108 V10 = ts 1109 1110 V10 ^= V20 1111 V11 ^= V21 1112 V12 ^= V22 1113 V13 ^= V23 1114 V14 ^= V24 1115 V15 ^= V25 1116 V16 ^= V26 1117 V17 ^= V27 1118 1119 ts = V27 1120 V27 = V26 1121 V26 = V25 1122 V25 = V24 1123 V24 = V23 ^ ts 1124 V23 = V22 ^ ts 1125 V22 = V21 1126 V21 = V20 ^ ts 1127 V20 = ts 1128 1129 V20 ^= V30 1130 V21 ^= V31 1131 V22 ^= V32 1132 V23 ^= V33 1133 V24 ^= V34 1134 V25 ^= V35 1135 V26 ^= V36 1136 V27 ^= V37 1137 1138 ts = V37 1139 V37 = V36 1140 V36 = V35 1141 V35 = V34 1142 V34 = V33 ^ ts 1143 V33 = V32 ^ ts 1144 V32 = V31 1145 V31 = V30 ^ ts 1146 V30 = ts 1147 1148 V30 ^= V40 1149 V31 ^= V41 1150 V32 ^= V42 1151 V33 ^= V43 1152 V34 ^= V44 1153 V35 ^= V45 1154 V36 ^= V46 1155 V37 ^= V47 1156 1157 ts = V47 1158 V47 = V46 1159 V46 = V45 1160 V45 = V44 1161 V44 = V43 ^ ts 1162 V43 = V42 ^ ts 1163 V42 = V41 1164 V41 = V40 ^ ts 1165 V40 = ts 1166 1167 V40 ^= V00 1168 V41 ^= V01 1169 V42 ^= V02 1170 V43 ^= V03 1171 V44 ^= V04 1172 V45 ^= V05 1173 V46 ^= V06 1174 V47 ^= V07 1175 1176 ts = b7 1177 V07 = b6 1178 V06 = b5 1179 V05 = b4 1180 V04 = b3 ^ ts 1181 V03 = b2 ^ ts 1182 V02 = b1 1183 V01 = b0 ^ ts 1184 V00 = ts 1185 1186 V00 ^= V40 1187 V01 ^= V41 1188 V02 ^= V42 1189 V03 ^= V43 1190 V04 ^= V44 1191 V05 ^= V45 1192 V06 ^= V46 1193 V07 ^= V47 1194 1195 ts = V47 1196 V47 = V46 1197 V46 = V45 1198 V45 = V44 1199 V44 = V43 ^ ts 1200 V43 = V42 ^ ts 1201 V42 = V41 1202 V41 = V40 ^ ts 1203 V40 = ts 1204 1205 V40 ^= V30 1206 V41 ^= V31 1207 V42 ^= V32 1208 V43 ^= V33 1209 V44 ^= V34 1210 V45 ^= V35 1211 V46 ^= V36 1212 V47 ^= V37 1213 1214 ts = V37 1215 V37 = V36 1216 V36 = V35 1217 V35 = V34 1218 V34 = V33 ^ ts 1219 V33 = V32 ^ ts 1220 V32 = V31 1221 V31 = V30 ^ ts 1222 V30 = ts 1223 1224 V30 ^= V20 1225 V31 ^= V21 1226 V32 ^= V22 1227 V33 ^= V23 1228 V34 ^= V24 1229 V35 ^= V25 1230 V36 ^= V26 1231 V37 ^= V27 1232 1233 ts = V27 1234 V27 = V26 1235 V26 = V25 1236 V25 = V24 1237 V24 = V23 ^ ts 1238 V23 = V22 ^ ts 1239 V22 = V21 1240 V21 = V20 ^ ts 1241 V20 = ts 1242 1243 V20 ^= V10 1244 V21 ^= V11 1245 V22 ^= V12 1246 V23 ^= V13 1247 V24 ^= V14 1248 V25 ^= V15 1249 V26 ^= V16 1250 V27 ^= V17 1251 1252 ts = V17 1253 V17 = V16 1254 V16 = V15 1255 V15 = V14 1256 V14 = V13 ^ ts 1257 V13 = V12 ^ ts 1258 V12 = V11 1259 V11 = V10 ^ ts 1260 V10 = ts 1261 1262 V10 ^= b0 1263 V11 ^= b1 1264 V12 ^= b2 1265 V13 ^= b3 1266 V14 ^= b4 1267 V15 ^= b5 1268 V16 ^= b6 1269 V17 ^= b7 1270 1271 V00 ^= M0 1272 V01 ^= M1 1273 V02 ^= M2 1274 V03 ^= M3 1275 V04 ^= M4 1276 V05 ^= M5 1277 V06 ^= M6 1278 V07 ^= M7 1279 1280 ts = M7 1281 M7 = M6 1282 M6 = M5 1283 M5 = M4 1284 M4 = M3 ^ ts 1285 M3 = M2 ^ ts 1286 M2 = M1 1287 M1 = M0 ^ ts 1288 M0 = ts 1289 1290 V10 ^= M0 1291 V11 ^= M1 1292 V12 ^= M2 1293 V13 ^= M3 1294 V14 ^= M4 1295 V15 ^= M5 1296 V16 ^= M6 1297 V17 ^= M7 1298 1299 ts = M7 1300 M7 = M6 1301 M6 = M5 1302 M5 = M4 1303 M4 = M3 ^ ts 1304 M3 = M2 ^ ts 1305 M2 = M1 1306 M1 = M0 ^ ts 1307 M0 = ts 1308 1309 V20 ^= M0 1310 V21 ^= M1 1311 V22 ^= M2 1312 V23 ^= M3 1313 V24 ^= M4 1314 V25 ^= M5 1315 V26 ^= M6 1316 V27 ^= M7 1317 1318 ts = M7 1319 M7 = M6 1320 M6 = M5 1321 M5 = M4 1322 M4 = M3 ^ ts 1323 M3 = M2 ^ ts 1324 M2 = M1 1325 M1 = M0 ^ ts 1326 M0 = ts 1327 1328 V30 ^= M0 1329 V31 ^= M1 1330 V32 ^= M2 1331 V33 ^= M3 1332 V34 ^= M4 1333 V35 ^= M5 1334 V36 ^= M6 1335 V37 ^= M7 1336 1337 ts = M7 1338 M7 = M6 1339 M6 = M5 1340 M5 = M4 1341 M4 = M3 ^ ts 1342 M3 = M2 ^ ts 1343 M2 = M1 1344 M1 = M0 ^ ts 1345 M0 = ts 1346 1347 V40 ^= M0 1348 V41 ^= M1 1349 V42 ^= M2 1350 V43 ^= M3 1351 V44 ^= M4 1352 V45 ^= M5 1353 V46 ^= M6 1354 V47 ^= M7 1355 } 1356 1357 { 1358 var ul, uh, vl, vh, tws uint32 1359 var W0, W1, W2, W3, W4, W5, W6, W7, tw uint64 1360 1361 V14 = ((V14 << 1) | (V14 >> (32 - 1))) 1362 V15 = ((V15 << 1) | (V15 >> (32 - 1))) 1363 V16 = ((V16 << 1) | (V16 >> (32 - 1))) 1364 V17 = ((V17 << 1) | (V17 >> (32 - 1))) 1365 V24 = ((V24 << 2) | (V24 >> (32 - 2))) 1366 V25 = ((V25 << 2) | (V25 >> (32 - 2))) 1367 V26 = ((V26 << 2) | (V26 >> (32 - 2))) 1368 V27 = ((V27 << 2) | (V27 >> (32 - 2))) 1369 V34 = ((V34 << 3) | (V34 >> (32 - 3))) 1370 V35 = ((V35 << 3) | (V35 >> (32 - 3))) 1371 V36 = ((V36 << 3) | (V36 >> (32 - 3))) 1372 V37 = ((V37 << 3) | (V37 >> (32 - 3))) 1373 V44 = ((V44 << 4) | (V44 >> (32 - 4))) 1374 V45 = ((V45 << 4) | (V45 >> (32 - 4))) 1375 V46 = ((V46 << 4) | (V46 >> (32 - 4))) 1376 V47 = ((V47 << 4) | (V47 >> (32 - 4))) 1377 1378 W0 = uint64(V00) | (uint64(V10) << 32) 1379 W1 = uint64(V01) | (uint64(V11) << 32) 1380 W2 = uint64(V02) | (uint64(V12) << 32) 1381 W3 = uint64(V03) | (uint64(V13) << 32) 1382 W4 = uint64(V04) | (uint64(V14) << 32) 1383 W5 = uint64(V05) | (uint64(V15) << 32) 1384 W6 = uint64(V06) | (uint64(V16) << 32) 1385 W7 = uint64(V07) | (uint64(V17) << 32) 1386 1387 for r := uintptr(0); r < 8; r++ { 1388 tw = W0 1389 W0 |= W1 1390 W2 ^= W3 1391 W1 = ^W1 1392 W0 ^= W3 1393 W3 &= tw 1394 W1 ^= W3 1395 W3 ^= W2 1396 W2 &= W0 1397 W0 = ^W0 1398 W2 ^= W1 1399 W1 |= W3 1400 tw ^= W1 1401 W3 ^= W2 1402 W2 &= W1 1403 W1 ^= W0 1404 W0 = tw 1405 1406 tw = W5 1407 W5 |= W6 1408 W7 ^= W4 1409 W6 = ^W6 1410 W5 ^= W4 1411 W4 &= tw 1412 W6 ^= W4 1413 W4 ^= W7 1414 W7 &= W5 1415 W5 = ^W5 1416 W7 ^= W6 1417 W6 |= W4 1418 tw ^= W6 1419 W4 ^= W7 1420 W7 &= W6 1421 W6 ^= W5 1422 W5 = tw 1423 1424 W4 ^= W0 1425 ul = uint32(W0) 1426 uh = uint32((W0 >> 32)) 1427 vl = uint32(W4) 1428 vh = uint32((W4 >> 32)) 1429 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 1430 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 1431 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 1432 vl = ((vl << 1) | (vl >> (32 - 1))) 1433 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 1434 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 1435 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 1436 vh = ((vh << 1) | (vh >> (32 - 1))) 1437 W0 = uint64(ul) | (uint64(uh) << 32) 1438 W4 = uint64(vl) | (uint64(vh) << 32) 1439 1440 W5 ^= W1 1441 ul = uint32(W1) 1442 uh = uint32((W1 >> 32)) 1443 vl = uint32(W5) 1444 vh = uint32((W5 >> 32)) 1445 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 1446 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 1447 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 1448 vl = ((vl << 1) | (vl >> (32 - 1))) 1449 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 1450 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 1451 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 1452 vh = ((vh << 1) | (vh >> (32 - 1))) 1453 W1 = uint64(ul) | (uint64(uh) << 32) 1454 W5 = uint64(vl) | (uint64(vh) << 32) 1455 1456 W6 ^= W2 1457 ul = uint32(W2) 1458 uh = uint32((W2 >> 32)) 1459 vl = uint32(W6) 1460 vh = uint32((W6 >> 32)) 1461 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 1462 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 1463 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 1464 vl = ((vl << 1) | (vl >> (32 - 1))) 1465 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 1466 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 1467 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 1468 vh = ((vh << 1) | (vh >> (32 - 1))) 1469 W2 = uint64(ul) | (uint64(uh) << 32) 1470 W6 = uint64(vl) | (uint64(vh) << 32) 1471 1472 W7 ^= W3 1473 ul = uint32(W3) 1474 uh = uint32((W3 >> 32)) 1475 vl = uint32(W7) 1476 vh = uint32((W7 >> 32)) 1477 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 1478 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 1479 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 1480 vl = ((vl << 1) | (vl >> (32 - 1))) 1481 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 1482 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 1483 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 1484 vh = ((vh << 1) | (vh >> (32 - 1))) 1485 W3 = uint64(ul) | (uint64(uh) << 32) 1486 W7 = uint64(vl) | (uint64(vh) << 32) 1487 1488 W0 ^= kRCW010[r] 1489 W4 ^= kRCW014[r] 1490 } 1491 1492 V00 = uint32(W0) 1493 V10 = uint32((W0 >> 32)) 1494 V01 = uint32(W1) 1495 V11 = uint32((W1 >> 32)) 1496 V02 = uint32(W2) 1497 V12 = uint32((W2 >> 32)) 1498 V03 = uint32(W3) 1499 V13 = uint32((W3 >> 32)) 1500 V04 = uint32(W4) 1501 V14 = uint32((W4 >> 32)) 1502 V05 = uint32(W5) 1503 V15 = uint32((W5 >> 32)) 1504 V06 = uint32(W6) 1505 V16 = uint32((W6 >> 32)) 1506 V07 = uint32(W7) 1507 V17 = uint32((W7 >> 32)) 1508 1509 W0 = uint64(V20) | (uint64(V30) << 32) 1510 W1 = uint64(V21) | (uint64(V31) << 32) 1511 W2 = uint64(V22) | (uint64(V32) << 32) 1512 W3 = uint64(V23) | (uint64(V33) << 32) 1513 W4 = uint64(V24) | (uint64(V34) << 32) 1514 W5 = uint64(V25) | (uint64(V35) << 32) 1515 W6 = uint64(V26) | (uint64(V36) << 32) 1516 W7 = uint64(V27) | (uint64(V37) << 32) 1517 1518 for r := uintptr(0); r < 8; r++ { 1519 tw = W0 1520 W0 |= W1 1521 W2 ^= W3 1522 W1 = ^W1 1523 W0 ^= W3 1524 W3 &= tw 1525 W1 ^= W3 1526 W3 ^= W2 1527 W2 &= W0 1528 W0 = ^W0 1529 W2 ^= W1 1530 W1 |= W3 1531 tw ^= W1 1532 W3 ^= W2 1533 W2 &= W1 1534 W1 ^= W0 1535 W0 = tw 1536 1537 tw = W5 1538 W5 |= W6 1539 W7 ^= W4 1540 W6 = ^W6 1541 W5 ^= W4 1542 W4 &= tw 1543 W6 ^= W4 1544 W4 ^= W7 1545 W7 &= W5 1546 W5 = ^W5 1547 W7 ^= W6 1548 W6 |= W4 1549 tw ^= W6 1550 W4 ^= W7 1551 W7 &= W6 1552 W6 ^= W5 1553 W5 = tw 1554 1555 W4 ^= W0 1556 ul = uint32(W0) 1557 uh = uint32((W0 >> 32)) 1558 vl = uint32(W4) 1559 vh = uint32((W4 >> 32)) 1560 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 1561 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 1562 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 1563 vl = ((vl << 1) | (vl >> (32 - 1))) 1564 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 1565 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 1566 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 1567 vh = ((vh << 1) | (vh >> (32 - 1))) 1568 W0 = uint64(ul) | (uint64(uh) << 32) 1569 W4 = uint64(vl) | (uint64(vh) << 32) 1570 1571 W5 ^= W1 1572 ul = uint32(W1) 1573 uh = uint32((W1 >> 32)) 1574 vl = uint32(W5) 1575 vh = uint32((W5 >> 32)) 1576 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 1577 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 1578 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 1579 vl = ((vl << 1) | (vl >> (32 - 1))) 1580 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 1581 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 1582 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 1583 vh = ((vh << 1) | (vh >> (32 - 1))) 1584 W1 = uint64(ul) | (uint64(uh) << 32) 1585 W5 = uint64(vl) | (uint64(vh) << 32) 1586 1587 W6 ^= W2 1588 ul = uint32(W2) 1589 uh = uint32((W2 >> 32)) 1590 vl = uint32(W6) 1591 vh = uint32((W6 >> 32)) 1592 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 1593 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 1594 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 1595 vl = ((vl << 1) | (vl >> (32 - 1))) 1596 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 1597 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 1598 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 1599 vh = ((vh << 1) | (vh >> (32 - 1))) 1600 W2 = uint64(ul) | (uint64(uh) << 32) 1601 W6 = uint64(vl) | (uint64(vh) << 32) 1602 1603 W7 ^= W3 1604 ul = uint32(W3) 1605 uh = uint32((W3 >> 32)) 1606 vl = uint32(W7) 1607 vh = uint32((W7 >> 32)) 1608 ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl 1609 vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul 1610 ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl 1611 vl = ((vl << 1) | (vl >> (32 - 1))) 1612 uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh 1613 vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh 1614 uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh 1615 vh = ((vh << 1) | (vh >> (32 - 1))) 1616 W3 = uint64(ul) | (uint64(uh) << 32) 1617 W7 = uint64(vl) | (uint64(vh) << 32) 1618 1619 W0 ^= kRCW230[r] 1620 W4 ^= kRCW234[r] 1621 } 1622 1623 V20 = uint32(W0) 1624 V30 = uint32((W0 >> 32)) 1625 V21 = uint32(W1) 1626 V31 = uint32((W1 >> 32)) 1627 V22 = uint32(W2) 1628 V32 = uint32((W2 >> 32)) 1629 V23 = uint32(W3) 1630 V33 = uint32((W3 >> 32)) 1631 V24 = uint32(W4) 1632 V34 = uint32((W4 >> 32)) 1633 V25 = uint32(W5) 1634 V35 = uint32((W5 >> 32)) 1635 V26 = uint32(W6) 1636 V36 = uint32((W6 >> 32)) 1637 V27 = uint32(W7) 1638 V37 = uint32((W7 >> 32)) 1639 1640 for r := uintptr(0); r < 8; r++ { 1641 tws = V40 1642 V40 |= V41 1643 V42 ^= V43 1644 V41 = ^V41 1645 V40 ^= V43 1646 V43 &= tws 1647 V41 ^= V43 1648 V43 ^= V42 1649 V42 &= V40 1650 V40 = ^V40 1651 V42 ^= V41 1652 V41 |= V43 1653 tws ^= V41 1654 V43 ^= V42 1655 V42 &= V41 1656 V41 ^= V40 1657 V40 = tws 1658 1659 tws = V45 1660 V45 |= V46 1661 V47 ^= V44 1662 V46 = ^V46 1663 V45 ^= V44 1664 V44 &= tws 1665 V46 ^= V44 1666 V44 ^= V47 1667 V47 &= V45 1668 V45 = ^V45 1669 V47 ^= V46 1670 V46 |= V44 1671 tws ^= V46 1672 V44 ^= V47 1673 V47 &= V46 1674 V46 ^= V45 1675 V45 = tws 1676 1677 V44 ^= V40 1678 V40 = ((V40 << 2) | (V40 >> (32 - 2))) ^ V44 1679 V44 = ((V44 << 14) | (V44 >> (32 - 14))) ^ V40 1680 V40 = ((V40 << 10) | (V40 >> (32 - 10))) ^ V44 1681 V44 = ((V44 << 1) | (V44 >> (32 - 1))) 1682 1683 V45 ^= V41 1684 V41 = ((V41 << 2) | (V41 >> (32 - 2))) ^ V45 1685 V45 = ((V45 << 14) | (V45 >> (32 - 14))) ^ V41 1686 V41 = ((V41 << 10) | (V41 >> (32 - 10))) ^ V45 1687 V45 = ((V45 << 1) | (V45 >> (32 - 1))) 1688 1689 V46 ^= V42 1690 V42 = ((V42 << 2) | (V42 >> (32 - 2))) ^ V46 1691 V46 = ((V46 << 14) | (V46 >> (32 - 14))) ^ V42 1692 V42 = ((V42 << 10) | (V42 >> (32 - 10))) ^ V46 1693 V46 = ((V46 << 1) | (V46 >> (32 - 1))) 1694 1695 V47 ^= V43 1696 V43 = ((V43 << 2) | (V43 >> (32 - 2))) ^ V47 1697 V47 = ((V47 << 14) | (V47 >> (32 - 14))) ^ V43 1698 V43 = ((V43 << 10) | (V43 >> (32 - 10))) ^ V47 1699 V47 = ((V47 << 1) | (V47 >> (32 - 1))) 1700 1701 V40 ^= kRC40[r] 1702 V44 ^= kRC44[r] 1703 } 1704 } 1705 1706 switch i { 1707 case 0: 1708 memset(buf[:], 0) 1709 break 1710 case 1: 1711 encUInt32be(dst[0:], V00^V10^V20^V30^V40) 1712 encUInt32be(dst[4:], V01^V11^V21^V31^V41) 1713 encUInt32be(dst[8:], V02^V12^V22^V32^V42) 1714 encUInt32be(dst[12:], V03^V13^V23^V33^V43) 1715 encUInt32be(dst[16:], V04^V14^V24^V34^V44) 1716 encUInt32be(dst[20:], V05^V15^V25^V35^V45) 1717 encUInt32be(dst[24:], V06^V16^V26^V36^V46) 1718 encUInt32be(dst[28:], V07^V17^V27^V37^V47) 1719 break 1720 case 2: 1721 encUInt32be(dst[32:], V00^V10^V20^V30^V40) 1722 encUInt32be(dst[36:], V01^V11^V21^V31^V41) 1723 encUInt32be(dst[40:], V02^V12^V22^V32^V42) 1724 encUInt32be(dst[44:], V03^V13^V23^V33^V43) 1725 encUInt32be(dst[48:], V04^V14^V24^V34^V44) 1726 encUInt32be(dst[52:], V05^V15^V25^V35^V45) 1727 encUInt32be(dst[56:], V06^V16^V26^V36^V46) 1728 encUInt32be(dst[60:], V07^V17^V27^V37^V47) 1729 break 1730 } 1731 } 1732 1733 ref.Reset() 1734 return nil 1735 } 1736 1737 // Size returns the number of bytes required to store the hash. 1738 func (*digest) Size() int { 1739 return HashSize 1740 } 1741 1742 // BlockSize returns the block size of the hash. 1743 func (*digest) BlockSize() int { 1744 return int(BlockSize) 1745 } 1746 1747 //////////////// 1748 1749 func memset(dst []byte, src byte) { 1750 for i := range dst { 1751 dst[i] = src 1752 } 1753 } 1754 1755 func decUInt32be(src []byte) uint32 { 1756 return (uint32(src[0])<<24 | 1757 uint32(src[1])<<16 | 1758 uint32(src[2])<<8 | 1759 uint32(src[3])) 1760 } 1761 1762 func encUInt32be(dst []byte, src uint32) { 1763 dst[0] = uint8(src >> 24) 1764 dst[1] = uint8(src >> 16) 1765 dst[2] = uint8(src >> 8) 1766 dst[3] = uint8(src) 1767 } 1768 1769 //////////////// 1770 1771 var kInit = [5][8]uint32{ 1772 { 1773 uint32(0x6d251e69), uint32(0x44b051e0), 1774 uint32(0x4eaa6fb4), uint32(0xdbf78465), 1775 uint32(0x6e292011), uint32(0x90152df4), 1776 uint32(0xee058139), uint32(0xdef610bb), 1777 }, 1778 { 1779 uint32(0xc3b44b95), uint32(0xd9d2f256), 1780 uint32(0x70eee9a0), uint32(0xde099fa3), 1781 uint32(0x5d9b0557), uint32(0x8fc944b3), 1782 uint32(0xcf1ccf0e), uint32(0x746cd581), 1783 }, 1784 { 1785 uint32(0xf7efc89d), uint32(0x5dba5781), 1786 uint32(0x04016ce5), uint32(0xad659c05), 1787 uint32(0x0306194f), uint32(0x666d1836), 1788 uint32(0x24aa230a), uint32(0x8b264ae7), 1789 }, 1790 { 1791 uint32(0x858075d5), uint32(0x36d79cce), 1792 uint32(0xe571f7d7), uint32(0x204b1f67), 1793 uint32(0x35870c6a), uint32(0x57e9e923), 1794 uint32(0x14bcb808), uint32(0x7cde72ce), 1795 }, 1796 { 1797 uint32(0x6c68e9be), uint32(0x5ec41e22), 1798 uint32(0xc825b7c7), uint32(0xaffb4363), 1799 uint32(0xf5df3999), uint32(0x0fc688f1), 1800 uint32(0xb07224cc), uint32(0x03e86cea), 1801 }, 1802 } 1803 1804 var kRC40 = [8]uint32{ 1805 uint32(0xf0d2e9e3), uint32(0xac11d7fa), 1806 uint32(0x1bcb66f2), uint32(0x6f2d9bc9), 1807 uint32(0x78602649), uint32(0x8edae952), 1808 uint32(0x3b6ba548), uint32(0xedae9520), 1809 } 1810 var kRC44 = [8]uint32{ 1811 uint32(0x5090d577), uint32(0x2d1925ab), 1812 uint32(0xb46496ac), uint32(0xd1925ab0), 1813 uint32(0x29131ab6), uint32(0x0fc053c3), 1814 uint32(0x3f014f0c), uint32(0xfc053c31), 1815 } 1816 1817 var kRCW010 = [8]uint64{ 1818 uint64(0xb6de10ed303994a6), uint64(0x70f47aaec0e65299), 1819 uint64(0x0707a3d46cc33a12), uint64(0x1c1e8f51dc56983e), 1820 uint64(0x707a3d451e00108f), uint64(0xaeb285627800423d), 1821 uint64(0xbaca15898f5b7882), uint64(0x40a46f3e96e1db12), 1822 } 1823 var kRCW014 = [8]uint64{ 1824 uint64(0x01685f3de0337818), uint64(0x05a17cf4441ba90d), 1825 uint64(0xbd09caca7f34d442), uint64(0xf4272b289389217f), 1826 uint64(0x144ae5cce5a8bce6), uint64(0xfaa7ae2b5274baf4), 1827 uint64(0x2e48f1c126889ba7), uint64(0xb923c7049a226e9d), 1828 } 1829 var kRCW230 = [8]uint64{ 1830 uint64(0xb213afa5fc20d9d2), uint64(0xc84ebe9534552e25), 1831 uint64(0x4e608a227ad8818f), uint64(0x56d858fe8438764a), 1832 uint64(0x343b138fbb6de032), uint64(0xd0ec4e3dedb780c8), 1833 uint64(0x2ceb4882d9847356), uint64(0xb3ad2208a2c78434), 1834 } 1835 var kRCW234 = [8]uint64{ 1836 uint64(0xe028c9bfe25e72c1), uint64(0x44756f91e623bb72), 1837 uint64(0x7e8fce325c58a4a4), uint64(0x956548be1e38e2e7), 1838 uint64(0xfe191be278e38b9d), uint64(0x3cb226e527586719), 1839 uint64(0x5944a28e36eda57f), uint64(0xa1c4c355703aace7), 1840 }