github.com/waltonchain/waltonchain_gwtc_src@v1.1.4-0.20201225072101-8a298c95a819/crypto/x11/x11.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 x11
     5  
     6  import (
     7  	"github.com/wtc/go-wtc/crypto/hash"
     8  
     9  	"github.com/wtc/go-wtc/crypto/x11/blake"
    10  	"github.com/wtc/go-wtc/crypto/x11/bmw"
    11  	"github.com/wtc/go-wtc/crypto/x11/cubed"
    12  	"github.com/wtc/go-wtc/crypto/x11/echo"
    13  	"github.com/wtc/go-wtc/crypto/x11/groest"
    14  	"github.com/wtc/go-wtc/crypto/x11/jhash"
    15  	"github.com/wtc/go-wtc/crypto/x11/keccak"
    16  	"github.com/wtc/go-wtc/crypto/x11/luffa"
    17  	"github.com/wtc/go-wtc/crypto/x11/shavite"
    18  	"github.com/wtc/go-wtc/crypto/x11/simd"
    19  	"github.com/wtc/go-wtc/crypto/x11/skein"
    20  )
    21  
    22  ////////////////
    23  
    24  // Hash contains the state objects
    25  // required to perform the x11.Hash.
    26  type Hash struct {
    27  	tha [64]byte
    28  	thb [64]byte
    29  
    30  	blake   hash.Digest
    31  	bmw     hash.Digest
    32  	cubed   hash.Digest
    33  	echo    hash.Digest
    34  	groest  hash.Digest
    35  	jhash   hash.Digest
    36  	keccak  hash.Digest
    37  	luffa   hash.Digest
    38  	shavite hash.Digest
    39  	simd    hash.Digest
    40  	skein   hash.Digest
    41  }
    42  
    43  // New returns a new object to compute a x11 hash.
    44  func New() *Hash {
    45  	ref := &Hash{}
    46  	ref.blake = blake.New()
    47  	ref.bmw = bmw.New()
    48  	ref.cubed = cubed.New()
    49  	ref.echo = echo.New()
    50  	ref.groest = groest.New()
    51  	ref.jhash = jhash.New()
    52  	ref.keccak = keccak.New()
    53  	ref.luffa = luffa.New()
    54  	ref.shavite = shavite.New()
    55  	ref.simd = simd.New()
    56  	ref.skein = skein.New()
    57  	return ref
    58  }
    59  
    60  // Hash computes the hash from the src bytes and stores the result in dst.
    61  func (ref *Hash) Hash(src []byte, dst []byte, order []byte) {
    62  	in := ref.tha[:]
    63  	out := ref.thb[:]
    64  	in = src[:]
    65  
    66  	for i := 0; i < len(order); i++ {
    67  		switch order[i] {
    68  			case 'A':
    69  				ref.blake.Write(in)
    70  				ref.blake.Close(out, 0, 0)
    71  				in = out[:]
    72  			case 'B':
    73  				ref.cubed.Write(in)
    74  				ref.cubed.Close(out, 0, 0)
    75  				in = out[:]
    76  			case 'C':
    77  				ref.echo.Write(in)
    78  				ref.echo.Close(out, 0, 0)
    79  				in = out[:]
    80  			case 'D':
    81  				ref.bmw.Write(in)
    82  				ref.bmw.Close(out, 0, 0)
    83  				in = out[:]
    84  			case 'E':
    85  				ref.jhash.Write(in)
    86  				ref.jhash.Close(out, 0, 0)
    87  				in = out[:]
    88  			case 'F':
    89  				ref.groest.Write(in)
    90  				ref.groest.Close(out, 0, 0)
    91  				in = out[:]
    92  			case 'G':
    93  				ref.luffa.Write(in)
    94  				ref.luffa.Close(out, 0, 0)
    95  				in = out[:]
    96  			case 'H':
    97  				ref.skein.Write(in)
    98  				ref.skein.Close(out, 0, 0)
    99  				in = out[:]
   100  			case 'I':
   101  				ref.simd.Write(in)
   102  				ref.simd.Close(out, 0, 0)
   103  				in = out[:]
   104  			case 'J':
   105  				ref.keccak.Write(in)
   106  				ref.keccak.Close(out, 0, 0)
   107  				in = out[:]
   108  			case 'K':
   109  				ref.shavite.Write(in)
   110  				ref.shavite.Close(out, 0, 0)
   111  				in = out[:]
   112  
   113  		}
   114  		copy(dst, out)
   115  	}
   116  }
   117  
   118  
   119  
   120  
   121  
   122  
   123  func (ref *Hash) Hash1(src []byte, dst []byte, order [11]byte) {
   124  
   125  	ta := ref.tha[:]
   126  	tb := ref.thb[:]
   127  
   128  	ref.blake.Write(src)
   129  	ref.blake.Close(tb, 0, 0)
   130  
   131  	ref.cubed.Write(tb)
   132  	ref.cubed.Close(ta, 0, 0)
   133  
   134  	ref.echo.Write(ta)
   135  	ref.echo.Close(tb, 0, 0)
   136  
   137  	ref.bmw.Write(tb)
   138  	ref.bmw.Close(ta, 0, 0)
   139  
   140  	ref.jhash.Write(ta)
   141  	ref.jhash.Close(tb, 0, 0)
   142  	ref.groest.Write(tb)
   143  	ref.groest.Close(ta, 0, 0)
   144  	ref.luffa.Write(ta)
   145  	ref.luffa.Close(tb, 0, 0)
   146  
   147  	ref.skein.Write(tb)
   148  	ref.skein.Close(ta, 0, 0)
   149  	ref.simd.Write(ta)
   150  	ref.simd.Close(tb, 0, 0)
   151  	ref.keccak.Write(tb)
   152  	ref.keccak.Close(ta, 0, 0)
   153  
   154  	ref.shavite.Write(ta)
   155  	ref.shavite.Close(tb, 0, 0)
   156  
   157  	copy(dst, tb)
   158  }