lib-q-tweak-aead 0.0.4

Parallel tweakable-block (CTR) AEAD over Keccak-f[1600] for lib-Q
Documentation
//! Portable keystream XOR.

use crate::block::keystream_block;
use crate::params::{
    BLOCK_BYTES,
    KEY_BYTES,
    NONCE_BYTES,
};
use crate::simd::traits::TweakAeadStreamOps;

pub struct Portable;

impl TweakAeadStreamOps for Portable {
    fn xor_keystream(key: &[u8; KEY_BYTES], nonce: &[u8; NONCE_BYTES], pt: &[u8], ct: &mut [u8]) {
        debug_assert_eq!(pt.len(), ct.len());
        let full_blocks = pt.len() / BLOCK_BYTES;
        for b in 0..full_blocks {
            let ks = keystream_block(key, nonce, b as u64);
            let base = b * BLOCK_BYTES;
            for j in 0..BLOCK_BYTES {
                ct[base + j] = pt[base + j] ^ ks[j];
            }
        }
        let rem = pt.len() % BLOCK_BYTES;
        if rem > 0 {
            let b = full_blocks as u64;
            let ks = keystream_block(key, nonce, b);
            let base = full_blocks * BLOCK_BYTES;
            for j in 0..rem {
                ct[base + j] = pt[base + j] ^ ks[j];
            }
        }
    }
}