github.com/waltonchain/waltonchain_gwtc_src@v1.1.4-0.20201225072101-8a298c95a819/crypto/x11/jhash/jhash.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 jhash
     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(64)
    17  
    18  ////////////////
    19  
    20  type digest struct {
    21  	ptr uintptr
    22  	cnt uintptr
    23  
    24  	h [16]uint64
    25  
    26  	b [BlockSize]byte
    27  }
    28  
    29  // New returns a new digest compute a JH512 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  	copy(ref.h[:], kInit[:])
    43  }
    44  
    45  // Sum appends the current hash to dst and returns the result
    46  // as a slice. It does not change the underlying hash state.
    47  func (ref *digest) Sum(dst []byte) []byte {
    48  	dgt := *ref
    49  	hsh := [64]byte{}
    50  	dgt.Close(hsh[:], 0, 0)
    51  	return append(dst, hsh[:]...)
    52  }
    53  
    54  // Write more data to the running hash, never returns an error.
    55  func (ref *digest) Write(src []byte) (int, error) {
    56  	sln := uintptr(len(src))
    57  	fln := len(src)
    58  	buf := ref.b[:]
    59  	ptr := ref.ptr
    60  
    61  	if sln < (BlockSize - ptr) {
    62  		copy(buf[ptr:], src)
    63  		ref.ptr += sln
    64  		return int(sln), nil
    65  	}
    66  
    67  	var hi, lo [8]uint64
    68  	hi[0] = ref.h[0x0]
    69  	lo[0] = ref.h[0x1]
    70  	hi[1] = ref.h[0x2]
    71  	lo[1] = ref.h[0x3]
    72  	hi[2] = ref.h[0x4]
    73  	lo[2] = ref.h[0x5]
    74  	hi[3] = ref.h[0x6]
    75  	lo[3] = ref.h[0x7]
    76  	hi[4] = ref.h[0x8]
    77  	lo[4] = ref.h[0x9]
    78  	hi[5] = ref.h[0xA]
    79  	lo[5] = ref.h[0xB]
    80  	hi[6] = ref.h[0xC]
    81  	lo[6] = ref.h[0xD]
    82  	hi[7] = ref.h[0xE]
    83  	lo[7] = ref.h[0xF]
    84  
    85  	for sln > 0 {
    86  		cln := BlockSize - ptr
    87  
    88  		if cln > sln {
    89  			cln = sln
    90  		}
    91  		sln -= cln
    92  
    93  		copy(ref.b[ptr:], src[:cln])
    94  		src = src[cln:]
    95  		ptr += cln
    96  
    97  		if ptr == BlockSize {
    98  			m0h := decUInt64le(buf[0:])
    99  			m0l := decUInt64le(buf[8:])
   100  			m1h := decUInt64le(buf[16:])
   101  			m1l := decUInt64le(buf[24:])
   102  			m2h := decUInt64le(buf[32:])
   103  			m2l := decUInt64le(buf[40:])
   104  			m3h := decUInt64le(buf[48:])
   105  			m3l := decUInt64le(buf[56:])
   106  
   107  			hi[0] ^= m0h
   108  			lo[0] ^= m0l
   109  			hi[1] ^= m1h
   110  			lo[1] ^= m1l
   111  			hi[2] ^= m2h
   112  			lo[2] ^= m2l
   113  			hi[3] ^= m3h
   114  			lo[3] ^= m3l
   115  
   116  			for r := uint64(0); r < 42; r += 7 {
   117  				slMutateExtend(r+0, 0, hi[:], lo[:])
   118  				slMutateExtend(r+1, 1, hi[:], lo[:])
   119  				slMutateExtend(r+2, 2, hi[:], lo[:])
   120  				slMutateExtend(r+3, 3, hi[:], lo[:])
   121  				slMutateExtend(r+4, 4, hi[:], lo[:])
   122  				slMutateExtend(r+5, 5, hi[:], lo[:])
   123  				slMutateBasic(r+6, hi[:], lo[:])
   124  			}
   125  
   126  			hi[4] ^= m0h
   127  			lo[4] ^= m0l
   128  			hi[5] ^= m1h
   129  			lo[5] ^= m1l
   130  			hi[6] ^= m2h
   131  			lo[6] ^= m2l
   132  			hi[7] ^= m3h
   133  			lo[7] ^= m3l
   134  
   135  			ref.cnt++
   136  			ptr = 0
   137  		}
   138  	}
   139  
   140  	ref.h[0x0] = hi[0]
   141  	ref.h[0x1] = lo[0]
   142  	ref.h[0x2] = hi[1]
   143  	ref.h[0x3] = lo[1]
   144  	ref.h[0x4] = hi[2]
   145  	ref.h[0x5] = lo[2]
   146  	ref.h[0x6] = hi[3]
   147  	ref.h[0x7] = lo[3]
   148  	ref.h[0x8] = hi[4]
   149  	ref.h[0x9] = lo[4]
   150  	ref.h[0xA] = hi[5]
   151  	ref.h[0xB] = lo[5]
   152  	ref.h[0xC] = hi[6]
   153  	ref.h[0xD] = lo[6]
   154  	ref.h[0xE] = hi[7]
   155  	ref.h[0xF] = lo[7]
   156  
   157  	ref.ptr = ptr
   158  	return fln, nil
   159  }
   160  
   161  // Close the digest by writing the last bits and storing the hash
   162  // in dst. This prepares the digest for reuse by calling reset. A call
   163  // to Close with a dst that is smaller then HashSize will return an error.
   164  func (ref *digest) Close(dst []byte, bits uint8, bcnt uint8) error {
   165  	if ln := len(dst); HashSize > ln {
   166  		return fmt.Errorf("JHash Close: dst min length: %d, got %d", HashSize, ln)
   167  	}
   168  
   169  	var ocnt uintptr
   170  	var buf [128]uint8
   171  
   172  	{
   173  		off := uint8(0x80) >> bcnt
   174  		buf[0] = uint8((bits & -off) | off)
   175  	}
   176  
   177  	if ref.ptr == 0 && bcnt == 0 {
   178  		ocnt = 47
   179  	} else {
   180  		ocnt = 111 - ref.ptr
   181  	}
   182  
   183  	l0 := uint64(bcnt)
   184  	l0 += uint64(ref.cnt << 9)
   185  	l0 += uint64(ref.ptr << 3)
   186  	l1 := uint64(ref.cnt >> 55)
   187  
   188  	encUInt64be(buf[ocnt+1:], l1)
   189  	encUInt64be(buf[ocnt+9:], l0)
   190  
   191  	ref.Write(buf[:ocnt+17])
   192  
   193  	for u := uintptr(0); u < 8; u++ {
   194  		encUInt64le(dst[(u<<3):], ref.h[u+8])
   195  	}
   196  
   197  	ref.Reset()
   198  	return nil
   199  }
   200  
   201  // Size returns the number of bytes required to store the hash.
   202  func (*digest) Size() int {
   203  	return HashSize
   204  }
   205  
   206  // BlockSize returns the block size of the hash.
   207  func (*digest) BlockSize() int {
   208  	return int(BlockSize)
   209  }
   210  
   211  ////////////////
   212  
   213  func decUInt64le(src []byte) uint64 {
   214  	return (uint64(src[0]) |
   215  		uint64(src[1])<<8 |
   216  		uint64(src[2])<<16 |
   217  		uint64(src[3])<<24 |
   218  		uint64(src[4])<<32 |
   219  		uint64(src[5])<<40 |
   220  		uint64(src[6])<<48 |
   221  		uint64(src[7])<<56)
   222  }
   223  
   224  func encUInt64le(dst []byte, src uint64) {
   225  	dst[0] = uint8(src)
   226  	dst[1] = uint8(src >> 8)
   227  	dst[2] = uint8(src >> 16)
   228  	dst[3] = uint8(src >> 24)
   229  	dst[4] = uint8(src >> 32)
   230  	dst[5] = uint8(src >> 40)
   231  	dst[6] = uint8(src >> 48)
   232  	dst[7] = uint8(src >> 56)
   233  }
   234  
   235  func encUInt64be(dst []byte, src uint64) {
   236  	dst[0] = uint8(src >> 56)
   237  	dst[1] = uint8(src >> 48)
   238  	dst[2] = uint8(src >> 40)
   239  	dst[3] = uint8(src >> 32)
   240  	dst[4] = uint8(src >> 24)
   241  	dst[5] = uint8(src >> 16)
   242  	dst[6] = uint8(src >> 8)
   243  	dst[7] = uint8(src)
   244  }
   245  
   246  func slMutateBasic(r uint64, hi, lo []uint64) {
   247  	var tmp uint64
   248  
   249  	tmp = kSpec[(r<<2)+0]
   250  	hi[6] = ^hi[6]
   251  	hi[0] ^= tmp & ^hi[4]
   252  	tmp = tmp ^ (hi[0] & hi[2])
   253  	hi[0] ^= hi[4] & hi[6]
   254  	hi[6] ^= ^hi[2] & hi[4]
   255  	hi[2] ^= hi[0] & hi[4]
   256  	hi[4] ^= hi[0] & ^hi[6]
   257  	hi[0] ^= hi[2] | hi[6]
   258  	hi[6] ^= hi[2] & hi[4]
   259  	hi[2] ^= tmp & hi[0]
   260  	hi[4] ^= tmp
   261  
   262  	tmp = kSpec[(r<<2)+1]
   263  	lo[6] = ^lo[6]
   264  	lo[0] ^= tmp & ^lo[4]
   265  	tmp = tmp ^ (lo[0] & lo[2])
   266  	lo[0] ^= lo[4] & lo[6]
   267  	lo[6] ^= ^lo[2] & lo[4]
   268  	lo[2] ^= lo[0] & lo[4]
   269  	lo[4] ^= lo[0] & ^lo[6]
   270  	lo[0] ^= lo[2] | lo[6]
   271  	lo[6] ^= lo[2] & lo[4]
   272  	lo[2] ^= tmp & lo[0]
   273  	lo[4] ^= tmp
   274  
   275  	tmp = kSpec[(r<<2)+2]
   276  	hi[7] = ^hi[7]
   277  	hi[1] ^= tmp & ^hi[5]
   278  	tmp = tmp ^ (hi[1] & hi[3])
   279  	hi[1] ^= hi[5] & hi[7]
   280  	hi[7] ^= ^hi[3] & hi[5]
   281  	hi[3] ^= hi[1] & hi[5]
   282  	hi[5] ^= hi[1] & ^hi[7]
   283  	hi[1] ^= hi[3] | hi[7]
   284  	hi[7] ^= hi[3] & hi[5]
   285  	hi[3] ^= tmp & hi[1]
   286  	hi[5] ^= tmp
   287  
   288  	tmp = kSpec[(r<<2)+3]
   289  	lo[7] = ^lo[7]
   290  	lo[1] ^= tmp & ^lo[5]
   291  	tmp = tmp ^ (lo[1] & lo[3])
   292  	lo[1] ^= lo[5] & lo[7]
   293  	lo[7] ^= ^lo[3] & lo[5]
   294  	lo[3] ^= lo[1] & lo[5]
   295  	lo[5] ^= lo[1] & ^lo[7]
   296  	lo[1] ^= lo[3] | lo[7]
   297  	lo[7] ^= lo[3] & lo[5]
   298  	lo[3] ^= tmp & lo[1]
   299  	lo[5] ^= tmp
   300  
   301  	hi[1] ^= hi[2]
   302  	hi[3] ^= hi[4]
   303  	hi[5] ^= hi[6] ^ hi[0]
   304  	hi[7] ^= hi[0]
   305  	hi[0] ^= hi[3]
   306  	hi[2] ^= hi[5]
   307  	hi[4] ^= hi[7] ^ hi[1]
   308  	hi[6] ^= hi[1]
   309  
   310  	lo[1] ^= lo[2]
   311  	lo[3] ^= lo[4]
   312  	lo[5] ^= lo[6] ^ lo[0]
   313  	lo[7] ^= lo[0]
   314  	lo[0] ^= lo[3]
   315  	lo[2] ^= lo[5]
   316  	lo[4] ^= lo[7] ^ lo[1]
   317  	lo[6] ^= lo[1]
   318  
   319  	tmp = hi[1]
   320  	hi[1] = lo[1]
   321  	lo[1] = tmp
   322  
   323  	tmp = hi[3]
   324  	hi[3] = lo[3]
   325  	lo[3] = tmp
   326  
   327  	tmp = hi[5]
   328  	hi[5] = lo[5]
   329  	lo[5] = tmp
   330  
   331  	tmp = hi[7]
   332  	hi[7] = lo[7]
   333  	lo[7] = tmp
   334  }
   335  
   336  func slMutateExtend(r, ro uint64, hi, lo []uint64) {
   337  	var tmp uint64
   338  
   339  	tmp = kSpec[(r<<2)+0]
   340  	hi[6] = ^hi[6]
   341  	hi[0] ^= tmp & ^hi[4]
   342  	tmp = tmp ^ (hi[0] & hi[2])
   343  	hi[0] ^= hi[4] & hi[6]
   344  	hi[6] ^= ^hi[2] & hi[4]
   345  	hi[2] ^= hi[0] & hi[4]
   346  	hi[4] ^= hi[0] & ^hi[6]
   347  	hi[0] ^= hi[2] | hi[6]
   348  	hi[6] ^= hi[2] & hi[4]
   349  	hi[2] ^= tmp & hi[0]
   350  	hi[4] ^= tmp
   351  
   352  	tmp = kSpec[(r<<2)+1]
   353  	lo[6] = ^lo[6]
   354  	lo[0] ^= tmp & ^lo[4]
   355  	tmp = tmp ^ (lo[0] & lo[2])
   356  	lo[0] ^= lo[4] & lo[6]
   357  	lo[6] ^= ^lo[2] & lo[4]
   358  	lo[2] ^= lo[0] & lo[4]
   359  	lo[4] ^= lo[0] & ^lo[6]
   360  	lo[0] ^= lo[2] | lo[6]
   361  	lo[6] ^= lo[2] & lo[4]
   362  	lo[2] ^= tmp & lo[0]
   363  	lo[4] ^= tmp
   364  
   365  	tmp = kSpec[(r<<2)+2]
   366  	hi[7] = ^hi[7]
   367  	hi[1] ^= tmp & ^hi[5]
   368  	tmp = tmp ^ (hi[1] & hi[3])
   369  	hi[1] ^= hi[5] & hi[7]
   370  	hi[7] ^= ^hi[3] & hi[5]
   371  	hi[3] ^= hi[1] & hi[5]
   372  	hi[5] ^= hi[1] & ^hi[7]
   373  	hi[1] ^= hi[3] | hi[7]
   374  	hi[7] ^= hi[3] & hi[5]
   375  	hi[3] ^= tmp & hi[1]
   376  	hi[5] ^= tmp
   377  
   378  	tmp = kSpec[(r<<2)+3]
   379  	lo[7] = ^lo[7]
   380  	lo[1] ^= tmp & ^lo[5]
   381  	tmp = tmp ^ (lo[1] & lo[3])
   382  	lo[1] ^= lo[5] & lo[7]
   383  	lo[7] ^= ^lo[3] & lo[5]
   384  	lo[3] ^= lo[1] & lo[5]
   385  	lo[5] ^= lo[1] & ^lo[7]
   386  	lo[1] ^= lo[3] | lo[7]
   387  	lo[7] ^= lo[3] & lo[5]
   388  	lo[3] ^= tmp & lo[1]
   389  	lo[5] ^= tmp
   390  
   391  	hi[1] ^= hi[2]
   392  	hi[3] ^= hi[4]
   393  	hi[5] ^= hi[6] ^ hi[0]
   394  	hi[7] ^= hi[0]
   395  	hi[0] ^= hi[3]
   396  	hi[2] ^= hi[5]
   397  	hi[4] ^= hi[7] ^ hi[1]
   398  	hi[6] ^= hi[1]
   399  
   400  	lo[1] ^= lo[2]
   401  	lo[3] ^= lo[4]
   402  	lo[5] ^= lo[6] ^ lo[0]
   403  	lo[7] ^= lo[0]
   404  	lo[0] ^= lo[3]
   405  	lo[2] ^= lo[5]
   406  	lo[4] ^= lo[7] ^ lo[1]
   407  	lo[6] ^= lo[1]
   408  
   409  	tmp = (hi[1] & (kWrapValue[ro])) << (kWrapOffset[ro])
   410  	hi[1] = ((hi[1] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp
   411  	tmp = (lo[1] & (kWrapValue[ro])) << (kWrapOffset[ro])
   412  	lo[1] = ((lo[1] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp
   413  
   414  	tmp = (hi[3] & (kWrapValue[ro])) << (kWrapOffset[ro])
   415  	hi[3] = ((hi[3] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp
   416  	tmp = (lo[3] & (kWrapValue[ro])) << (kWrapOffset[ro])
   417  	lo[3] = ((lo[3] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp
   418  
   419  	tmp = (hi[5] & (kWrapValue[ro])) << (kWrapOffset[ro])
   420  	hi[5] = ((hi[5] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp
   421  	tmp = (lo[5] & (kWrapValue[ro])) << (kWrapOffset[ro])
   422  	lo[5] = ((lo[5] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp
   423  
   424  	tmp = (hi[7] & (kWrapValue[ro])) << (kWrapOffset[ro])
   425  	hi[7] = ((hi[7] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp
   426  	tmp = (lo[7] & (kWrapValue[ro])) << (kWrapOffset[ro])
   427  	lo[7] = ((lo[7] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp
   428  }
   429  
   430  ////////////////
   431  
   432  var kInit = []uint64{
   433  	uint64(0x17aa003e964bd16f), uint64(0x43d5157a052e6a63),
   434  	uint64(0x0bef970c8d5e228a), uint64(0x61c3b3f2591234e9),
   435  	uint64(0x1e806f53c1a01d89), uint64(0x806d2bea6b05a92a),
   436  	uint64(0xa6ba7520dbcc8e58), uint64(0xf73bf8ba763a0fa9),
   437  	uint64(0x694ae34105e66901), uint64(0x5ae66f2e8e8ab546),
   438  	uint64(0x243c84c1d0a74710), uint64(0x99c15a2db1716e3b),
   439  	uint64(0x56f8b19decf657cf), uint64(0x56b116577c8806a7),
   440  	uint64(0xfb1785e6dffcc2e3), uint64(0x4bdd8ccc78465a54),
   441  }
   442  
   443  var kSpec = []uint64{
   444  	uint64(0x67f815dfa2ded572), uint64(0x571523b70a15847b),
   445  	uint64(0xf6875a4d90d6ab81), uint64(0x402bd1c3c54f9f4e),
   446  	uint64(0x9cfa455ce03a98ea), uint64(0x9a99b26699d2c503),
   447  	uint64(0x8a53bbf2b4960266), uint64(0x31a2db881a1456b5),
   448  	uint64(0xdb0e199a5c5aa303), uint64(0x1044c1870ab23f40),
   449  	uint64(0x1d959e848019051c), uint64(0xdccde75eadeb336f),
   450  	uint64(0x416bbf029213ba10), uint64(0xd027bbf7156578dc),
   451  	uint64(0x5078aa3739812c0a), uint64(0xd3910041d2bf1a3f),
   452  	uint64(0x907eccf60d5a2d42), uint64(0xce97c0929c9f62dd),
   453  	uint64(0xac442bc70ba75c18), uint64(0x23fcc663d665dfd1),
   454  	uint64(0x1ab8e09e036c6e97), uint64(0xa8ec6c447e450521),
   455  	uint64(0xfa618e5dbb03f1ee), uint64(0x97818394b29796fd),
   456  	uint64(0x2f3003db37858e4a), uint64(0x956a9ffb2d8d672a),
   457  	uint64(0x6c69b8f88173fe8a), uint64(0x14427fc04672c78a),
   458  	uint64(0xc45ec7bd8f15f4c5), uint64(0x80bb118fa76f4475),
   459  	uint64(0xbc88e4aeb775de52), uint64(0xf4a3a6981e00b882),
   460  	uint64(0x1563a3a9338ff48e), uint64(0x89f9b7d524565faa),
   461  	uint64(0xfde05a7c20edf1b6), uint64(0x362c42065ae9ca36),
   462  	uint64(0x3d98fe4e433529ce), uint64(0xa74b9a7374f93a53),
   463  	uint64(0x86814e6f591ff5d0), uint64(0x9f5ad8af81ad9d0e),
   464  	uint64(0x6a6234ee670605a7), uint64(0x2717b96ebe280b8b),
   465  	uint64(0x3f1080c626077447), uint64(0x7b487ec66f7ea0e0),
   466  	uint64(0xc0a4f84aa50a550d), uint64(0x9ef18e979fe7e391),
   467  	uint64(0xd48d605081727686), uint64(0x62b0e5f3415a9e7e),
   468  	uint64(0x7a205440ec1f9ffc), uint64(0x84c9f4ce001ae4e3),
   469  	uint64(0xd895fa9df594d74f), uint64(0xa554c324117e2e55),
   470  	uint64(0x286efebd2872df5b), uint64(0xb2c4a50fe27ff578),
   471  	uint64(0x2ed349eeef7c8905), uint64(0x7f5928eb85937e44),
   472  	uint64(0x4a3124b337695f70), uint64(0x65e4d61df128865e),
   473  	uint64(0xe720b95104771bc7), uint64(0x8a87d423e843fe74),
   474  	uint64(0xf2947692a3e8297d), uint64(0xc1d9309b097acbdd),
   475  	uint64(0xe01bdc5bfb301b1d), uint64(0xbf829cf24f4924da),
   476  	uint64(0xffbf70b431bae7a4), uint64(0x48bcf8de0544320d),
   477  	uint64(0x39d3bb5332fcae3b), uint64(0xa08b29e0c1c39f45),
   478  	uint64(0x0f09aef7fd05c9e5), uint64(0x34f1904212347094),
   479  	uint64(0x95ed44e301b771a2), uint64(0x4a982f4f368e3be9),
   480  	uint64(0x15f66ca0631d4088), uint64(0xffaf52874b44c147),
   481  	uint64(0x30c60ae2f14abb7e), uint64(0xe68c6eccc5b67046),
   482  	uint64(0x00ca4fbd56a4d5a4), uint64(0xae183ec84b849dda),
   483  	uint64(0xadd1643045ce5773), uint64(0x67255c1468cea6e8),
   484  	uint64(0x16e10ecbf28cdaa3), uint64(0x9a99949a5806e933),
   485  	uint64(0x7b846fc220b2601f), uint64(0x1885d1a07facced1),
   486  	uint64(0xd319dd8da15b5932), uint64(0x46b4a5aac01c9a50),
   487  	uint64(0xba6b04e467633d9f), uint64(0x7eee560bab19caf6),
   488  	uint64(0x742128a9ea79b11f), uint64(0xee51363b35f7bde9),
   489  	uint64(0x76d350755aac571d), uint64(0x01707da3fec2463a),
   490  	uint64(0x42d8a498afc135f7), uint64(0x79676b9e20eced78),
   491  	uint64(0xa8db3aea15638341), uint64(0x832c83324d3bc3fa),
   492  	uint64(0xf347271c1f3b40a7), uint64(0x9a762db734f04059),
   493  	uint64(0xfd4f21d26c4e3ee7), uint64(0xef5957dc398dfdb8),
   494  	uint64(0xdaeb492b490c9b8d), uint64(0x0d70f36849d7a25b),
   495  	uint64(0x84558d7ad0ae3b7d), uint64(0x658ef8e4f0e9a5f5),
   496  	uint64(0x533b1036f4a2b8a0), uint64(0x5aec3e759e07a80c),
   497  	uint64(0x4f88e85692946891), uint64(0x4cbcbaf8555cb05b),
   498  	uint64(0x7b9487f3993bbbe3), uint64(0x5d1c6b72d6f4da75),
   499  	uint64(0x6db334dc28acae64), uint64(0x71db28b850a5346c),
   500  	uint64(0x2a518d10f2e261f8), uint64(0xfc75dd593364dbe3),
   501  	uint64(0xa23fce43f1bcac1c), uint64(0xb043e8023cd1bb67),
   502  	uint64(0x75a12988ca5b0a33), uint64(0x5c5316b44d19347f),
   503  	uint64(0x1e4d790ec3943b92), uint64(0x3fafeeb6d7757479),
   504  	uint64(0x21391abef7d4a8ea), uint64(0x5127234c097ef45c),
   505  	uint64(0xd23c32ba5324a326), uint64(0xadd5a66d4a17a344),
   506  	uint64(0x08c9f2afa63e1db5), uint64(0x563c6b91983d5983),
   507  	uint64(0x4d608672a17cf84c), uint64(0xf6c76e08cc3ee246),
   508  	uint64(0x5e76bcb1b333982f), uint64(0x2ae6c4efa566d62b),
   509  	uint64(0x36d4c1bee8b6f406), uint64(0x6321efbc1582ee74),
   510  	uint64(0x69c953f40d4ec1fd), uint64(0x26585806c45a7da7),
   511  	uint64(0x16fae0061614c17e), uint64(0x3f9d63283daf907e),
   512  	uint64(0x0cd29b00e3f2c9d2), uint64(0x300cd4b730ceaa5f),
   513  	uint64(0x9832e0f216512a74), uint64(0x9af8cee3d830eb0d),
   514  	uint64(0x9279f1b57b9ec54b), uint64(0xd36886046ee651ff),
   515  	uint64(0x316796e6574d239b), uint64(0x05750a17f3a6e6cc),
   516  	uint64(0xce6c3213d98176b1), uint64(0x62a205f88452173c),
   517  	uint64(0x47154778b3cb2bf4), uint64(0x486a9323825446ff),
   518  	uint64(0x65655e4e0758df38), uint64(0x8e5086fc897cfcf2),
   519  	uint64(0x86ca0bd0442e7031), uint64(0x4e477830a20940f0),
   520  	uint64(0x8338f7d139eea065), uint64(0xbd3a2ce437e95ef7),
   521  	uint64(0x6ff8130126b29721), uint64(0xe7de9fefd1ed44a3),
   522  	uint64(0xd992257615dfa08b), uint64(0xbe42dc12f6f7853c),
   523  	uint64(0x7eb027ab7ceca7d8), uint64(0xdea83eaada7d8d53),
   524  	uint64(0xd86902bd93ce25aa), uint64(0xf908731afd43f65a),
   525  	uint64(0xa5194a17daef5fc0), uint64(0x6a21fd4c33664d97),
   526  	uint64(0x701541db3198b435), uint64(0x9b54cdedbb0f1eea),
   527  	uint64(0x72409751a163d09a), uint64(0xe26f4791bf9d75f6),
   528  }
   529  
   530  var kWrapValue = []uint64{
   531  	uint64(0x5555555555555555),
   532  	uint64(0x3333333333333333),
   533  	uint64(0x0F0F0F0F0F0F0F0F),
   534  	uint64(0x00FF00FF00FF00FF),
   535  	uint64(0x0000FFFF0000FFFF),
   536  	uint64(0x00000000FFFFFFFF),
   537  }
   538  
   539  var kWrapOffset = []uint64{
   540  	1, 2, 4, 8, 16, 32,
   541  }