acvm_blackbox_solver/
aes128.rs

1use crate::BlackBoxResolutionError;
2use aes::cipher::{BlockModeEncrypt, KeyIvInit, block_padding::NoPadding};
3
4type Aes128CbcEnc = cbc::Encryptor<aes::Aes128>; // cSpell:disable-line
5
6pub fn aes128_encrypt(
7    inputs: &[u8],
8    iv: [u8; 16],
9    key: [u8; 16],
10) -> Result<Vec<u8>, BlackBoxResolutionError> {
11    if !inputs.len().is_multiple_of(16) {
12        return Err(BlackBoxResolutionError::Failed(
13            acir::BlackBoxFunc::AES128Encrypt,
14            "input length must be a multiple of 16".to_string(),
15        ));
16    }
17
18    let mut buffer = inputs.to_vec();
19    // This blackbox does not apply padding; callers must pad inputs in Noir before calling.
20    // The expect cannot fail because we verify block-alignment above.
21    Aes128CbcEnc::new(&key.into(), &iv.into())
22        .encrypt_padded::<NoPadding>(&mut buffer, inputs.len())
23        .expect("input length is block-aligned");
24
25    Ok(buffer)
26}