12 // Sorted by preference order.
13 var HashesDefault = []string{
17 "shake128:goshake128",
18 "shake256:goshake256",
21 "streebog-256:streebog256sum",
22 "streebog-512:streebog512sum",
33 func NewHasher(hashes string) *Hasher {
35 for _, hc := range strings.Split(hashes, ",") {
36 cols := strings.SplitN(hc, ":", 2)
37 name, cmdline := cols[0], cols[1]
38 cmd := exec.Command(cmdline)
39 in, err := cmd.StdinPipe()
43 out, err := cmd.StdoutPipe()
47 h.Names = append(h.Names, name)
48 h.Ins = append(h.Ins, in)
49 h.Outs = append(h.Outs, out)
50 h.Cmds = append(h.Cmds, cmd)
55 func (h *Hasher) Start() {
56 for _, cmd := range h.Cmds {
57 if err := cmd.Start(); err != nil {
63 func (h *Hasher) Write(p []byte) (n int, err error) {
64 h.wg.Add(len(h.Names))
65 for _, in := range h.Ins {
66 go func(in io.WriteCloser) {
67 if _, err := io.Copy(in, bytes.NewReader(p)); err != nil {
77 func (h *Hasher) Sums() []Hash {
78 sums := make([]Hash, 0, len(h.Names))
79 for i, name := range h.Names {
80 if err := h.Ins[i].Close(); err != nil {
83 dgst, err := io.ReadAll(h.Outs[i])
87 sums = append(sums, Hash{Type: name, Hash: string(dgst[:len(dgst)-1])})
88 if err = h.Cmds[i].Wait(); err != nil {