]> Sergey Matveev's repositories - meta4ra.git/blobdiff - cmd/meta4-create/main.go
SHAKE it
[meta4ra.git] / cmd / meta4-create / main.go
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 != "" {