Point

Struct Point 

Source
pub struct Point { /* private fields */ }
Expand description

P-384 elliptic curve point in affine coordinates (x, y)

Represents points on the NIST P-384 curve. The special point at infinity (identity element) is represented with is_identity = true.

Implementations§

Source§

impl Point

Source

pub fn new_uncompressed(x: &[u8; 48], y: &[u8; 48]) -> Result<Self>

Create a new elliptic curve point from uncompressed coordinates

Validates that the given (x, y) coordinates satisfy the P-384 curve equation: y² = x³ - 3x + b (mod p)

Returns an error if the point is not on the curve.

Source

pub fn identity() -> Self

Create the identity element (point at infinity)

The identity element serves as the additive neutral element for the elliptic curve group operation.

Source

pub fn is_identity(&self) -> bool

Check if this point is the identity element

Source

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

Get the x-coordinate as a byte array in big-endian format

Source

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

Get the y-coordinate as a byte array in big-endian format

Source

pub fn detect_format(bytes: &[u8]) -> Result<PointFormat>

Detect point format from serialized bytes

Analyzes the leading byte and length to determine the serialization format. Useful for handling points that could be in either compressed or uncompressed form.

§Returns
  • Ok(PointFormat) indicating the detected format
  • Err if the format is invalid or unrecognized
Source

pub fn serialize_uncompressed(&self) -> [u8; 97]

Serialize point to uncompressed format: 0x04 || x || y

The uncompressed point format is:

  • 1 byte: 0x04 (uncompressed indicator)
  • 48 bytes: x-coordinate (big-endian)
  • 48 bytes: y-coordinate (big-endian)

The identity point is represented as all zeros.

Source

pub fn deserialize_uncompressed(bytes: &[u8]) -> Result<Self>

Deserialize point from uncompressed byte format

Supports the standard uncompressed format (0x04 || x || y) and recognizes the all-zeros encoding for the identity element.

Source

pub fn serialize_compressed(&self) -> [u8; 49]

Serialize point to SEC 1 compressed format (0x02/0x03 || x)

The compressed format uses:

  • 0x02 prefix if y-coordinate is even
  • 0x03 prefix if y-coordinate is odd
  • Followed by the x-coordinate in big-endian format

The identity point is encoded as 49 zero bytes for consistency with the uncompressed format.

This format reduces storage/transmission size by ~50% compared to uncompressed points while maintaining full recoverability.

Source

pub fn deserialize_compressed(bytes: &[u8]) -> Result<Self>

Deserialize SEC 1 compressed point

Recovers the full point from compressed format by:

  1. Extracting the x-coordinate
  2. Computing y² = x³ - 3x + b
  3. Finding the square root of y²
  4. Selecting the root with correct parity based on the prefix
§Errors

Returns an error if:

  • The prefix is not 0x02 or 0x03
  • The x-coordinate is not in the valid field range
  • The x-coordinate corresponds to a non-residue (not on curve)
Source

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

Elliptic curve point addition using the group law

Implements the abelian group operation for P-384 points. Converts to projective coordinates for efficient computation, then converts back to affine form.

Source

pub fn double(&self) -> Self

Elliptic curve point doubling: 2 * self

Computes the sum of a point with itself, which has a more efficient formula than general point addition.

Source

pub fn mul(&self, scalar: &Scalar) -> Result<Self>

Scalar multiplication: compute scalar * self

Uses the binary method (double-and-add) with constant-time execution to prevent timing attacks. Processes scalar bits from most significant to least significant for efficiency.

Returns the identity element if scalar is zero.

Trait Implementations§

Source§

impl Clone for Point

Source§

fn clone(&self) -> Point

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 Point

Source§

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

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

impl PartialEq for Point

Source§

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

Constant-time equality comparison for elliptic curve points

Handles the special case where either point is the identity element. For regular points, compares both x and y coordinates.

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.

Auto Trait Implementations§

§

impl Freeze for Point

§

impl RefUnwindSafe for Point

§

impl Send for Point

§

impl Sync for Point

§

impl Unpin for Point

§

impl UnwindSafe for Point

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