github.com/ethereumproject/go-ethereum@v5.5.2+incompatible/crypto/sha3/xor_unaligned.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build amd64 386 6 // +build !appengine 7 8 package sha3 9 10 import "unsafe" 11 12 func xorInUnaligned(d *state, buf []byte) { 13 bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0])) 14 n := len(buf) 15 if n >= 72 { 16 d.a[0] ^= bw[0] 17 d.a[1] ^= bw[1] 18 d.a[2] ^= bw[2] 19 d.a[3] ^= bw[3] 20 d.a[4] ^= bw[4] 21 d.a[5] ^= bw[5] 22 d.a[6] ^= bw[6] 23 d.a[7] ^= bw[7] 24 d.a[8] ^= bw[8] 25 } 26 if n >= 104 { 27 d.a[9] ^= bw[9] 28 d.a[10] ^= bw[10] 29 d.a[11] ^= bw[11] 30 d.a[12] ^= bw[12] 31 } 32 if n >= 136 { 33 d.a[13] ^= bw[13] 34 d.a[14] ^= bw[14] 35 d.a[15] ^= bw[15] 36 d.a[16] ^= bw[16] 37 } 38 if n >= 144 { 39 d.a[17] ^= bw[17] 40 } 41 if n >= 168 { 42 d.a[18] ^= bw[18] 43 d.a[19] ^= bw[19] 44 d.a[20] ^= bw[20] 45 } 46 } 47 48 func copyOutUnaligned(d *state, buf []byte) { 49 ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0])) 50 copy(buf, ab[:]) 51 } 52 53 var ( 54 xorIn = xorInUnaligned 55 copyOut = copyOutUnaligned 56 ) 57 58 const xorImplementationUnaligned = "unaligned"