Valid

Struct Valid 

Source
pub struct Valid<T>(/* private fields */);
Expand description

Validated value

Valid<T> wraps a value T that has been validated using Validate trait.

Valid<T> provides only immutable access to T. For instance, if you want to change content of T, you need to deconstruct it, do necessary modifications, and then validate it again.

§Transitive “valideness” through AsRef

Valid<T> assumes that if T implements AsRef<K> and K can be validated (i.e. K implements Validate), then K has been validated when T was validated. Thus, if you have value of type Valid<T>, you can obtain &Valid<K> via AsRef trait.

Example of transitive valideness is demostrated below:

use key_share::{Validate, Valid};

pub type CoreKeyShare = Valid<DirtyCoreKeyShare>;
pub type KeyInfo = Valid<DirtyKeyInfo>;

pub struct DirtyCoreKeyShare {
    i: u16,
    key_info: DirtyKeyInfo,
    x: SecretScalar,
}
pub struct DirtyKeyInfo { /* ... */ }

// Key info can be validated separately
impl Validate for DirtyKeyInfo {
    type Error = InvalidKeyShare;
    fn is_valid(&self) -> Result<(), Self::Error> {
        // ...
    }
}

// CoreKeyShare can be validated as well
impl Validate for DirtyCoreKeyShare {
    type Error = InvalidKeyShare;
    fn is_valid(&self) -> Result<(), Self::Error> {
        // Since `key_info` is part of key share, it **must be** validated when
        // the key share is validated
        self.key_info.is_valid();
        // ...
    }
}
impl AsRef<DirtyKeyInfo> for DirtyCoreKeyShare {
    fn as_ref(&self) -> &DirtyKeyInfo {
        &self.key_info
    }
}

let key_share: CoreKeyShare = DirtyCoreKeyShare { i, key_info, x }.validate()?;

// Since `key_share` is validated, and it contains `key_info`, we can obtain a `&KeyInfo`.
// `Valid<T>` trusts that `<DirtyCoreKeyShare as Validate>::is_valid` has validated `key_info`.
let key_info: &KeyInfo = key_share.as_ref();

This mechanism allow to improve performance by not validating what’s already been validated. However, incorrect implementation of Validate trait may lead to obtaining Valid<K> that’s actually invalid. It may, in return, lead to runtime panic and/or compromised security of the application. Make sure that all implementations of Validate trait are correct and aligned with AsRef implementations.

Implementations§

Source§

impl<T> Valid<T>
where T: Validate,

Source

pub fn validate( value: T, ) -> Result<Self, ValidateError<T, <T as Validate>::Error>>

Validates the value

If value is valid, returns Ok(validated_value) wrapped into type guard Valid<T>, otherwise returns Err(err) containing the error and the invalid value.

Source

pub fn validate_ref( value: &T, ) -> Result<&Self, ValidateError<&T, <T as Validate>::Error>>

Validates a reference to value &T returning &Valid<T> if it’s valid

Source

pub fn from_parts<Parts>( parts: Parts, ) -> Result<Self, ValidateError<Parts, <T as Validate>::Error>>
where T: ValidateFromParts<Parts>,

Constructs and validates value from parts

Refer to ValidateFromParts trait documentation

Source§

impl<T> Valid<T>

Source

pub fn into_inner(self) -> T

Returns wraped validated value

Source§

impl<E: Curve> Valid<DirtyCoreKeyShare<E>>

Source

pub fn n(&self) -> u16

Returns amount of key co-holders

Source

pub fn min_signers(&self) -> u16

Returns threshold

Threshold is an amount of signers required to cooperate in order to sign a message and/or generate presignature

Source

pub fn shared_public_key(&self) -> NonZero<Point<E>>

Returns public key shared by signers

Trait Implementations§

Source§

impl<T> AsRef<T> for Valid<T>

Source§

fn as_ref(&self) -> &T

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl<E: Curve> AsRef<Valid<DirtyCoreKeyShare<E>>> for CoreKeyShare<E>

Source§

fn as_ref(&self) -> &CoreKeyShare<E>

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl<T, K> AsRef<Valid<K>> for Valid<T>
where T: Validate + AsRef<K>, K: Validate,

Source§

fn as_ref(&self) -> &Valid<K>

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl<T: Clone> Clone for Valid<T>

Source§

fn clone(&self) -> Valid<T>

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<T: Debug> Debug for Valid<T>

Source§

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

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

impl<T> Deref for Valid<T>

Source§

type Target = T

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<'de, T> Deserialize<'de> for Valid<T>
where T: Validate + Deserialize<'de>, <T as Validate>::Error: Display,

Available on crate feature serde only.
Source§

fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer<'de>,

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

impl<T> Serialize for Valid<T>
where T: Serialize,

Available on crate feature serde only.
Source§

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

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl<T> Freeze for Valid<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for Valid<T>
where T: RefUnwindSafe,

§

impl<T> Send for Valid<T>
where T: Send,

§

impl<T> Sync for Valid<T>
where T: Sync,

§

impl<T> Unpin for Valid<T>
where T: Unpin,

§

impl<T> UnwindSafe for Valid<T>
where T: UnwindSafe,

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<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,