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  }