]> Sergey Matveev's repositories - meta4ra.git/commitdiff
SHAKE it
authorSergey Matveev <stargrave@stargrave.org>
Fri, 14 Apr 2023 10:28:30 +0000 (13:28 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Fri, 14 Apr 2023 10:28:30 +0000 (13:28 +0300)
cmd/meta4-create/main.go
common.go
go.mod
go.sum

index f14ed7ce2ca17b7b07a8a4842cdcbd00bd19b2c9..1c799af9bbe1d3c7e8cfb6d865b5cc9b8f6e21fc 100644 (file)
@@ -36,6 +36,7 @@ import (
        "go.cypherpunks.ru/gogost/v5/gost34112012256"
        "go.cypherpunks.ru/gogost/v5/gost34112012512"
        "go.stargrave.org/meta4ra"
+       "golang.org/x/crypto/sha3"
 )
 
 type MultiHasher struct {
@@ -43,6 +44,8 @@ type MultiHasher struct {
        sha512h      hash.Hash
        streebog256h hash.Hash
        streebog512h hash.Hash
+       shake128h    sha3.ShakeHash
+       shake256h    sha3.ShakeHash
        g            sync.WaitGroup
 }
 
@@ -52,11 +55,13 @@ func NewMultiHasher() *MultiHasher {
                sha512h:      sha512.New(),
                streebog256h: gost34112012256.New(),
                streebog512h: gost34112012512.New(),
+               shake128h:    sha3.NewShake128(),
+               shake256h:    sha3.NewShake256(),
        }
 }
 
 func (h *MultiHasher) Write(p []byte) (n int, err error) {
-       h.g.Add(4)
+       h.g.Add(6)
        go func() {
                if _, err := h.sha256h.Write(p); err != nil {
                        panic(err)
@@ -81,6 +86,18 @@ func (h *MultiHasher) Write(p []byte) (n int, err error) {
                }
                h.g.Done()
        }()
+       go func() {
+               if _, err := h.shake128h.Write(p); err != nil {
+                       panic(err)
+               }
+               h.g.Done()
+       }()
+       go func() {
+               if _, err := h.shake256h.Write(p); err != nil {
+                       panic(err)
+               }
+               h.g.Done()
+       }()
        h.g.Wait()
        return len(p), nil
 }
@@ -107,6 +124,14 @@ func main() {
        if err != nil {
                log.Fatalln(err)
        }
+       shake128 := make([]byte, 32)
+       if _, err = io.ReadFull(h.shake128h, shake128); err != nil {
+               panic(err)
+       }
+       shake256 := make([]byte, 64)
+       if _, err = io.ReadFull(h.shake256h, shake256); err != nil {
+               panic(err)
+       }
        f := meta4ra.File{
                Name:        path.Base(*fn),
                Description: *desc,
@@ -117,6 +142,8 @@ func main() {
                        {Type: meta4ra.HashSHA512, Hash: hex.EncodeToString(h.sha512h.Sum(nil))},
                        {Type: meta4ra.HashStreebog256, Hash: hex.EncodeToString(h.streebog256h.Sum(nil))},
                        {Type: meta4ra.HashStreebog512, Hash: hex.EncodeToString(h.streebog512h.Sum(nil))},
+                       {Type: meta4ra.HashSHAKE128, Hash: hex.EncodeToString(shake128)},
+                       {Type: meta4ra.HashSHAKE256, Hash: hex.EncodeToString(shake256)},
                },
        }
        if *sig != "" {
index 3eed481d5392f092aeb56a43187ec90bbe0afb1d..f8d8a45fe31238a397bcc65c41737c3552193397 100644 (file)
--- a/common.go
+++ b/common.go
@@ -30,6 +30,8 @@ const (
        HashSHA512      = "sha-512"
        HashStreebog256 = "streebog-256"
        HashStreebog512 = "streebog-512"
+       HashSHAKE128    = "shake128"
+       HashSHAKE256    = "shake256"
 )
 
 type Metalink struct {
diff --git a/go.mod b/go.mod
index e57add08d2f046812a2421d995722ecb476053ac..19e71d867487eef9413c6663a5eec6c485550277 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -2,4 +2,9 @@ module go.stargrave.org/meta4ra
 
 go 1.20
 
-require go.cypherpunks.ru/gogost/v5 v5.10.0
+require (
+       go.cypherpunks.ru/gogost/v5 v5.10.0
+       golang.org/x/crypto v0.8.0
+)
+
+require golang.org/x/sys v0.7.0 // indirect
diff --git a/go.sum b/go.sum
index 31d7bc628ca139dcfe03cb7aefc7b6703b1fa8cc..960d8db34a2995dfed86f12f3ff89fe93a96e209 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -1,3 +1,6 @@
 go.cypherpunks.ru/gogost/v5 v5.10.0 h1:2y0Xu17euJiSNsAwmm7/RQhm3R9oRuS5UeTth0uBt/w=
 go.cypherpunks.ru/gogost/v5 v5.10.0/go.mod h1:lq0ROvdwQiQGh44ZqcUDTkzRnkeaJFkd8qdJoJIkcKg=
-golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc=
+golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
+golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
+golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=