| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package s3crypto
- import (
- "crypto/md5"
- "crypto/sha256"
- "hash"
- "io"
- )
- // hashReader is used for calculating SHA256 when following the sigv4 specification.
- // Additionally this used for calculating the unencrypted MD5.
- type hashReader interface {
- GetValue() []byte
- GetContentLength() int64
- }
- type sha256Writer struct {
- sha256 []byte
- hash hash.Hash
- out io.Writer
- }
- func newSHA256Writer(f io.Writer) *sha256Writer {
- return &sha256Writer{hash: sha256.New(), out: f}
- }
- func (r *sha256Writer) Write(b []byte) (int, error) {
- r.hash.Write(b)
- return r.out.Write(b)
- }
- func (r *sha256Writer) GetValue() []byte {
- return r.hash.Sum(nil)
- }
- type md5Reader struct {
- contentLength int64
- hash hash.Hash
- body io.Reader
- }
- func newMD5Reader(body io.Reader) *md5Reader {
- return &md5Reader{hash: md5.New(), body: body}
- }
- func (w *md5Reader) Read(b []byte) (int, error) {
- n, err := w.body.Read(b)
- if err != nil && err != io.EOF {
- return n, err
- }
- w.contentLength += int64(n)
- w.hash.Write(b[:n])
- return n, err
- }
- func (w *md5Reader) GetValue() []byte {
- return w.hash.Sum(nil)
- }
- func (w *md5Reader) GetContentLength() int64 {
- return w.contentLength
- }
|