From e30fb3873f83925ad6a9c653cbd93dd5edb3e3ee Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 30 Sep 2024 16:19:57 -0700 Subject: [PATCH 1/4] Adding semgrepignore to also analyse test files. --- .github/workflows/semgrep.yml | 7 +++---- .semgrepignore | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 .semgrepignore diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml index 4090692f..2250f98d 100644 --- a/.github/workflows/semgrep.yml +++ b/.github/workflows/semgrep.yml @@ -1,13 +1,12 @@ on: pull_request: {} workflow_dispatch: {} - push: + push: branches: - main - - master schedule: - cron: '0 0 * * *' -name: Semgrep config +name: Semgrep jobs: semgrep: name: semgrep/ci @@ -21,4 +20,4 @@ jobs: image: semgrep/semgrep steps: - uses: actions/checkout@v4 - - run: semgrep ci + - run: semgrep ci --verbose diff --git a/.semgrepignore b/.semgrepignore new file mode 100644 index 00000000..bb0224d5 --- /dev/null +++ b/.semgrepignore @@ -0,0 +1 @@ +.github/ From 12a9881e302c47346a9169b6cb82285b2124c632 Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 7 Oct 2024 15:59:31 -0700 Subject: [PATCH 2/4] Bump to go1.22 inner files and ci jobs. --- .github/workflows/ci-actions.yml | 16 ++++++++-------- go.mod | 2 +- pke/kyber/internal/common/asm/go.mod | 6 +++--- pke/kyber/internal/common/asm/go.sum | 8 ++++---- sign/dilithium/internal/common/asm/go.mod | 6 +++--- sign/dilithium/internal/common/asm/go.sum | 8 ++++---- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci-actions.yml b/.github/workflows/ci-actions.yml index 0c024234..a1105bf1 100644 --- a/.github/workflows/ci-actions.yml +++ b/.github/workflows/ci-actions.yml @@ -13,14 +13,14 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - GOVER: ['1.22', '1.21'] + GOVER: ['1.23', '1.22'] steps: + - name: Checkout + uses: actions/checkout@v4 - name: Setup Go-${{ matrix.GOVER }} uses: actions/setup-go@v5 with: go-version: ${{ matrix.GOVER }} - - name: Checkout - uses: actions/checkout@v4 - name: Linting uses: golangci/golangci-lint-action@v4 with: @@ -47,7 +47,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - CFG: [[arm64, arm64v8, '1.22']] + CFG: [[arm64, arm64v8, '1.23']] steps: - uses: actions/checkout@v4 - name: Enabling Docker Experimental @@ -72,7 +72,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.22' + go-version: '1.23' - name: Build as Static run: make circl_static - name: Build as Plugin @@ -88,7 +88,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.22' + go-version: '1.23' - name: Produce Coverage run: go test -coverprofile=./coverage.txt ./... - name: Upload Codecov @@ -110,7 +110,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.22' + go-version: '1.23' - name: Building run: go build -v ./... - name: Testing @@ -129,7 +129,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.22' + go-version: '1.23' - name: Initialize CodeQL uses: github/codeql-action/init@v3 with: diff --git a/go.mod b/go.mod index c58932dc..0340ede9 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/cloudflare/circl -go 1.21 +go 1.22.0 require ( github.com/bwesterb/go-ristretto v1.2.3 diff --git a/pke/kyber/internal/common/asm/go.mod b/pke/kyber/internal/common/asm/go.mod index ed620578..12eece75 100644 --- a/pke/kyber/internal/common/asm/go.mod +++ b/pke/kyber/internal/common/asm/go.mod @@ -1,15 +1,15 @@ module github.com/cloudflare/circl/pke/kyber/internal/common/asm -go 1.21 +go 1.22.0 require ( - github.com/cloudflare/circl v1.3.7 + github.com/cloudflare/circl v1.4.0 github.com/mmcloughlin/avo v0.6.0 ) require ( golang.org/x/mod v0.14.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/tools v0.16.1 // indirect ) replace github.com/cloudflare/circl => ../../../../../ diff --git a/pke/kyber/internal/common/asm/go.sum b/pke/kyber/internal/common/asm/go.sum index d9b5c0cf..483bba88 100644 --- a/pke/kyber/internal/common/asm/go.sum +++ b/pke/kyber/internal/common/asm/go.sum @@ -2,7 +2,7 @@ github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= diff --git a/sign/dilithium/internal/common/asm/go.mod b/sign/dilithium/internal/common/asm/go.mod index 5638957e..3f9a8a6d 100644 --- a/sign/dilithium/internal/common/asm/go.mod +++ b/sign/dilithium/internal/common/asm/go.mod @@ -1,15 +1,15 @@ module github.com/cloudflare/circl/sign/dilithium/internal/common/asm -go 1.21 +go 1.22.0 require ( - github.com/cloudflare/circl v1.3.7 + github.com/cloudflare/circl v1.4.0 github.com/mmcloughlin/avo v0.6.0 ) require ( golang.org/x/mod v0.14.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/tools v0.16.1 // indirect ) replace github.com/cloudflare/circl => ../../../../../ diff --git a/sign/dilithium/internal/common/asm/go.sum b/sign/dilithium/internal/common/asm/go.sum index d9b5c0cf..483bba88 100644 --- a/sign/dilithium/internal/common/asm/go.sum +++ b/sign/dilithium/internal/common/asm/go.sum @@ -2,7 +2,7 @@ github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= From 49369bdbb6e7ef78cdd470ab2aabbb34b356987d Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 30 Sep 2024 16:25:12 -0700 Subject: [PATCH 3/4] Updates golangci-lint to v1.61.0 and fixes code. --- .github/workflows/ci-actions.yml | 6 +++--- .etc/golangci.yml => .golangci.yaml | 13 ++++++++----- abe/cpabe/tkn20/internal/dsl/lexer.go | 3 ++- group/group_test.go | 1 - group/hash_test.go | 1 - internal/test/test.go | 2 +- kem/frodo/kat_test.go | 1 - kem/kyber/kat_test.go | 1 - kem/schemes/schemes_test.go | 4 ---- math/wnaf_test.go | 2 -- oprf/vectors_test.go | 2 +- pke/kyber/internal/common/poly_test.go | 2 -- pki/pki_test.go | 1 - sign/ed448/ed448.go | 2 +- sign/schemes/schemes_test.go | 4 ---- 15 files changed, 16 insertions(+), 29 deletions(-) rename .etc/golangci.yml => .golangci.yaml (89%) diff --git a/.github/workflows/ci-actions.yml b/.github/workflows/ci-actions.yml index a1105bf1..88869975 100644 --- a/.github/workflows/ci-actions.yml +++ b/.github/workflows/ci-actions.yml @@ -22,10 +22,10 @@ jobs: with: go-version: ${{ matrix.GOVER }} - name: Linting - uses: golangci/golangci-lint-action@v4 + uses: golangci/golangci-lint-action@v6 with: - version: v1.56.2 - args: --config=./.etc/golangci.yml ./... + version: v1.61.0 + install-mode: goinstall - name: Check shadowing run: | go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow@latest diff --git a/.etc/golangci.yml b/.golangci.yaml similarity index 89% rename from .etc/golangci.yml rename to .golangci.yaml index 386ef278..06402465 100644 --- a/.etc/golangci.yml +++ b/.golangci.yaml @@ -12,11 +12,12 @@ linters: # - structcheck (deprecated since v1.49.0) # - varcheck (deprecated since v1.49.0) # - deadcode (deprecated since v1.49.0) + # - exportloopref (deprecated since v1.60.2) - bodyclose + - copyloopvar - depguard - dogsled - errcheck - - exportloopref - forbidigo - funlen - goconst @@ -56,15 +57,17 @@ linters-settings: goconst: min-occurrences: 4 govet: - check-shadowing: true + enable-all: true + disable: + - fieldalignment staticcheck: # TODO: replace deprecated elliptic.Marshal, elliptic.GenerateKey, # elliptic.Unmarshal, params.ScalarBaseMult before re-enabling SA1019. checks: ["*", "-SA1019"] + gosec: + excludes: + - G115 issues: max-issues-per-linter: 0 max-same-issues: 0 - -output: - format: github-actions diff --git a/abe/cpabe/tkn20/internal/dsl/lexer.go b/abe/cpabe/tkn20/internal/dsl/lexer.go index 43c19d97..be648ef7 100644 --- a/abe/cpabe/tkn20/internal/dsl/lexer.go +++ b/abe/cpabe/tkn20/internal/dsl/lexer.go @@ -1,6 +1,7 @@ package dsl import ( + "errors" "fmt" "strings" ) @@ -58,7 +59,7 @@ func (l *Lexer) scanTokens() error { } l.addToken(EOF) if l.hadError { - return fmt.Errorf(strings.TrimSpace(errMsg)) + return errors.New(strings.TrimSpace(errMsg)) } return nil } diff --git a/group/group_test.go b/group/group_test.go index ee7e2505..b48cd507 100644 --- a/group/group_test.go +++ b/group/group_test.go @@ -20,7 +20,6 @@ var allGroups = []group.Group{ func TestGroup(t *testing.T) { const testTimes = 1 << 7 for _, g := range allGroups { - g := g n := g.(fmt.Stringer).String() t.Run(n+"/Add", func(tt *testing.T) { testAdd(tt, testTimes, g) }) t.Run(n+"/Neg", func(tt *testing.T) { testNeg(tt, testTimes, g) }) diff --git a/group/hash_test.go b/group/hash_test.go index 51b44ad7..1e784e9e 100644 --- a/group/hash_test.go +++ b/group/hash_test.go @@ -115,7 +115,6 @@ type vector struct { func BenchmarkHash(b *testing.B) { for _, g := range allGroups { - g := g name := g.(fmt.Stringer).String() b.Run(name+"/HashToElement", func(b *testing.B) { for i := 0; i < b.N; i++ { diff --git a/internal/test/test.go b/internal/test/test.go index 576211a9..9ba73dd7 100644 --- a/internal/test/test.go +++ b/internal/test/test.go @@ -16,7 +16,7 @@ func ReportError(t testing.TB, got, want interface{}, inputs ...interface{}) { } fmt.Fprintf(b, "got: %v\nwant: %v", got, want) t.Helper() - t.Fatalf(b.String()) + t.Fatal(b.String()) } // CheckOk fails the test if result == false. diff --git a/kem/frodo/kat_test.go b/kem/frodo/kat_test.go index 61b0aae2..c4694c8d 100644 --- a/kem/frodo/kat_test.go +++ b/kem/frodo/kat_test.go @@ -23,7 +23,6 @@ func TestPQCgenKATKem(t *testing.T) { {"FrodoKEM-640-SHAKE", "604a10cfc871dfaed9cb5b057c644ab03b16852cea7f39bc7f9831513b5b1cfa"}, } for _, kat := range kats { - kat := kat t.Run(kat.name, func(t *testing.T) { testPQCgenKATKem(t, kat.name, kat.want) }) diff --git a/kem/kyber/kat_test.go b/kem/kyber/kat_test.go index 5b6d39e8..08726cd7 100644 --- a/kem/kyber/kat_test.go +++ b/kem/kyber/kat_test.go @@ -31,7 +31,6 @@ func TestPQCgenKATKem(t *testing.T) { {"ML-KEM-1024", "3fba7327d0320cb6134badf2a1bcb963a5b3c0026c7dece8f00d6a6155e47b33"}, } for _, kat := range kats { - kat := kat t.Run(kat.name, func(t *testing.T) { testPQCgenKATKem(t, kat.name, kat.want) }) diff --git a/kem/schemes/schemes_test.go b/kem/schemes/schemes_test.go index 88a02f31..d9caf70a 100644 --- a/kem/schemes/schemes_test.go +++ b/kem/schemes/schemes_test.go @@ -17,7 +17,6 @@ func TestCaseSensitivity(t *testing.T) { func BenchmarkGenerateKeyPair(b *testing.B) { allSchemes := schemes.All() for _, scheme := range allSchemes { - scheme := scheme b.Run(scheme.Name(), func(b *testing.B) { for i := 0; i < b.N; i++ { _, _, _ = scheme.GenerateKeyPair() @@ -29,7 +28,6 @@ func BenchmarkGenerateKeyPair(b *testing.B) { func BenchmarkEncapsulate(b *testing.B) { allSchemes := schemes.All() for _, scheme := range allSchemes { - scheme := scheme pk, _, _ := scheme.GenerateKeyPair() b.Run(scheme.Name(), func(b *testing.B) { for i := 0; i < b.N; i++ { @@ -42,7 +40,6 @@ func BenchmarkEncapsulate(b *testing.B) { func BenchmarkDecapsulate(b *testing.B) { allSchemes := schemes.All() for _, scheme := range allSchemes { - scheme := scheme pk, sk, _ := scheme.GenerateKeyPair() ct, _, _ := scheme.Encapsulate(pk) b.Run(scheme.Name(), func(b *testing.B) { @@ -56,7 +53,6 @@ func BenchmarkDecapsulate(b *testing.B) { func TestApi(t *testing.T) { allSchemes := schemes.All() for _, scheme := range allSchemes { - scheme := scheme t.Run(scheme.Name(), func(t *testing.T) { if scheme == nil { t.Fatal() diff --git a/math/wnaf_test.go b/math/wnaf_test.go index d397b064..ad33d20b 100644 --- a/math/wnaf_test.go +++ b/math/wnaf_test.go @@ -63,7 +63,6 @@ func BenchmarkOmegaNAF(b *testing.B) { Two128.Lsh(Two128, 128) for w := uint(2); w < 6; w++ { - w := w // pin variable b.Run(fmt.Sprintf("%v", w), func(b *testing.B) { x, _ := rand.Int(rand.Reader, Two128) b.ResetTimer() @@ -79,7 +78,6 @@ func BenchmarkOmegaNAFRegular(b *testing.B) { Two128.Lsh(Two128, 128) for w := uint(2); w < 6; w++ { - w := w // pin variable b.Run(fmt.Sprintf("%v", w), func(b *testing.B) { x, _ := rand.Int(rand.Reader, Two128) x.SetBit(x, 0, uint(1)) // odd-numbers diff --git a/oprf/vectors_test.go b/oprf/vectors_test.go index 774dc50f..2293049e 100644 --- a/oprf/vectors_test.go +++ b/oprf/vectors_test.go @@ -245,7 +245,7 @@ func TestVectors(t *testing.T) { for i := range v { suite, err := GetSuite(v[i].Identifier) if err != nil { - t.Logf(v[i].Identifier + " not supported yet") + t.Log(v[i].Identifier + " not supported yet") continue } t.Run(fmt.Sprintf("%v/Mode%v", suite, v[i].Mode), v[i].test) diff --git a/pke/kyber/internal/common/poly_test.go b/pke/kyber/internal/common/poly_test.go index 350bef96..cc305d73 100644 --- a/pke/kyber/internal/common/poly_test.go +++ b/pke/kyber/internal/common/poly_test.go @@ -44,7 +44,6 @@ func TestDecompressMessage(t *testing.T) { func TestCompress(t *testing.T) { for _, d := range []int{4, 5, 10, 11} { - d := d t.Run(fmt.Sprintf("d=%d", d), func(t *testing.T) { var p, q Poly bound := (Q + (1 << uint(d))) >> uint(d+1) @@ -351,7 +350,6 @@ func (p *Poly) OldCompressTo(m []byte, d int) { func TestCompressFullInputFirstCoeff(t *testing.T) { for _, d := range []int{4, 5, 10, 11} { - d := d t.Run(fmt.Sprintf("d=%d", d), func(t *testing.T) { var p, q Poly bound := (Q + (1 << uint(d))) >> uint(d+1) diff --git a/pki/pki_test.go b/pki/pki_test.go index 7412dd0a..64b43759 100644 --- a/pki/pki_test.go +++ b/pki/pki_test.go @@ -9,7 +9,6 @@ import ( func TestPEM(t *testing.T) { for _, scheme := range schemes.All() { - scheme := scheme t.Run(scheme.Name(), func(t *testing.T) { if scheme == nil { t.Fatal() diff --git a/sign/ed448/ed448.go b/sign/ed448/ed448.go index 324bd8f3..c368b181 100644 --- a/sign/ed448/ed448.go +++ b/sign/ed448/ed448.go @@ -206,7 +206,7 @@ func newKeyFromSeed(privateKey, seed []byte) { func signAll(signature []byte, privateKey PrivateKey, message, ctx []byte, preHash bool) { if len(ctx) > ContextMaxSize { - panic(fmt.Errorf("ed448: bad context length: " + strconv.Itoa(len(ctx)))) + panic(fmt.Errorf("ed448: bad context length: %v", len(ctx))) } H := sha3.NewShake256() diff --git a/sign/schemes/schemes_test.go b/sign/schemes/schemes_test.go index 2d8e8651..dfa044d7 100644 --- a/sign/schemes/schemes_test.go +++ b/sign/schemes/schemes_test.go @@ -17,7 +17,6 @@ func TestCaseSensitivity(t *testing.T) { func TestApi(t *testing.T) { allSchemes := schemes.All() for _, scheme := range allSchemes { - scheme := scheme t.Run(scheme.Name(), func(t *testing.T) { if scheme == nil { t.Fatal() @@ -122,7 +121,6 @@ func Example() { func BenchmarkGenerateKeyPair(b *testing.B) { allSchemes := schemes.All() for _, scheme := range allSchemes { - scheme := scheme b.Run(scheme.Name(), func(b *testing.B) { for i := 0; i < b.N; i++ { _, _, _ = scheme.GenerateKey() @@ -136,7 +134,6 @@ func BenchmarkSign(b *testing.B) { opts := &sign.SignatureOpts{} for _, scheme := range allSchemes { msg := []byte(fmt.Sprintf("Signing with %s", scheme.Name())) - scheme := scheme _, sk, _ := scheme.GenerateKey() b.Run(scheme.Name(), func(b *testing.B) { for i := 0; i < b.N; i++ { @@ -151,7 +148,6 @@ func BenchmarkVerify(b *testing.B) { opts := &sign.SignatureOpts{} for _, scheme := range allSchemes { msg := []byte(fmt.Sprintf("Signing with %s", scheme.Name())) - scheme := scheme pk, sk, _ := scheme.GenerateKey() sig := scheme.Sign(sk, msg, opts) b.Run(scheme.Name(), func(b *testing.B) { From 74f56dad079f950a04face368f56757f4b53303d Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 7 Oct 2024 16:47:11 -0700 Subject: [PATCH 4/4] Reverting arm64 jobs since qemu can't run go1.23 binaries yet. See: https://github.com/golang/go/issues/69259 --- .github/workflows/ci-actions.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-actions.yml b/.github/workflows/ci-actions.yml index 88869975..fd10e7b4 100644 --- a/.github/workflows/ci-actions.yml +++ b/.github/workflows/ci-actions.yml @@ -47,7 +47,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - CFG: [[arm64, arm64v8, '1.23']] + CFG: [[arm64, arm64v8, '1.22']] steps: - uses: actions/checkout@v4 - name: Enabling Docker Experimental @@ -61,7 +61,7 @@ jobs: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - name: Testing run: | - docker run --rm -v `pwd`:`pwd` -w `pwd` ${{matrix.CFG[1]}}/golang:${{matrix.CFG[2]}} go test -v ./... + docker run --rm --platform linux/${{matrix.CFG[0]}} -v `pwd`:`pwd` -w `pwd` ${{matrix.CFG[1]}}/golang:${{matrix.CFG[2]}} go test -v ./... build_modes: needs: [amd64_job] runs-on: ubuntu-22.04