Skip to content

Commit f6acc42

Browse files
committed
Implement FromOkm for MontgomeryScalar
1 parent 5b14237 commit f6acc42

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
@@ -68,7 +68,7 @@ impl PartialEq for FieldElement {
6868
}
6969
impl Eq for FieldElement {}
7070

71-
impl FromOkm for Ed448FieldElement {
71+
impl FromOkm for FieldElementU84 {
7272
type Length = U84;
7373

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

92-
impl FromOkm for Decaf448FieldElement {
92+
impl FromOkm for FieldElementU56 {
9393
type Length = U56;
9494

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

196196
#[derive(Clone, Copy, Default, Debug)]
197-
pub struct Ed448FieldElement(FieldElement);
197+
pub struct FieldElementU84(pub(crate) FieldElement);
198198

199199
impl MapToCurve for Ed448 {
200200
type CurvePoint = EdwardsPoint;
201-
type FieldElement = Ed448FieldElement;
201+
type FieldElement = FieldElementU84;
202202

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

@@ -214,13 +214,13 @@ impl MapToCurve for Ed448 {
214214
}
215215

216216
#[derive(Clone, Copy, Default, Debug)]
217-
pub struct Decaf448FieldElement(FieldElement);
217+
pub struct FieldElementU56(pub(crate) FieldElement);
218218

219219
impl MapToCurve for Decaf448 {
220220
type CurvePoint = DecafPoint;
221-
type FieldElement = Decaf448FieldElement;
221+
type FieldElement = FieldElementU56;
222222

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

@@ -480,16 +480,14 @@ mod tests {
480480
.unwrap();
481481
let mut data = Array::<u8, U84>::default();
482482
expander.fill_bytes(&mut data);
483-
// TODO: This should be `Curve448FieldElement`.
484-
let u0 = Ed448FieldElement::from_okm(&data).0;
483+
let u0 = FieldElementU84::from_okm(&data).0;
485484
let mut e_u0 = *expected_u0;
486485
e_u0.reverse();
487486
let mut e_u1 = *expected_u1;
488487
e_u1.reverse();
489488
assert_eq!(u0.to_bytes(), e_u0);
490489
expander.fill_bytes(&mut data);
491-
// TODO: This should be `Curve448FieldElement`.
492-
let u1 = Ed448FieldElement::from_okm(&data).0;
490+
let u1 = FieldElementU84::from_okm(&data).0;
493491
assert_eq!(u1.to_bytes(), e_u1);
494492
}
495493
}
@@ -514,14 +512,14 @@ mod tests {
514512
.unwrap();
515513
let mut data = Array::<u8, U84>::default();
516514
expander.fill_bytes(&mut data);
517-
let u0 = Ed448FieldElement::from_okm(&data).0;
515+
let u0 = FieldElementU84::from_okm(&data).0;
518516
let mut e_u0 = *expected_u0;
519517
e_u0.reverse();
520518
let mut e_u1 = *expected_u1;
521519
e_u1.reverse();
522520
assert_eq!(u0.to_bytes(), e_u0);
523521
expander.fill_bytes(&mut data);
524-
let u1 = Ed448FieldElement::from_okm(&data).0;
522+
let u1 = FieldElementU84::from_okm(&data).0;
525523
assert_eq!(u1.to_bytes(), e_u1);
526524
}
527525
}

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)