Function aes_frast::aes_with_operation_mode::cbc_enc [] [src]

pub fn cbc_enc(
    plain: &[u8],
    cipher: &mut [u8],
    keys: &[u32],
    iv: &[u8]
) -> Vec<u8>

CBC (Cipher Block Chaining) Encryption

This function encrypts a long plain from the first parameter and put the long cipher into the second parameter, using the scheduled keys and the initialization vector (IV) in the third and fourth parameters.
Finally, it returns the final block of the cipher (NOT the plain).
CBC encryption (This picture comes from the Wikimedia Commons)

Examples

use aes_frast::{aes_core, aes_with_operation_mode, padding_128bit};
let length: usize = 64;
let mut plain: Vec<u8> = vec![0x30, 0xA3, 0xBC, 0xA0, 0xBA, 0x57, 0xFB, 0x27,
                              0x2F, 0xE2, 0x31, 0xEC, 0xBB, 0x04, 0x5E, 0x93,
                              0x40, 0xA1, 0x19, 0xB6, 0xE2, 0x60, 0x4F, 0x74,
                              0x0E, 0xF2, 0xC0, 0x29, 0x1B, 0xF0, 0xF9, 0x9B,
                              0xFD, 0x90, 0xFD, 0x0D, 0x97, 0xF8, 0x9B, 0x91,
                              0x78, 0xF4, 0x90, 0x07, 0x66, 0x6C, 0xE8, 0x11,
                              0x5F, 0xFE, 0x6F, 0xE9, 0x4F, 0x75, 0xB0, 0xCE,
                              0x53, 0x48, 0x92, 0xC7, 0x96, 0xD2, 0x0B, 0x3E];
let mut cipher = vec![0u8; length + 16];
let mut dec_cipher = vec![0u8; length + 16];
let mut o_key: Vec<u8> = vec![0x0F, 0x57, 0x9F, 0x79, 0x50, 0x99, 0x0A, 0xCE,
                              0x66, 0x72, 0xA8, 0x17, 0x95, 0x1F, 0xF6, 0x06,
                              0x24, 0x40, 0xDE, 0xF5, 0x08, 0xF1, 0x64, 0x34,
                              0xD6, 0xEF, 0xEF, 0xFD, 0x26, 0x23, 0x04, 0x95];
let mut w_keys: Vec<u32> = vec![0u32; 60];
let mut iv: Vec<u8> = vec![0x04, 0x7C, 0xF3, 0xEA, 0xE1, 0x76, 0x45, 0x85,
                           0x72, 0x52, 0x7B, 0xAA, 0x26, 0x0D, 0x65, 0xBB];
 
aes_core::setkey_enc_auto(&o_key, &mut w_keys);
padding_128bit::pa_pkcs7(&mut plain);
aes_with_operation_mode::cbc_enc(&plain, &mut cipher, &w_keys, &iv);
 
let expected_encrypted = vec![0xBE, 0xF7, 0x24, 0xED, 0xB0, 0x45, 0x0F, 0x20,
                              0xBC, 0x8B, 0x97, 0xA4, 0x17, 0xF3, 0xC0, 0x6F,
                              0x08, 0xF8, 0x3D, 0xF4, 0x78, 0x0E, 0xA3, 0x11,
                              0x5C, 0xE8, 0x59, 0x8F, 0xF7, 0xD6, 0x9C, 0x54,
                              0x83, 0x37, 0x9C, 0xE7, 0x95, 0x44, 0x78, 0x03,
                              0xDA, 0x86, 0x6B, 0x67, 0x7D, 0x66, 0xAD, 0x48,
                              0x7F, 0x8B, 0xF5, 0x57, 0x0C, 0xDC, 0xB0, 0x2C,
                              0x7C, 0xB7, 0xFA, 0x1A, 0x07, 0x57, 0x94, 0x14,
                              0x3A, 0xA4, 0xB7, 0x91, 0x76, 0x1C, 0x2F, 0xAD,
                              0x77, 0x8E, 0x50, 0xE7, 0x03, 0xEA, 0x70, 0x2A];
assert_eq!(length + 16, cipher.len());
for i in 0..(length + 16) {
    assert_eq!(expected_encrypted[i], cipher[i]);
}
 
aes_core::setkey_dec_auto(&o_key, &mut w_keys);
aes_with_operation_mode::cbc_dec(&cipher, &mut dec_cipher, &w_keys, &iv);
padding_128bit::de_ansix923_pkcs7(&mut dec_cipher);
 
assert_eq!(length, dec_cipher.len());
for i in 0..length {
    assert_eq!(plain[i], dec_cipher[i]);
}