diff --git a/errors.go b/errors.go index 3937faf..36bbc12 100644 --- a/errors.go +++ b/errors.go @@ -6,12 +6,17 @@ import ( type CorruptionError struct { msg string + err error } func (e CorruptionError) Error() string { return "Triplesec corruption: " + e.msg } +func (e CorruptionError) Unwrap() error { + return e.err +} + type VersionError struct { v Version } diff --git a/triplesec.go b/triplesec.go index 5aabdbb..8238320 100644 --- a/triplesec.go +++ b/triplesec.go @@ -308,7 +308,7 @@ func encryptData(plain, keys []byte, rng RandomnessGenerator, versionParams Vers ivOffset -= len(aesIV) if ivOffset != 0 { - return nil, CorruptionError{"something went terribly wrong during encryption: ivOffset final value non-zero"} + return nil, CorruptionError{msg: "something went terribly wrong during encryption: ivOffset final value non-zero"} } return res, nil @@ -344,12 +344,12 @@ func generateMACs(data, keys []byte, versionParams VersionParams) []byte { // authentication fails or on memory failures. func (c *Cipher) Decrypt(src []byte) (res []byte, err error) { if len(src) < len(MagicBytes)+VersionBytesLen { - err = CorruptionError{"decryption underrun"} + err = CorruptionError{msg: "decryption underrun"} return } if !bytes.Equal(src[:len(MagicBytes)], MagicBytes[0:]) { - err = CorruptionError{"wrong magic bytes"} + err = CorruptionError{msg: "wrong magic bytes"} return } @@ -357,7 +357,7 @@ func (c *Cipher) Decrypt(src []byte) (res []byte, err error) { var version Version err = binary.Read(vB, binary.BigEndian, &version) if err != nil { - err = CorruptionError{err.Error()} + err = CorruptionError{msg: err.Error(), err: err} return } @@ -442,7 +442,7 @@ func decryptData(dst, data, keys []byte, versionParams VersionParams) error { salsa20.XORKeyStream(dst, buffer[ivOffset:], iv, keyArray) if len(buffer[ivOffset:]) != len(data)-versionParams.TotalIVLen { - return CorruptionError{"something went terribly wrong during decryption: buffer size is wrong"} + return CorruptionError{msg: "something went terribly wrong during decryption: buffer size is wrong"} } return nil diff --git a/triplesec_test.go b/triplesec_test.go index 70b7757..e9c2808 100644 --- a/triplesec_test.go +++ b/triplesec_test.go @@ -8,6 +8,7 @@ import ( "bytes" "encoding/hex" "encoding/json" + "errors" "fmt" "os" "testing" @@ -201,7 +202,7 @@ func TestBadPwV3(t *testing.T) { _, err := c.Decrypt(ciphertext) if err == nil { t.Error("needed an error on bad PW") - } else if _, ok := err.(BadPassphraseError); !ok { + } else if !errors.As(err, new(BadPassphraseError)) { t.Error("got wrong type of error") } } @@ -229,7 +230,7 @@ func TestBadPwV4(t *testing.T) { _, err := c.Decrypt(ciphertext) if err == nil { t.Error("needed an error on bad PW") - } else if _, ok := err.(BadPassphraseError); !ok { + } else if !errors.As(err, new(BadPassphraseError)) { t.Error("got wrong type of error") } }