package poseidon import ( "bytes" "errors" "hash" ) type digest 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 &digest{ buf: bytes.NewBuffer([]byte{}), frameSize: frameSize, }, nil } // Write (via the embedded io.Writer interface) adds more data to the running hash. func (d *digest) Write(p []byte) (n int, err error) { return d.buf.Write(p) } // Sum returns the Poseidon checksum of the data. func (d *digest) Sum(b []byte) []byte { hahs, err := HashBytesX(d.buf.Bytes(), d.frameSize) if err != nil { panic(err) } return append(b, hahs.Bytes()...) } // Reset resets the Hash to its initial state. func (d *digest) Reset() { d.buf.Reset() } // Size returns the number of bytes Sum will return. func (d *digest) Size() int { return 32 } // BlockSize returns the hash block size. func (d *digest) BlockSize() int { return spongeChunkSize }