[][src]Trait ssb_crypto::FromBytes

pub unsafe trait FromBytes { }

Types for which any byte pattern is valid.

WARNING: Do not implement this trait yourself! Instead, use #[derive(FromBytes)].

FromBytes types can safely be deserialized from an untrusted sequence of bytes because any byte sequence corresponds to a valid instance of the type.

FromBytes is ignorant of byte order. For byte order-aware types, see the byteorder module.

Safety

If T: FromBytes, then unsafe code may assume that it is sound to treat any initialized sequence of bytes of length size_of::<T>() as a T. If a type is marked as FromBytes which violates this contract, it may cause undefined behavior.

If a type has the following properties, then it is safe to implement FromBytes for that type:

  • If the type is a struct:
    • All of its fields must implement FromBytes
  • If the type is an enum:
    • It must be a C-like enum (meaning that all variants have no fields)
    • It must have a defined representation (reprs C, u8, u16, u32, u64, usize, i8, i16, i32, i64, or isize).
    • The maximum number of discriminants must be used (so that every possible bit pattern is a valid one). Be very careful when using the C, usize, or isize representations, as their size is platform-dependent.

Rationale

Why isn't an explicit representation required for structs?

Per the Rust reference,

The representation of a type can change the padding between fields, but does not change the layout of the fields themselves.

Since the layout of structs only consists of padding bytes and field bytes, a struct is soundly FromBytes if:

  1. its padding is soundly FromBytes, and
  2. its fields are soundly FromBytes.

The answer to the first question is always yes: padding bytes do not have any validity constraints. A discussion of this question in the Unsafe Code Guidelines Working Group concluded that it would be virtually unimaginable for future versions of rustc to add validity constraints to padding bytes.

Whether a struct is soundly FromBytes therefore solely depends on whether its fields are FromBytes.

Implementations on Foreign Types

impl<O> FromBytes for I128<O> where
    O: ByteOrder,
    PhantomData<O>: FromBytes
[src]

impl FromBytes for usize[src]

impl<T> FromBytes for [T; 20] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 98] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 48] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 57] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 4096] where
    T: FromBytes
[src]

impl FromBytes for u64[src]

impl<T> FromBytes for [T; 255] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 33] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 8192] where
    T: FromBytes
[src]

impl FromBytes for u16[src]

impl<T> FromBytes for [T; 65536] where
    T: FromBytes
[src]

impl FromBytes for u32[src]

impl<T> FromBytes for [T; 4] where
    T: FromBytes
[src]

impl FromBytes for i64[src]

impl<T> FromBytes for [T; 8] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 16384] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 256] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 50] where
    T: FromBytes
[src]

impl FromBytes for i128[src]

impl<O> FromBytes for U16<O> where
    O: ByteOrder,
    PhantomData<O>: FromBytes
[src]

impl<T> FromBytes for [T; 45] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 12] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 17] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 44] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 0] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 27] where
    T: FromBytes
[src]

impl<O> FromBytes for U64<O> where
    O: ByteOrder,
    PhantomData<O>: FromBytes
[src]

impl<T> FromBytes for [T; 128] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 53] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 61] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 22] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 51] where
    T: FromBytes
[src]

impl FromBytes for u8[src]

impl<O> FromBytes for I16<O> where
    O: ByteOrder,
    PhantomData<O>: FromBytes
[src]

impl<T> FromBytes for [T; 60] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 236] where
    T: FromBytes
[src]

impl FromBytes for f64[src]

impl<T> FromBytes for [T; 54] where
    T: FromBytes
[src]

impl FromBytes for i16[src]

impl<T> FromBytes for [T; 62] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 36] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 64] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 15] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 32] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 1024] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 43] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 25] where
    T: FromBytes
[src]

impl<O> FromBytes for I64<O> where
    O: ByteOrder,
    PhantomData<O>: FromBytes
[src]

impl<T> FromBytes for [T; 37] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 2048] where
    T: FromBytes
[src]

impl<O> FromBytes for U128<O> where
    O: ByteOrder,
    PhantomData<O>: FromBytes
[src]

impl<T> FromBytes for [T; 6] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 41] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 18] where
    T: FromBytes
[src]

impl<T> FromBytes for [T] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 126] where
    T: FromBytes
[src]

impl FromBytes for isize[src]

impl<T> FromBytes for PhantomData<T>[src]

impl<T> FromBytes for [T; 31] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 26] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 40] where
    T: FromBytes
[src]

impl<O> FromBytes for I32<O> where
    O: ByteOrder,
    PhantomData<O>: FromBytes
[src]

impl<T> FromBytes for [T; 13] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 11] where
    T: FromBytes
[src]

impl FromBytes for ()[src]

impl FromBytes for u128[src]

impl<T> FromBytes for [T; 59] where
    T: FromBytes
[src]

impl<O> FromBytes for U32<O> where
    O: ByteOrder,
    PhantomData<O>: FromBytes
[src]

impl FromBytes for f32[src]

impl<T> FromBytes for [T; 56] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 10] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 63] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 30] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 9] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 28] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 512] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 2] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 39] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 42] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 35] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 23] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 58] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 14] where
    T: FromBytes
[src]

impl FromBytes for i8[src]

impl<T> FromBytes for [T; 55] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 16] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 32768] where
    T: FromBytes
[src]

impl FromBytes for i32[src]

impl<T> FromBytes for [T; 7] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 52] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 3] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 49] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 24] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 38] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 29] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 34] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 19] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 5] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 47] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 21] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 46] where
    T: FromBytes
[src]

impl<T> FromBytes for [T; 1] where
    T: FromBytes
[src]

Loading content...

Implementors

impl FromBytes for EphPublicKey[src]

impl FromBytes for Hmac[src]

impl FromBytes for Key[src]

impl FromBytes for Nonce[src]

impl FromBytes for Hash[src]

impl FromBytes for Keypair[src]

impl FromBytes for NetworkAuth[src]

impl FromBytes for PublicKey[src]

impl FromBytes for SecretKey[src]

impl FromBytes for Signature[src]

Loading content...