Crate cts

Source
Expand description

§RustCrypto: CTS

crate Docs Apache2/MIT licensed Rust Version Project Chat Build Status

Generic implementation of the ciphertext stealing block cipher modes of operation.

§Example

use aes::Aes128;
use cts::{Decrypt, Encrypt, KeyIvInit};
use hex_literal::hex;

let key = [0x42; 16];
let iv = [0x24; 16];

// Message must be bigger than block size (16 bytes for AES-128)
let msg = b"Lorem ipsum dolor sit amet";
let mut buf = [0u8; 26];

let enc_mode = cts::CbcCs3Enc::<Aes128>::new(&key.into(), &iv.into());
enc_mode.encrypt_b2b(msg, &mut buf).unwrap();
assert_eq!(buf, hex!("68ec97f172e322fdd38e74fca65cee52658ae2124beb5e4e5315"));

let dec_mode = cts::CbcCs3Dec::<Aes128>::new(&key.into(), &iv.into());
dec_mode.decrypt(&mut buf).unwrap();
assert_eq!(&buf, msg);

If you wan to encrypt many messages with one key, you can use a block cipher reference to create CTS modes:

use aes::Aes128;
use cts::{
    cipher::{InnerIvInit, KeyInit},
    Encrypt,
};
use hex_literal::hex;

let key = [0x42; 16];
let cipher = Aes128::new(&key.into());

let iv1 = [0x24; 16];
let msg1 = b"Lorem ipsum dolor sit amet";
let mut buf1 = [0u8; 26];

let iv2 = [0x25; 16];
let msg2 = b"Lorem ipsum dolor sit";
let mut buf2 = [0u8; 21];

let enc_mode = cts::CbcCs3Enc::inner_iv_init(&cipher, &iv1.into());
enc_mode.encrypt_b2b(msg1, &mut buf1).unwrap();
assert_eq!(buf1, hex!("68ec97f172e322fdd38e74fca65cee52658ae2124beb5e4e5315"));

let enc_mode = cts::CbcCs3Enc::inner_iv_init(&cipher, &iv2.into());
enc_mode.encrypt_b2b(msg2, &mut buf2).unwrap();
assert_eq!(buf2, hex!("69ebd2059e69c6e416a67351982267a26bf5672934"));

§Minimum Supported Rust Version

Rust 1.57 or higher.

Minimum supported Rust version can be changed in the future, but it will be done with a minor version bump.

§SemVer Policy

  • All on-by-default features of this library are covered by SemVer
  • MSRV is considered exempt from SemVer as noted above

§License

Licensed under either of:

at your option.

§Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Re-exports§

pub use cipher;

Structs§

CbcCs1Dec
The CBC-CS-1 ciphertext stealing mode decryptor.
CbcCs1Enc
The CBC-CS-1 ciphertext stealing mode encryptor.
CbcCs2Dec
The CBC-CS-2 ciphertext stealing mode decryptor.
CbcCs2Enc
The CBC-CS-2 ciphertext stealing mode encryptor.
CbcCs3Dec
The CBC-CS-3 ciphertext stealing mode decryptor.
CbcCs3Enc
The CBC-CS-3 ciphertext stealing mode encryptor.
EcbCs1Dec
The ECB-CS-1 ciphertext stealing mode decryptor.
EcbCs1Enc
The ECB-CS-1 ciphertext stealing mode encryptor.
EcbCs2Dec
The ECB-CS-2 ciphertext stealing mode decryptor.
EcbCs2Enc
The ECB-CS-2 ciphertext stealing mode encryptor.
EcbCs3Dec
The ECB-CS-3 ciphertext stealing mode decryptor.
EcbCs3Enc
The ECB-CS-3 ciphertext stealing mode encryptor.
Error
Error which indicates that message is smaller than cipher’s block size.

Traits§

Decrypt
Decryption functionality of CTS modes.
Encrypt
Encryption functionality of CTS modes.
KeyInit
Types which can be initialized from key.
KeyIvInit
Types which can be initialized from key and initialization vector (nonce).