util/sha256.go

164 lines
3.1 KiB
Go
Raw Permalink Normal View History

2021-01-09 22:59:27 +08:00
package util
import (
2024-01-23 23:02:08 +08:00
"crypto/sha256"
"encoding/hex"
"errors"
"hash"
"io"
"os"
"path/filepath"
"strings"
2021-01-09 22:59:27 +08:00
)
2024-01-18 22:34:19 +08:00
const SHA256ResultLength = 32
type SHA256Result struct {
2024-01-23 23:02:08 +08:00
result [SHA256ResultLength]byte
err error
2024-01-18 22:34:19 +08:00
}
func (s *SHA256Result) Array() [SHA256ResultLength]byte {
2024-02-19 16:46:42 +08:00
if s.err != nil {
return [SHA256ResultLength]byte{}
}
2024-01-23 23:02:08 +08:00
return s.result
2024-01-18 22:34:19 +08:00
}
func (s *SHA256Result) Slice() []byte {
2024-02-19 16:46:42 +08:00
if s.err != nil {
return []byte{}
}
2024-01-23 23:02:08 +08:00
return s.result[:]
2024-01-18 22:34:19 +08:00
}
func (s *SHA256Result) Upper() string {
2024-02-19 16:46:42 +08:00
if s.err != nil {
return ""
}
2024-01-23 23:02:08 +08:00
return strings.ToUpper(hex.EncodeToString(s.result[:]))
2024-01-18 22:34:19 +08:00
}
func (s *SHA256Result) Lower() string {
2024-02-19 16:46:42 +08:00
if s.err != nil {
return ""
}
2024-01-23 23:02:08 +08:00
return strings.ToLower(hex.EncodeToString(s.result[:]))
2024-01-18 22:34:19 +08:00
}
func (s *SHA256Result) Error() error {
2024-01-23 23:02:08 +08:00
return s.err
2024-01-18 22:34:19 +08:00
}
func NewSHA256Result(result []byte, err error) *SHA256Result {
2024-01-23 23:02:08 +08:00
res := &SHA256Result{
result: [SHA256ResultLength]byte{},
err: err,
}
copy(res.result[:], result)
return res
2024-01-18 22:34:19 +08:00
}
type SHA256 struct{}
2024-01-19 10:48:33 +08:00
func NewSHA256() *SHA256 {
2024-01-23 23:02:08 +08:00
return &SHA256{}
2024-01-19 10:48:33 +08:00
}
func (s *SHA256) FromReader(r io.Reader) *SHA256Result {
2024-01-23 23:02:08 +08:00
ha := sha256.New()
if _, err := io.Copy(ha, r); err != nil {
return NewSHA256Result(nil, err)
}
hashInBytes := ha.Sum(nil)
if len(hashInBytes) != SHA256ResultLength {
return NewSHA256Result(nil, errors.New("wrong length"))
}
return NewSHA256Result(hashInBytes, nil)
2024-01-18 22:34:19 +08:00
}
2024-01-23 21:12:04 +08:00
func (s *SHA256) FromFile(filename string) *SHA256Result {
2024-01-23 23:02:08 +08:00
file, err := os.Open(filepath.Clean(filename))
if err != nil {
return NewSHA256Result(nil, err)
}
defer func() {
_ = file.Close()
}()
return s.FromReader(file)
2024-01-18 22:34:19 +08:00
}
2024-01-19 10:48:33 +08:00
func (s *SHA256) FromReaderChunk(r io.Reader, chunksize int) *SHA256Result {
2024-01-23 23:02:08 +08:00
buf := make([]byte, chunksize)
s1 := sha256.New()
var n int
var err error
for {
n, err = r.Read(buf)
if err != nil {
if err != io.EOF {
return NewSHA256Result(nil, err)
}
if n > 0 {
_, err = s1.Write(buf[:n])
if err != nil {
return NewSHA256Result(nil, err)
}
}
break
}
_, err = s1.Write(buf[:n])
if err != nil {
return NewSHA256Result(nil, err)
}
}
return NewSHA256Result(s1.Sum(nil), nil)
2024-01-19 01:36:33 +08:00
}
2024-01-23 21:12:04 +08:00
func (s *SHA256) FromFileChunk(filename string, chunksize int) *SHA256Result {
2024-01-23 23:02:08 +08:00
file, err := os.Open(filepath.Clean(filename))
if err != nil {
return NewSHA256Result(nil, err)
}
defer func() {
_ = file.Close()
}()
return s.FromReaderChunk(file, chunksize)
2024-01-18 22:34:19 +08:00
}
2024-01-19 10:48:33 +08:00
func (s *SHA256) FromBytes(b []byte) *SHA256Result {
2024-01-23 23:02:08 +08:00
res := sha256.Sum256(b)
return NewSHA256Result(res[:], nil)
2024-01-18 22:34:19 +08:00
}
2024-01-19 10:48:33 +08:00
func (s *SHA256) FromString(str string) *SHA256Result {
2024-01-23 23:02:08 +08:00
res := sha256.Sum256([]byte(str))
return NewSHA256Result(res[:], nil)
2024-01-18 22:34:19 +08:00
}
type SHA256Pip struct {
2024-01-23 23:02:08 +08:00
sha256 hash.Hash
2024-01-18 22:34:19 +08:00
}
func NewSHA256Pip() *SHA256Pip {
2024-01-23 23:02:08 +08:00
return &SHA256Pip{sha256: sha256.New()}
2024-01-18 22:34:19 +08:00
}
2024-01-19 01:36:33 +08:00
func (s *SHA256Pip) Write(data []byte) (n int, err error) {
2024-01-23 23:02:08 +08:00
return s.sha256.Write(data)
2024-01-19 01:36:33 +08:00
}
func (s *SHA256Pip) WriteBytes(data []byte) error {
2024-01-23 23:02:08 +08:00
_, err := s.Write(data)
return err
2024-01-18 22:34:19 +08:00
}
func (s *SHA256Pip) WriteString(data string) error {
2024-01-23 23:02:08 +08:00
_, err := s.Write([]byte(data))
return err
2024-01-18 22:34:19 +08:00
}
func (s *SHA256Pip) Result() *SHA256Result {
2024-01-23 23:02:08 +08:00
return NewSHA256Result(s.sha256.Sum(nil), nil)
2021-01-09 22:59:27 +08:00
}