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 }