@@ -425,6 +425,12 @@ TestTDECCipherModes = class(TTestCase)
425425 procedure TestEncodeECBDataDoesNotMatchBlockSizeFailure ;
426426 procedure TestDecodeECBDataDoesNotMatchBlockSizeFailureSmall ;
427427 procedure TestDecodeECBDataDoesNotMatchBlockSizeFailure ;
428+
429+ // / <summary>
430+ // / Test for GitHub issue 47: EncodeCBCx threw a range check failure for
431+ // / "block sizes > 32k"
432+ // / </summary>
433+ procedure TestEncodeCBCxFailure_47 ;
428434 end ;
429435
430436implementation
@@ -868,6 +874,36 @@ procedure TestTDECCipherModes.TestEncodeCBCx;
868874 DoTestEncode(Data, TCipherMode.cmCBCx);
869875end ;
870876
877+ procedure TestTDECCipherModes.TestEncodeCBCxFailure_47 ;
878+ var
879+ Data : TBytes;
880+ EncrData : TBytes;
881+ AESCipher : TCipher_AES;
882+ AESKey : RawByteString;
883+ IV : RawByteString;
884+ i : Integer;
885+ begin
886+ SetLength(Data, 256 *1024 ); // Size >32 KiB
887+
888+ for i := 0 to length(Data) - 1 do
889+ Data[i] := UInt8(i);
890+
891+ IV := ' 12345678' ;
892+ AESKey := IV + IV;
893+
894+ AESCipher := TCipher_AES.Create;
895+ try
896+ AESCipher.Init(AESKey, IV, 0 ); // Key and InitVector
897+ AESCipher.Mode := cmCBCx;
898+ EncrData := AESCipher.EncodeBytes(Data); // Before the fix there was
899+ // a range check error here!
900+ finally
901+ FreeAndNil(AESCipher);
902+ end ;
903+
904+ CheckEquals(256 *1024 , length(EncrData), ' Length of encrypted data is wrong' );
905+ end ;
906+
871907procedure TestTDECCipherModes.TestEncodeCTSx ;
872908begin
873909 DoTestEncode(Data, TCipherMode.cmCTSx);
0 commit comments