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>
29 lines
680 B
Go
29 lines
680 B
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.
|
|
|
|
package sha3
|
|
|
|
import "encoding/binary"
|
|
|
|
// xorInGeneric xors the bytes in buf into the state; it
|
|
// makes no non-portable assumptions about memory layout
|
|
// or alignment.
|
|
func xorInGeneric(d *state, buf []byte) {
|
|
n := len(buf) / 8
|
|
|
|
for i := 0; i < n; i++ {
|
|
a := binary.LittleEndian.Uint64(buf)
|
|
d.a[i] ^= a
|
|
buf = buf[8:]
|
|
}
|
|
}
|
|
|
|
// copyOutGeneric copies ulint64s to a byte buffer.
|
|
func copyOutGeneric(d *state, b []byte) {
|
|
for i := 0; len(b) >= 8; i++ {
|
|
binary.LittleEndian.PutUint64(b, d.a[i])
|
|
b = b[8:]
|
|
}
|
|
}
|