hbs-lms 0.1.1

Pure Rust implementation of the Leighton Micali Signature scheme with support for key generation, signature generation and verification.
Documentation
use core::{ops::Index, slice::SliceIndex};
use tinyvec::ArrayVec;
use zeroize::DefaultIsZeroes;

pub mod coef;
pub mod helper;

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct ArrayVecZeroize<T, const N: usize>(pub ArrayVec<[T; N]>)
where
    T: Copy + Default;

impl<T, const N: usize> DefaultIsZeroes for ArrayVecZeroize<T, N> where T: Copy + Default {}

impl<T, const N: usize> Default for ArrayVecZeroize<T, N>
where
    T: Copy + Default,
{
    #[inline]
    fn default() -> Self {
        Self(ArrayVec::from([T::default(); N]))
    }
}

impl<T, Idx, const N: usize> Index<Idx> for ArrayVecZeroize<T, N>
where
    T: Copy + Default,
    Idx: SliceIndex<[T], Output = T>,
{
    type Output = T;
    #[inline]
    fn index(&self, index: Idx) -> &Self::Output {
        &self.0[index]
    }
}

impl<T, const N: usize> ArrayVecZeroize<T, N>
where
    T: Copy + Default,
{
    #[inline]
    pub fn as_slice(&self) -> &[T] {
        self.0.as_slice()
    }

    #[inline]
    pub fn as_mut_slice(&mut self) -> &mut [T] {
        self.0.as_mut_slice()
    }
}