You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Miscomputation when performing AES encryption in rust-crypto
Details
Package
rust-crypto
Version
0.2.36
Date
2022-02-28
The following Rust program demonstrates some strangeness in AES encryption - if you have an immutable key slice and then operate on that slice, you get different encryption output than if you operate on a copy of that key.
For these functions, we expect that extending a 16 byte key to a 32 byte key by repeating it gives the same encrypted data, because the underlying rust-crypto functions repeat key data up to the necessary key size for the cipher.
use crypto::{
aes, blockmodes, buffer,
buffer::{BufferResult,ReadBuffer,WriteBuffer},
symmetriccipher,};fnencrypt(key:&[u8],iv:&[u8],data:&str,) ->Result<String, symmetriccipher::SymmetricCipherError>{letmut encryptor =
aes::cbc_encryptor(aes::KeySize::KeySize256, key, iv, blockmodes::PkcsPadding);letmut encrypted_data = Vec::<u8>::new();letmut read_buffer = buffer::RefReadBuffer::new(data.as_bytes());letmut buffer = [0;4096];letmut write_buffer = buffer::RefWriteBuffer::new(&mut buffer);loop{let result = encryptor.encrypt(&mut read_buffer,&mut write_buffer,true)?;
encrypted_data.extend(
write_buffer
.take_read_buffer().take_remaining().iter().copied(),);match result {BufferResult::BufferUnderflow =>break,BufferResult::BufferOverflow =>{}}}Ok(hex::encode(encrypted_data))}fnworking(){let data = "data";let iv = [0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,];let key = [0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,];// The copy here makes the code work.let key_copy = key;let key2:Vec<u8> = key_copy.iter().cycle().take(32).copied().collect();println!("key1:{} key2: {}", hex::encode(&key), hex::encode(&key2));let x1 = encrypt(&key,&iv, data).unwrap();println!("X1: {}", x1);let x2 = encrypt(&key2,&iv, data).unwrap();println!("X2: {}", x2);assert_eq!(x1, x2);}fnbroken(){let data = "data";let iv = [0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,];let key = [0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,];// This operation shouldn't affect the contents of key at all.let key2:Vec<u8> = key.iter().cycle().take(32).copied().collect();println!("key1:{} key2: {}", hex::encode(&key), hex::encode(&key2));let x1 = encrypt(&key,&iv, data).unwrap();println!("X1: {}", x1);let x2 = encrypt(&key2,&iv, data).unwrap();println!("X2: {}", x2);assert_eq!(x1, x2);}fnmain(){working();broken();}
rust-crypto
0.2.36
The following Rust program demonstrates some strangeness in AES encryption - if you have an immutable key slice and then operate on that slice, you get different encryption output than if you operate on a copy of that key.
For these functions, we expect that extending a 16 byte key to a 32 byte key by repeating it gives the same encrypted data, because the underlying rust-crypto functions repeat key data up to the necessary key size for the cipher.
The output from this program:
Notably, the X1 key in the
broken()
test changes every time after rerunning the program.See advisory page for additional details.
The text was updated successfully, but these errors were encountered: