Struct scrypto_test::prelude::EncryptedMessageV1
pub struct EncryptedMessageV1 {
pub encrypted: AesGcmPayload,
pub decryptors_by_curve: IndexMap<CurveType, DecryptorsByCurve>,
}
Expand description
A PlaintextMessageV1
encrypted with “MultiPartyECIES” for a number of decryptors (public keys).
First, a PlaintextMessageV1
should be created, and encoded as manifest_sbor_encode(plaintext_message)
to get the plaintext message payload bytes.
The plaintext message payload bytes are encrypted via (128-bit) AES-GCM with an ephemeral symmetric key.
The (128-bit) AES-GCM symmetric key is encrypted separately for each decryptor public key via (256-bit) AES-KeyWrap.
AES-KeyWrap uses a key derived via a KDF (Key Derivation Function) using a shared secret.
For each decryptor public key, we create a shared curve point G
via static Diffie-Helman between the
decryptor public key, and a per-transaction ephemeral public key for that curve type.
We then use that shared secret with a key derivation function to create the (256-bit) KEK (Key Encrypting Key):
KEK = HKDF(hash: Blake2b, secret: x co-ord of G, salt: [], length: 256 bits)
.
Note:
- For ECDH, the secret we use is the
x
coordinate of the shared public point, unhashed. This ECDH output is known as ASN1 X9.63 variant of ECDH. Be careful - libsecp256k1 uses another non-standard variant. - We persist 128-bit symmetric keys because we wish to save on payload size, and:
- 128-bit AES is considered secure enough for most use cases (EG bitcoin hash rate is only 2^93 / year)
- It’s being used with a transient key - so a hypothetical successful attack would only decrypt one message
Fields§
§encrypted: AesGcmPayload
§decryptors_by_curve: IndexMap<CurveType, DecryptorsByCurve>
Trait Implementations§
§impl Categorize<ManifestCustomValueKind> for EncryptedMessageV1
impl Categorize<ManifestCustomValueKind> for EncryptedMessageV1
fn value_kind() -> ValueKind<ManifestCustomValueKind>
§impl Clone for EncryptedMessageV1
impl Clone for EncryptedMessageV1
§fn clone(&self) -> EncryptedMessageV1
fn clone(&self) -> EncryptedMessageV1
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more§impl Debug for EncryptedMessageV1
impl Debug for EncryptedMessageV1
§impl<D> Decode<ManifestCustomValueKind, D> for EncryptedMessageV1where
D: Decoder<ManifestCustomValueKind>,
impl<D> Decode<ManifestCustomValueKind, D> for EncryptedMessageV1where
D: Decoder<ManifestCustomValueKind>,
§fn decode_body_with_value_kind(
decoder: &mut D,
value_kind: ValueKind<ManifestCustomValueKind>
) -> Result<EncryptedMessageV1, DecodeError>
fn decode_body_with_value_kind( decoder: &mut D, value_kind: ValueKind<ManifestCustomValueKind> ) -> Result<EncryptedMessageV1, DecodeError>
§impl<E> Encode<ManifestCustomValueKind, E> for EncryptedMessageV1where
E: Encoder<ManifestCustomValueKind>,
impl<E> Encode<ManifestCustomValueKind, E> for EncryptedMessageV1where
E: Encoder<ManifestCustomValueKind>,
§fn encode_value_kind(&self, encoder: &mut E) -> Result<(), EncodeError>
fn encode_value_kind(&self, encoder: &mut E) -> Result<(), EncodeError>
§fn encode_body(&self, encoder: &mut E) -> Result<(), EncodeError>
fn encode_body(&self, encoder: &mut E) -> Result<(), EncodeError>
§impl PartialEq for EncryptedMessageV1
impl PartialEq for EncryptedMessageV1
§fn eq(&self, other: &EncryptedMessageV1) -> bool
fn eq(&self, other: &EncryptedMessageV1) -> bool
self
and other
values to be equal, and is used
by ==
.§impl SborTuple<ManifestCustomValueKind> for EncryptedMessageV1
impl SborTuple<ManifestCustomValueKind> for EncryptedMessageV1
fn get_length(&self) -> usize
impl Eq for EncryptedMessageV1
impl StructuralPartialEq for EncryptedMessageV1
Auto Trait Implementations§
impl RefUnwindSafe for EncryptedMessageV1
impl Send for EncryptedMessageV1
impl Sync for EncryptedMessageV1
impl Unpin for EncryptedMessageV1
impl UnwindSafe for EncryptedMessageV1
Blanket Implementations§
§impl<U> As for U
impl<U> As for U
§fn as_<T>(self) -> Twhere
T: CastFrom<U>,
fn as_<T>(self) -> Twhere
T: CastFrom<U>,
self
to type T
. The semantics of numeric casting with the as
operator are followed, so <T as As>::as_::<U>
can be used in the same way as T as U
for numeric conversions. Read moresource§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.