Skip to main content

Signature

Struct Signature 

Source
pub struct Signature {
    pub r: Vec<u8>,
    pub s: Vec<u8>,
}
Expand description

ECDSA signature (r, s) as big-endian byte arrays.

Each component is felem_bytes octets long for the curve (32 / 48 / 64 / 66 depending on the curve).

Fields§

§r: Vec<u8>

r component of the signature, big-endian.

§s: Vec<u8>

s component of the signature, big-endian.

Implementations§

Source§

impl Signature

Source

pub fn to_der(&self) -> Vec<u8>

Encode as ASN.1 DER (RFC 5480 / X.509 standard form):

ECDSA-Sig-Value ::= SEQUENCE {
    r  INTEGER,
    s  INTEGER
}

Uses the strict canonical DER encoding:

  • Lengths use the shortest form (single byte < 128, 81 xx up to 255, 82 hi lo above).
  • INTEGERs strip leading zero octets, and prepend one 00 octet if the high bit of the first octet would otherwise be set (which would make the number look negative in two’s complement).

This is the format used by X.509 certificates, TLS, S/MIME, CMS, JWS ES256-DER, and virtually every OpenSSL-derived tool.

Source

pub fn from_der(der: &[u8]) -> Option<Self>

Parse an ASN.1 DER encoding (strict). Returns None if the input is not a valid canonical DER encoding of an ECDSA signature.

Rejected inputs include (for defence against signature malleability and parser-differential attacks):

  • Any input whose length does not exactly match the advertised SEQUENCE length.
  • Non-minimal length encodings (e.g. 81 10 where 10 would do, or 82 00 10 where 10 would do).
  • INTEGERs with superfluous leading zero octets, or with the high bit set (which would be a negative number).
  • r or s equal to zero.

The returned Signature has r and s stripped of their DER padding (so they may be shorter than LIMBS * 8 bytes). This is fine for Curve::verify, which interprets them via bits2int and thus handles variable widths correctly.

Trait Implementations§

Source§

impl Clone for Signature

Source§

fn clone(&self) -> Signature

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 Signature

Source§

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

Formats the value using the given formatter. Read more

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.