1 use alloc::vec::Vec; 2 use core::fmt; 3 use core::fmt::Debug; 4 5 use mls_rs_codec::{MlsDecode, MlsEncode, MlsSize}; 6 use mls_rs_core::crypto::CipherSuiteProvider; 7 8 use crate::{client::MlsError, error::IntoAnyError, MlsMessage}; 9 10 #[derive(Clone, PartialEq, Eq, MlsEncode, MlsDecode, MlsSize, Hash)] 11 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 12 pub(crate) struct MessageHash( 13 #[mls_codec(with = "mls_rs_codec::byte_vec")] 14 #[cfg_attr(feature = "serde", serde(with = "mls_rs_core::vec_serde"))] 15 Vec<u8>, 16 ); 17 18 impl Debug for MessageHash { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result19 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 20 mls_rs_core::debug::pretty_bytes(&self.0) 21 .named("MessageHash") 22 .fmt(f) 23 } 24 } 25 26 impl MessageHash { 27 #[cfg_attr(not(mls_build_async), maybe_async::must_be_sync)] compute<CS: CipherSuiteProvider>( cs: &CS, message: &MlsMessage, ) -> Result<Self, MlsError>28 pub(crate) async fn compute<CS: CipherSuiteProvider>( 29 cs: &CS, 30 message: &MlsMessage, 31 ) -> Result<Self, MlsError> { 32 cs.hash(&message.mls_encode_to_vec()?) 33 .await 34 .map_err(|e| MlsError::CryptoProviderError(e.into_any_error())) 35 .map(Self) 36 } 37 } 38