github.com/waltonchain/waltonchain_gwtc_src@v1.1.4-0.20201225072101-8a298c95a819/crypto/x11/groest/groest.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 groest
     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 = uintptr(64)
    14  
    15  // BlockSize holds the size of a block in bytes.
    16  const BlockSize = uintptr(128)
    17  
    18  ////////////////
    19  
    20  type digest struct {
    21  	ptr uintptr
    22  	cnt uint64
    23  
    24  	h [16]uint64
    25  
    26  	b [BlockSize]byte
    27  }
    28  
    29  // New returns a new digest compute a GROESTL512 hash.
    30  func New() hash.Digest {
    31  	ref := &digest{}
    32  	ref.Reset()
    33  	return ref
    34  }
    35  
    36  ////////////////
    37  
    38  // Reset resets the digest to its initial state.
    39  func (ref *digest) Reset() {
    40  	ref.ptr = 0
    41  	ref.cnt = 0
    42  
    43  	for u := uintptr(0); u < 15; u++ {
    44  		ref.h[u] = 0
    45  	}
    46  	ref.h[15] = ((uint64(512&0xFF) << 56) | (uint64(512&0xFF00) << 40))
    47  }
    48  
    49  // Sum appends the current hash to dst and returns the result
    50  // as a slice. It does not change the underlying hash state.
    51  func (ref *digest) Sum(dst []byte) []byte {
    52  	dgt := *ref
    53  	hsh := [64]byte{}
    54  	dgt.Close(hsh[:], 0, 0)
    55  	return append(dst, hsh[:]...)
    56  }
    57  
    58  // Write more data to the running hash, never returns an error.
    59  func (ref *digest) Write(src []byte) (int, error) {
    60  	sln := uintptr(len(src))
    61  	fln := len(src)
    62  	ptr := ref.ptr
    63  
    64  	if sln < (BlockSize - ptr) {
    65  		copy(ref.b[ptr:], src)
    66  		ref.ptr += sln
    67  		return int(sln), nil
    68  	}
    69  
    70  	h := ref.h[:]
    71  	b := ref.b[:]
    72  
    73  	for sln > 0 {
    74  		cln := BlockSize - ptr
    75  
    76  		if cln > sln {
    77  			cln = sln
    78  		}
    79  		sln -= cln
    80  
    81  		copy(b[ptr:], src[:cln])
    82  		src = src[cln:]
    83  		ptr += cln
    84  
    85  		if ptr == BlockSize {
    86  			var g, m [16]uint64
    87  
    88  			for u := uint64(0); u < 16; u++ {
    89  				m[u] = decUInt64le(b[(u << 3):])
    90  				g[u] = m[u] ^ h[u]
    91  			}
    92  
    93  			gs := g[:]
    94  			for r := uint64(0); r < 14; r += 2 {
    95  				gRounds(r+0, gs)
    96  				gRounds(r+1, gs)
    97  			}
    98  
    99  			ms := m[:]
   100  			for r := uint64(0); r < 14; r += 2 {
   101  				mRounds(r+0, ms)
   102  				mRounds(r+1, ms)
   103  			}
   104  
   105  			for u := uint64(0); u < 16; u++ {
   106  				h[u] ^= g[u] ^ m[u]
   107  			}
   108  
   109  			ref.cnt++
   110  			ptr = 0
   111  		}
   112  	}
   113  
   114  	ref.ptr = ptr
   115  	return fln, nil
   116  }
   117  
   118  // Close the digest by writing the last bits and storing the hash
   119  // in dst. This prepares the digest for reuse by calling reset. A call
   120  // to Close with a dst that is smaller then HashSize will return an error.
   121  func (ref *digest) Close(dst []byte, bits uint8, bcnt uint8) error {
   122  	if ln := len(dst); HashSize > uintptr(ln) {
   123  		return fmt.Errorf("Groest Close: dst min length: %d, got %d", HashSize, ln)
   124  	}
   125  
   126  	ptr := ref.ptr
   127  	cnt := uint64(0)
   128  
   129  	pln := uintptr(0)
   130  	pad := [136]uint8{}
   131  
   132  	{
   133  		off := uint8(0x80) >> bcnt
   134  		pad[0] = uint8((bits & -off) | off)
   135  	}
   136  
   137  	if ptr < 120 {
   138  		pln = 128 - ptr
   139  		cnt = ref.cnt + 1
   140  	} else {
   141  		pln = 256 - ptr
   142  		cnt = ref.cnt + 2
   143  	}
   144  
   145  	encUInt64be(pad[(pln-8):], cnt)
   146  	ref.Write(pad[:pln])
   147  
   148  	h := ref.h[:]
   149  	g := [16]uint64{}
   150  
   151  	gs := g[:]
   152  	copy(gs, h[:])
   153  
   154  	for r := uint64(0); r < 14; r += 2 {
   155  		gRounds(r+0, gs)
   156  		gRounds(r+1, gs)
   157  	}
   158  
   159  	for u := uintptr(0); u < 16; u++ {
   160  		h[u] ^= g[u]
   161  	}
   162  
   163  	for u := uintptr(0); u < 8; u++ {
   164  		encUInt64le(pad[(u<<3):], h[u+8])
   165  	}
   166  
   167  	copy(dst[:], pad[:])
   168  
   169  	ref.Reset()
   170  	return nil
   171  }
   172  
   173  // Size returns the number of bytes required to store the hash.
   174  func (*digest) Size() int {
   175  	return int(HashSize)
   176  }
   177  
   178  // BlockSize returns the block size of the hash.
   179  func (*digest) BlockSize() int {
   180  	return int(BlockSize)
   181  }
   182  
   183  ////////////////
   184  
   185  func decUInt64le(src []byte) uint64 {
   186  	return (uint64(src[0]) |
   187  		uint64(src[1])<<8 |
   188  		uint64(src[2])<<16 |
   189  		uint64(src[3])<<24 |
   190  		uint64(src[4])<<32 |
   191  		uint64(src[5])<<40 |
   192  		uint64(src[6])<<48 |
   193  		uint64(src[7])<<56)
   194  }
   195  
   196  func encUInt64le(dst []byte, src uint64) {
   197  	dst[0] = uint8(src)
   198  	dst[1] = uint8(src >> 8)
   199  	dst[2] = uint8(src >> 16)
   200  	dst[3] = uint8(src >> 24)
   201  	dst[4] = uint8(src >> 32)
   202  	dst[5] = uint8(src >> 40)
   203  	dst[6] = uint8(src >> 48)
   204  	dst[7] = uint8(src >> 56)
   205  }
   206  
   207  func encUInt64be(dst []byte, src uint64) {
   208  	dst[0] = uint8(src >> 56)
   209  	dst[1] = uint8(src >> 48)
   210  	dst[2] = uint8(src >> 40)
   211  	dst[3] = uint8(src >> 32)
   212  	dst[4] = uint8(src >> 24)
   213  	dst[5] = uint8(src >> 16)
   214  	dst[6] = uint8(src >> 8)
   215  	dst[7] = uint8(src)
   216  }
   217  
   218  func gRounds(r uint64, g []uint64) {
   219  	g[0x0] ^= (r + uint64(0x00))
   220  	g[0x1] ^= (r + uint64(0x10))
   221  	g[0x2] ^= (r + uint64(0x20))
   222  	g[0x3] ^= (r + uint64(0x30))
   223  	g[0x4] ^= (r + uint64(0x40))
   224  	g[0x5] ^= (r + uint64(0x50))
   225  	g[0x6] ^= (r + uint64(0x60))
   226  	g[0x7] ^= (r + uint64(0x70))
   227  	g[0x8] ^= (r + uint64(0x80))
   228  	g[0x9] ^= (r + uint64(0x90))
   229  	g[0xA] ^= (r + uint64(0xA0))
   230  	g[0xB] ^= (r + uint64(0xB0))
   231  	g[0xC] ^= (r + uint64(0xC0))
   232  	g[0xD] ^= (r + uint64(0xD0))
   233  	g[0xE] ^= (r + uint64(0xE0))
   234  	g[0xF] ^= (r + uint64(0xF0))
   235  
   236  	var t [16]uint64
   237  	var tp, ix uint64
   238  
   239  	for u := uint64(0); u < 16; u += 4 {
   240  		t[u] = kTab0[((g[(u+0)&0xF]) & 0xFF)]
   241  		tp = kTab0[(((g[(u+1)&0xF]) >> 8) & 0xFF)]
   242  		t[u] ^= (tp << 8) | (tp >> (64 - 8))
   243  		tp = kTab0[(((g[(u+2)&0xF]) >> 16) & 0xFF)]
   244  		t[u] ^= (tp << 16) | (tp >> (64 - 16))
   245  		tp = kTab0[(((g[(u+3)&0xF]) >> 24) & 0xFF)]
   246  		t[u] ^= (tp << 24) | (tp >> (64 - 24))
   247  		t[u] ^= kTab4[(((g[(u+4)&0xF]) >> 32) & 0xFF)]
   248  		tp = kTab4[(((g[(u+5)&0xF]) >> 40) & 0xFF)]
   249  		t[u] ^= (tp << 8) | (tp >> (64 - 8))
   250  		tp = kTab4[(((g[(u+6)&0xF]) >> 48) & 0xFF)]
   251  		t[u] ^= (tp << 16) | (tp >> (64 - 16))
   252  		tp = kTab4[(((g[(u+11)&0xF]) >> 56) & 0xFF)]
   253  		t[u] ^= (tp << 24) | (tp >> (64 - 24))
   254  
   255  		ix = u + 1
   256  		t[ix] = kTab0[((g[(u+1)&0xF]) & 0xFF)]
   257  		tp = kTab0[(((g[(u+2)&0xF]) >> 8) & 0xFF)]
   258  		t[ix] ^= (tp << 8) | (tp >> (64 - 8))
   259  		tp = kTab0[(((g[(u+3)&0xF]) >> 16) & 0xFF)]
   260  		t[ix] ^= (tp << 16) | (tp >> (64 - 16))
   261  		tp = kTab0[(((g[(u+4)&0xF]) >> 24) & 0xFF)]
   262  		t[ix] ^= (tp << 24) | (tp >> (64 - 24))
   263  		t[ix] ^= kTab4[(((g[(u+5)&0xF]) >> 32) & 0xFF)]
   264  		tp = kTab4[(((g[(u+6)&0xF]) >> 40) & 0xFF)]
   265  		t[ix] ^= (tp << 8) | (tp >> (64 - 8))
   266  		tp = kTab4[(((g[(u+7)&0xF]) >> 48) & 0xFF)]
   267  		t[ix] ^= (tp << 16) | (tp >> (64 - 16))
   268  		tp = kTab4[(((g[(u+12)&0xF]) >> 56) & 0xFF)]
   269  		t[ix] ^= (tp << 24) | (tp >> (64 - 24))
   270  
   271  		ix = u + 2
   272  		t[ix] = kTab0[((g[(u+2)&0xF]) & 0xFF)]
   273  		tp = kTab0[(((g[(u+3)&0xF]) >> 8) & 0xFF)]
   274  		t[ix] ^= (tp << 8) | (tp >> (64 - 8))
   275  		tp = kTab0[(((g[(u+4)&0xF]) >> 16) & 0xFF)]
   276  		t[ix] ^= (tp << 16) | (tp >> (64 - 16))
   277  		tp = kTab0[(((g[(u+5)&0xF]) >> 24) & 0xFF)]
   278  		t[ix] ^= (tp << 24) | (tp >> (64 - 24))
   279  		t[ix] ^= kTab4[(((g[(u+6)&0xF]) >> 32) & 0xFF)]
   280  		tp = kTab4[(((g[(u+7)&0xF]) >> 40) & 0xFF)]
   281  		t[ix] ^= (tp << 8) | (tp >> (64 - 8))
   282  		tp = kTab4[(((g[(u+8)&0xF]) >> 48) & 0xFF)]
   283  		t[ix] ^= (tp << 16) | (tp >> (64 - 16))
   284  		tp = kTab4[(((g[(u+13)&0xF]) >> 56) & 0xFF)]
   285  		t[ix] ^= (tp << 24) | (tp >> (64 - 24))
   286  
   287  		ix = u + 3
   288  		t[ix] = kTab0[((g[(u+3)&0xF]) & 0xFF)]
   289  		tp = kTab0[(((g[(u+4)&0xF]) >> 8) & 0xFF)]
   290  		t[ix] ^= (tp << 8) | (tp >> (64 - 8))
   291  		tp = kTab0[(((g[(u+5)&0xF]) >> 16) & 0xFF)]
   292  		t[ix] ^= (tp << 16) | (tp >> (64 - 16))
   293  		tp = kTab0[(((g[(u+6)&0xF]) >> 24) & 0xFF)]
   294  		t[ix] ^= (tp << 24) | (tp >> (64 - 24))
   295  		t[ix] ^= kTab4[(((g[(u+7)&0xF]) >> 32) & 0xFF)]
   296  		tp = kTab4[(((g[(u+8)&0xF]) >> 40) & 0xFF)]
   297  		t[ix] ^= (tp << 8) | (tp >> (64 - 8))
   298  		tp = kTab4[(((g[(u+9)&0xF]) >> 48) & 0xFF)]
   299  		t[ix] ^= (tp << 16) | (tp >> (64 - 16))
   300  		tp = kTab4[(((g[(u+14)&0xF]) >> 56) & 0xFF)]
   301  		t[ix] ^= (tp << 24) | (tp >> (64 - 24))
   302  	}
   303  
   304  	copy(g, t[:])
   305  }
   306  
   307  func mRounds(r uint64, m []uint64) {
   308  	m[0x0] ^= ((r << 56) ^ (^(uint64(0x00) << 56)))
   309  	m[0x1] ^= ((r << 56) ^ (^(uint64(0x10) << 56)))
   310  	m[0x2] ^= ((r << 56) ^ (^(uint64(0x20) << 56)))
   311  	m[0x3] ^= ((r << 56) ^ (^(uint64(0x30) << 56)))
   312  	m[0x4] ^= ((r << 56) ^ (^(uint64(0x40) << 56)))
   313  	m[0x5] ^= ((r << 56) ^ (^(uint64(0x50) << 56)))
   314  	m[0x6] ^= ((r << 56) ^ (^(uint64(0x60) << 56)))
   315  	m[0x7] ^= ((r << 56) ^ (^(uint64(0x70) << 56)))
   316  	m[0x8] ^= ((r << 56) ^ (^(uint64(0x80) << 56)))
   317  	m[0x9] ^= ((r << 56) ^ (^(uint64(0x90) << 56)))
   318  	m[0xA] ^= ((r << 56) ^ (^(uint64(0xA0) << 56)))
   319  	m[0xB] ^= ((r << 56) ^ (^(uint64(0xB0) << 56)))
   320  	m[0xC] ^= ((r << 56) ^ (^(uint64(0xC0) << 56)))
   321  	m[0xD] ^= ((r << 56) ^ (^(uint64(0xD0) << 56)))
   322  	m[0xE] ^= ((r << 56) ^ (^(uint64(0xE0) << 56)))
   323  	m[0xF] ^= ((r << 56) ^ (^(uint64(0xF0) << 56)))
   324  
   325  	var t [16]uint64
   326  	var tp, ix uint64
   327  
   328  	for u := uint64(0); u < 16; u += 4 {
   329  		t[u] = kTab0[((m[(u+1)&0xF]) & 0xFF)]
   330  		tp = kTab0[(((m[(u+3)&0xF]) >> 8) & 0xFF)]
   331  		t[u] ^= (tp << 8) | (tp >> (64 - 8))
   332  		tp = kTab0[(((m[(u+5)&0xF]) >> 16) & 0xFF)]
   333  		t[u] ^= (tp << 16) | (tp >> (64 - 16))
   334  		tp = kTab0[(((m[(u+11)&0xF]) >> 24) & 0xFF)]
   335  		t[u] ^= (tp << 24) | (tp >> (64 - 24))
   336  		t[u] ^= kTab4[(((m[(u+0)&0xF]) >> 32) & 0xFF)]
   337  		tp = kTab4[(((m[(u+2)&0xF]) >> 40) & 0xFF)]
   338  		t[u] ^= (tp << 8) | (tp >> (64 - 8))
   339  		tp = kTab4[(((m[(u+4)&0xF]) >> 48) & 0xFF)]
   340  		t[u] ^= (tp << 16) | (tp >> (64 - 16))
   341  		tp = kTab4[(((m[(u+6)&0xF]) >> 56) & 0xFF)]
   342  		t[u] ^= (tp << 24) | (tp >> (64 - 24))
   343  
   344  		ix = u + 1
   345  		t[ix] = kTab0[((m[(u+2)&0xF]) & 0xFF)]
   346  		tp = kTab0[(((m[(u+4)&0xF]) >> 8) & 0xFF)]
   347  		t[ix] ^= (tp << 8) | (tp >> (64 - 8))
   348  		tp = kTab0[(((m[(u+6)&0xF]) >> 16) & 0xFF)]
   349  		t[ix] ^= (tp << 16) | (tp >> (64 - 16))
   350  		tp = kTab0[(((m[(u+12)&0xF]) >> 24) & 0xFF)]
   351  		t[ix] ^= (tp << 24) | (tp >> (64 - 24))
   352  		t[ix] ^= kTab4[(((m[(u+1)&0xF]) >> 32) & 0xFF)]
   353  		tp = kTab4[(((m[(u+3)&0xF]) >> 40) & 0xFF)]
   354  		t[ix] ^= (tp << 8) | (tp >> (64 - 8))
   355  		tp = kTab4[(((m[(u+5)&0xF]) >> 48) & 0xFF)]
   356  		t[ix] ^= (tp << 16) | (tp >> (64 - 16))
   357  		tp = kTab4[(((m[(u+7)&0xF]) >> 56) & 0xFF)]
   358  		t[ix] ^= (tp << 24) | (tp >> (64 - 24))
   359  
   360  		ix = u + 2
   361  		t[ix] = kTab0[((m[(u+3)&0xF]) & 0xFF)]
   362  		tp = kTab0[(((m[(u+5)&0xF]) >> 8) & 0xFF)]
   363  		t[ix] ^= (tp << 8) | (tp >> (64 - 8))
   364  		tp = kTab0[(((m[(u+7)&0xF]) >> 16) & 0xFF)]
   365  		t[ix] ^= (tp << 16) | (tp >> (64 - 16))
   366  		tp = kTab0[(((m[(u+13)&0xF]) >> 24) & 0xFF)]
   367  		t[ix] ^= (tp << 24) | (tp >> (64 - 24))
   368  		t[ix] ^= kTab4[(((m[(u+2)&0xF]) >> 32) & 0xFF)]
   369  		tp = kTab4[(((m[(u+4)&0xF]) >> 40) & 0xFF)]
   370  		t[ix] ^= (tp << 8) | (tp >> (64 - 8))
   371  		tp = kTab4[(((m[(u+6)&0xF]) >> 48) & 0xFF)]
   372  		t[ix] ^= (tp << 16) | (tp >> (64 - 16))
   373  		tp = kTab4[(((m[(u+8)&0xF]) >> 56) & 0xFF)]
   374  		t[ix] ^= (tp << 24) | (tp >> (64 - 24))
   375  
   376  		ix = u + 3
   377  		t[ix] = kTab0[((m[(u+4)&0xF]) & 0xFF)]
   378  		tp = kTab0[(((m[(u+6)&0xF]) >> 8) & 0xFF)]
   379  		t[ix] ^= (tp << 8) | (tp >> (64 - 8))
   380  		tp = kTab0[(((m[(u+8)&0xF]) >> 16) & 0xFF)]
   381  		t[ix] ^= (tp << 16) | (tp >> (64 - 16))
   382  		tp = kTab0[(((m[(u+14)&0xF]) >> 24) & 0xFF)]
   383  		t[ix] ^= (tp << 24) | (tp >> (64 - 24))
   384  		t[ix] ^= kTab4[(((m[(u+3)&0xF]) >> 32) & 0xFF)]
   385  		tp = kTab4[(((m[(u+5)&0xF]) >> 40) & 0xFF)]
   386  		t[ix] ^= (tp << 8) | (tp >> (64 - 8))
   387  		tp = kTab4[(((m[(u+7)&0xF]) >> 48) & 0xFF)]
   388  		t[ix] ^= (tp << 16) | (tp >> (64 - 16))
   389  		tp = kTab4[(((m[(u+9)&0xF]) >> 56) & 0xFF)]
   390  		t[ix] ^= (tp << 24) | (tp >> (64 - 24))
   391  	}
   392  
   393  	copy(m, t[:])
   394  }
   395  
   396  ////////////////
   397  
   398  var kTab0 = []uint64{
   399  	uint64(0xc6a597f4a5f432c6), uint64(0xf884eb9784976ff8),
   400  	uint64(0xee99c7b099b05eee), uint64(0xf68df78c8d8c7af6),
   401  	uint64(0xff0de5170d17e8ff), uint64(0xd6bdb7dcbddc0ad6),
   402  	uint64(0xdeb1a7c8b1c816de), uint64(0x915439fc54fc6d91),
   403  	uint64(0x6050c0f050f09060), uint64(0x0203040503050702),
   404  	uint64(0xcea987e0a9e02ece), uint64(0x567dac877d87d156),
   405  	uint64(0xe719d52b192bcce7), uint64(0xb56271a662a613b5),
   406  	uint64(0x4de69a31e6317c4d), uint64(0xec9ac3b59ab559ec),
   407  	uint64(0x8f4505cf45cf408f), uint64(0x1f9d3ebc9dbca31f),
   408  	uint64(0x894009c040c04989), uint64(0xfa87ef92879268fa),
   409  	uint64(0xef15c53f153fd0ef), uint64(0xb2eb7f26eb2694b2),
   410  	uint64(0x8ec90740c940ce8e), uint64(0xfb0bed1d0b1de6fb),
   411  	uint64(0x41ec822fec2f6e41), uint64(0xb3677da967a91ab3),
   412  	uint64(0x5ffdbe1cfd1c435f), uint64(0x45ea8a25ea256045),
   413  	uint64(0x23bf46dabfdaf923), uint64(0x53f7a602f7025153),
   414  	uint64(0xe496d3a196a145e4), uint64(0x9b5b2ded5bed769b),
   415  	uint64(0x75c2ea5dc25d2875), uint64(0xe11cd9241c24c5e1),
   416  	uint64(0x3dae7ae9aee9d43d), uint64(0x4c6a98be6abef24c),
   417  	uint64(0x6c5ad8ee5aee826c), uint64(0x7e41fcc341c3bd7e),
   418  	uint64(0xf502f1060206f3f5), uint64(0x834f1dd14fd15283),
   419  	uint64(0x685cd0e45ce48c68), uint64(0x51f4a207f4075651),
   420  	uint64(0xd134b95c345c8dd1), uint64(0xf908e9180818e1f9),
   421  	uint64(0xe293dfae93ae4ce2), uint64(0xab734d9573953eab),
   422  	uint64(0x6253c4f553f59762), uint64(0x2a3f54413f416b2a),
   423  	uint64(0x080c10140c141c08), uint64(0x955231f652f66395),
   424  	uint64(0x46658caf65afe946), uint64(0x9d5e21e25ee27f9d),
   425  	uint64(0x3028607828784830), uint64(0x37a16ef8a1f8cf37),
   426  	uint64(0x0a0f14110f111b0a), uint64(0x2fb55ec4b5c4eb2f),
   427  	uint64(0x0e091c1b091b150e), uint64(0x2436485a365a7e24),
   428  	uint64(0x1b9b36b69bb6ad1b), uint64(0xdf3da5473d4798df),
   429  	uint64(0xcd26816a266aa7cd), uint64(0x4e699cbb69bbf54e),
   430  	uint64(0x7fcdfe4ccd4c337f), uint64(0xea9fcfba9fba50ea),
   431  	uint64(0x121b242d1b2d3f12), uint64(0x1d9e3ab99eb9a41d),
   432  	uint64(0x5874b09c749cc458), uint64(0x342e68722e724634),
   433  	uint64(0x362d6c772d774136), uint64(0xdcb2a3cdb2cd11dc),
   434  	uint64(0xb4ee7329ee299db4), uint64(0x5bfbb616fb164d5b),
   435  	uint64(0xa4f65301f601a5a4), uint64(0x764decd74dd7a176),
   436  	uint64(0xb76175a361a314b7), uint64(0x7dcefa49ce49347d),
   437  	uint64(0x527ba48d7b8ddf52), uint64(0xdd3ea1423e429fdd),
   438  	uint64(0x5e71bc937193cd5e), uint64(0x139726a297a2b113),
   439  	uint64(0xa6f55704f504a2a6), uint64(0xb96869b868b801b9),
   440  	uint64(0x0000000000000000), uint64(0xc12c99742c74b5c1),
   441  	uint64(0x406080a060a0e040), uint64(0xe31fdd211f21c2e3),
   442  	uint64(0x79c8f243c8433a79), uint64(0xb6ed772ced2c9ab6),
   443  	uint64(0xd4beb3d9bed90dd4), uint64(0x8d4601ca46ca478d),
   444  	uint64(0x67d9ce70d9701767), uint64(0x724be4dd4bddaf72),
   445  	uint64(0x94de3379de79ed94), uint64(0x98d42b67d467ff98),
   446  	uint64(0xb0e87b23e82393b0), uint64(0x854a11de4ade5b85),
   447  	uint64(0xbb6b6dbd6bbd06bb), uint64(0xc52a917e2a7ebbc5),
   448  	uint64(0x4fe59e34e5347b4f), uint64(0xed16c13a163ad7ed),
   449  	uint64(0x86c51754c554d286), uint64(0x9ad72f62d762f89a),
   450  	uint64(0x6655ccff55ff9966), uint64(0x119422a794a7b611),
   451  	uint64(0x8acf0f4acf4ac08a), uint64(0xe910c9301030d9e9),
   452  	uint64(0x0406080a060a0e04), uint64(0xfe81e798819866fe),
   453  	uint64(0xa0f05b0bf00baba0), uint64(0x7844f0cc44ccb478),
   454  	uint64(0x25ba4ad5bad5f025), uint64(0x4be3963ee33e754b),
   455  	uint64(0xa2f35f0ef30eaca2), uint64(0x5dfeba19fe19445d),
   456  	uint64(0x80c01b5bc05bdb80), uint64(0x058a0a858a858005),
   457  	uint64(0x3fad7eecadecd33f), uint64(0x21bc42dfbcdffe21),
   458  	uint64(0x7048e0d848d8a870), uint64(0xf104f90c040cfdf1),
   459  	uint64(0x63dfc67adf7a1963), uint64(0x77c1ee58c1582f77),
   460  	uint64(0xaf75459f759f30af), uint64(0x426384a563a5e742),
   461  	uint64(0x2030405030507020), uint64(0xe51ad12e1a2ecbe5),
   462  	uint64(0xfd0ee1120e12effd), uint64(0xbf6d65b76db708bf),
   463  	uint64(0x814c19d44cd45581), uint64(0x1814303c143c2418),
   464  	uint64(0x26354c5f355f7926), uint64(0xc32f9d712f71b2c3),
   465  	uint64(0xbee16738e13886be), uint64(0x35a26afda2fdc835),
   466  	uint64(0x88cc0b4fcc4fc788), uint64(0x2e395c4b394b652e),
   467  	uint64(0x93573df957f96a93), uint64(0x55f2aa0df20d5855),
   468  	uint64(0xfc82e39d829d61fc), uint64(0x7a47f4c947c9b37a),
   469  	uint64(0xc8ac8befacef27c8), uint64(0xbae76f32e73288ba),
   470  	uint64(0x322b647d2b7d4f32), uint64(0xe695d7a495a442e6),
   471  	uint64(0xc0a09bfba0fb3bc0), uint64(0x199832b398b3aa19),
   472  	uint64(0x9ed12768d168f69e), uint64(0xa37f5d817f8122a3),
   473  	uint64(0x446688aa66aaee44), uint64(0x547ea8827e82d654),
   474  	uint64(0x3bab76e6abe6dd3b), uint64(0x0b83169e839e950b),
   475  	uint64(0x8cca0345ca45c98c), uint64(0xc729957b297bbcc7),
   476  	uint64(0x6bd3d66ed36e056b), uint64(0x283c50443c446c28),
   477  	uint64(0xa779558b798b2ca7), uint64(0xbce2633de23d81bc),
   478  	uint64(0x161d2c271d273116), uint64(0xad76419a769a37ad),
   479  	uint64(0xdb3bad4d3b4d96db), uint64(0x6456c8fa56fa9e64),
   480  	uint64(0x744ee8d24ed2a674), uint64(0x141e28221e223614),
   481  	uint64(0x92db3f76db76e492), uint64(0x0c0a181e0a1e120c),
   482  	uint64(0x486c90b46cb4fc48), uint64(0xb8e46b37e4378fb8),
   483  	uint64(0x9f5d25e75de7789f), uint64(0xbd6e61b26eb20fbd),
   484  	uint64(0x43ef862aef2a6943), uint64(0xc4a693f1a6f135c4),
   485  	uint64(0x39a872e3a8e3da39), uint64(0x31a462f7a4f7c631),
   486  	uint64(0xd337bd5937598ad3), uint64(0xf28bff868b8674f2),
   487  	uint64(0xd532b156325683d5), uint64(0x8b430dc543c54e8b),
   488  	uint64(0x6e59dceb59eb856e), uint64(0xdab7afc2b7c218da),
   489  	uint64(0x018c028f8c8f8e01), uint64(0xb16479ac64ac1db1),
   490  	uint64(0x9cd2236dd26df19c), uint64(0x49e0923be03b7249),
   491  	uint64(0xd8b4abc7b4c71fd8), uint64(0xacfa4315fa15b9ac),
   492  	uint64(0xf307fd090709faf3), uint64(0xcf25856f256fa0cf),
   493  	uint64(0xcaaf8feaafea20ca), uint64(0xf48ef3898e897df4),
   494  	uint64(0x47e98e20e9206747), uint64(0x1018202818283810),
   495  	uint64(0x6fd5de64d5640b6f), uint64(0xf088fb83888373f0),
   496  	uint64(0x4a6f94b16fb1fb4a), uint64(0x5c72b8967296ca5c),
   497  	uint64(0x3824706c246c5438), uint64(0x57f1ae08f1085f57),
   498  	uint64(0x73c7e652c7522173), uint64(0x975135f351f36497),
   499  	uint64(0xcb238d652365aecb), uint64(0xa17c59847c8425a1),
   500  	uint64(0xe89ccbbf9cbf57e8), uint64(0x3e217c6321635d3e),
   501  	uint64(0x96dd377cdd7cea96), uint64(0x61dcc27fdc7f1e61),
   502  	uint64(0x0d861a9186919c0d), uint64(0x0f851e9485949b0f),
   503  	uint64(0xe090dbab90ab4be0), uint64(0x7c42f8c642c6ba7c),
   504  	uint64(0x71c4e257c4572671), uint64(0xccaa83e5aae529cc),
   505  	uint64(0x90d83b73d873e390), uint64(0x06050c0f050f0906),
   506  	uint64(0xf701f5030103f4f7), uint64(0x1c12383612362a1c),
   507  	uint64(0xc2a39ffea3fe3cc2), uint64(0x6a5fd4e15fe18b6a),
   508  	uint64(0xaef94710f910beae), uint64(0x69d0d26bd06b0269),
   509  	uint64(0x17912ea891a8bf17), uint64(0x995829e858e87199),
   510  	uint64(0x3a2774692769533a), uint64(0x27b94ed0b9d0f727),
   511  	uint64(0xd938a948384891d9), uint64(0xeb13cd351335deeb),
   512  	uint64(0x2bb356ceb3cee52b), uint64(0x2233445533557722),
   513  	uint64(0xd2bbbfd6bbd604d2), uint64(0xa9704990709039a9),
   514  	uint64(0x07890e8089808707), uint64(0x33a766f2a7f2c133),
   515  	uint64(0x2db65ac1b6c1ec2d), uint64(0x3c22786622665a3c),
   516  	uint64(0x15922aad92adb815), uint64(0xc92089602060a9c9),
   517  	uint64(0x874915db49db5c87), uint64(0xaaff4f1aff1ab0aa),
   518  	uint64(0x5078a0887888d850), uint64(0xa57a518e7a8e2ba5),
   519  	uint64(0x038f068a8f8a8903), uint64(0x59f8b213f8134a59),
   520  	uint64(0x0980129b809b9209), uint64(0x1a1734391739231a),
   521  	uint64(0x65daca75da751065), uint64(0xd731b553315384d7),
   522  	uint64(0x84c61351c651d584), uint64(0xd0b8bbd3b8d303d0),
   523  	uint64(0x82c31f5ec35edc82), uint64(0x29b052cbb0cbe229),
   524  	uint64(0x5a77b4997799c35a), uint64(0x1e113c3311332d1e),
   525  	uint64(0x7bcbf646cb463d7b), uint64(0xa8fc4b1ffc1fb7a8),
   526  	uint64(0x6dd6da61d6610c6d), uint64(0x2c3a584e3a4e622c),
   527  }
   528  
   529  var kTab4 = []uint64{
   530  	uint64(0xa5f432c6c6a597f4), uint64(0x84976ff8f884eb97),
   531  	uint64(0x99b05eeeee99c7b0), uint64(0x8d8c7af6f68df78c),
   532  	uint64(0x0d17e8ffff0de517), uint64(0xbddc0ad6d6bdb7dc),
   533  	uint64(0xb1c816dedeb1a7c8), uint64(0x54fc6d91915439fc),
   534  	uint64(0x50f090606050c0f0), uint64(0x0305070202030405),
   535  	uint64(0xa9e02ececea987e0), uint64(0x7d87d156567dac87),
   536  	uint64(0x192bcce7e719d52b), uint64(0x62a613b5b56271a6),
   537  	uint64(0xe6317c4d4de69a31), uint64(0x9ab559ecec9ac3b5),
   538  	uint64(0x45cf408f8f4505cf), uint64(0x9dbca31f1f9d3ebc),
   539  	uint64(0x40c04989894009c0), uint64(0x879268fafa87ef92),
   540  	uint64(0x153fd0efef15c53f), uint64(0xeb2694b2b2eb7f26),
   541  	uint64(0xc940ce8e8ec90740), uint64(0x0b1de6fbfb0bed1d),
   542  	uint64(0xec2f6e4141ec822f), uint64(0x67a91ab3b3677da9),
   543  	uint64(0xfd1c435f5ffdbe1c), uint64(0xea25604545ea8a25),
   544  	uint64(0xbfdaf92323bf46da), uint64(0xf702515353f7a602),
   545  	uint64(0x96a145e4e496d3a1), uint64(0x5bed769b9b5b2ded),
   546  	uint64(0xc25d287575c2ea5d), uint64(0x1c24c5e1e11cd924),
   547  	uint64(0xaee9d43d3dae7ae9), uint64(0x6abef24c4c6a98be),
   548  	uint64(0x5aee826c6c5ad8ee), uint64(0x41c3bd7e7e41fcc3),
   549  	uint64(0x0206f3f5f502f106), uint64(0x4fd15283834f1dd1),
   550  	uint64(0x5ce48c68685cd0e4), uint64(0xf407565151f4a207),
   551  	uint64(0x345c8dd1d134b95c), uint64(0x0818e1f9f908e918),
   552  	uint64(0x93ae4ce2e293dfae), uint64(0x73953eabab734d95),
   553  	uint64(0x53f597626253c4f5), uint64(0x3f416b2a2a3f5441),
   554  	uint64(0x0c141c08080c1014), uint64(0x52f66395955231f6),
   555  	uint64(0x65afe94646658caf), uint64(0x5ee27f9d9d5e21e2),
   556  	uint64(0x2878483030286078), uint64(0xa1f8cf3737a16ef8),
   557  	uint64(0x0f111b0a0a0f1411), uint64(0xb5c4eb2f2fb55ec4),
   558  	uint64(0x091b150e0e091c1b), uint64(0x365a7e242436485a),
   559  	uint64(0x9bb6ad1b1b9b36b6), uint64(0x3d4798dfdf3da547),
   560  	uint64(0x266aa7cdcd26816a), uint64(0x69bbf54e4e699cbb),
   561  	uint64(0xcd4c337f7fcdfe4c), uint64(0x9fba50eaea9fcfba),
   562  	uint64(0x1b2d3f12121b242d), uint64(0x9eb9a41d1d9e3ab9),
   563  	uint64(0x749cc4585874b09c), uint64(0x2e724634342e6872),
   564  	uint64(0x2d774136362d6c77), uint64(0xb2cd11dcdcb2a3cd),
   565  	uint64(0xee299db4b4ee7329), uint64(0xfb164d5b5bfbb616),
   566  	uint64(0xf601a5a4a4f65301), uint64(0x4dd7a176764decd7),
   567  	uint64(0x61a314b7b76175a3), uint64(0xce49347d7dcefa49),
   568  	uint64(0x7b8ddf52527ba48d), uint64(0x3e429fdddd3ea142),
   569  	uint64(0x7193cd5e5e71bc93), uint64(0x97a2b113139726a2),
   570  	uint64(0xf504a2a6a6f55704), uint64(0x68b801b9b96869b8),
   571  	uint64(0x0000000000000000), uint64(0x2c74b5c1c12c9974),
   572  	uint64(0x60a0e040406080a0), uint64(0x1f21c2e3e31fdd21),
   573  	uint64(0xc8433a7979c8f243), uint64(0xed2c9ab6b6ed772c),
   574  	uint64(0xbed90dd4d4beb3d9), uint64(0x46ca478d8d4601ca),
   575  	uint64(0xd970176767d9ce70), uint64(0x4bddaf72724be4dd),
   576  	uint64(0xde79ed9494de3379), uint64(0xd467ff9898d42b67),
   577  	uint64(0xe82393b0b0e87b23), uint64(0x4ade5b85854a11de),
   578  	uint64(0x6bbd06bbbb6b6dbd), uint64(0x2a7ebbc5c52a917e),
   579  	uint64(0xe5347b4f4fe59e34), uint64(0x163ad7eded16c13a),
   580  	uint64(0xc554d28686c51754), uint64(0xd762f89a9ad72f62),
   581  	uint64(0x55ff99666655ccff), uint64(0x94a7b611119422a7),
   582  	uint64(0xcf4ac08a8acf0f4a), uint64(0x1030d9e9e910c930),
   583  	uint64(0x060a0e040406080a), uint64(0x819866fefe81e798),
   584  	uint64(0xf00baba0a0f05b0b), uint64(0x44ccb4787844f0cc),
   585  	uint64(0xbad5f02525ba4ad5), uint64(0xe33e754b4be3963e),
   586  	uint64(0xf30eaca2a2f35f0e), uint64(0xfe19445d5dfeba19),
   587  	uint64(0xc05bdb8080c01b5b), uint64(0x8a858005058a0a85),
   588  	uint64(0xadecd33f3fad7eec), uint64(0xbcdffe2121bc42df),
   589  	uint64(0x48d8a8707048e0d8), uint64(0x040cfdf1f104f90c),
   590  	uint64(0xdf7a196363dfc67a), uint64(0xc1582f7777c1ee58),
   591  	uint64(0x759f30afaf75459f), uint64(0x63a5e742426384a5),
   592  	uint64(0x3050702020304050), uint64(0x1a2ecbe5e51ad12e),
   593  	uint64(0x0e12effdfd0ee112), uint64(0x6db708bfbf6d65b7),
   594  	uint64(0x4cd45581814c19d4), uint64(0x143c24181814303c),
   595  	uint64(0x355f792626354c5f), uint64(0x2f71b2c3c32f9d71),
   596  	uint64(0xe13886bebee16738), uint64(0xa2fdc83535a26afd),
   597  	uint64(0xcc4fc78888cc0b4f), uint64(0x394b652e2e395c4b),
   598  	uint64(0x57f96a9393573df9), uint64(0xf20d585555f2aa0d),
   599  	uint64(0x829d61fcfc82e39d), uint64(0x47c9b37a7a47f4c9),
   600  	uint64(0xacef27c8c8ac8bef), uint64(0xe73288babae76f32),
   601  	uint64(0x2b7d4f32322b647d), uint64(0x95a442e6e695d7a4),
   602  	uint64(0xa0fb3bc0c0a09bfb), uint64(0x98b3aa19199832b3),
   603  	uint64(0xd168f69e9ed12768), uint64(0x7f8122a3a37f5d81),
   604  	uint64(0x66aaee44446688aa), uint64(0x7e82d654547ea882),
   605  	uint64(0xabe6dd3b3bab76e6), uint64(0x839e950b0b83169e),
   606  	uint64(0xca45c98c8cca0345), uint64(0x297bbcc7c729957b),
   607  	uint64(0xd36e056b6bd3d66e), uint64(0x3c446c28283c5044),
   608  	uint64(0x798b2ca7a779558b), uint64(0xe23d81bcbce2633d),
   609  	uint64(0x1d273116161d2c27), uint64(0x769a37adad76419a),
   610  	uint64(0x3b4d96dbdb3bad4d), uint64(0x56fa9e646456c8fa),
   611  	uint64(0x4ed2a674744ee8d2), uint64(0x1e223614141e2822),
   612  	uint64(0xdb76e49292db3f76), uint64(0x0a1e120c0c0a181e),
   613  	uint64(0x6cb4fc48486c90b4), uint64(0xe4378fb8b8e46b37),
   614  	uint64(0x5de7789f9f5d25e7), uint64(0x6eb20fbdbd6e61b2),
   615  	uint64(0xef2a694343ef862a), uint64(0xa6f135c4c4a693f1),
   616  	uint64(0xa8e3da3939a872e3), uint64(0xa4f7c63131a462f7),
   617  	uint64(0x37598ad3d337bd59), uint64(0x8b8674f2f28bff86),
   618  	uint64(0x325683d5d532b156), uint64(0x43c54e8b8b430dc5),
   619  	uint64(0x59eb856e6e59dceb), uint64(0xb7c218dadab7afc2),
   620  	uint64(0x8c8f8e01018c028f), uint64(0x64ac1db1b16479ac),
   621  	uint64(0xd26df19c9cd2236d), uint64(0xe03b724949e0923b),
   622  	uint64(0xb4c71fd8d8b4abc7), uint64(0xfa15b9acacfa4315),
   623  	uint64(0x0709faf3f307fd09), uint64(0x256fa0cfcf25856f),
   624  	uint64(0xafea20cacaaf8fea), uint64(0x8e897df4f48ef389),
   625  	uint64(0xe920674747e98e20), uint64(0x1828381010182028),
   626  	uint64(0xd5640b6f6fd5de64), uint64(0x888373f0f088fb83),
   627  	uint64(0x6fb1fb4a4a6f94b1), uint64(0x7296ca5c5c72b896),
   628  	uint64(0x246c54383824706c), uint64(0xf1085f5757f1ae08),
   629  	uint64(0xc752217373c7e652), uint64(0x51f36497975135f3),
   630  	uint64(0x2365aecbcb238d65), uint64(0x7c8425a1a17c5984),
   631  	uint64(0x9cbf57e8e89ccbbf), uint64(0x21635d3e3e217c63),
   632  	uint64(0xdd7cea9696dd377c), uint64(0xdc7f1e6161dcc27f),
   633  	uint64(0x86919c0d0d861a91), uint64(0x85949b0f0f851e94),
   634  	uint64(0x90ab4be0e090dbab), uint64(0x42c6ba7c7c42f8c6),
   635  	uint64(0xc457267171c4e257), uint64(0xaae529ccccaa83e5),
   636  	uint64(0xd873e39090d83b73), uint64(0x050f090606050c0f),
   637  	uint64(0x0103f4f7f701f503), uint64(0x12362a1c1c123836),
   638  	uint64(0xa3fe3cc2c2a39ffe), uint64(0x5fe18b6a6a5fd4e1),
   639  	uint64(0xf910beaeaef94710), uint64(0xd06b026969d0d26b),
   640  	uint64(0x91a8bf1717912ea8), uint64(0x58e87199995829e8),
   641  	uint64(0x2769533a3a277469), uint64(0xb9d0f72727b94ed0),
   642  	uint64(0x384891d9d938a948), uint64(0x1335deebeb13cd35),
   643  	uint64(0xb3cee52b2bb356ce), uint64(0x3355772222334455),
   644  	uint64(0xbbd604d2d2bbbfd6), uint64(0x709039a9a9704990),
   645  	uint64(0x8980870707890e80), uint64(0xa7f2c13333a766f2),
   646  	uint64(0xb6c1ec2d2db65ac1), uint64(0x22665a3c3c227866),
   647  	uint64(0x92adb81515922aad), uint64(0x2060a9c9c9208960),
   648  	uint64(0x49db5c87874915db), uint64(0xff1ab0aaaaff4f1a),
   649  	uint64(0x7888d8505078a088), uint64(0x7a8e2ba5a57a518e),
   650  	uint64(0x8f8a8903038f068a), uint64(0xf8134a5959f8b213),
   651  	uint64(0x809b92090980129b), uint64(0x1739231a1a173439),
   652  	uint64(0xda75106565daca75), uint64(0x315384d7d731b553),
   653  	uint64(0xc651d58484c61351), uint64(0xb8d303d0d0b8bbd3),
   654  	uint64(0xc35edc8282c31f5e), uint64(0xb0cbe22929b052cb),
   655  	uint64(0x7799c35a5a77b499), uint64(0x11332d1e1e113c33),
   656  	uint64(0xcb463d7b7bcbf646), uint64(0xfc1fb7a8a8fc4b1f),
   657  	uint64(0xd6610c6d6dd6da61), uint64(0x3a4e622c2c3a584e),
   658  }