Skip to content

Commit

Permalink
impl (From<u32>, Hash, Ord) for Scalar
Browse files Browse the repository at this point in the history
  • Loading branch information
A-Manning committed Dec 18, 2020
1 parent 080eaa7 commit 3aa4d87
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 3 deletions.
4 changes: 2 additions & 2 deletions src/g1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1538,7 +1538,7 @@ fn test_mul_by_x() {
};
assert_eq!(generator.mul_by_x(), generator * x);

let point = G1Projective::generator() * Scalar::from(42);
let point = G1Projective::generator() * Scalar::from(42u64);
assert_eq!(point.mul_by_x(), point * x);
}

Expand Down Expand Up @@ -1588,7 +1588,7 @@ fn test_clear_cofactor() {

// in BLS12-381 the cofactor in G1 can be
// cleared multiplying by (1-x)
let h_eff = Scalar::from(1) + Scalar::from(crate::BLS_X);
let h_eff = Scalar::from(1u64) + Scalar::from(crate::BLS_X);
assert_eq!(point.clear_cofactor(), point * h_eff);
}

Expand Down
42 changes: 41 additions & 1 deletion src/scalar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use crate::util::{adc, mac, sbb};
// The internal representation of this type is four 64-bit unsigned
// integers in little-endian order. `Scalar` values are always in
// Montgomery form; i.e., Scalar(a) = aR mod q, with R = 2^256.
#[derive(Clone, Copy, Eq)]
#[derive(Clone, Copy, Eq, Hash)]
pub struct Scalar(pub(crate) [u64; 4]);

impl fmt::Debug for Scalar {
Expand All @@ -37,6 +37,12 @@ impl fmt::Display for Scalar {
}
}

impl From<u32> for Scalar {
fn from(val: u32) -> Scalar {
Scalar([val as u64, 0, 0, 0]) * R2
}
}

impl From<u64> for Scalar {
fn from(val: u64) -> Scalar {
Scalar([val, 0, 0, 0]) * R2
Expand All @@ -59,6 +65,22 @@ impl PartialEq for Scalar {
}
}

impl Ord for Scalar {
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
let mut self_bytes = self.0;
let mut other_bytes = other.0;
&self_bytes.reverse();
&other_bytes.reverse();
self_bytes.cmp(&other_bytes)
}
}

impl PartialOrd for Scalar {
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
Some(self.cmp(other))
}
}

impl ConditionallySelectable for Scalar {
fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self {
Scalar([
Expand Down Expand Up @@ -1231,3 +1253,21 @@ fn test_double() {

assert_eq!(a.double(), a + a);
}

#[test]
fn test_ord() {
assert!(Scalar::one() > Scalar::zero());
let x = Scalar::from_raw([
0x0000_0000_0000_0000,
0x0000_0000_0000_0000,
0x1111_1111_1111_1111,
0x1111_1111_1111_1111,
]);
let y = Scalar::from_raw([
0x1111_1111_1111_1111,
0x0000_0000_0000_0000,
0x1111_1111_1111_1111,
0x0000_0000_0000_0000,
]);
assert!(y < x);
}

0 comments on commit 3aa4d87

Please sign in to comment.