pub struct ExpandedSecretKey { /* private fields */ }
Expand description

An “expanded” secret key.

This is produced by using an hash function with 512-bits output to digest a SecretKey. The output digest is then split in half, the lower half being the actual key used to sign messages, after twiddling with some bits.¹ The upper half is used a sort of half-baked, ill-designed² pseudo-domain-separation “nonce”-like thing, which is used during signature production by concatenating it with the message to be signed before the message is hashed.

Instances of this secret are automatically overwritten with zeroes when they fall out of scope.

Implementations§

§

impl ExpandedSecretKey

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

Convert this ExpandedSecretKey into an array of 64 bytes.

Returns

An array of 64 bytes. The first 32 bytes represent the “expanded” secret key, and the last 32 bytes represent the “domain-separation” “nonce”.

Examples
use rand::rngs::OsRng;
use ed25519_dalek_fiat::{SecretKey, ExpandedSecretKey};

let mut csprng = OsRng{};
let secret_key: SecretKey = SecretKey::generate(&mut csprng);
let expanded_secret_key: ExpandedSecretKey = ExpandedSecretKey::from(&secret_key);
let expanded_secret_key_bytes: [u8; 64] = expanded_secret_key.to_bytes();

assert!(&expanded_secret_key_bytes[..] != &[0u8; 64][..]);

pub fn from_bytes(bytes: &[u8]) -> Result<ExpandedSecretKey, Error>

Construct an ExpandedSecretKey from a slice of bytes.

Returns

A Result whose okay value is an EdDSA ExpandedSecretKey or whose error value is an SignatureError describing the error that occurred.

Examples
use rand::rngs::OsRng;
use ed25519_dalek_fiat::{SecretKey, ExpandedSecretKey};
use ed25519_dalek_fiat::SignatureError;

let mut csprng = OsRng{};
let secret_key: SecretKey = SecretKey::generate(&mut csprng);
let expanded_secret_key: ExpandedSecretKey = ExpandedSecretKey::from(&secret_key);
let bytes: [u8; 64] = expanded_secret_key.to_bytes();
let expanded_secret_key_again = ExpandedSecretKey::from_bytes(&bytes)?;

pub fn sign(&self, message: &[u8], public_key: &PublicKey) -> Signature

Sign a message with this ExpandedSecretKey.

pub fn sign_prehashed<D, 'a>( &self, prehashed_message: D, public_key: &PublicKey, context: Option<&'a [u8]> ) -> Result<Signature, Error>where D: Digest<OutputSize = UInt<UInt<UInt<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B0>, B0>, B0>, B0>, B0>>,

Sign a prehashed_message with this ExpandedSecretKey using the Ed25519ph algorithm defined in RFC8032 §5.1.

Inputs
  • prehashed_message is an instantiated hash digest with 512-bits of output which has had the message to be signed previously fed into its state.
  • public_key is a PublicKey which corresponds to this secret key.
  • context is an optional context string, up to 255 bytes inclusive, which may be used to provide additional domain separation. If not set, this will default to an empty string.
Returns

A Result whose Ok value is an Ed25519ph [Signature] on the prehashed_message if the context was 255 bytes or less, otherwise a SignatureError.

Trait Implementations§

§

impl<'d> Deserialize<'d> for ExpandedSecretKey

§

fn deserialize<D>( deserializer: D ) -> Result<ExpandedSecretKey, <D as Deserializer<'d>>::Error>where D: Deserializer<'d>,

Deserialize this value from the given Serde deserializer. Read more
§

impl Drop for ExpandedSecretKey

§

fn drop(&mut self)

Executes the destructor for this type. Read more
§

impl<'a> From<&'a ExpandedSecretKey> for PublicKey

§

fn from(expanded_secret_key: &ExpandedSecretKey) -> PublicKey

Derive this public key from its corresponding ExpandedSecretKey.

§

impl<'a> From<&'a SecretKey> for ExpandedSecretKey

§

fn from(secret_key: &'a SecretKey) -> ExpandedSecretKey

Construct an ExpandedSecretKey from a SecretKey.

Examples
use rand::rngs::OsRng;
use ed25519_dalek_fiat::{SecretKey, ExpandedSecretKey};

let mut csprng = OsRng{};
let secret_key: SecretKey = SecretKey::generate(&mut csprng);
let expanded_secret_key: ExpandedSecretKey = ExpandedSecretKey::from(&secret_key);
§

impl Serialize for ExpandedSecretKey

§

fn serialize<S>( &self, serializer: S ) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl Zeroize for ExpandedSecretKey

§

fn zeroize(&mut self)

Zero out this object from memory using Rust intrinsics which ensure the zeroization operation is not “optimized away” by the compiler.

Auto Trait Implementations§

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

const: unstable · source§

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

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

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

const: unstable · 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> Same<T> for T

§

type Output = T

Should always be Self
§

impl<T> TestOnlyHash for Twhere T: Serialize + ?Sized,

§

fn test_only_hash(&self) -> HashValue

Generates a hash used only for tests.
source§

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

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

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

Performs the conversion.
source§

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

§

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

The type returned in the event of a conversion error.
const: unstable · source§

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

Performs the conversion.
§

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

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere T: for<'de> Deserialize<'de>,