Struct FieldElement

Source
pub struct FieldElement(/* private fields */);
Expand description

P-384 field element representing values in F_p

Internally stored as 12 little-endian 32-bit limbs for efficient arithmetic. All operations maintain the invariant that values are reduced modulo p.

Implementations§

Source§

impl FieldElement

Source

pub fn zero() -> Self

The additive identity element: 0

Source

pub fn one() -> Self

The multiplicative identity element: 1

Source

pub fn from_bytes(bytes: &[u8; 48]) -> Result<Self>

Create a field element from big-endian byte representation

Validates that the input represents a value less than the field modulus p. Returns an error if the value is >= p.

Source

pub fn to_bytes(&self) -> [u8; 48]

Convert field element to big-endian byte representation

Source

pub fn is_valid(&self) -> bool

Constant-time validation that the field element is in canonical form (< p)

Uses constant-time subtraction to check if self < p without branching. Returns true if the element is valid (< p), false otherwise.

Source

pub fn add(&self, other: &Self) -> Self

Constant-time field addition: (self + other) mod p

Algorithm:

  1. Perform full 384-bit addition with carry detection
  2. Conditionally subtract p if result >= p
  3. Ensure result is in canonical form
Source

pub fn sub(&self, other: &Self) -> Self

Constant-time field subtraction: (self - other) mod p

Algorithm:

  1. Perform limb-wise subtraction
  2. If subtraction borrows, add p to get the correct positive result
Source

pub fn mul(&self, other: &Self) -> Self

Field multiplication: (self * other) mod p

Algorithm:

  1. Compute the full 768-bit product using schoolbook multiplication
  2. Perform carry propagation to get proper limb representation
  3. Apply Barrett reduction for P-384
Source

pub fn square(&self) -> Self

Field squaring: self² mod p

Optimized version of multiplication for the case where both operands are the same. Currently implemented as self.mul(self) but could be optimized further with dedicated squaring algorithms.

Source

pub fn invert(&self) -> Result<Self>

Compute the modular multiplicative inverse using Fermat’s Little Theorem

For prime fields, a^(p-1) ≡ 1 (mod p), so a^(p-2) ≡ a^(-1) (mod p). Uses binary exponentiation (square-and-multiply) for efficiency.

Returns an error if attempting to invert zero (which has no inverse).

Source

pub fn is_zero(&self) -> bool

Check if the field element represents zero

Constant-time check across all limbs to determine if the field element is the additive identity.

Source

pub fn is_odd(&self) -> bool

Return true when the element is odd (LSB set)

Used for point compression to determine the sign of the y-coordinate. The parity is determined by the least significant bit of the canonical representation.

Source

pub fn sqrt(&self) -> Option<Self>

Modular square root using the (p+1)/4 shortcut (p ≡ 3 mod 4).

Because the P-384 prime satisfies p ≡ 3 (mod 4), we can compute sqrt(a) = a^((p+1)/4) mod p. This is more efficient than the general Tonelli-Shanks algorithm.

Returns None when the input is a quadratic non-residue (i.e., when no square root exists in the field).

§Algorithm

For p ≡ 3 (mod 4), if a has a square root, then:

  • sqrt(a) = ±a^((p+1)/4) mod p
  • We return the principal square root (the smaller of the two)

Trait Implementations§

Source§

impl Clone for FieldElement

Source§

fn clone(&self) -> FieldElement

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FieldElement

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for FieldElement

Source§

fn eq(&self, other: &FieldElement) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Eq for FieldElement

Source§

impl StructuralPartialEq for FieldElement

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V