Skip to content

Commit

Permalink
Merge pull request #17 from openmls/cryspen/protected-metadata3
Browse files Browse the repository at this point in the history
Add Mutable and Immutable Metadata
  • Loading branch information
neekolas authored Feb 10, 2024
2 parents acc326f + cbf2b71 commit 0da7dcb
Show file tree
Hide file tree
Showing 8 changed files with 236 additions and 278 deletions.
12 changes: 6 additions & 6 deletions openmls/src/extensions/codec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use crate::extensions::{
UnknownExtension,
};

use super::{last_resort::LastResortExtension, protected_metadata::ProtectedMetadata};
use super::{last_resort::LastResortExtension, metadata::Metadata};

fn vlbytes_len_len(length: usize) -> usize {
if length < 0x40 {
Expand Down Expand Up @@ -37,7 +37,7 @@ impl Size for Extension {
Extension::ExternalPub(e) => e.tls_serialized_len(),
Extension::ExternalSenders(e) => e.tls_serialized_len(),
Extension::LastResort(e) => e.tls_serialized_len(),
Extension::ProtectedMetadata(e) => e.tls_serialized_len(),
Extension::ImmutableMetadata(e) => e.tls_serialized_len(),
Extension::Unknown(_, e) => e.0.len(),
};

Expand Down Expand Up @@ -70,7 +70,7 @@ impl Serialize for Extension {
Extension::ExternalPub(e) => e.tls_serialize(&mut extension_data),
Extension::ExternalSenders(e) => e.tls_serialize(&mut extension_data),
Extension::LastResort(e) => e.tls_serialize(&mut extension_data),
Extension::ProtectedMetadata(e) => e.tls_serialize(&mut extension_data),
Extension::ImmutableMetadata(e) => e.tls_serialize(&mut extension_data),
Extension::Unknown(_, e) => extension_data
.write_all(e.0.as_slice())
.map(|_| e.0.len())
Expand Down Expand Up @@ -120,9 +120,9 @@ impl Deserialize for Extension {
ExtensionType::LastResort => {
Extension::LastResort(LastResortExtension::tls_deserialize(&mut extension_data)?)
}
ExtensionType::ProtectedMetadata => Extension::ProtectedMetadata(
ProtectedMetadata::tls_deserialize(&mut extension_data)?,
),
ExtensionType::ImmutableMetadata => {
Extension::ImmutableMetadata(Metadata::tls_deserialize(&mut extension_data)?)
}
ExtensionType::Unknown(unknown) => {
Extension::Unknown(unknown, UnknownExtension(extension_data.to_vec()))
}
Expand Down
23 changes: 23 additions & 0 deletions openmls/src/extensions/metadata.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
use super::{Deserialize, Serialize};
use tls_codec::{TlsDeserialize, TlsSerialize, TlsSize};

/// Metadata is an extension that keeps arbitrary application-specific metadata, in the form of a
/// byte sequence. The application is responsible for specifying a format and parsing the contents.
#[derive(
PartialEq, Eq, Clone, Debug, Serialize, Deserialize, TlsDeserialize, TlsSerialize, TlsSize,
)]
pub struct Metadata {
metadata: Vec<u8>,
}

impl Metadata {
/// Create a new [`Metadata`] extension.
pub fn new(metadata: Vec<u8>) -> Self {
Self { metadata }
}

/// Get the metadata bytes.
pub fn metadata(&self) -> &Vec<u8> {
&self.metadata
}
}
42 changes: 21 additions & 21 deletions openmls/src/extensions/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ mod codec;
mod external_pub_extension;
mod external_sender_extension;
mod last_resort;
mod protected_metadata;
mod metadata;
mod ratchet_tree_extension;
mod required_capabilities;
use errors::*;
Expand All @@ -54,7 +54,7 @@ use tls_codec::{
Size, TlsSize,
};

pub use protected_metadata::ProtectedMetadata;
pub use metadata::Metadata;

#[cfg(test)]
mod test_extensions;
Expand Down Expand Up @@ -100,9 +100,9 @@ pub enum ExtensionType {
/// scenario.
LastResort,

/// Protected metadata extension for policies of the group. GroupContext
/// extension
ProtectedMetadata,
/// Immutable metadata extension for the GroupContext.
/// This can only be set on creation of the group.
ImmutableMetadata,

/// A currently unknown extension type.
Unknown(u16),
Expand Down Expand Up @@ -155,7 +155,7 @@ impl From<u16> for ExtensionType {
4 => ExtensionType::ExternalPub,
5 => ExtensionType::ExternalSenders,
10 => ExtensionType::LastResort,
11 => ExtensionType::ProtectedMetadata,
0xf000 => ExtensionType::ImmutableMetadata,
unknown => ExtensionType::Unknown(unknown),
}
}
Expand All @@ -170,7 +170,7 @@ impl From<ExtensionType> for u16 {
ExtensionType::ExternalPub => 4,
ExtensionType::ExternalSenders => 5,
ExtensionType::LastResort => 10,
ExtensionType::ProtectedMetadata => 11,
ExtensionType::ImmutableMetadata => 0xf000,
ExtensionType::Unknown(unknown) => unknown,
}
}
Expand All @@ -187,7 +187,7 @@ impl ExtensionType {
| ExtensionType::ExternalPub
| ExtensionType::ExternalSenders
| ExtensionType::LastResort
| ExtensionType::ProtectedMetadata
| ExtensionType::ImmutableMetadata
)
}
}
Expand Down Expand Up @@ -226,8 +226,8 @@ pub enum Extension {
/// A [`LastResortExtension`]
LastResort(LastResortExtension),

/// A [`ProtectedMetadata`] extension
ProtectedMetadata(ProtectedMetadata),
/// An immutable [`Metadata`] extension
ImmutableMetadata(Metadata),

/// A currently unknown extension.
Unknown(u16, UnknownExtension),
Expand Down Expand Up @@ -420,11 +420,11 @@ impl Extensions {
})
}

/// Get a reference to the [`ProtectedMetadata`] if there is any.
pub fn protected_metadata(&self) -> Option<&ProtectedMetadata> {
self.find_by_type(ExtensionType::ProtectedMetadata)
/// Get a reference to the immutable [`Metadata`] if there is any.
pub fn immutable_metadata(&self) -> Option<&Metadata> {
self.find_by_type(ExtensionType::ImmutableMetadata)
.and_then(|e| match e {
Extension::ProtectedMetadata(e) => Some(e),
Extension::ImmutableMetadata(e) => Some(e),
_ => None,
})
}
Expand Down Expand Up @@ -495,14 +495,14 @@ impl Extension {
}
}

/// Get a reference to this extension as [`ProtectedMetadata`].
/// Get a reference to this extension as immutable [`Metadata`].
/// Returns an [`ExtensionError::InvalidExtensionType`] error if called on
/// an [`Extension`] that's not a [`ProtectedMetadata`] extension.
pub fn as_protected_metadata_extension(&self) -> Result<&ProtectedMetadata, ExtensionError> {
/// an [`Extension`] that's not an immutable [`Metadata`] extension.
pub fn as_immutable_metadata_extension(&self) -> Result<&Metadata, ExtensionError> {
match self {
Self::ProtectedMetadata(e) => Ok(e),
Self::ImmutableMetadata(e) => Ok(e),
_ => Err(ExtensionError::InvalidExtensionType(
"This is not an ProtectedMetadata".into(),
"This is not an immutable metadata extensions".into(),
)),
}
}
Expand All @@ -517,7 +517,7 @@ impl Extension {
Extension::ExternalPub(_) => ExtensionType::ExternalPub,
Extension::ExternalSenders(_) => ExtensionType::ExternalSenders,
Extension::LastResort(_) => ExtensionType::LastResort,
Extension::ProtectedMetadata(_) => ExtensionType::ProtectedMetadata,
Extension::ImmutableMetadata(_) => ExtensionType::ImmutableMetadata,
Extension::Unknown(kind, _) => ExtensionType::Unknown(*kind),
}
}
Expand Down Expand Up @@ -622,7 +622,7 @@ mod test {

#[test]
fn that_unknown_extensions_are_de_serialized_correctly() {
let extension_types = [0x0000u16, 0x0A0A, 0x7A7A, 0xF000, 0xFFFF];
let extension_types = [0x0000u16, 0x0A0A, 0x7A7A, 0xF100, 0xFFFF];
let extension_datas = [vec![], vec![0], vec![1, 2, 3]];

for extension_type in extension_types.into_iter() {
Expand Down
Loading

0 comments on commit 0da7dcb

Please sign in to comment.