@@ -13,8 +13,8 @@ use elliptic_curve::{
1313 Array , ArraySize ,
1414 typenum:: { Prod , Unsigned } ,
1515 } ,
16- bigint:: { Integer , Limb , U448 , U896 , Word , Zero } ,
17- consts:: U2 ,
16+ bigint:: { Integer , Limb , NonZero , U448 , U704 , U896 , Word , Zero } ,
17+ consts:: { U2 , U84 , U88 } ,
1818 ff:: { Field , helpers} ,
1919 ops:: { Invert , Reduce , ReduceNonZero } ,
2020 scalar:: { FromUintUnchecked , IsHigh } ,
@@ -815,4 +815,18 @@ impl<C: CurveWithScalar> Scalar<C> {
815815 pub fn to_scalar < O : CurveWithScalar > ( & self ) -> Scalar < O > {
816816 Scalar :: new ( self . scalar )
817817 }
818+
819+ pub ( crate ) fn from_okm_u84 ( data : & Array < u8 , U84 > ) -> Self {
820+ const SEMI_WIDE_MODULUS : NonZero < U704 > = NonZero :: < U704 > :: new_unwrap ( U704 :: from_be_hex (
821+ "00000000000000000000000000000000000000000000000000000000000000003fffffffffffffffffffffffffffffffffffffffffffffffffffffff7cca23e9c44edb49aed63690216cc2728dc58f552378c292ab5844f3" ,
822+ ) ) ;
823+ let mut tmp = Array :: < u8 , U88 > :: default ( ) ;
824+ tmp[ 4 ..] . copy_from_slice ( & data[ ..] ) ;
825+
826+ let mut num = U704 :: from_be_slice ( & tmp[ ..] ) ;
827+ num %= SEMI_WIDE_MODULUS ;
828+ let mut words = [ 0 ; U448 :: LIMBS ] ;
829+ words. copy_from_slice ( & num. to_words ( ) [ ..U448 :: LIMBS ] ) ;
830+ Scalar :: new ( U448 :: from_words ( words) )
831+ }
818832}
0 commit comments