Struct curve25519_dalek::scalar::Scalar [] [src]

pub struct Scalar(pub [u8; 32]);

The Scalar struct represents an element in ℤ/lℤ, where

l = 2252 + 27742317777372353535851937790883648493

is the order of the basepoint. The Scalar is stored as bytes.

Methods

impl Scalar
[src]

Return a Scalar chosen uniformly at random using a CSPRNG. Panics if the operating system's CSPRNG is unavailable.

Inputs

  • cspring: any cryptographically secure PRNG which implements the rand::Rng interface.

Returns

A random scalar within ℤ/lℤ.

Construct the additive identity

Construct the multiplicative identity

Compute a width-5 "Non-Adjacent Form" of this scalar.

A width-w NAF of a positive integer k is an expression k = sum(k[i]*2^i for i in range(l)), where each nonzero coefficient k[i] is odd and bounded by |k[i]| < 2^(w-1), k[l-1] is nonzero, and at most one of any w consecutive coefficients is nonzero. (Hankerson, Menezes, Vanstone; def 3.32).

Intuitively, this is like a binary expansion, except that we allow some coefficients to grow up to 2^(w-1) so that the nonzero coefficients are as sparse as possible.

Write this scalar in radix 16, with coefficients in [-8,8), i.e., compute a_i such that

a = a_0 + a_1*161 + ... + a_63*1663,

with -8 ≤ a_i < 8 for 0 ≤ i < 63 and -8 ≤ a_63 ≤ 8.

Precondition: self[31] <= 127. This is the case whenever self is reduced.

Compute ab+c (mod l). XXX should this exist, or should we just have Mul, Add etc impls that unpack and then call UnpackedScalar::multiply_add ?

Reduce a 512-bit little endian number mod l

Trait Implementations

impl Copy for Scalar
[src]

impl Clone for Scalar
[src]

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

impl Index<usize> for Scalar
[src]

The returned type after indexing

The method for the indexing (container[index]) operation

impl IndexMut<usize> for Scalar
[src]

The method for the mutable indexing (container[index]) operation

impl CTAssignable for Scalar
[src]

Conditionally assign another Scalar to this one.

let a = Scalar([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,0]);
let b = Scalar([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]);
let mut t = a;
t.conditional_assign(&b, 0u8);
assert!(t[0] == a[0]);
t.conditional_assign(&b, 1u8);
assert!(t[0] == b[0]);

Preconditions

  • choice in {0,1}