github.com/code-to-go/safepool.lib@v0.0.0-20221205180519-ee25e63c226e/security/hash.go (about) 1 package security 2 3 import ( 4 "hash" 5 "io" 6 "os" 7 8 "github.com/code-to-go/safepool.lib/core" 9 10 "golang.org/x/crypto/blake2b" 11 ) 12 13 //type Hash256 [blake2b.Size256]byte 14 15 type HashStream struct { 16 r io.Reader 17 w io.Writer 18 size int64 19 block hash.Hash 20 } 21 22 func NewHash() hash.Hash { 23 h, err := blake2b.New256(nil) 24 if err != nil { 25 panic(err) 26 } 27 return h 28 } 29 30 func NewHashStream(r io.Reader, w io.Writer) (*HashStream, error) { 31 b, err := blake2b.New256(nil) 32 if core.IsErr(err, "cannot create black hash: %v") { 33 return nil, err 34 } 35 return &HashStream{ 36 block: b, 37 r: r, 38 w: w, 39 }, nil 40 } 41 42 func (s *HashStream) Read(p []byte) (n int, err error) { 43 if s.r == nil { 44 return 0, os.ErrClosed 45 } 46 47 n, err = s.r.Read(p) 48 if err == nil && n > 0 { 49 _, err = s.block.Write(p[0:n]) 50 } 51 s.size += int64(n) 52 return n, err 53 } 54 55 func (s *HashStream) Write(p []byte) (n int, err error) { 56 if s.w == nil { 57 return 0, os.ErrClosed 58 } 59 60 n, err = s.w.Write(p) 61 if err == nil && n > 0 { 62 _, err = s.block.Write(p[0:n]) 63 } 64 s.size += int64(n) 65 return n, err 66 } 67 68 func (s *HashStream) Hash() []byte { 69 return s.block.Sum(nil) 70 } 71 72 func (s *HashStream) Size() int64 { 73 return s.size 74 }