@@ -268,6 +268,31 @@ final class AESTests: XCTestCase {
268268 self . stopMeasuring ( )
269269 } )
270270 }
271+
272+ // https://github.com/krzyzanowskim/CryptoSwift/pull/289
273+ func testAES_encrypt_ctr_irregular_length_incremental_update( ) {
274+ let key : Array < UInt8 > = [ 0x2b , 0x7e , 0x15 , 0x16 , 0x28 , 0xae , 0xd2 , 0xa6 , 0xab , 0xf7 , 0x15 , 0x88 , 0x09 , 0xcf , 0x4f , 0x3c ] ;
275+ let iv : Array < UInt8 > = [ 0xf0 , 0xf1 , 0xf2 , 0xf3 , 0xf4 , 0xf5 , 0xf6 , 0xf7 , 0xf8 , 0xf9 , 0xfa , 0xfb , 0xfc , 0xfd , 0xfe , 0xff ]
276+ let plaintext : Array < UInt8 > = [ 0x6b , 0xc1 , 0xbe , 0xe2 , 0x2e , 0x40 , 0x9f , 0x96 , 0xe9 , 0x3d , 0x7e , 0x11 , 0x73 , 0x93 , 0x17 , 0x2a , 0x01 , 0x6b , 0xc1 , 0xbe , 0xe2 , 0x2e , 0x40 , 0x9f , 0x96 , 0xe9 , 0x3d , 0x7e , 0x11 , 0x73 , 0x93 , 0x17 , 0x2a , 0x01 ]
277+ let expected : Array < UInt8 > = [ 0x87 , 0x4d , 0x61 , 0x91 , 0xb6 , 0x20 , 0xe3 , 0x26 , 0x1b , 0xef , 0x68 , 0x64 , 0x99 , 0xd , 0xb6 , 0xce , 0x37 , 0x40 , 0xbd , 0x82 , 0x85 , 0x5d , 0x11 , 0xfc , 0x8e , 0x49 , 0x4a , 0xa9 , 0xed , 0x23 , 0xe0 , 0xb9 , 0x40 , 0x2d ]
278+
279+ let aes = try ! AES ( key: key, iv: iv, blockMode: . CTR, padding: NoPadding ( ) )
280+ var encryptor = aes. makeEncryptor ( )
281+ var encrypted = Array < UInt8 > ( )
282+ encrypted += try ! encryptor. update ( withBytes: Array ( plaintext [ 0 ..< 5 ] ) )
283+ encrypted += try ! encryptor. update ( withBytes: Array ( plaintext [ 5 ..< 15 ] ) )
284+ encrypted += try ! encryptor. update ( withBytes: Array ( plaintext [ 15 ..< plaintext. count] ) )
285+ encrypted += try ! encryptor. finish ( )
286+ XCTAssertEqual ( encrypted, expected, " encryption failed " )
287+
288+ var decryptor = aes. makeDecryptor ( )
289+ var decrypted = Array < UInt8 > ( )
290+ decrypted += try ! decryptor. update ( withBytes: Array ( expected [ 0 ..< 5 ] ) )
291+ decrypted += try ! decryptor. update ( withBytes: Array ( expected [ 5 ..< 15 ] ) )
292+ decrypted += try ! decryptor. update ( withBytes: Array ( expected [ 15 ..< plaintext. count] ) )
293+ decrypted += try ! decryptor. finish ( )
294+ XCTAssertEqual ( decrypted, plaintext, " decryption failed " )
295+ }
271296
272297 func testAESWithWrongKey( ) {
273298 let key : Array < UInt8 > = [ 0x2b , 0x7e , 0x15 , 0x16 , 0x28 , 0xae , 0xd2 , 0xa6 , 0xab , 0xf7 , 0x15 , 0x88 , 0x09 , 0xcf , 0x4f , 0x3c ] ;
0 commit comments