import (
"crypto/sha256"
+ "crypto/sha3"
"crypto/sha512"
"encoding/hex"
"hash"
var (
BuiltinHashes map[string]func() hash.Hash = map[string]func() hash.Hash{
- "sha-256": sha256.New,
- "sha-512": sha512.New,
+ "sha-256": sha256.New,
+ "sha-512": sha512.New,
+ "shake128": func() hash.Hash { return shake{l: 32, h: sha3.NewSHAKE128()} },
+ "shake256": func() hash.Hash { return shake{l: 64, h: sha3.NewSHAKE256()} },
}
HashesDefault = "sha-512:builtin,sha-256:builtin"
)
)
const (
- Generator = "meta4ra/0.10.0"
+ Generator = "meta4ra/0.11.0"
SigMediaTypePGP = "application/pgp-signature"
SigMediaTypeSSH = "application/ssh-signature"
BufLen = 1 << 20
--- /dev/null
+// meta4ra -- Metalink 4.0 utilities
+// Copyright (C) 2021-2025 Sergey Matveev <stargrave@stargrave.org>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+package internal
+
+import (
+ "crypto/sha3"
+ "io"
+)
+
+type shake struct {
+ h *sha3.SHAKE
+ l int
+}
+
+func (h shake) Size() int {
+ return h.l
+}
+
+func (h shake) BlockSize() int {
+ return h.h.BlockSize()
+}
+
+func (h shake) Reset() {
+ h.h.Reset()
+}
+
+func (h shake) Write(p []byte) (int, error) {
+ return h.h.Write(p)
+}
+
+func (h shake) Sum(b []byte) []byte {
+ buf := make([]byte, h.l)
+ if _, err := io.ReadFull(h.h, buf); err != nil {
+ panic(err)
+ }
+ return append(b, buf...)
+}
"go.cypherpunks.su/gogost/v6/gost34112012256"
"go.cypherpunks.su/gogost/v6/gost34112012512"
"golang.org/x/crypto/blake2b"
- "golang.org/x/crypto/sha3"
"lukechampine.com/blake3"
)
func init() {
- // Those are better than SHA2, prepend them
- name := "shake256"
- BuiltinHashes[name] = func() hash.Hash {
- return sha3.NewShake256()
- }
- HashesDefault = name + ":builtin," + HashesDefault
-
- name = "shake128"
- BuiltinHashes[name] = func() hash.Hash {
- return sha3.NewShake128()
- }
- HashesDefault = name + ":builtin," + HashesDefault
-
- name = "skein-512"
+ name := "skein-512"
BuiltinHashes[name] = func() hash.Hash {
return skein.NewHash(64)
}