mirror of
https://github.com/rclone/rclone.git
synced 2025-02-16 18:41:54 +01:00
crypt: check for maximum length before decrypting filename
The EME Transform() method will panic if the input data is larger than 2048 bytes. Fixes #2826
This commit is contained in:
parent
c1dd76788d
commit
9cb3a68c38
@ -41,6 +41,7 @@ var (
|
|||||||
ErrorBadDecryptControlChar = errors.New("bad decryption - contains control chars")
|
ErrorBadDecryptControlChar = errors.New("bad decryption - contains control chars")
|
||||||
ErrorNotAMultipleOfBlocksize = errors.New("not a multiple of blocksize")
|
ErrorNotAMultipleOfBlocksize = errors.New("not a multiple of blocksize")
|
||||||
ErrorTooShortAfterDecode = errors.New("too short after base32 decode")
|
ErrorTooShortAfterDecode = errors.New("too short after base32 decode")
|
||||||
|
ErrorTooLongAfterDecode = errors.New("too long after base32 decode")
|
||||||
ErrorEncryptedFileTooShort = errors.New("file is too short to be encrypted")
|
ErrorEncryptedFileTooShort = errors.New("file is too short to be encrypted")
|
||||||
ErrorEncryptedFileBadHeader = errors.New("file has truncated block header")
|
ErrorEncryptedFileBadHeader = errors.New("file has truncated block header")
|
||||||
ErrorEncryptedBadMagic = errors.New("not an encrypted file - bad magic string")
|
ErrorEncryptedBadMagic = errors.New("not an encrypted file - bad magic string")
|
||||||
@ -284,6 +285,9 @@ func (c *cipher) decryptSegment(ciphertext string) (string, error) {
|
|||||||
// not possible if decodeFilename() working correctly
|
// not possible if decodeFilename() working correctly
|
||||||
return "", ErrorTooShortAfterDecode
|
return "", ErrorTooShortAfterDecode
|
||||||
}
|
}
|
||||||
|
if len(rawCiphertext) > 2048 {
|
||||||
|
return "", ErrorTooLongAfterDecode
|
||||||
|
}
|
||||||
paddedPlaintext := eme.Transform(c.block, c.nameTweak[:], rawCiphertext, eme.DirectionDecrypt)
|
paddedPlaintext := eme.Transform(c.block, c.nameTweak[:], rawCiphertext, eme.DirectionDecrypt)
|
||||||
plaintext, err := pkcs7.Unpad(nameCipherBlockSize, paddedPlaintext)
|
plaintext, err := pkcs7.Unpad(nameCipherBlockSize, paddedPlaintext)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -194,6 +194,10 @@ func TestEncryptSegment(t *testing.T) {
|
|||||||
|
|
||||||
func TestDecryptSegment(t *testing.T) {
|
func TestDecryptSegment(t *testing.T) {
|
||||||
// We've tested the forwards above, now concentrate on the errors
|
// We've tested the forwards above, now concentrate on the errors
|
||||||
|
longName := make([]byte, 3328)
|
||||||
|
for i := range longName {
|
||||||
|
longName[i] = 'a'
|
||||||
|
}
|
||||||
c, _ := newCipher(NameEncryptionStandard, "", "", true)
|
c, _ := newCipher(NameEncryptionStandard, "", "", true)
|
||||||
for _, test := range []struct {
|
for _, test := range []struct {
|
||||||
in string
|
in string
|
||||||
@ -201,6 +205,7 @@ func TestDecryptSegment(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{"64=", ErrorBadBase32Encoding},
|
{"64=", ErrorBadBase32Encoding},
|
||||||
{"!", base32.CorruptInputError(0)},
|
{"!", base32.CorruptInputError(0)},
|
||||||
|
{string(longName), ErrorTooLongAfterDecode},
|
||||||
{encodeFileName([]byte("a")), ErrorNotAMultipleOfBlocksize},
|
{encodeFileName([]byte("a")), ErrorNotAMultipleOfBlocksize},
|
||||||
{encodeFileName([]byte("123456789abcdef")), ErrorNotAMultipleOfBlocksize},
|
{encodeFileName([]byte("123456789abcdef")), ErrorNotAMultipleOfBlocksize},
|
||||||
{encodeFileName([]byte("123456789abcdef0")), pkcs7.ErrorPaddingTooLong},
|
{encodeFileName([]byte("123456789abcdef0")), pkcs7.ErrorPaddingTooLong},
|
||||||
|
Loading…
Reference in New Issue
Block a user