|
|
package poseidon
import ( "bytes" "errors" "hash" )
type hasher struct { buf *bytes.Buffer frameSize int }
// Sum returns the Poseidon hash of the input bytes.
// use frame size of 16 inputs by default
func Sum(b []byte) []byte { h, _ := New(16) h.Write(b) return h.Sum(nil) }
// New returns a new hash.Hash computing the Poseidon hash.
func New(frameSize int) (hash.Hash, error) { if frameSize < 2 || frameSize > 16 { return nil, errors.New("incorrect frame size") } return &hasher{ buf: bytes.NewBuffer([]byte{}), frameSize: frameSize, }, nil }
// Write (via the embedded io.Writer interface) adds more data to the running hash.
func (h *hasher) Write(p []byte) (n int, err error) { return h.buf.Write(p) }
// Sum returns the Poseidon digest of the data.
func (h *hasher) Sum(b []byte) []byte { hahs, err := HashBytesX(h.buf.Bytes(), h.frameSize) if err != nil { panic(err) } return append(b, hahs.Bytes()...) }
// Reset resets the Hash to its initial state.
func (h *hasher) Reset() { h.buf.Reset() }
// Size returns the number of bytes Sum will return.
func (h *hasher) Size() int { return 32 }
// BlockSize returns the hash block size.
func (h *hasher) BlockSize() int { return spongeChunkSize }
|