@@ -121,6 +121,54 @@ pub static SCALAR_OPS: ScalarOps = ScalarOps {
121121 scalar_mul_mont : p256_scalar_mul_mont,
122122} ;
123123
124+ cfg_if ! {
125+ if #[ cfg( any( all( target_arch = "aarch64" , target_endian = "little" ) ,
126+ target_arch = "x86_64" ) ) ] {
127+ prefixed_extern! {
128+ fn p256_scalar_mul_mont(
129+ r: * mut Limb , // [COMMON_OPS.num_limbs]
130+ a: * const Limb , // [COMMON_OPS.num_limbs]
131+ b: * const Limb ) ; // [COMMON_OPS.num_limbs]
132+ pub ( super ) fn p256_scalar_sqr_rep_mont(
133+ r: * mut Limb , // [COMMON_OPS.num_limbs]
134+ a: * const Limb , // [COMMON_OPS.num_limbs]
135+ rep: LeakyWord ) ;
136+ }
137+ } else {
138+ use crate :: arithmetic:: { inout:: AliasingSlices3FromRawParts , LimbSliceError } ;
139+
140+ static N_N0 : N0 = N0 :: precalculated( 0xccd1c8aa_ee00bc4f ) ;
141+
142+ unsafe extern "C" fn p256_scalar_mul_mont(
143+ r: * mut Limb , // [COMMON_OPS.num_limbs]
144+ a: * const Limb , // [COMMON_OPS.num_limbs]
145+ b: * const Limb , // [COMMON_OPS.num_limbs]
146+ ) {
147+ // XXX: Inefficient. TODO: optimize with dedicated multiplication routine
148+ // TODO: Caller should pass in an `impl AliasingSlices3`.
149+ let in_out = unsafe { AliasingSlices3FromRawParts :: new_rab_unchecked( r, a, b, NUM_LIMBS ) } ;
150+ let n = & COMMON_OPS . n. limbs[ ..NUM_LIMBS . get( ) ] ;
151+ let cpu = cpu:: features( ) ; // TODO: caller should supply this
152+ limbs_mul_mont( in_out, n, & N_N0 , cpu) . unwrap_or_else( |e| match e {
153+ LimbSliceError :: LenMismatch ( _)
154+ | LimbSliceError :: TooShort ( _)
155+ | LimbSliceError :: TooLong ( _) => unreachable!( ) ,
156+ } )
157+ }
158+
159+ pub ( super ) unsafe extern "C" fn p256_scalar_sqr_rep_mont(
160+ r: * mut Limb , // [COMMON_OPS.num_limbs]
161+ a: * const Limb , // [COMMON_OPS.num_limbs]
162+ rep: LeakyWord ) {
163+ debug_assert!( rep >= 1 ) ;
164+ unsafe { p256_scalar_mul_mont( r, a, a) ; }
165+ for _ in 1 ..rep {
166+ unsafe { p256_scalar_mul_mont( r, r, r) ; }
167+ }
168+ }
169+ }
170+ }
171+
124172pub static PUBLIC_SCALAR_OPS : PublicScalarOps = PublicScalarOps {
125173 scalar_ops : & SCALAR_OPS ,
126174 public_key_ops : & PUBLIC_KEY_OPS ,
@@ -309,17 +357,6 @@ prefixed_extern! {
309357 p_x: * const Limb , // [COMMON_OPS.num_limbs]
310358 p_y: * const Limb , // [COMMON_OPS.num_limbs]
311359 ) ;
312-
313- fn p256_scalar_mul_mont(
314- r: * mut Limb , // [COMMON_OPS.num_limbs]
315- a: * const Limb , // [COMMON_OPS.num_limbs]
316- b: * const Limb , // [COMMON_OPS.num_limbs]
317- ) ;
318- fn p256_scalar_sqr_rep_mont(
319- r: * mut Limb , // [COMMON_OPS.num_limbs]
320- a: * const Limb , // [COMMON_OPS.num_limbs]
321- rep: LeakyWord ,
322- ) ;
323360}
324361
325362#[ cfg( test) ]
0 commit comments