Files
golib/encoding/sha256/model.go
Nicolas JUHEL 6e49a0bd4a Package Encoding:
- interface Coder: replace all return io.reader/io.writer to same io interface but with closer implementation
- interface Coder: add Reset function to free memory
- add sha256: add new sub package that implement coder interface to calculate checksum (no decode available)

Other:
- bump dependencies
2025-03-14 14:57:58 +01:00

160 lines
3.1 KiB
Go

/*
* MIT License
*
* Copyright (c) 2023 Nicolas JUHEL
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*
*/
package sha256
import (
"fmt"
"hash"
"io"
)
type crt struct {
hsh hash.Hash
}
func (o *crt) Encode(p []byte) []byte {
if o.hsh == nil {
return make([]byte, 0)
}
if len(p) > 0 {
if _, e := o.hsh.Write(p); e != nil {
return make([]byte, 0)
}
}
if q := o.hsh.Sum(nil); len(q) < 1 {
return make([]byte, 0)
} else {
return q[:]
}
}
func (o *crt) Decode(p []byte) ([]byte, error) {
return nil, fmt.Errorf("unexpected call function")
}
func (o *crt) EncodeReader(r io.Reader) io.ReadCloser {
f := func(p []byte) (n int, err error) {
n, err = r.Read(p)
if n > 0 && o.hsh != nil {
o.hsh.Write(p[0:n])
}
return n, err
}
c := func() error {
if rc, ok := r.(io.Closer); ok {
return rc.Close()
} else {
return nil
}
}
return &reader{f: f, c: c}
}
func (o *crt) DecodeReader(r io.Reader) io.ReadCloser {
return nil
}
func (o *crt) EncodeWriter(w io.Writer) io.WriteCloser {
f := func(p []byte) (n int, err error) {
n, err = w.Write(p)
if n > 0 && o.hsh != nil {
o.hsh.Write(p[0:n])
}
return n, err
}
c := func() error {
if wc, ok := w.(io.Closer); ok {
return wc.Close()
} else {
return nil
}
}
return &writer{f: f, c: c}
}
func (o *crt) DecodeWriter(w io.Writer) io.WriteCloser {
return nil
}
func (o *crt) Reset() {
if o.hsh != nil {
o.hsh.Reset()
}
}
type reader struct {
f func(p []byte) (n int, err error)
c func() error
}
func (r *reader) Read(p []byte) (n int, err error) {
if r.f == nil {
return 0, fmt.Errorf("invalid reader")
} else {
return r.f(p)
}
}
func (r *reader) Close() error {
if r.c == nil {
return fmt.Errorf("invalid closer")
} else {
return r.c()
}
}
type writer struct {
f func(p []byte) (n int, err error)
c func() error
}
func (r *writer) Write(p []byte) (n int, err error) {
if r.f == nil {
return 0, fmt.Errorf("invalid writer")
} else {
return r.f(p)
}
}
func (r *writer) Close() error {
if r.c == nil {
return fmt.Errorf("invalid closer")
} else {
return r.c()
}
}