Experimental: allow analysis of xorIn inside Write to prevent heap escape of parameter p
This commit is contained in:
parent
dde79576dc
commit
04fe7dc643
29
sha3_test.go
29
sha3_test.go
|
@ -32,12 +32,16 @@ const (
|
||||||
// with output-length equal to the KAT length for SHA-3, Keccak
|
// with output-length equal to the KAT length for SHA-3, Keccak
|
||||||
// and SHAKE instances.
|
// and SHAKE instances.
|
||||||
var testDigests = map[string]func() hash.Hash{
|
var testDigests = map[string]func() hash.Hash{
|
||||||
"SHA3-224": New224,
|
"SHA3-224": New224,
|
||||||
"SHA3-256": New256,
|
"SHA3-256": New256,
|
||||||
"SHA3-384": New384,
|
"SHA3-384": New384,
|
||||||
"SHA3-512": New512,
|
"SHA3-512": New512,
|
||||||
"Keccak-256": NewLegacyKeccak256,
|
"Keccak-256": func() hash.Hash {
|
||||||
"Keccak-512": NewLegacyKeccak512,
|
return NewLegacyKeccak256()
|
||||||
|
},
|
||||||
|
"Keccak-512": func() hash.Hash {
|
||||||
|
return NewLegacyKeccak512()
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// testShakes contains functions that return sha3.ShakeHash instances for
|
// testShakes contains functions that return sha3.ShakeHash instances for
|
||||||
|
@ -77,14 +81,15 @@ type KeccakKats struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func testUnalignedAndGeneric(t *testing.T, testf func(impl string)) {
|
func testUnalignedAndGeneric(t *testing.T, testf func(impl string)) {
|
||||||
xorInOrig, copyOutOrig := xorIn, copyOut
|
testf("generic")
|
||||||
|
/*xorInOrig, copyOutOrig := xorIn, copyOut
|
||||||
xorIn, copyOut = xorInGeneric, copyOutGeneric
|
xorIn, copyOut = xorInGeneric, copyOutGeneric
|
||||||
testf("generic")
|
testf("generic")
|
||||||
if xorImplementationUnaligned != "generic" {
|
if xorImplementationUnaligned != "generic" {
|
||||||
xorIn, copyOut = xorInUnaligned, copyOutUnaligned
|
xorIn, copyOut = xorInUnaligned, copyOutUnaligned
|
||||||
testf("unaligned")
|
testf("unaligned")
|
||||||
}
|
}
|
||||||
xorIn, copyOut = xorInOrig, copyOutOrig
|
xorIn, copyOut = xorInOrig, copyOutOrig*/
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestKeccakKats tests the SHA-3 and Shake implementations against all the
|
// TestKeccakKats tests the SHA-3 and Shake implementations against all the
|
||||||
|
@ -166,12 +171,16 @@ func TestKeccak(t *testing.T) {
|
||||||
want string
|
want string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
NewLegacyKeccak256,
|
func() hash.Hash {
|
||||||
|
return NewLegacyKeccak256()
|
||||||
|
},
|
||||||
[]byte("abc"),
|
[]byte("abc"),
|
||||||
"4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45",
|
"4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
NewLegacyKeccak512,
|
func() hash.Hash {
|
||||||
|
return NewLegacyKeccak512()
|
||||||
|
},
|
||||||
[]byte("abc"),
|
[]byte("abc"),
|
||||||
"18587dc2ea106b9a1563e32b3312421ca164c7f1f07bc922a9c83d77cea3a1e5d0c69910739025372dc14ac9642629379540c17e2a65b19d77aa511a9d00bb96",
|
"18587dc2ea106b9a1563e32b3312421ca164c7f1f07bc922a9c83d77cea3a1e5d0c69910739025372dc14ac9642629379540c17e2a65b19d77aa511a9d00bb96",
|
||||||
},
|
},
|
||||||
|
|
5
xor.go
5
xor.go
|
@ -14,8 +14,11 @@ func (b *storageBuf) asBytes() *[maxRate]byte {
|
||||||
return (*[maxRate]byte)(b)
|
return (*[maxRate]byte)(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func xorIn(d *HasherState, buf []byte) {
|
||||||
|
xorInGeneric(d, buf)
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
xorIn = xorInGeneric
|
|
||||||
copyOut = copyOutGeneric
|
copyOut = copyOutGeneric
|
||||||
xorInUnaligned = xorInGeneric
|
xorInUnaligned = xorInGeneric
|
||||||
copyOutUnaligned = copyOutGeneric
|
copyOutUnaligned = copyOutGeneric
|
||||||
|
|
|
@ -8,7 +8,10 @@
|
||||||
|
|
||||||
package sha3
|
package sha3
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
// A storageBuf is an aligned array of maxRate bytes.
|
// A storageBuf is an aligned array of maxRate bytes.
|
||||||
type storageBuf [maxRate / 8]uint64
|
type storageBuf [maxRate / 8]uint64
|
||||||
|
@ -21,37 +24,36 @@ func (b *storageBuf) asBytes() *[maxRate]byte {
|
||||||
// XOR buf.
|
// XOR buf.
|
||||||
func xorInUnaligned(d *HasherState, buf []byte) {
|
func xorInUnaligned(d *HasherState, buf []byte) {
|
||||||
n := len(buf)
|
n := len(buf)
|
||||||
bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0]))[: n/8 : n/8]
|
|
||||||
if n >= 72 {
|
if n >= 72 {
|
||||||
d.a[0] ^= bw[0]
|
d.a[0] ^= binary.LittleEndian.Uint64(buf[8*0:])
|
||||||
d.a[1] ^= bw[1]
|
d.a[1] ^= binary.LittleEndian.Uint64(buf[8*1:])
|
||||||
d.a[2] ^= bw[2]
|
d.a[2] ^= binary.LittleEndian.Uint64(buf[8*2:])
|
||||||
d.a[3] ^= bw[3]
|
d.a[3] ^= binary.LittleEndian.Uint64(buf[8*3:])
|
||||||
d.a[4] ^= bw[4]
|
d.a[4] ^= binary.LittleEndian.Uint64(buf[8*4:])
|
||||||
d.a[5] ^= bw[5]
|
d.a[5] ^= binary.LittleEndian.Uint64(buf[8*5:])
|
||||||
d.a[6] ^= bw[6]
|
d.a[6] ^= binary.LittleEndian.Uint64(buf[8*6:])
|
||||||
d.a[7] ^= bw[7]
|
d.a[7] ^= binary.LittleEndian.Uint64(buf[8*7:])
|
||||||
d.a[8] ^= bw[8]
|
d.a[8] ^= binary.LittleEndian.Uint64(buf[8*8:])
|
||||||
}
|
}
|
||||||
if n >= 104 {
|
if n >= 104 {
|
||||||
d.a[9] ^= bw[9]
|
d.a[9] ^= binary.LittleEndian.Uint64(buf[8*9:])
|
||||||
d.a[10] ^= bw[10]
|
d.a[10] ^= binary.LittleEndian.Uint64(buf[8*10:])
|
||||||
d.a[11] ^= bw[11]
|
d.a[11] ^= binary.LittleEndian.Uint64(buf[8*11:])
|
||||||
d.a[12] ^= bw[12]
|
d.a[12] ^= binary.LittleEndian.Uint64(buf[8*12:])
|
||||||
}
|
}
|
||||||
if n >= 136 {
|
if n >= 136 {
|
||||||
d.a[13] ^= bw[13]
|
d.a[13] ^= binary.LittleEndian.Uint64(buf[8*13:])
|
||||||
d.a[14] ^= bw[14]
|
d.a[14] ^= binary.LittleEndian.Uint64(buf[8*14:])
|
||||||
d.a[15] ^= bw[15]
|
d.a[15] ^= binary.LittleEndian.Uint64(buf[8*15:])
|
||||||
d.a[16] ^= bw[16]
|
d.a[16] ^= binary.LittleEndian.Uint64(buf[8*16:])
|
||||||
}
|
}
|
||||||
if n >= 144 {
|
if n >= 144 {
|
||||||
d.a[17] ^= bw[17]
|
d.a[17] ^= binary.LittleEndian.Uint64(buf[8*17:])
|
||||||
}
|
}
|
||||||
if n >= 168 {
|
if n >= 168 {
|
||||||
d.a[18] ^= bw[18]
|
d.a[18] ^= binary.LittleEndian.Uint64(buf[8*18:])
|
||||||
d.a[19] ^= bw[19]
|
d.a[19] ^= binary.LittleEndian.Uint64(buf[8*19:])
|
||||||
d.a[20] ^= bw[20]
|
d.a[20] ^= binary.LittleEndian.Uint64(buf[8*20:])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,8 +62,11 @@ func copyOutUnaligned(d *HasherState, buf []byte) {
|
||||||
copy(buf, ab[:])
|
copy(buf, ab[:])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func xorIn(d *HasherState, buf []byte) {
|
||||||
|
xorInUnaligned(d, buf)
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
xorIn = xorInUnaligned
|
|
||||||
copyOut = copyOutUnaligned
|
copyOut = copyOutUnaligned
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue