1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
//! This crate contains generic implementation of [block cipher modes of //! operation][1]. //! //! Note that this crate implements only modes which require padding. For CTR, //! CFB and OFB modes (i.e. modes which transsform block ciphers into stream //! ciphers) see crates in the [RustCrypto/stream-ciphers][2] repository. //! //! # Usage example //! ``` //! #[macro_use] extern crate hex_literal; //! extern crate aes_soft as aes; //! extern crate block_modes; //! //! use block_modes::{BlockMode, Cbc}; //! use block_modes::block_padding::Pkcs7; //! use aes::Aes128; //! //! // create an alias for convinience //! type Aes128Cbc = Cbc<Aes128, Pkcs7>; //! //! let key = hex!("000102030405060708090a0b0c0d0e0f"); //! let iv = hex!("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"); //! let plaintext = b"Hello world!"; //! let cipher = Aes128Cbc::new_var(&key, &iv).unwrap(); //! //! // buffer must have enough space for message+padding //! let mut buffer = [0u8; 32]; //! // copy message to the buffer //! let pos = plaintext.len(); //! buffer[..pos].copy_from_slice(plaintext); //! let ciphertext = cipher.encrypt(&mut buffer, pos).unwrap(); //! //! assert_eq!(ciphertext, hex!("1b7a4c403124ae2fb52bedc534d82fa8")); //! //! // re-create cipher mode instance //! let cipher = Aes128Cbc::new_var(&key, &iv).unwrap(); //! let mut buf = ciphertext.to_vec(); //! let decrypted_ciphertext = cipher.decrypt(&mut buf).unwrap(); //! //! assert_eq!(decrypted_ciphertext, plaintext); //! ``` //! //! With an enabled `std` feature (which is enabled by default) you can use //! `encrypt_vec` and `descrypt_vec` methods: //! ``` //! # #[macro_use] extern crate hex_literal; //! # extern crate aes_soft as aes; //! # extern crate block_modes; //! # //! # use block_modes::{BlockMode, Cbc}; //! # use block_modes::block_padding::Pkcs7; //! # use aes::Aes128; //! # //! # // create an alias for convinience //! # type Aes128Cbc = Cbc<Aes128, Pkcs7>; //! # //! # let key = hex!("000102030405060708090a0b0c0d0e0f"); //! # let iv = hex!("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"); //! # let plaintext = b"Hello world!"; //! let cipher = Aes128Cbc::new_var(&key, &iv).unwrap(); //! let ciphertext = cipher.encrypt_vec(plaintext); //! //! assert_eq!(ciphertext, hex!("1b7a4c403124ae2fb52bedc534d82fa8")); //! //! let cipher = Aes128Cbc::new_var(&key, &iv).unwrap(); //! let decrypted_ciphertext = cipher.decrypt_vec(&ciphertext).unwrap(); //! //! assert_eq!(decrypted_ciphertext, plaintext); //! ``` //! //! [1]: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation //! [2]: https://github.com/RustCrypto/stream-ciphers #![no_std] extern crate block_cipher_trait; pub extern crate block_padding; #[cfg(feature = "std")] extern crate std; mod utils; mod traits; pub use traits::{BlockMode, BlockModeError, InvalidKeyIvLength}; mod cbc; pub use cbc::Cbc; mod ecb; pub use ecb::Ecb; mod pcbc; pub use pcbc::Pcbc;