Experimental: allow analysis of xorIn inside Write to prevent heap escape of parameter p

This commit is contained in:
DataHoarder 2023-06-04 11:24:30 +02:00
parent dde79576dc
commit 04fe7dc643
Signed by: DataHoarder
SSH key fingerprint: SHA256:OLTRf6Fl87G52SiR7sWLGNzlJt4WOX+tfI2yxo0z7xk
3 changed files with 52 additions and 35 deletions

View file

@ -32,12 +32,16 @@ const (
// with output-length equal to the KAT length for SHA-3, Keccak
// and SHAKE instances.
var testDigests = map[string]func() hash.Hash{
"SHA3-224": New224,
"SHA3-256": New256,
"SHA3-384": New384,
"SHA3-512": New512,
"Keccak-256": NewLegacyKeccak256,
"Keccak-512": NewLegacyKeccak512,
"SHA3-224": New224,
"SHA3-256": New256,
"SHA3-384": New384,
"SHA3-512": New512,
"Keccak-256": func() hash.Hash {
return NewLegacyKeccak256()
},
"Keccak-512": func() hash.Hash {
return NewLegacyKeccak512()
},
}
// 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)) {
xorInOrig, copyOutOrig := xorIn, copyOut
testf("generic")
/*xorInOrig, copyOutOrig := xorIn, copyOut
xorIn, copyOut = xorInGeneric, copyOutGeneric
testf("generic")
if xorImplementationUnaligned != "generic" {
xorIn, copyOut = xorInUnaligned, copyOutUnaligned
testf("unaligned")
}
xorIn, copyOut = xorInOrig, copyOutOrig
xorIn, copyOut = xorInOrig, copyOutOrig*/
}
// TestKeccakKats tests the SHA-3 and Shake implementations against all the
@ -166,12 +171,16 @@ func TestKeccak(t *testing.T) {
want string
}{
{
NewLegacyKeccak256,
func() hash.Hash {
return NewLegacyKeccak256()
},
[]byte("abc"),
"4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45",
},
{
NewLegacyKeccak512,
func() hash.Hash {
return NewLegacyKeccak512()
},
[]byte("abc"),
"18587dc2ea106b9a1563e32b3312421ca164c7f1f07bc922a9c83d77cea3a1e5d0c69910739025372dc14ac9642629379540c17e2a65b19d77aa511a9d00bb96",
},

5
xor.go
View file

@ -14,8 +14,11 @@ func (b *storageBuf) asBytes() *[maxRate]byte {
return (*[maxRate]byte)(b)
}
func xorIn(d *HasherState, buf []byte) {
xorInGeneric(d, buf)
}
var (
xorIn = xorInGeneric
copyOut = copyOutGeneric
xorInUnaligned = xorInGeneric
copyOutUnaligned = copyOutGeneric

View file

@ -8,7 +8,10 @@
package sha3
import "unsafe"
import (
"encoding/binary"
"unsafe"
)
// A storageBuf is an aligned array of maxRate bytes.
type storageBuf [maxRate / 8]uint64
@ -21,37 +24,36 @@ func (b *storageBuf) asBytes() *[maxRate]byte {
// XOR buf.
func xorInUnaligned(d *HasherState, buf []byte) {
n := len(buf)
bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0]))[: n/8 : n/8]
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]
d.a[0] ^= binary.LittleEndian.Uint64(buf[8*0:])
d.a[1] ^= binary.LittleEndian.Uint64(buf[8*1:])
d.a[2] ^= binary.LittleEndian.Uint64(buf[8*2:])
d.a[3] ^= binary.LittleEndian.Uint64(buf[8*3:])
d.a[4] ^= binary.LittleEndian.Uint64(buf[8*4:])
d.a[5] ^= binary.LittleEndian.Uint64(buf[8*5:])
d.a[6] ^= binary.LittleEndian.Uint64(buf[8*6:])
d.a[7] ^= binary.LittleEndian.Uint64(buf[8*7:])
d.a[8] ^= binary.LittleEndian.Uint64(buf[8*8:])
}
if n >= 104 {
d.a[9] ^= bw[9]
d.a[10] ^= bw[10]
d.a[11] ^= bw[11]
d.a[12] ^= bw[12]
d.a[9] ^= binary.LittleEndian.Uint64(buf[8*9:])
d.a[10] ^= binary.LittleEndian.Uint64(buf[8*10:])
d.a[11] ^= binary.LittleEndian.Uint64(buf[8*11:])
d.a[12] ^= binary.LittleEndian.Uint64(buf[8*12:])
}
if n >= 136 {
d.a[13] ^= bw[13]
d.a[14] ^= bw[14]
d.a[15] ^= bw[15]
d.a[16] ^= bw[16]
d.a[13] ^= binary.LittleEndian.Uint64(buf[8*13:])
d.a[14] ^= binary.LittleEndian.Uint64(buf[8*14:])
d.a[15] ^= binary.LittleEndian.Uint64(buf[8*15:])
d.a[16] ^= binary.LittleEndian.Uint64(buf[8*16:])
}
if n >= 144 {
d.a[17] ^= bw[17]
d.a[17] ^= binary.LittleEndian.Uint64(buf[8*17:])
}
if n >= 168 {
d.a[18] ^= bw[18]
d.a[19] ^= bw[19]
d.a[20] ^= bw[20]
d.a[18] ^= binary.LittleEndian.Uint64(buf[8*18:])
d.a[19] ^= binary.LittleEndian.Uint64(buf[8*19:])
d.a[20] ^= binary.LittleEndian.Uint64(buf[8*20:])
}
}
@ -60,8 +62,11 @@ func copyOutUnaligned(d *HasherState, buf []byte) {
copy(buf, ab[:])
}
func xorIn(d *HasherState, buf []byte) {
xorInUnaligned(d, buf)
}
var (
xorIn = xorInUnaligned
copyOut = copyOutUnaligned
)