pub struct EncryptedMessageV2 {
pub encrypted: AesGcmPayload,
pub decryptors_by_curve: IndexMap<CurveType, DecryptorsByCurveV2>,
}
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 (256-bit) AES-GCM with an ephemeral symmetric key.
The (256-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.
Fields§
§encrypted: AesGcmPayload
§decryptors_by_curve: IndexMap<CurveType, DecryptorsByCurveV2>
Trait Implementations§
Source§impl Clone for EncryptedMessageV2
impl Clone for EncryptedMessageV2
Source§fn clone(&self) -> EncryptedMessageV2
fn clone(&self) -> EncryptedMessageV2
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for EncryptedMessageV2
impl Debug for EncryptedMessageV2
Source§impl<D> Decode<ManifestCustomValueKind, D> for EncryptedMessageV2where
D: Decoder<ManifestCustomValueKind>,
impl<D> Decode<ManifestCustomValueKind, D> for EncryptedMessageV2where
D: Decoder<ManifestCustomValueKind>,
Source§fn decode_body_with_value_kind(
decoder: &mut D,
value_kind: ValueKind<ManifestCustomValueKind>,
) -> Result<EncryptedMessageV2, DecodeError>
fn decode_body_with_value_kind( decoder: &mut D, value_kind: ValueKind<ManifestCustomValueKind>, ) -> Result<EncryptedMessageV2, DecodeError>
Source§impl Describe<ScryptoCustomTypeKind> for EncryptedMessageV2
impl Describe<ScryptoCustomTypeKind> for EncryptedMessageV2
Source§const TYPE_ID: RustTypeId
const TYPE_ID: RustTypeId
TYPE_ID
should give a unique identifier for its SBOR schema type.
An SBOR schema type capture details about the SBOR payload, how it should be interpreted, validated and displayed. Read moreSource§fn type_data() -> TypeData<ScryptoCustomTypeKind, RustTypeId>
fn type_data() -> TypeData<ScryptoCustomTypeKind, RustTypeId>
Source§fn add_all_dependencies(aggregator: &mut TypeAggregator<ScryptoCustomTypeKind>)
fn add_all_dependencies(aggregator: &mut TypeAggregator<ScryptoCustomTypeKind>)
get_local_type_data
, we need to ensure that the type and all of its own references
get added to the aggregator. Read moreSource§impl<E> Encode<ManifestCustomValueKind, E> for EncryptedMessageV2where
E: Encoder<ManifestCustomValueKind>,
impl<E> Encode<ManifestCustomValueKind, E> for EncryptedMessageV2where
E: Encoder<ManifestCustomValueKind>,
Source§fn encode_value_kind(&self, encoder: &mut E) -> Result<(), EncodeError>
fn encode_value_kind(&self, encoder: &mut E) -> Result<(), EncodeError>
Source§fn encode_body(&self, encoder: &mut E) -> Result<(), EncodeError>
fn encode_body(&self, encoder: &mut E) -> Result<(), EncodeError>
Source§impl PartialEq for EncryptedMessageV2
impl PartialEq for EncryptedMessageV2
Source§impl SborTuple<ManifestCustomValueKind> for EncryptedMessageV2
impl SborTuple<ManifestCustomValueKind> for EncryptedMessageV2
fn get_length(&self) -> usize
impl Eq for EncryptedMessageV2
impl StructuralPartialEq for EncryptedMessageV2
Auto Trait Implementations§
impl Freeze for EncryptedMessageV2
impl RefUnwindSafe for EncryptedMessageV2
impl Send for EncryptedMessageV2
impl Sync for EncryptedMessageV2
impl Unpin for EncryptedMessageV2
impl UnwindSafe for EncryptedMessageV2
Blanket Implementations§
Source§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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, U> ContextualTryInto<U> for Twhere
U: ContextualTryFrom<T>,
impl<T, U> ContextualTryInto<U> for Twhere
U: ContextualTryFrom<T>,
type Error = <U as ContextualTryFrom<T>>::Error
type Context = <U as ContextualTryFrom<T>>::Context
fn contextual_try_into( self, context: &<U as ContextualTryFrom<T>>::Context, ) -> Result<U, <U as ContextualTryFrom<T>>::Error>
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§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
.Source§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
.Source§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.Source§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.Source§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§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.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.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more