use elliptic_curve::{
sec1::{EncodedPoint, FromEncodedPoint, ModulusSize},
CurveArithmetic,
Scalar,
ScalarPrimitive,
};
use crate::{
error::{Result, VrfError},
VrfStruct,
};
impl<C, D> VrfStruct<C, D>
where
C: CurveArithmetic,
C::FieldBytesSize: ModulusSize,
C::AffinePoint: FromEncodedPoint<C>,
{
pub(super) fn point_from_bytes(&self, data: &[u8]) -> Result<C::AffinePoint> {
let encoded_point: EncodedPoint<C> =
EncodedPoint::<C>::from_bytes(data).map_err(|_| VrfError::AffineFromBytes)?;
Option::from(C::AffinePoint::from_encoded_point(&encoded_point)).ok_or(VrfError::AffineFromBytes)
}
pub(super) fn try_hash_to_point(&self, data: &[u8]) -> Result<C::AffinePoint> {
self.point_from_bytes(&[&[0x02], data].concat())
}
pub(super) fn scalar_from_bytes(&self, data: &[u8]) -> Result<Scalar<C>> {
let primitive = ScalarPrimitive::<C>::from_slice(data).map_err(|_| VrfError::ScalarFromBytes)?;
Ok(primitive.into())
}
}