cryprot-core 0.3.2

Core primitives for cryptographic protocol implementations.
Documentation
//! Small utility functions such as [`xor_inplace`].
use std::ops::{BitAndAssign, BitXorAssign};

pub fn xor_inplace<T: Copy + BitXorAssign>(a: &mut [T], b: &[T]) {
    a.iter_mut().zip(b).for_each(|(a, b)| {
        *a ^= *b;
    });
}

pub fn and_inplace<T: Copy + BitAndAssign>(a: &mut [T], b: &[T]) {
    a.iter_mut().zip(b).for_each(|(a, b)| {
        *a &= *b;
    });
}

pub fn xor_inplace_elem<T: Copy + BitXorAssign>(a: &mut [T], b: T) {
    a.iter_mut().for_each(|a| {
        *a ^= b;
    });
}

pub fn and_inplace_elem<T: Copy + BitAndAssign>(a: &mut [T], b: T) {
    a.iter_mut().for_each(|a| {
        *a &= b;
    });
}

pub fn log2_ceil(val: usize) -> usize {
    let log2 = val.ilog2();
    if val > (1 << log2) {
        (log2 + 1) as usize
    } else {
        log2 as usize
    }
}