newDigestingReader returns an io.Reader implementation with contents of source, which will eventually return a non-EOF error or set validationSucceeded/validationFailed to true if the source stream does/does not match expectedDigest. (neither is set if EOF is never reached).
(source io.Reader, expectedDigest digest.Digest)
| 21 | // or set validationSucceeded/validationFailed to true if the source stream does/does not match expectedDigest. |
| 22 | // (neither is set if EOF is never reached). |
| 23 | func newDigestingReader(source io.Reader, expectedDigest digest.Digest) (*digestingReader, error) { |
| 24 | var digester digest.Digester |
| 25 | if err := expectedDigest.Validate(); err != nil { |
| 26 | return nil, fmt.Errorf("invalid digest specification %q: %w", expectedDigest, err) |
| 27 | } |
| 28 | digestAlgorithm := expectedDigest.Algorithm() |
| 29 | if !digestAlgorithm.Available() { |
| 30 | return nil, fmt.Errorf("invalid digest specification %q: unsupported digest algorithm %q", expectedDigest, digestAlgorithm) |
| 31 | } |
| 32 | digester = digestAlgorithm.Digester() |
| 33 | |
| 34 | return &digestingReader{ |
| 35 | source: source, |
| 36 | digester: digester, |
| 37 | hash: digester.Hash(), |
| 38 | expectedDigest: expectedDigest, |
| 39 | validationFailed: false, |
| 40 | }, nil |
| 41 | } |
| 42 | |
| 43 | func (d *digestingReader) Read(p []byte) (int, error) { |
| 44 | n, err := d.source.Read(p) |
no outgoing calls
searching dependent graphs…