46 lines
655 B
Go
46 lines
655 B
Go
|
package cpio
|
||
|
|
||
|
import (
|
||
|
"encoding/binary"
|
||
|
"hash"
|
||
|
)
|
||
|
|
||
|
type digest struct {
|
||
|
sum uint32
|
||
|
}
|
||
|
|
||
|
// NewHash returns a new hash.Hash32 computing the SVR4 checksum.
|
||
|
func NewHash() hash.Hash32 {
|
||
|
return &digest{}
|
||
|
}
|
||
|
|
||
|
func (d *digest) Write(p []byte) (n int, err error) {
|
||
|
for _, b := range p {
|
||
|
d.sum += uint32(b & 0xFF)
|
||
|
}
|
||
|
|
||
|
return len(p), nil
|
||
|
}
|
||
|
|
||
|
func (d *digest) Sum(b []byte) []byte {
|
||
|
out := [4]byte{}
|
||
|
binary.LittleEndian.PutUint32(out[:], d.sum)
|
||
|
return append(b, out[:]...)
|
||
|
}
|
||
|
|
||
|
func (d *digest) Sum32() uint32 {
|
||
|
return d.sum
|
||
|
}
|
||
|
|
||
|
func (d *digest) Reset() {
|
||
|
d.sum = 0
|
||
|
}
|
||
|
|
||
|
func (d *digest) Size() int {
|
||
|
return 4
|
||
|
}
|
||
|
|
||
|
func (d *digest) BlockSize() int {
|
||
|
return 1
|
||
|
}
|