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  }