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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
//! This crate contains generic implementation of [block cipher modes of //! operation][1]. //! //! Note that some block modes (such as CTR, CFB, and OFB) transform block ciphers //! into stream ciphers. Implementations in this crate require padding, so if you //! want use those modes as stream ciphers (i.e. without padding), then check out //! crates in the [RustCrypto/stream-ciphers][2] repository. //! //! # Usage example //! ``` //! use aes::Aes128; //! use block_modes::{BlockMode, Cbc}; //! use block_modes::block_padding::Pkcs7; //! use hex_literal::hex; //! //! // create an alias for convenience //! type Aes128Cbc = Cbc<Aes128, Pkcs7>; //! //! # fn main() { //! let key = hex!("000102030405060708090a0b0c0d0e0f"); //! let iv = hex!("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"); //! let plaintext = b"Hello world!"; //! let cipher = Aes128Cbc::new_from_slices(&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_from_slices(&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 `alloc` feature (which is enabled by default) you can use //! `encrypt_vec` and `descrypt_vec` methods: //! ``` //! # use aes::Aes128; //! # use block_modes::{BlockMode, Cbc}; //! # use block_modes::block_padding::Pkcs7; //! # use hex_literal::hex; //! # //! # // create an alias for convenience //! # type Aes128Cbc = Cbc<Aes128, Pkcs7>; //! # //! # fn main() { //! # let key = hex!("000102030405060708090a0b0c0d0e0f"); //! # let iv = hex!("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"); //! # let plaintext = b"Hello world!"; //! let cipher = Aes128Cbc::new_from_slices(&key, &iv).unwrap(); //! let ciphertext = cipher.encrypt_vec(plaintext); //! //! assert_eq!(ciphertext, hex!("1b7a4c403124ae2fb52bedc534d82fa8")); //! //! let cipher = Aes128Cbc::new_from_slices(&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] #![doc( html_logo_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo.svg", html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo.svg" )] #![deny(unsafe_code)] #![warn(missing_docs, rust_2018_idioms)] #[cfg(feature = "alloc")] extern crate alloc; #[cfg(feature = "std")] extern crate std; mod errors; mod traits; mod utils; mod cbc; mod cfb; mod cfb8; mod ecb; mod ige; mod ofb; mod pcbc; pub use block_padding; pub use cipher; pub use crate::{ cbc::Cbc, cfb::Cfb, cfb8::Cfb8, ecb::Ecb, errors::{BlockModeError, InvalidKeyIvLength}, ige::Ige, ofb::Ofb, pcbc::Pcbc, traits::{BlockMode, IvState}, };