use super::*;
use crate::internal_prelude::*;
#[derive(Debug, Clone, Eq, PartialEq, Default, ManifestSbor, ScryptoDescribe)]
pub enum MessageV2 {
#[default]
None,
Plaintext(PlaintextMessageV1),
Encrypted(EncryptedMessageV2),
}
impl TransactionPartialPrepare for MessageV2 {
type Prepared = PreparedMessageV2;
}
#[derive(Debug, Clone, PartialEq, Eq, ManifestSbor, ScryptoDescribe)]
pub struct EncryptedMessageV2 {
pub encrypted: AesGcmPayload,
pub decryptors_by_curve: IndexMap<CurveType, DecryptorsByCurveV2>,
}
#[derive(Debug, Clone, PartialEq, Eq, ManifestSbor, ScryptoDescribe)]
pub enum DecryptorsByCurveV2 {
Ed25519 {
dh_ephemeral_public_key: Ed25519PublicKey,
decryptors: IndexMap<PublicKeyFingerprint, AesWrapped256BitKey>,
},
Secp256k1 {
dh_ephemeral_public_key: Secp256k1PublicKey,
decryptors: IndexMap<PublicKeyFingerprint, AesWrapped256BitKey>,
},
}
impl DecryptorsByCurveV2 {
pub fn curve_type(&self) -> CurveType {
match self {
Self::Ed25519 { .. } => CurveType::Ed25519,
Self::Secp256k1 { .. } => CurveType::Secp256k1,
}
}
pub fn number_of_decryptors(&self) -> usize {
match self {
Self::Ed25519 { decryptors, .. } => decryptors.len(),
Self::Secp256k1 { decryptors, .. } => decryptors.len(),
}
}
}
#[derive(Debug, Clone, Eq, PartialEq, ManifestSbor, ScryptoDescribe)]
#[sbor(transparent)]
pub struct AesWrapped256BitKey(pub [u8; Self::LENGTH]);
impl AesWrapped256BitKey {
pub const LENGTH: usize = 40;
}
pub type PreparedMessageV2 = SummarizedRawValueBody<MessageV2>;