git.gammaspectra.live/P2Pool/consensus@v0.0.0-20240403173234-a039820b20c9/monero/crypto/pool.go (about) 1 package crypto 2 3 import ( 4 "git.gammaspectra.live/P2Pool/consensus/types" 5 "git.gammaspectra.live/P2Pool/edwards25519" 6 "git.gammaspectra.live/P2Pool/sha3" 7 "runtime" 8 "sync" 9 ) 10 11 var hasherPool, pointPool, scalarPool sync.Pool 12 13 func init() { 14 hasherPool.New = func() any { 15 return sha3.NewLegacyKeccak256() 16 } 17 pointPool.New = func() any { 18 p := new(edwards25519.Point) 19 runtime.SetFinalizer(p, PutEdwards25519Point) 20 return p 21 } 22 scalarPool.New = func() any { 23 s := new(edwards25519.Scalar) 24 runtime.SetFinalizer(s, PutEdwards25519Scalar) 25 return s 26 } 27 } 28 29 func GetKeccak256Hasher() *sha3.HasherState { 30 return hasherPool.Get().(*sha3.HasherState) 31 } 32 33 func PutKeccak256Hasher(h *sha3.HasherState) { 34 h.Reset() 35 hasherPool.Put(h) 36 } 37 38 func PooledKeccak256(data ...[]byte) (result types.Hash) { 39 h := GetKeccak256Hasher() 40 defer PutKeccak256Hasher(h) 41 for _, b := range data { 42 _, _ = h.Write(b) 43 } 44 HashFastSum(h, result[:]) 45 return 46 } 47 48 func GetEdwards25519Point() *edwards25519.Point { 49 return pointPool.Get().(*edwards25519.Point) 50 } 51 52 func PutEdwards25519Point(p *edwards25519.Point) { 53 pointPool.Put(p) 54 } 55 56 func GetEdwards25519Scalar() *edwards25519.Scalar { 57 return scalarPool.Get().(*edwards25519.Scalar) 58 } 59 60 func PutEdwards25519Scalar(s *edwards25519.Scalar) { 61 scalarPool.Put(s) 62 }