diff --git a/cmd/cmd-close.go b/cmd/cmd-close.go
index 62e7e2f..e35a20a 100644
--- a/cmd/cmd-close.go
+++ b/cmd/cmd-close.go
@@ -3,7 +3,7 @@ package main
 import (
 	"errors"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"os"
 	"strings"
 
@@ -89,9 +89,9 @@ var (
 			// load file
 			var data []byte
 			if filename == "-" {
-				data, err = ioutil.ReadAll(os.Stdin)
+				data, err = io.ReadAll(os.Stdin)
 			} else {
-				data, err = ioutil.ReadFile(filename)
+				data, err = os.ReadFile(filename)
 			}
 			if err != nil {
 				return err
diff --git a/cmd/cmd-open.go b/cmd/cmd-open.go
index edf3ecf..4fdadc0 100644
--- a/cmd/cmd-open.go
+++ b/cmd/cmd-open.go
@@ -4,7 +4,6 @@ import (
 	"errors"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"os"
 	"strings"
 
@@ -79,9 +78,9 @@ var (
 			// load file
 			var data []byte
 			if filename == "-" {
-				data, err = ioutil.ReadAll(os.Stdin)
+				data, err = io.ReadAll(os.Stdin)
 			} else {
-				data, err = ioutil.ReadFile(filename)
+				data, err = os.ReadFile(filename)
 			}
 			if err != nil {
 				return err
diff --git a/cmd/cmd-verify.go b/cmd/cmd-verify.go
index 061dcf6..bd0401f 100644
--- a/cmd/cmd-verify.go
+++ b/cmd/cmd-verify.go
@@ -3,8 +3,8 @@ package main
 import (
 	"errors"
 	"fmt"
+	"io"
 	"io/fs"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"strings"
@@ -185,9 +185,9 @@ func verifyLetter(filename string, silent bool) (signedBy []string, err error) {
 	// load file
 	var data []byte
 	if filename == "-" {
-		data, err = ioutil.ReadAll(os.Stdin)
+		data, err = io.ReadAll(os.Stdin)
 	} else {
-		data, err = ioutil.ReadFile(filename)
+		data, err = os.ReadFile(filename)
 	}
 	if err != nil {
 		return nil, err
diff --git a/cmd/main.go b/cmd/main.go
index b603063..ef46179 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -16,7 +16,6 @@ import (
 const (
 	stdInOutFilename    = "-"
 	letterFileExtension = ".letter"
-	sigFileExtension    = ".sig"
 
 	warnFileSize = 12000000 // 120MB
 )
diff --git a/core_test.go b/core_test.go
index 045abd3..ea07472 100644
--- a/core_test.go
+++ b/core_test.go
@@ -225,10 +225,8 @@ func TestCoreAllCombinations(t *testing.T) {
 	t.Logf("of these, %d were successfully detected as invalid", combinationsDetectedInvalid)
 }
 
-func testStorage(t *testing.T, suite *Suite) (detectedInvalid bool) {
-	t.Helper()
-
-	// t.Logf("testing storage with %s", suite.ID)
+func testStorage(t *testing.T, suite *Suite) (detectedInvalid bool) { //nolint:thelper
+	t.Logf("testing storage with %s", suite.ID)
 
 	e, err := setupEnvelopeAndTrustStore(t, suite)
 	if err != nil {
@@ -404,9 +402,7 @@ func setupEnvelopeAndTrustStore(t *testing.T, suite *Suite) (*Envelope, error) {
 	}
 
 	// check if we are missing key derivation - this is only ok if we are merely signing
-	if !keyDerPresent &&
-		(len(e.suite.Provides.all) != 1 ||
-			!e.suite.Provides.Has(SenderAuthentication)) {
+	if !keyDerPresent && len(e.Senders) != len(e.suite.Tools) {
 		return nil, testInvalidToolset(e, "omitting a key derivation tool is only allowed when merely signing")
 	}
 
@@ -514,9 +510,10 @@ func getOrMakeSignet(t *testing.T, tool tools.ToolLogic, recipient bool, signetI
 }
 
 // generateCombinations returns all possible combinations of the given []string slice.
-//   Forked from https://github.com/mxschmitt/golang-combinations/blob/a887187146560effd2677e987b069262f356297f/combinations.go
-//   Copyright (c) 2018 Max Schmitt,
-//   MIT License.
+//
+//	Forked from https://github.com/mxschmitt/golang-combinations/blob/a887187146560effd2677e987b069262f356297f/combinations.go
+//	Copyright (c) 2018 Max Schmitt,
+//	MIT License.
 func generateCombinations(set []string) (subsets [][]string) {
 	length := uint(len(set))
 
diff --git a/filesig/helpers.go b/filesig/helpers.go
index 0037a9c..90e7918 100644
--- a/filesig/helpers.go
+++ b/filesig/helpers.go
@@ -3,7 +3,6 @@ package filesig
 import (
 	"errors"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"strings"
 
@@ -51,7 +50,7 @@ func SignFile(dataFilePath, signatureFilePath string, metaData map[string]string
 		return nil, fmt.Errorf("failed to sign file: %w", err)
 	}
 
-	sigFileData, err := ioutil.ReadFile(signatureFilePath)
+	sigFileData, err := os.ReadFile(signatureFilePath)
 	var newSigFileData []byte
 	switch {
 	case err == nil:
@@ -71,7 +70,7 @@ func SignFile(dataFilePath, signatureFilePath string, metaData map[string]string
 	}
 
 	// Write the signature to file.
-	if err := ioutil.WriteFile(signatureFilePath, newSigFileData, 0o0644); err != nil { //nolint:gosec
+	if err := os.WriteFile(signatureFilePath, newSigFileData, 0o0644); err != nil { //nolint:gosec
 		return nil, fmt.Errorf("failed to write signature to file: %w", err)
 	}
 
@@ -86,7 +85,7 @@ func VerifyFile(dataFilePath, signatureFilePath string, metaData map[string]stri
 	var lastErr error
 
 	// Read signature from file.
-	sigFileData, err := ioutil.ReadFile(signatureFilePath)
+	sigFileData, err := os.ReadFile(signatureFilePath)
 	if err != nil {
 		return nil, fmt.Errorf("failed to read signature file: %w", err)
 	}
diff --git a/import_export.go b/import_export.go
index 86de909..84eccdd 100644
--- a/import_export.go
+++ b/import_export.go
@@ -7,6 +7,7 @@ import (
 	"strings"
 )
 
+// Keywords and Prefixes for the export text format.
 const (
 	ExportSenderKeyword = "sender"
 	ExportSenderPrefix  = "sender:"
diff --git a/lhash/labeledhash.go b/lhash/labeledhash.go
index b395b5a..68e5475 100644
--- a/lhash/labeledhash.go
+++ b/lhash/labeledhash.go
@@ -36,7 +36,7 @@ func Digest(alg Algorithm, data []byte) *LabeledHash {
 // DigestFile creates a new labeled hash and digests the given file.
 func DigestFile(alg Algorithm, pathToFile string) (*LabeledHash, error) {
 	// Open file that should be hashed.
-	file, err := os.OpenFile(pathToFile, os.O_RDONLY, 0)
+	file, err := os.Open(pathToFile)
 	if err != nil {
 		return nil, fmt.Errorf("failed to open file: %w", err)
 	}
@@ -181,7 +181,7 @@ func (lh *LabeledHash) Matches(data []byte) bool {
 }
 
 // MatchesData returns true if the digest of the given data matches the hash.
-// DEPRECATED: Use Matches instead.
+// Deprecated: Use Matches instead.
 func (lh *LabeledHash) MatchesData(data []byte) bool {
 	return lh.Equal(Digest(lh.alg, data))
 }
diff --git a/truststores/io.go b/truststores/io.go
index 1c795d5..8ccff5e 100644
--- a/truststores/io.go
+++ b/truststores/io.go
@@ -2,7 +2,6 @@ package truststores
 
 import (
 	"errors"
-	"io/ioutil"
 	"os"
 
 	"github.com/safing/jess"
@@ -27,7 +26,7 @@ func WriteSignetToFile(signet *jess.Signet, filename string) error {
 	}
 
 	// write
-	err = ioutil.WriteFile(filename, data, 0o0600)
+	err = os.WriteFile(filename, data, 0o0600)
 	if err != nil {
 		return err
 	}
@@ -37,7 +36,7 @@ func WriteSignetToFile(signet *jess.Signet, filename string) error {
 
 // LoadSignetFromFile loads a signet from the given filepath.
 func LoadSignetFromFile(filename string) (*jess.Signet, error) {
-	data, err := ioutil.ReadFile(filename)
+	data, err := os.ReadFile(filename)
 	if err != nil {
 		if os.IsNotExist(err) {
 			return nil, jess.ErrSignetNotFound
@@ -72,7 +71,7 @@ func WriteEnvelopeToFile(envelope *jess.Envelope, filename string) error {
 	}
 
 	// write to storage
-	err = ioutil.WriteFile(filename, data, 0600) //nolint:gofumpt // gofumpt is ignorant of octal numbers.
+	err = os.WriteFile(filename, data, 0600) //nolint:gofumpt // gofumpt is ignorant of octal numbers.
 	if err != nil {
 		return err
 	}
@@ -82,7 +81,7 @@ func WriteEnvelopeToFile(envelope *jess.Envelope, filename string) error {
 
 // LoadEnvelopeFromFile loads an envelope from the given filepath.
 func LoadEnvelopeFromFile(filename string) (*jess.Envelope, error) {
-	data, err := ioutil.ReadFile(filename)
+	data, err := os.ReadFile(filename)
 	if err != nil {
 		if os.IsNotExist(err) {
 			return nil, jess.ErrEnvelopeNotFound