diff --git a/armor.go b/armor.go index 544fcef..c51fe88 100644 --- a/armor.go +++ b/armor.go @@ -5,6 +5,7 @@ package saltpack import ( "bytes" + "errors" "fmt" "io" "strings" @@ -206,11 +207,11 @@ func (s *framedDecoderStream) Read(p []byte) (n int, err error) { if s.state == fdsBody { n, err = s.r.Read(p) - if err == ErrPunctuated { + if errors.Is(err, ErrPunctuated) { err = nil s.state = fdsFooter } - if err == io.EOF { + if errors.Is(err, io.EOF) { err = io.ErrUnexpectedEOF } if err != nil { @@ -241,7 +242,7 @@ func (s *framedDecoderStream) Read(p []byte) (n int, err error) { if s.state == fdsEndOfStream { err = s.consumeUntilEOF() - if err == io.EOF && n > 0 { + if errors.Is(err, io.EOF) && n > 0 { err = nil } } diff --git a/chunk_reader_test.go b/chunk_reader_test.go index 3512f5a..e2ca6c4 100644 --- a/chunk_reader_test.go +++ b/chunk_reader_test.go @@ -57,7 +57,7 @@ func (c exampleChunker) getNextChunk() ([]byte, error) { seqno, err := c.mps.Read(&block) if err != nil { // An EOF here is unexpected. - if err == io.EOF { + if errors.Is(err, io.EOF) { err = io.ErrUnexpectedEOF } return nil, err diff --git a/classify_and_decrypt.go b/classify_and_decrypt.go index 89603ad..f05c7e5 100644 --- a/classify_and_decrypt.go +++ b/classify_and_decrypt.go @@ -5,6 +5,7 @@ package saltpack import ( "bufio" + "errors" "fmt" "io" "regexp" @@ -34,7 +35,7 @@ const ( // rest of the message is well formed. func IsSaltpackBinary(stream *bufio.Reader) (msgType MessageType, version Version, err error) { b, err := stream.Peek(minLengthToIdentifyBinarySaltpack) - if err == bufio.ErrBufferFull { + if errors.Is(err, bufio.ErrBufferFull) { return MessageTypeUnknown, Version{}, ErrShortSliceOrBuffer } if err != nil { @@ -115,7 +116,7 @@ func IsSaltpackBinarySlice(b []byte) (msgType MessageType, version Version, err // rest of the message is well formed. func IsSaltpackArmored(stream *bufio.Reader) (brand string, msgType MessageType, ver Version, err error) { buf, err := stream.Peek(stream.Size()) - if (err != nil && err != io.EOF) || len(buf) == 0 { + if (err != nil && !errors.Is(err, io.EOF)) || len(buf) == 0 { return "", MessageTypeUnknown, ver, err } @@ -186,7 +187,7 @@ func IsSaltpackArmoredPrefix(pref string) (brand string, messageType MessageType // a truncated block as if it was a short block. Moreover, we only need one codeword, so if an error is returned but a codeword // was decoded, the error can be ignored. if len(dec) < 32 { - if err == basex.ErrInvalidEncodingLength || err == nil { + if errors.Is(err, basex.ErrInvalidEncodingLength) || err == nil { return "", MessageTypeUnknown, ver, ErrShortSliceOrBuffer } return "", MessageTypeUnknown, ver, ErrNotASaltpackMessage @@ -222,7 +223,7 @@ func ClassifyStream(stream *bufio.Reader) (isArmored bool, brand string, message brand, messageType, ver, err = IsSaltpackArmored(stream) if err == nil { return true, brand, messageType, ver, err - } else if err == ErrShortSliceOrBuffer { + } else if errors.Is(err, ErrShortSliceOrBuffer) { return false, "", MessageTypeUnknown, Version{}, ErrShortSliceOrBuffer } messageType, ver, err = IsSaltpackBinary(stream) @@ -244,7 +245,7 @@ func ClassifyEncryptedStreamAndMakeDecoder(source io.Reader, decryptionKeyring S stream := bufio.NewReader(source) isArmored, _, msgType, ver, err = ClassifyStream(stream) - if err == ErrShortSliceOrBuffer { + if errors.Is(err, ErrShortSliceOrBuffer) { return nil, MessageTypeUnknown, nil, nil, false, "", Version{}, ErrShortSliceOrBuffer } if err != nil { diff --git a/decrypt.go b/decrypt.go index 652eff7..439f1ff 100644 --- a/decrypt.go +++ b/decrypt.go @@ -7,6 +7,7 @@ import ( "bytes" "crypto/hmac" "crypto/sha512" + "errors" "io" "golang.org/x/crypto/nacl/secretbox" @@ -42,7 +43,7 @@ type MessageKeyInfo struct { func (ds *decryptStream) getNextChunk() ([]byte, error) { ciphertext, authenticators, isFinal, seqno, err := readEncryptionBlock(ds.version, ds.mps) if err != nil { - if err == io.EOF { + if errors.Is(err, io.EOF) { err = io.ErrUnexpectedEOF } return nil, err diff --git a/decrypt_test.go b/decrypt_test.go index ad33177..9434b5b 100644 --- a/decrypt_test.go +++ b/decrypt_test.go @@ -51,7 +51,7 @@ type errAtEOFReader struct { func (r errAtEOFReader) Read(p []byte) (n int, err error) { n, err = r.Reader.Read(p) - if err == io.EOF { + if errors.Is(err, io.EOF) { err = r.errAtEOF } return n, err diff --git a/encoding/basex/go_base64_test.go b/encoding/basex/go_base64_test.go index 8d4670f..de22c5e 100644 --- a/encoding/basex/go_base64_test.go +++ b/encoding/basex/go_base64_test.go @@ -139,12 +139,12 @@ func TestDecoder(t *testing.T) { decoder := NewDecoder(Base58StdEncoding, strings.NewReader(p.encoded)) dbuf := make([]byte, Base58StdEncoding.DecodedLen(len(p.encoded))) count, err := decoder.Read(dbuf) - if err != nil && err != io.EOF { + if err != nil && !errors.Is(err, io.EOF) { t.Fatal("Read failed", err) } testEqual(t, "Read from %q = length %v, want %v", p.encoded, count, len(p.decoded)) testEqual(t, "Decoding of %q = %q, want %q", p.encoded, string(dbuf[0:count]), p.decoded) - if err != io.EOF { + if !errors.Is(err, io.EOF) { _, err = decoder.Read(dbuf) } testEqual(t, "Read from %q = %v, want %v", p.encoded, err, io.EOF) @@ -263,7 +263,7 @@ func TestDecoderIssue3577(t *testing.T) { }() select { case err := <-errc: - if err != wantErr { + if !errors.Is(err, wantErr) { t.Errorf("got error %v; want %v", err, wantErr) } case <-time.After(5 * time.Second): @@ -336,10 +336,10 @@ func TestDecodeCorrupt(t *testing.T) { } continue } - switch err := err.(type) { - case CorruptInputError: - testEqual(t, "Corruption in %q at offset %v, want %v", tc.input, int(err), tc.offset) - default: + var cie CorruptInputError + if errors.As(err, &cie) { + testEqual(t, "Corruption in %q at offset %v, want %v", tc.input, int(cie), tc.offset) + } else { t.Error("Decoder failed to detect corruption in", tc) } } diff --git a/encoding/basex/stream.go b/encoding/basex/stream.go index a8404ba..a6dc7b9 100644 --- a/encoding/basex/stream.go +++ b/encoding/basex/stream.go @@ -3,7 +3,10 @@ package basex -import "io" +import ( + "errors" + "io" +) // Much of this code is adopted from Go's encoding/base64 @@ -145,7 +148,7 @@ func (d *decoder) Read(p []byte) (int, error) { eof := false - if d.err == io.EOF { + if errors.Is(d.err, io.EOF) { if d.nbuf == 0 { return 0, d.err } diff --git a/encrypt_test.go b/encrypt_test.go index a7f1d61..16a79cf 100644 --- a/encrypt_test.go +++ b/encrypt_test.go @@ -233,7 +233,7 @@ func slowRead(r io.Reader, sz int) ([]byte, error) { for eof := false; !eof; { n, err := r.Read(buf) res = append(res, buf[:n]...) - if err == io.EOF { + if errors.Is(err, io.EOF) { break } if err != nil { @@ -1250,19 +1250,19 @@ func TestEncryptSubsequenceV1(t *testing.T) { validator := SingleVersionValidator(Version1()) _, _, err = Open(validator, truncatedCiphertext1.Bytes(), kr) expectedErr := ErrBadTag(2) - if err != expectedErr { + if !errors.Is(err, expectedErr) { t.Errorf("err=%v != %v for truncatedCiphertext1", err, expectedErr) } _, _, err = Open(validator, truncatedCiphertext2.Bytes(), kr) expectedErr = ErrBadTag(1) - if err != expectedErr { + if !errors.Is(err, expectedErr) { t.Errorf("err=%v != %v for truncatedCiphertext2", err, expectedErr) } _, _, err = Open(validator, truncatedCiphertext3.Bytes(), kr) expectedErr = ErrBadTag(1) - if err != expectedErr { + if !errors.Is(err, expectedErr) { t.Errorf("err=%v != %v for truncatedCiphertext3", err, expectedErr) } } @@ -1316,7 +1316,7 @@ func TestEncryptSubsequenceV2(t *testing.T) { validator := SingleVersionValidator(Version2()) _, _, err = Open(validator, truncatedCiphertext.Bytes(), kr) expectedErr := ErrBadTag(1) - if err != expectedErr { + if !errors.Is(err, expectedErr) { t.Errorf("err=%v != %v for truncatedCiphertext%d", err, expectedErr, i+1) } } @@ -1547,7 +1547,8 @@ func (i encryptArmor62SealInput) call() (string, error) { receivers, constantEphemeralKeyCreator{ephemeralKey}, constantEncryptRNG{payloadKey, i.permutation}, - i.brand) + i.brand, + ) } // encryptArmor62SealResult encapsulates all the inputs and outputs of diff --git a/punctuated_reader.go b/punctuated_reader.go index a5161e3..55fc4d9 100644 --- a/punctuated_reader.go +++ b/punctuated_reader.go @@ -103,17 +103,17 @@ func (p *punctuatedReader) ReadUntilPunctuation(lim int) (res []byte, err error) for { var n int n, err = p.Read(p.buf[:]) - switch err { - case nil, ErrPunctuated: + switch { + case err == nil, errors.Is(err, ErrPunctuated): res = append(res, p.buf[0:n]...) - if err == ErrPunctuated { + if errors.Is(err, ErrPunctuated) { err = nil return res, err } if len(res) >= lim { return nil, ErrOverflow } - case io.EOF: + case errors.Is(err, io.EOF): err = io.ErrUnexpectedEOF fallthrough default: diff --git a/punctuated_reader_test.go b/punctuated_reader_test.go index 5b1a1ec..e712812 100644 --- a/punctuated_reader_test.go +++ b/punctuated_reader_test.go @@ -5,6 +5,7 @@ package saltpack import ( "bytes" + "errors" "io" "testing" ) @@ -50,7 +51,7 @@ func TestPunctuatedReaderRegularReads(t *testing.T) { } } _, err := r.ReadUntilPunctuation(1024) - if err != io.ErrUnexpectedEOF { + if !errors.Is(err, io.ErrUnexpectedEOF) { t.Fatalf("Wrong error; wanted %v but got %v", io.ErrUnexpectedEOF, err) } } @@ -64,7 +65,7 @@ func TestPunctuatedReaderSlowReads(t *testing.T) { } } _, err := r.ReadUntilPunctuation(1024) - if err != io.ErrUnexpectedEOF { + if !errors.Is(err, io.ErrUnexpectedEOF) { t.Fatalf("Wrong error; wanted %v but got %v", io.ErrUnexpectedEOF, err) } } @@ -72,7 +73,7 @@ func TestPunctuatedReaderSlowReads(t *testing.T) { func TestPunctuatedReaderSlowReadsOverflow(t *testing.T) { r := newPunctuatedReader(&slowReader{[]byte(testText)}, '.') _, err := r.ReadUntilPunctuation(20) - if err != ErrOverflow { + if !errors.Is(err, ErrOverflow) { t.Fatalf("Wrong error; wanted %v but got %v", ErrOverflow, err) } } diff --git a/sign_test.go b/sign_test.go index f50dfbb..049e933 100644 --- a/sign_test.go +++ b/sign_test.go @@ -187,7 +187,7 @@ func testSignTruncation(t *testing.T, version Version) { if vmsg != nil { t.Errorf("Verify returned a message for a truncated message") } - if err != io.ErrUnexpectedEOF { + if !errors.Is(err, io.ErrUnexpectedEOF) { t.Errorf("error: %v, expected %v", err, io.ErrUnexpectedEOF) } } @@ -211,7 +211,7 @@ func testSignSkipBlock(t *testing.T, version Version) { if vmsg != nil { t.Errorf("Verify returned a message for a message with missing block") } - if err != io.ErrUnexpectedEOF { + if !errors.Is(err, io.ErrUnexpectedEOF) { t.Errorf("error: %v, expected %v", err, io.ErrUnexpectedEOF) } } @@ -230,7 +230,7 @@ func testSignSkipFooter(t *testing.T, version Version) { if vmsg != nil { t.Errorf("Verify returned a message for a signed message without a footer") } - if err != io.ErrUnexpectedEOF { + if !errors.Is(err, io.ErrUnexpectedEOF) { t.Errorf("error: %v, expected %v", err, io.ErrUnexpectedEOF) } } @@ -249,7 +249,7 @@ func testSignSwapBlock(t *testing.T, version Version) { if vmsg != nil { t.Errorf("Verify returned a message for a signed message without a footer") } - if err != ErrBadSignature { + if !errors.Is(err, ErrBadSignature) { t.Errorf("error: %v, expected %v", err, ErrBadSignature) } } @@ -290,7 +290,7 @@ func testSignDetachedVerifyAttached(t *testing.T, version Version) { if err == nil { t.Fatal("Verify succeeded, expected it to fail") } - if _, ok := err.(ErrWrongMessageType); !ok { + if !errors.As(err, new(ErrWrongMessageType)) { t.Errorf("error %T, expected ErrWrongMessageType", err) } if skey != nil { @@ -313,7 +313,7 @@ func testSignAttachedVerifyDetached(t *testing.T, version Version) { if err == nil { t.Fatal("VerifyDetached succeeded, expected it to fail") } - if _, ok := err.(ErrWrongMessageType); !ok { + if !errors.As(err, new(ErrWrongMessageType)) { t.Errorf("error %T, expected ErrWrongMessageType", err) } if skey != nil { @@ -331,7 +331,7 @@ func testSignBadKey(t *testing.T, version Version) { t.Fatal(err) } _, _, err = Verify(SingleVersionValidator(version), smsg, kr) - if err != ErrBadSignature { + if !errors.Is(err, ErrBadSignature) { t.Errorf("error: %v, expected ErrBadSignature", err) } @@ -340,7 +340,7 @@ func testSignBadKey(t *testing.T, version Version) { t.Fatal(err) } _, err = VerifyDetached(SingleVersionValidator(version), msg, sig, kr) - if err != ErrBadSignature { + if !errors.Is(err, ErrBadSignature) { t.Errorf("error: %v, expected ErrBadSignature", err) } } @@ -351,7 +351,7 @@ func testSignNilKey(t *testing.T, version Version) { if err == nil { t.Fatal("Sign with nil key didn't fail") } - if _, ok := err.(ErrInvalidParameter); !ok { + if !errors.As(err, new(ErrInvalidParameter)) { t.Errorf("error %T, expected ErrInvalidParameter", err) } @@ -359,7 +359,7 @@ func testSignNilKey(t *testing.T, version Version) { if err == nil { t.Fatal("SignDetached with nil key didn't fail") } - if _, ok := err.(ErrInvalidParameter); !ok { + if !errors.As(err, new(ErrInvalidParameter)) { t.Errorf("error %T, expected ErrInvalidParameter", err) } } @@ -450,7 +450,8 @@ func testSignCorruptHeader(t *testing.T, version Version) { t.Fatal(err) } _, _, err = Verify(SingleVersionValidator(version), smsg, kr) - if ebv, ok := err.(ErrBadVersion); !ok { + var ebv ErrBadVersion + if !errors.As(err, &ebv) { t.Fatalf("Got wrong error; wanted 'Bad Version' but got %v", err) } else if ebv.received != badVersion { t.Fatalf("got wrong version # in error message: %v", ebv.received) @@ -465,7 +466,7 @@ func testSignCorruptHeader(t *testing.T, version Version) { t.Fatal(err) } _, _, err = Verify(SingleVersionValidator(version), smsg, kr) - if _, ok := err.(ErrWrongMessageType); !ok { + if !errors.As(err, new(ErrWrongMessageType)) { t.Errorf("error: %v (%T), expected ErrWrongMessageType", err, err) } @@ -478,7 +479,7 @@ func testSignCorruptHeader(t *testing.T, version Version) { t.Fatal(err) } _, _, err = Verify(SingleVersionValidator(version), smsg, kr) - if _, ok := err.(ErrWrongMessageType); !ok { + if !errors.As(err, new(ErrWrongMessageType)) { t.Errorf("error: %v (%T), expected ErrWrongMessageType", err, err) } @@ -538,7 +539,7 @@ func testSignDetachedCorruptHeader(t *testing.T, version Version) { t.Fatal(err) } _, err = VerifyDetached(SingleVersionValidator(version), msg, sig, kr) - if _, ok := err.(ErrWrongMessageType); !ok { + if !errors.As(err, new(ErrWrongMessageType)) { t.Errorf("error: %v (%T), expected ErrWrongMessageType", err, err) } @@ -551,7 +552,7 @@ func testSignDetachedCorruptHeader(t *testing.T, version Version) { t.Fatal(err) } _, err = VerifyDetached(SingleVersionValidator(version), msg, sig, kr) - if _, ok := err.(ErrWrongMessageType); !ok { + if !errors.As(err, new(ErrWrongMessageType)) { t.Errorf("error: %v (%T), expected ErrWrongMessageType", err, err) } } @@ -588,7 +589,7 @@ func TestSignSinglePacketV1(t *testing.T) { // Nothing else. _, err = mps.Read(&block) - if err != io.EOF { + if !errors.Is(err, io.EOF) { t.Fatalf("err=%v != io.EOF", err) } } @@ -623,7 +624,7 @@ func TestSignSinglePacketV2(t *testing.T) { // Nothing else. _, err = mps.Read(&block) - if err != io.EOF { + if !errors.Is(err, io.EOF) { t.Fatalf("err=%v != io.EOF", err) } } @@ -695,7 +696,7 @@ func TestSignSubsequenceV1(t *testing.T) { for i, truncatedSMsg := range []*bytes.Buffer{truncatedSMsg1, truncatedSMsg2, truncatedSMsg3} { _, _, err = Verify(SingleVersionValidator(Version1()), truncatedSMsg.Bytes(), kr) - if err != ErrBadSignature { + if !errors.Is(err, ErrBadSignature) { t.Errorf("err=%v != ErrBadSignature for truncatedSMsg%d", err, i+1) } } @@ -756,7 +757,7 @@ func TestSignSubsequenceV2(t *testing.T) { for i, truncatedSMsg := range []*bytes.Buffer{truncatedSMsg1, truncatedSMsg2} { _, _, err = Verify(SingleVersionValidator(Version2()), truncatedSMsg.Bytes(), kr) - if err != ErrBadSignature { + if !errors.Is(err, ErrBadSignature) { t.Errorf("err=%v != ErrBadSignature for truncatedSMsg%d", err, i+1) } } diff --git a/signcrypt_open.go b/signcrypt_open.go index 8d05d7e..1e06252 100644 --- a/signcrypt_open.go +++ b/signcrypt_open.go @@ -7,6 +7,7 @@ import ( "bytes" "crypto/hmac" "crypto/sha512" + "errors" "io" "golang.org/x/crypto/ed25519" @@ -27,7 +28,7 @@ func (sos *signcryptOpenStream) getNextChunk() ([]byte, error) { var sb signcryptionBlock seqno, err := sos.mps.Read(&sb) if err != nil { - if err == io.EOF { + if errors.Is(err, io.EOF) { err = io.ErrUnexpectedEOF } return nil, err @@ -94,7 +95,8 @@ func (sos *signcryptOpenStream) tryBoxSecretKeys(hdr *SigncryptionHeader, epheme nil, receiver.PayloadKeyBox, (*[24]byte)(&nonce), - (*[32]byte)(derivedKey)) + (*[32]byte)(derivedKey), + ) if !isValid { return nil, ErrDecryptionFailed } @@ -152,7 +154,8 @@ func (sos *signcryptOpenStream) trySharedSymmetricKeys(hdr *SigncryptionHeader, nil, hdr.Receivers[index].PayloadKeyBox, (*[24]byte)(&nonce), - (*[32]byte)(derivedKey)) + (*[32]byte)(derivedKey), + ) if !isValid { return nil, ErrDecryptionFailed } diff --git a/signcrypt_seal.go b/signcrypt_seal.go index 882c0e4..ef4ed20 100644 --- a/signcrypt_seal.go +++ b/signcrypt_seal.go @@ -146,7 +146,8 @@ func (r receiverBoxKey) makeReceiverKeys(ephemeralPriv BoxSecretKey, payloadKey nil, payloadKey[:], (*[24]byte)(&nonce), - (*[32]byte)(derivedKey)) + (*[32]byte)(derivedKey), + ) return receiverKeys{ ReceiverKID: identifier, @@ -179,7 +180,8 @@ func (r ReceiverSymmetricKey) makeReceiverKeys(ephemeralPriv BoxSecretKey, paylo nil, payloadKey[:], (*[24]byte)(&nonce), - (*[32]byte)(derivedKey)) + (*[32]byte)(derivedKey), + ) // Unlike the box key case, the identifier is supplied by the caller rather // than computed. (These will be KBFS TLF pseudonyms.) diff --git a/signcrypt_test.go b/signcrypt_test.go index c2c27fd..8dda960 100644 --- a/signcrypt_test.go +++ b/signcrypt_test.go @@ -6,6 +6,7 @@ package saltpack import ( "bytes" "crypto/rand" + "errors" "fmt" "io" "testing" @@ -371,7 +372,7 @@ func TestSigncryptionStream(t *testing.T) { buffer := make([]byte, 1) n, err := reader.Read(buffer) output = append(output, buffer[:n]...) - if err == io.EOF { + if errors.Is(err, io.EOF) { break } require.NoError(t, err) @@ -575,7 +576,7 @@ type RandomSigningKeysKeyring struct { keyring } -var _ (Keyring) = (*RandomSigningKeysKeyring)(nil) +var _ Keyring = (*RandomSigningKeysKeyring)(nil) func (r *RandomSigningKeysKeyring) LookupSigningPublicKey(_ []byte) SigningPublicKey { pub, _, err := ed25519.GenerateKey(rand.Reader) diff --git a/verify_stream.go b/verify_stream.go index 0aa4b3a..cdda38b 100644 --- a/verify_stream.go +++ b/verify_stream.go @@ -4,6 +4,7 @@ package saltpack import ( + "errors" "io" ) @@ -28,7 +29,7 @@ func newVerifyStream(versionValidator VersionValidator, r io.Reader, msgType Mes func (v *verifyStream) getNextChunk() ([]byte, error) { signature, chunk, isFinal, seqno, err := readSignatureBlock(v.header.Version, v.mps) if err != nil { - if err == io.EOF { + if errors.Is(err, io.EOF) { err = io.ErrUnexpectedEOF } return nil, err