use super::engine_error;
use crate::prelude::{GlweDimension, PolynomialSize};
use crate::specification::engines::AbstractEngine;
use crate::specification::entities::GlweSecretKeyEntity;
engine_error! {
GlweSecretKeyGenerationError for GlweSecretKeyGenerationEngine @
NullGlweDimension => "The secret key GLWE dimension must be greater than zero.",
NullPolynomialSize => "The secret key polynomial size must be greater than zero.",
SizeOnePolynomial => "The secret key polynomial size must be greater than one. Otherwise you \
should prefer the LWE scheme."
}
impl<EngineError: std::error::Error> GlweSecretKeyGenerationError<EngineError> {
pub fn perform_generic_checks(
glwe_dimension: GlweDimension,
polynomial_size: PolynomialSize,
) -> Result<(), Self> {
if glwe_dimension.0 == 0 {
return Err(Self::NullGlweDimension);
}
if polynomial_size.0 == 0 {
return Err(Self::NullPolynomialSize);
}
if polynomial_size.0 == 1 {
return Err(Self::SizeOnePolynomial);
}
Ok(())
}
}
pub trait GlweSecretKeyGenerationEngine<SecretKey>: AbstractEngine
where
SecretKey: GlweSecretKeyEntity,
{
fn generate_new_glwe_secret_key(
&mut self,
glwe_dimension: GlweDimension,
polynomial_size: PolynomialSize,
) -> Result<SecretKey, GlweSecretKeyGenerationError<Self::EngineError>>;
unsafe fn generate_new_glwe_secret_key_unchecked(
&mut self,
glwe_dimension: GlweDimension,
polynomial_size: PolynomialSize,
) -> SecretKey;
}