internal/builtin.go | 7 +++++-- internal/common.go | 2 +- internal/shake.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ internal/thirdparty.go | 16 +--------------- diff --git a/internal/builtin.go b/internal/builtin.go index 1f1de2c4f93740d9156dff69e6df54f69bbaac2148a3b99ef0635ef8aee29b02..2e22a4aead60baacc3425d50ac65d95a90fa2efc8fa39743020e87a29b061f12 100644 --- a/internal/builtin.go +++ b/internal/builtin.go @@ -17,6 +17,7 @@ package internal import ( "crypto/sha256" + "crypto/sha3" "crypto/sha512" "encoding/hex" "hash" @@ -27,8 +28,10 @@ const BuiltinCmd = "builtin" 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" ) diff --git a/internal/common.go b/internal/common.go index 803dc32d61b387390a13e76f7959f11d9d844177007bd7c22e068c0b92dcaf4f..8c4925490cf9ebe294269215049d6e7cd6c51b561bd8f0ba7f8ea58f4ed19b0b 100644 --- a/internal/common.go +++ b/internal/common.go @@ -21,7 +21,7 @@ "runtime" ) const ( - Generator = "meta4ra/0.10.0" + Generator = "meta4ra/0.11.0" SigMediaTypePGP = "application/pgp-signature" SigMediaTypeSSH = "application/ssh-signature" BufLen = 1 << 20 diff --git a/internal/shake.go b/internal/shake.go new file mode 100644 index 0000000000000000000000000000000000000000..7f00b2d55eb127847023649c21653c44a59c0b7c0547c7e36545cf930f2c3281 --- /dev/null +++ b/internal/shake.go @@ -0,0 +1,50 @@ +// meta4ra -- Metalink 4.0 utilities +// Copyright (C) 2021-2025 Sergey Matveev +// +// 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 . + +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...) +} diff --git a/internal/thirdparty.go b/internal/thirdparty.go index 764645ec3d520545d9b20b66f92e4496eeefd9ac215f7660114f34aac87dbfc3..77f0e0e606eba02c5caf9912c4c40649a87f7601725d58bc9be05ede2735e148 100644 --- a/internal/thirdparty.go +++ b/internal/thirdparty.go @@ -24,25 +24,11 @@ "github.com/dchest/skein" "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) }