From: Sergey Matveev Date: Thu, 13 Apr 2023 14:42:17 +0000 (+0300) Subject: GOST Streebog hash algorithms support X-Git-Tag: v0.1.0~9 X-Git-Url: http://www.git.stargrave.org/?p=meta4ra.git;a=commitdiff_plain;h=1efa4b2c0439a7f041a619d99e9b18c6a4045979 GOST Streebog hash algorithms support --- diff --git a/cmd/meta4-create/main.go b/cmd/meta4-create/main.go index 0d54569..2c3a5ff 100644 --- a/cmd/meta4-create/main.go +++ b/cmd/meta4-create/main.go @@ -25,15 +25,66 @@ import ( "encoding/hex" "encoding/xml" "flag" + "hash" "io" "log" "os" "path/filepath" + "sync" "time" + "go.cypherpunks.ru/gogost/v5/gost34112012256" + "go.cypherpunks.ru/gogost/v5/gost34112012512" "go.stargrave.org/meta4ra" ) +type MultiHasher struct { + sha256h hash.Hash + sha512h hash.Hash + streebog256h hash.Hash + streebog512h hash.Hash + g sync.WaitGroup +} + +func NewMultiHasher() *MultiHasher { + return &MultiHasher{ + sha256h: sha256.New(), + sha512h: sha512.New(), + streebog256h: gost34112012256.New(), + streebog512h: gost34112012512.New(), + } +} + +func (h *MultiHasher) Write(p []byte) (n int, err error) { + h.g.Add(4) + go func() { + if _, err := h.sha256h.Write(p); err != nil { + panic(err) + } + h.g.Done() + }() + go func() { + if _, err := h.sha512h.Write(p); err != nil { + panic(err) + } + h.g.Done() + }() + go func() { + if _, err := h.streebog256h.Write(p); err != nil { + panic(err) + } + h.g.Done() + }() + go func() { + if _, err := h.streebog512h.Write(p); err != nil { + panic(err) + } + h.g.Done() + }() + h.g.Wait() + return len(p), nil +} + func main() { file := flag.String("file", "", "Path to file") mtime := flag.String("mtime", "", "Take that file's mtime as a Published date") @@ -54,13 +105,9 @@ func main() { if err != nil { log.Fatalln(err) } - sha256Hasher := sha256.New() - sha512Hasher := sha512.New() - _, err = io.Copy( - io.MultiWriter(sha256Hasher, sha512Hasher), - bufio.NewReader(fd), - ) - if err != nil { + buf := make([]byte, 1<<20) + h := NewMultiHasher() + if _, err = io.CopyBuffer(h, bufio.NewReader(fd), buf); err != nil { log.Fatalln(err) } f := meta4ra.File{ @@ -69,8 +116,10 @@ func main() { Size: uint64(fi.Size()), URLs: urls, Hashes: []meta4ra.Hash{ - {Type: meta4ra.HashSHA256, Hash: hex.EncodeToString(sha256Hasher.Sum(nil))}, - {Type: meta4ra.HashSHA512, Hash: hex.EncodeToString(sha512Hasher.Sum(nil))}, + {Type: meta4ra.HashSHA256, Hash: hex.EncodeToString(h.sha256h.Sum(nil))}, + {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))}, }, } if *sig != "" { diff --git a/common.go b/common.go index 2160928..3eed481 100644 --- a/common.go +++ b/common.go @@ -24,10 +24,12 @@ import ( ) const ( - Generator = "meta4ra/0.1.0" + Generator = "meta4ra/0.2.0" GPGSigMediaType = "application/pgp-signature" HashSHA256 = "sha-256" HashSHA512 = "sha-512" + HashStreebog256 = "streebog-256" + HashStreebog512 = "streebog-512" ) type Metalink struct { diff --git a/go.mod b/go.mod index 1191e6f..e57add0 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module go.stargrave.org/meta4ra -go 1.17 +go 1.20 + +require go.cypherpunks.ru/gogost/v5 v5.10.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..31d7bc6 --- /dev/null +++ b/go.sum @@ -0,0 +1,3 @@ +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=