Skip to content

Commit 714bc39

Browse files
committed
Implement FromOkm for MontgomeryScalar
1 parent c30aaa5 commit 714bc39

File tree

4 files changed

+42
-30
lines changed

4 files changed

+42
-30
lines changed

ed448-goldilocks/src/edwards/scalar.rs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use crate::field::{CurveWithScalar, NZ_ORDER, Scalar, ScalarBytes, WideScalarByt
22
use crate::{Ed448, ORDER};
33

44
use elliptic_curve::array::Array;
5-
use elliptic_curve::bigint::{Limb, NonZero, U448, U704};
6-
use elliptic_curve::consts::{U57, U84, U88};
5+
use elliptic_curve::bigint::{Limb, U448};
6+
use elliptic_curve::consts::{U57, U84};
77
use elliptic_curve::scalar::FromUintUnchecked;
88
use hash2curve::FromOkm;
99
use subtle::{Choice, CtOption};
@@ -86,17 +86,7 @@ impl FromOkm for EdwardsScalar {
8686
type Length = U84;
8787

8888
fn from_okm(data: &Array<u8, Self::Length>) -> Self {
89-
const SEMI_WIDE_MODULUS: NonZero<U704> = NonZero::<U704>::new_unwrap(U704::from_be_hex(
90-
"00000000000000000000000000000000000000000000000000000000000000003fffffffffffffffffffffffffffffffffffffffffffffffffffffff7cca23e9c44edb49aed63690216cc2728dc58f552378c292ab5844f3",
91-
));
92-
let mut tmp = Array::<u8, U88>::default();
93-
tmp[4..].copy_from_slice(&data[..]);
94-
95-
let mut num = U704::from_be_slice(&tmp[..]);
96-
num %= SEMI_WIDE_MODULUS;
97-
let mut words = [0; U448::LIMBS];
98-
words.copy_from_slice(&num.to_words()[..U448::LIMBS]);
99-
Scalar::new(U448::from_words(words))
89+
Self::from_okm_u84(data)
10090
}
10191
}
10292

ed448-goldilocks/src/field/element.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ impl PartialEq for FieldElement {
6767
}
6868
impl Eq for FieldElement {}
6969

70-
impl FromOkm for Ed448FieldElement {
70+
impl FromOkm for FieldElementU84 {
7171
type Length = U84;
7272

7373
fn from_okm(data: &Array<u8, Self::Length>) -> Self {
@@ -88,7 +88,7 @@ impl FromOkm for Ed448FieldElement {
8888
}
8989
}
9090

91-
impl FromOkm for Decaf448FieldElement {
91+
impl FromOkm for FieldElementU56 {
9292
type Length = U56;
9393

9494
fn from_okm(data: &Array<u8, Self::Length>) -> Self {
@@ -193,13 +193,13 @@ impl Neg for FieldElement {
193193
}
194194

195195
#[derive(Clone, Copy, Default, Debug)]
196-
pub struct Ed448FieldElement(FieldElement);
196+
pub struct FieldElementU84(pub(crate) FieldElement);
197197

198198
impl MapToCurve for Ed448 {
199199
type CurvePoint = EdwardsPoint;
200-
type FieldElement = Ed448FieldElement;
200+
type FieldElement = FieldElementU84;
201201

202-
fn map_to_curve(element: Ed448FieldElement) -> Self::CurvePoint {
202+
fn map_to_curve(element: FieldElementU84) -> Self::CurvePoint {
203203
AffinePoint::from(element.0.map_to_curve_elligator2_curve448()).to_edwards()
204204
}
205205

@@ -213,13 +213,13 @@ impl MapToCurve for Ed448 {
213213
}
214214

215215
#[derive(Clone, Copy, Default, Debug)]
216-
pub struct Decaf448FieldElement(FieldElement);
216+
pub struct FieldElementU56(pub(crate) FieldElement);
217217

218218
impl MapToCurve for Decaf448 {
219219
type CurvePoint = DecafPoint;
220-
type FieldElement = Decaf448FieldElement;
220+
type FieldElement = FieldElementU56;
221221

222-
fn map_to_curve(element: Decaf448FieldElement) -> DecafPoint {
222+
fn map_to_curve(element: FieldElementU56) -> DecafPoint {
223223
DecafPoint(element.0.map_to_curve_decaf448())
224224
}
225225

@@ -479,16 +479,14 @@ mod tests {
479479
.unwrap();
480480
let mut data = Array::<u8, U84>::default();
481481
expander.fill_bytes(&mut data);
482-
// TODO: This should be `Curve448FieldElement`.
483-
let u0 = Ed448FieldElement::from_okm(&data).0;
482+
let u0 = FieldElementU84::from_okm(&data).0;
484483
let mut e_u0 = *expected_u0;
485484
e_u0.reverse();
486485
let mut e_u1 = *expected_u1;
487486
e_u1.reverse();
488487
assert_eq!(u0.to_bytes(), e_u0);
489488
expander.fill_bytes(&mut data);
490-
// TODO: This should be `Curve448FieldElement`.
491-
let u1 = Ed448FieldElement::from_okm(&data).0;
489+
let u1 = FieldElementU84::from_okm(&data).0;
492490
assert_eq!(u1.to_bytes(), e_u1);
493491
}
494492
}
@@ -513,14 +511,14 @@ mod tests {
513511
.unwrap();
514512
let mut data = Array::<u8, U84>::default();
515513
expander.fill_bytes(&mut data);
516-
let u0 = Ed448FieldElement::from_okm(&data).0;
514+
let u0 = FieldElementU84::from_okm(&data).0;
517515
let mut e_u0 = *expected_u0;
518516
e_u0.reverse();
519517
let mut e_u1 = *expected_u1;
520518
e_u1.reverse();
521519
assert_eq!(u0.to_bytes(), e_u0);
522520
expander.fill_bytes(&mut data);
523-
let u1 = Ed448FieldElement::from_okm(&data).0;
521+
let u1 = FieldElementU84::from_okm(&data).0;
524522
assert_eq!(u1.to_bytes(), e_u1);
525523
}
526524
}

ed448-goldilocks/src/field/scalar.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use elliptic_curve::{
1313
Array, ArraySize,
1414
typenum::{Prod, Unsigned},
1515
},
16-
bigint::{Limb, NonZero, U448, U896, Word, Zero},
17-
consts::U2,
16+
bigint::{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},
@@ -826,4 +826,18 @@ impl<C: CurveWithScalar> Scalar<C> {
826826
pub fn to_scalar<O: CurveWithScalar>(&self) -> Scalar<O> {
827827
Scalar::new(self.scalar)
828828
}
829+
830+
pub(crate) fn from_okm_u84(data: &Array<u8, U84>) -> Self {
831+
const SEMI_WIDE_MODULUS: NonZero<U704> = NonZero::<U704>::new_unwrap(U704::from_be_hex(
832+
"00000000000000000000000000000000000000000000000000000000000000003fffffffffffffffffffffffffffffffffffffffffffffffffffffff7cca23e9c44edb49aed63690216cc2728dc58f552378c292ab5844f3",
833+
));
834+
let mut tmp = Array::<u8, U88>::default();
835+
tmp[4..].copy_from_slice(&data[..]);
836+
837+
let mut num = U704::from_be_slice(&tmp[..]);
838+
num %= SEMI_WIDE_MODULUS;
839+
let mut words = [0; U448::LIMBS];
840+
words.copy_from_slice(&num.to_words()[..U448::LIMBS]);
841+
Scalar::new(U448::from_words(words))
842+
}
829843
}

ed448-goldilocks/src/montgomery/scalar.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
use elliptic_curve::array::Array;
12
use elliptic_curve::bigint::{Limb, U448};
2-
use elliptic_curve::consts::U56;
3+
use elliptic_curve::consts::{U56, U84};
34
use elliptic_curve::scalar::FromUintUnchecked;
5+
use hash2curve::FromOkm;
46
use subtle::{Choice, CtOption};
57

68
use crate::field::{CurveWithScalar, NZ_ORDER, ScalarBytes, WideScalarBytes};
@@ -64,6 +66,14 @@ impl From<&MontgomeryScalar> for elliptic_curve::scalar::ScalarBits<Curve448> {
6466
}
6567
}
6668

69+
impl FromOkm for MontgomeryScalar {
70+
type Length = U84;
71+
72+
fn from_okm(data: &Array<u8, Self::Length>) -> Self {
73+
Self::from_okm_u84(data)
74+
}
75+
}
76+
6777
#[cfg(test)]
6878
mod test {
6979
use super::*;

0 commit comments

Comments
 (0)