From dec51d950f22add35fc2c63b76f154e7c927db51 Mon Sep 17 00:00:00 2001 From: Matt Dainty Date: Sat, 30 Mar 2024 08:51:39 +0000 Subject: [PATCH 1/3] test: Add AES password benchmark --- reader_test.go | 42 +++++++++++++++++++++++------------------- testdata/aes7z.7z | Bin 0 -> 36552 bytes 2 files changed, 23 insertions(+), 19 deletions(-) create mode 100644 testdata/aes7z.7z diff --git a/reader_test.go b/reader_test.go index 8ba9436..578a19d 100644 --- a/reader_test.go +++ b/reader_test.go @@ -362,13 +362,13 @@ func benchmarkArchiveNaiveParallel(b *testing.B, file string, workers int) { } } -func benchmarkArchive(b *testing.B, file string, optimised bool) { +func benchmarkArchive(b *testing.B, file, password string, optimised bool) { b.Helper() h := crc32.NewIEEE() for n := 0; n < b.N; n++ { - r, err := sevenzip.OpenReader(filepath.Join("testdata", file)) + r, err := sevenzip.OpenReaderWithPassword(filepath.Join("testdata", file), password) if err != nil { b.Fatal(err) } @@ -382,56 +382,60 @@ func benchmarkArchive(b *testing.B, file string, optimised bool) { } } +func BenchmarkAES7z(b *testing.B) { + benchmarkArchive(b, "aes7z.7z", "password", true) +} + func BenchmarkBzip2(b *testing.B) { - benchmarkArchive(b, "bzip2.7z", true) + benchmarkArchive(b, "bzip2.7z", "", true) } func BenchmarkCopy(b *testing.B) { - benchmarkArchive(b, "copy.7z", true) + benchmarkArchive(b, "copy.7z", "", true) } func BenchmarkDeflate(b *testing.B) { - benchmarkArchive(b, "deflate.7z", true) + benchmarkArchive(b, "deflate.7z", "", true) } func BenchmarkDelta(b *testing.B) { - benchmarkArchive(b, "delta.7z", true) + benchmarkArchive(b, "delta.7z", "", true) } func BenchmarkLZMA(b *testing.B) { - benchmarkArchive(b, "lzma.7z", true) + benchmarkArchive(b, "lzma.7z", "", true) } func BenchmarkLZMA2(b *testing.B) { - benchmarkArchive(b, "lzma2.7z", true) + benchmarkArchive(b, "lzma2.7z", "", true) } func BenchmarkBCJ2(b *testing.B) { - benchmarkArchive(b, "bcj2.7z", true) + benchmarkArchive(b, "bcj2.7z", "", true) } func BenchmarkComplex(b *testing.B) { - benchmarkArchive(b, "lzma1900.7z", true) + benchmarkArchive(b, "lzma1900.7z", "", true) } func BenchmarkLZ4(b *testing.B) { - benchmarkArchive(b, "lz4.7z", true) + benchmarkArchive(b, "lz4.7z", "", true) } func BenchmarkBrotli(b *testing.B) { - benchmarkArchive(b, "brotli.7z", true) + benchmarkArchive(b, "brotli.7z", "", true) } func BenchmarkZstandard(b *testing.B) { - benchmarkArchive(b, "zstd.7z", true) + benchmarkArchive(b, "zstd.7z", "", true) } func BenchmarkNaiveReader(b *testing.B) { - benchmarkArchive(b, "lzma1900.7z", false) + benchmarkArchive(b, "lzma1900.7z", "", false) } func BenchmarkOptimisedReader(b *testing.B) { - benchmarkArchive(b, "lzma1900.7z", true) + benchmarkArchive(b, "lzma1900.7z", "", true) } func BenchmarkNaiveParallelReader(b *testing.B) { @@ -447,17 +451,17 @@ func BenchmarkParallelReader(b *testing.B) { } func BenchmarkBCJ(b *testing.B) { - benchmarkArchive(b, "bcj.7z", true) + benchmarkArchive(b, "bcj.7z", "", true) } func BenchmarkPPC(b *testing.B) { - benchmarkArchive(b, "ppc.7z", true) + benchmarkArchive(b, "ppc.7z", "", true) } func BenchmarkARM(b *testing.B) { - benchmarkArchive(b, "arm.7z", true) + benchmarkArchive(b, "arm.7z", "", true) } func BenchmarkSPARC(b *testing.B) { - benchmarkArchive(b, "sparc.7z", true) + benchmarkArchive(b, "sparc.7z", "", true) } diff --git a/testdata/aes7z.7z b/testdata/aes7z.7z new file mode 100644 index 0000000000000000000000000000000000000000..3f4b3e9439c4635370c6a2f1ca852b770595f68c GIT binary patch literal 36552 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 Q41q?14hjLvq%DO20LW!t8UO$Q literal 0 HcmV?d00001 From 38c694496afbc6f978eb869965b51d9d50e43b7d Mon Sep 17 00:00:00 2001 From: Matt Dainty Date: Mon, 1 Apr 2024 23:35:16 +0100 Subject: [PATCH 2/3] perf: Add AES key caching --- go.mod | 1 + go.sum | 2 ++ internal/aes7z/key.go | 41 ++++++++++++++++++++++++++++++++++++++-- internal/aes7z/reader.go | 7 ++++++- 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b6d447e..5895b4a 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/bodgit/plumbing v1.3.0 github.com/bodgit/windows v1.0.1 github.com/hashicorp/go-multierror v1.1.1 + github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/klauspost/compress v1.17.7 github.com/pierrec/lz4/v4 v4.1.21 github.com/stretchr/testify v1.9.0 diff --git a/go.sum b/go.sum index 07f3f9d..13955a0 100644 --- a/go.sum +++ b/go.sum @@ -66,6 +66,8 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= diff --git a/internal/aes7z/key.go b/internal/aes7z/key.go index 2ff37e7..cdcf151 100644 --- a/internal/aes7z/key.go +++ b/internal/aes7z/key.go @@ -4,12 +4,47 @@ import ( "bytes" "crypto/sha256" "encoding/binary" + "encoding/hex" + lru "github.com/hashicorp/golang-lru/v2" + "go4.org/syncutil" "golang.org/x/text/encoding/unicode" "golang.org/x/text/transform" ) -func calculateKey(password string, cycles int, salt []byte) []byte { +type cacheKey struct { + password string + cycles int + salt string // []byte isn't comparable +} + +const cacheSize = 10 + +//nolint:gochecknoglobals +var ( + once syncutil.Once + cache *lru.Cache[cacheKey, []byte] +) + +func calculateKey(password string, cycles int, salt []byte) ([]byte, error) { + if err := once.Do(func() (err error) { + cache, err = lru.New[cacheKey, []byte](cacheSize) + + return + }); err != nil { + return nil, err + } + + ck := cacheKey{ + password: password, + cycles: cycles, + salt: hex.EncodeToString(salt), + } + + if key, ok := cache.Get(ck); ok { + return key, nil + } + b := bytes.NewBuffer(salt) // Convert password to UTF-16LE @@ -30,5 +65,7 @@ func calculateKey(password string, cycles int, salt []byte) []byte { copy(key, h.Sum(nil)) } - return key + _ = cache.Add(ck, key) + + return key, nil } diff --git a/internal/aes7z/reader.go b/internal/aes7z/reader.go index 4d0d30c..760db29 100644 --- a/internal/aes7z/reader.go +++ b/internal/aes7z/reader.go @@ -29,7 +29,12 @@ func (rc *readCloser) Close() error { } func (rc *readCloser) Password(p string) error { - block, err := aes.NewCipher(calculateKey(p, rc.cycles, rc.salt)) + key, err := calculateKey(p, rc.cycles, rc.salt) + if err != nil { + return err + } + + block, err := aes.NewCipher(key) if err != nil { return err } From df6194b7557bdc21cee370123da10613f6b5c214 Mon Sep 17 00:00:00 2001 From: Matt Dainty Date: Mon, 1 Apr 2024 23:46:33 +0100 Subject: [PATCH 3/3] style: Lint fixes --- internal/zstd/reader.go | 1 + reader.go | 4 +++- reader_test.go | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/internal/zstd/reader.go b/internal/zstd/reader.go index 89f3993..0d68a3c 100644 --- a/internal/zstd/reader.go +++ b/internal/zstd/reader.go @@ -52,6 +52,7 @@ func NewReader(_ []byte, _ uint64, readers []io.ReadCloser) (io.ReadCloser, erro if r, err = zstd.NewReader(readers[0]); err != nil { return nil, err } + runtime.SetFinalizer(r, (*zstd.Decoder).Close) } diff --git a/reader.go b/reader.go index 8f586dd..6a2fdf8 100644 --- a/reader.go +++ b/reader.go @@ -544,7 +544,7 @@ func toValidName(name string) string { return p } -//nolint:cyclop +//nolint:cyclop,funlen func (z *Reader) initFileList() { z.fileListOnce.Do(func() { files := make(map[string]int) @@ -583,12 +583,14 @@ func (z *Reader) initFileList() { isDir: isDir, } z.fileList = append(z.fileList, entry) + if isDir { knownDirs[name] = idx } else { files[name] = idx } } + for dir := range dirs { if _, ok := knownDirs[dir]; !ok { if idx, ok := files[dir]; ok { diff --git a/reader_test.go b/reader_test.go index 578a19d..5b259d4 100644 --- a/reader_test.go +++ b/reader_test.go @@ -188,6 +188,7 @@ func TestOpenReader(t *testing.T) { t.Run(table.name, func(t *testing.T) { t.Parallel() + r, err := sevenzip.OpenReader(filepath.Join("testdata", table.file)) if err != nil { assert.ErrorIs(t, err, table.err) @@ -243,6 +244,7 @@ func TestOpenReaderWithPassword(t *testing.T) { t.Run(table.name, func(t *testing.T) { t.Parallel() + r, err := sevenzip.OpenReaderWithPassword(filepath.Join("testdata", table.file), table.password) if err != nil { t.Fatal(err)