]> Sergey Matveev's repositories - meta4ra.git/blob - internal/builtin.go
*-hashes-detect, *-hash, *-check -stdin/-all-hashes, optional builtins
[meta4ra.git] / internal / builtin.go
1 // meta4ra -- Metalink 4.0 utilities
2 // Copyright (C) 2021-2024 Sergey Matveev <stargrave@stargrave.org>
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, version 3 of the License.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16 package internal
17
18 import (
19         "crypto/sha256"
20         "crypto/sha512"
21         "encoding/hex"
22         "hash"
23         "io"
24 )
25
26 const BuiltinCmd = "builtin"
27
28 var (
29         BuiltinHashes map[string]func() hash.Hash = map[string]func() hash.Hash{
30                 "sha-256": sha256.New,
31                 "sha-512": sha512.New,
32         }
33         HashesDefault = "sha-512:builtin,sha-256:builtin"
34 )
35
36 type BuiltinHasher struct {
37         h        hash.Hash
38         finished bool
39 }
40
41 func (h *BuiltinHasher) Write(p []byte) (int, error) {
42         return h.h.Write(p)
43 }
44
45 func (h *BuiltinHasher) Read(p []byte) (int, error) {
46         if h.finished {
47                 return 0, io.EOF
48         }
49         if len(p) < 2*h.h.Size() {
50                 panic("too small buffer for BuiltinHasher.h.Sum()")
51         }
52         hex.Encode(p, h.h.Sum(nil))
53         h.finished = true
54         return hex.EncodedLen(h.h.Size()), nil
55 }
56
57 func (h *BuiltinHasher) Close() error {
58         return nil
59 }