Speedup of about 1.4x on x64. Added benchmarks that use the ShakeHash interface, which doesn't require copying the state. Unaligned or generic xorIn and copyOut functions chosen via buildline, but both are tested. Substantial contributions from Eric Eisner. See golang.org/cl/151630044 for the previous CR. (There are also some minor edits/additions to the documentation.) Change-Id: I9500c25682457c82487512b9b8c66df7d75bff5d Reviewed-on: https://go-review.googlesource.com/2132 Reviewed-by: Adam Langley <agl@golang.org>
59 lines
1.0 KiB
Go
59 lines
1.0 KiB
Go
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build amd64 386
|
|
// +build !appengine
|
|
|
|
package sha3
|
|
|
|
import "unsafe"
|
|
|
|
func xorInUnaligned(d *state, buf []byte) {
|
|
bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0]))
|
|
n := len(buf)
|
|
if n >= 72 {
|
|
d.a[0] ^= bw[0]
|
|
d.a[1] ^= bw[1]
|
|
d.a[2] ^= bw[2]
|
|
d.a[3] ^= bw[3]
|
|
d.a[4] ^= bw[4]
|
|
d.a[5] ^= bw[5]
|
|
d.a[6] ^= bw[6]
|
|
d.a[7] ^= bw[7]
|
|
d.a[8] ^= bw[8]
|
|
}
|
|
if n >= 104 {
|
|
d.a[9] ^= bw[9]
|
|
d.a[10] ^= bw[10]
|
|
d.a[11] ^= bw[11]
|
|
d.a[12] ^= bw[12]
|
|
}
|
|
if n >= 136 {
|
|
d.a[13] ^= bw[13]
|
|
d.a[14] ^= bw[14]
|
|
d.a[15] ^= bw[15]
|
|
d.a[16] ^= bw[16]
|
|
}
|
|
if n >= 144 {
|
|
d.a[17] ^= bw[17]
|
|
}
|
|
if n >= 168 {
|
|
d.a[18] ^= bw[18]
|
|
d.a[19] ^= bw[19]
|
|
d.a[20] ^= bw[20]
|
|
}
|
|
}
|
|
|
|
func copyOutUnaligned(d *state, buf []byte) {
|
|
ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0]))
|
|
copy(buf, ab[:])
|
|
}
|
|
|
|
var (
|
|
xorIn = xorInUnaligned
|
|
copyOut = copyOutUnaligned
|
|
)
|
|
|
|
const xorImplementationUnaligned = "unaligned"
|