mirror of
https://github.com/saymrwulf/curve25519-dalek-source.git
synced 2026-09-04 20:24:10 +00:00
Merge remote-tracking branch 'hdevalence/feature/some-cleanup-tweaks' into develop
This commit is contained in:
commit
f48947fb57
3 changed files with 46 additions and 24 deletions
43
src/curve.rs
43
src/curve.rs
|
|
@ -79,7 +79,7 @@
|
||||||
|
|
||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
use core::iter::Iterator;
|
use core::iter::Iterator;
|
||||||
use core::ops::{Add, Sub, Neg, Index};
|
use core::ops::{Add, Sub, Neg};
|
||||||
use core::cmp::{PartialEq, Eq};
|
use core::cmp::{PartialEq, Eq};
|
||||||
|
|
||||||
use constants;
|
use constants;
|
||||||
|
|
@ -106,21 +106,18 @@ pub struct CompressedEdwardsY(pub [u8; 32]);
|
||||||
|
|
||||||
impl Debug for CompressedEdwardsY {
|
impl Debug for CompressedEdwardsY {
|
||||||
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
|
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
|
||||||
write!(f, "CompressedPoint: {:?}", &self.0[..])
|
write!(f, "CompressedPoint: {:?}", self.as_bytes())
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Index<usize> for CompressedEdwardsY {
|
|
||||||
type Output = u8;
|
|
||||||
|
|
||||||
fn index<'a>(&'a self, _index: usize) -> &'a u8 {
|
|
||||||
let ret: &'a u8 = &(self.0[_index]);
|
|
||||||
ret
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CompressedEdwardsY {
|
impl CompressedEdwardsY {
|
||||||
/// View this `CompressedEdwardsY` as an array of bytes.
|
/// View this `CompressedEdwardsY` as an array of bytes.
|
||||||
|
pub fn as_bytes<'a>(&'a self) -> &'a [u8;32] {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Copy this `CompressedEdwardsY` to an array of bytes.
|
||||||
|
/// XXX is this useful?
|
||||||
pub fn to_bytes(&self) -> [u8;32] {
|
pub fn to_bytes(&self) -> [u8;32] {
|
||||||
self.0
|
self.0
|
||||||
}
|
}
|
||||||
|
|
@ -130,7 +127,7 @@ impl CompressedEdwardsY {
|
||||||
/// Returns `None` if the input is not the `y`-coordinate of a
|
/// Returns `None` if the input is not the `y`-coordinate of a
|
||||||
/// curve point.
|
/// curve point.
|
||||||
pub fn decompress(&self) -> Option<ExtendedPoint> { // FromBytes()
|
pub fn decompress(&self) -> Option<ExtendedPoint> { // FromBytes()
|
||||||
let Y = FieldElement::from_bytes(&self.0);
|
let Y = FieldElement::from_bytes(self.as_bytes());
|
||||||
let Z = FieldElement::one();
|
let Z = FieldElement::one();
|
||||||
let YY = Y.square();
|
let YY = Y.square();
|
||||||
let u = &YY - &Z; // u = y²-1
|
let u = &YY - &Z; // u = y²-1
|
||||||
|
|
@ -140,7 +137,7 @@ impl CompressedEdwardsY {
|
||||||
if is_nonzero_square != 1u8 { return None; }
|
if is_nonzero_square != 1u8 { return None; }
|
||||||
|
|
||||||
// Flip the sign of X if it's not correct
|
// Flip the sign of X if it's not correct
|
||||||
let compressed_sign_bit = self[31] >> 7;
|
let compressed_sign_bit = self.as_bytes()[31] >> 7;
|
||||||
let current_sign_bit = X.is_negative_ed25519();
|
let current_sign_bit = X.is_negative_ed25519();
|
||||||
X.conditional_negate(current_sign_bit ^ compressed_sign_bit);
|
X.conditional_negate(current_sign_bit ^ compressed_sign_bit);
|
||||||
|
|
||||||
|
|
@ -221,6 +218,15 @@ pub trait Identity {
|
||||||
fn identity() -> Self;
|
fn identity() -> Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Identity for CompressedEdwardsY {
|
||||||
|
fn identity() -> CompressedEdwardsY {
|
||||||
|
CompressedEdwardsY([1, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Identity for ExtendedPoint {
|
impl Identity for ExtendedPoint {
|
||||||
fn identity() -> ExtendedPoint {
|
fn identity() -> ExtendedPoint {
|
||||||
ExtendedPoint{ X: FieldElement::zero(),
|
ExtendedPoint{ X: FieldElement::zero(),
|
||||||
|
|
@ -317,7 +323,8 @@ impl CTAssignable for AffineNielsPoint {
|
||||||
|
|
||||||
impl CTEq for ExtendedPoint {
|
impl CTEq for ExtendedPoint {
|
||||||
fn ct_eq(&self, other: &ExtendedPoint) -> u8 {
|
fn ct_eq(&self, other: &ExtendedPoint) -> u8 {
|
||||||
arrays_equal_ct(&self.compress().0, &other.compress().0)
|
arrays_equal_ct( self.compress().as_bytes(),
|
||||||
|
other.compress().as_bytes())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -977,7 +984,7 @@ mod test {
|
||||||
/// Test sign handling in decompression
|
/// Test sign handling in decompression
|
||||||
#[test]
|
#[test]
|
||||||
fn test_decompression_sign_handling() {
|
fn test_decompression_sign_handling() {
|
||||||
let mut m_bp_bytes: [u8;32] = BASE_CMPRSSD.to_bytes().clone();
|
let mut m_bp_bytes: [u8;32] = BASE_CMPRSSD.as_bytes().clone();
|
||||||
// Set the high bit of the last byte to flip the sign
|
// Set the high bit of the last byte to flip the sign
|
||||||
m_bp_bytes[31] |= 1 << 7;
|
m_bp_bytes[31] |= 1 << 7;
|
||||||
let m_bp = CompressedEdwardsY(m_bp_bytes).decompress().unwrap();
|
let m_bp = CompressedEdwardsY(m_bp_bytes).decompress().unwrap();
|
||||||
|
|
@ -1163,6 +1170,12 @@ mod test {
|
||||||
assert!(p2.is_small_order() == false);
|
assert!(p2.is_small_order() == false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_compressed_identity() {
|
||||||
|
assert_eq!(ExtendedPoint::identity().compress(),
|
||||||
|
CompressedEdwardsY::identity());
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_is_identity() {
|
fn test_is_identity() {
|
||||||
assert!(ExtendedPoint::identity().is_identity());
|
assert!(ExtendedPoint::identity().is_identity());
|
||||||
|
|
|
||||||
12
src/decaf.rs
12
src/decaf.rs
|
|
@ -50,15 +50,15 @@ pub struct CompressedDecaf(pub [u8; 32]);
|
||||||
/// The result of compressing a `DecafPoint`.
|
/// The result of compressing a `DecafPoint`.
|
||||||
impl CompressedDecaf {
|
impl CompressedDecaf {
|
||||||
/// View this `CompressedDecaf` as an array of bytes.
|
/// View this `CompressedDecaf` as an array of bytes.
|
||||||
pub fn to_bytes(&self) -> [u8;32] {
|
pub fn as_bytes<'a>(&'a self) -> &'a [u8;32] {
|
||||||
self.0
|
&self.0
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Attempt to decompress to an `DecafPoint`.
|
/// Attempt to decompress to an `DecafPoint`.
|
||||||
pub fn decompress(&self) -> Option<DecafPoint> {
|
pub fn decompress(&self) -> Option<DecafPoint> {
|
||||||
// XXX should decoding be CT ?
|
// XXX should decoding be CT ?
|
||||||
// XXX need to check that xy is nonnegative and reject otherwise
|
// XXX need to check that xy is nonnegative and reject otherwise
|
||||||
let s = FieldElement::from_bytes(&self.0);
|
let s = FieldElement::from_bytes(self.as_bytes());
|
||||||
|
|
||||||
// Check that s = |s| and reject otherwise.
|
// Check that s = |s| and reject otherwise.
|
||||||
let mut abs_s = s;
|
let mut abs_s = s;
|
||||||
|
|
@ -267,7 +267,7 @@ impl BasepointMult<Scalar> for DecafPoint {
|
||||||
|
|
||||||
impl Debug for CompressedDecaf {
|
impl Debug for CompressedDecaf {
|
||||||
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
|
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
|
||||||
write!(f, "CompressedDecaf: {:?}", &self.0[..])
|
write!(f, "CompressedDecaf: {:?}", self.as_bytes())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -308,9 +308,7 @@ mod test {
|
||||||
fn test_decaf_decompress_id() {
|
fn test_decaf_decompress_id() {
|
||||||
let compressed_id = CompressedDecaf::identity();
|
let compressed_id = CompressedDecaf::identity();
|
||||||
let id = compressed_id.decompress().unwrap();
|
let id = compressed_id.decompress().unwrap();
|
||||||
// This should compress (as ed25519) to the following:
|
assert_eq!(id.0.compress(), CompressedEdwardsY::identity());
|
||||||
let mut bytes = [0u8; 32]; bytes[0] = 1;
|
|
||||||
assert_eq!(id.0.compress(), CompressedEdwardsY(bytes));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,8 @@
|
||||||
//! limbs.
|
//! limbs.
|
||||||
|
|
||||||
use core::cmp::{Eq, PartialEq};
|
use core::cmp::{Eq, PartialEq};
|
||||||
use core::ops::{Index, IndexMut};
|
use core::ops::{Neg, Index, IndexMut};
|
||||||
use core::ops::{Neg};
|
use core::fmt::Debug;
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
|
@ -54,6 +54,12 @@ use subtle::arrays_equal_ct;
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct Scalar(pub [u8; 32]);
|
pub struct Scalar(pub [u8; 32]);
|
||||||
|
|
||||||
|
impl Debug for Scalar {
|
||||||
|
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
|
||||||
|
write!(f, "Scalar: {:?}", &self.0[..])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Eq for Scalar{}
|
impl Eq for Scalar{}
|
||||||
impl PartialEq for Scalar {
|
impl PartialEq for Scalar {
|
||||||
/// Test equality between two `Scalar`s.
|
/// Test equality between two `Scalar`s.
|
||||||
|
|
@ -194,6 +200,11 @@ impl Scalar {
|
||||||
Scalar::reduce(&output)
|
Scalar::reduce(&output)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// View this `Scalar` as a sequence of bytes.
|
||||||
|
pub fn as_bytes<'a>(&'a self) -> &'a [u8;32] {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
|
||||||
/// Construct the additive identity
|
/// Construct the additive identity
|
||||||
pub fn zero() -> Self {
|
pub fn zero() -> Self {
|
||||||
Scalar([0u8; 32])
|
Scalar([0u8; 32])
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue