MlsGroupTestSetup

Struct MlsGroupTestSetup 

Source
pub struct MlsGroupTestSetup<Provider: OpenMlsProvider> {
    pub clients: RwLock<HashMap<Vec<u8>, RwLock<Client<Provider>>>>,
    pub groups: RwLock<HashMap<GroupId, Group>>,
    pub waiting_for_welcome: RwLock<HashMap<Vec<u8>, Vec<u8>>>,
    pub default_mgp: MlsGroupCreateConfig,
    pub use_codec: CodecUse,
}
Available on (32-bit or 64-bit) and (crate features test-utils) only.
Expand description

MlsGroupTestSetup is the main struct of the framework. It contains the state of all clients. The waiting_for_welcome field acts as a temporary store for KeyPackages that are used to add new members to groups. Note, that the MlsGroupTestSetup can only be initialized with a fixed number of clients and that create_clients has to be called before it can be otherwise used.

Fields§

§clients: RwLock<HashMap<Vec<u8>, RwLock<Client<Provider>>>>§groups: RwLock<HashMap<GroupId, Group>>§waiting_for_welcome: RwLock<HashMap<Vec<u8>, Vec<u8>>>§default_mgp: MlsGroupCreateConfig§use_codec: CodecUse

Flag to indicate if messages should be serialized and de-serialized as part of message distribution

Implementations§

Source§

impl<Provider: OpenMlsProvider + Default> MlsGroupTestSetup<Provider>

Source

pub fn new( default_mgp: MlsGroupCreateConfig, number_of_clients: usize, use_codec: CodecUse, ) -> Self

Create a new MlsGroupTestSetup with the given default MlsGroupCreateConfig and the given number of clients. For lifetime reasons, create_clients has to be called in addition with the same number of clients.

Source

pub fn get_fresh_key_package( &self, client: &Client<Provider>, ciphersuite: Ciphersuite, ) -> Result<KeyPackage, SetupError<Provider::StorageError>>

Create a fresh KeyPackage for client client for use when adding it to a group. The KeyPackageBundle will be fetched automatically when delivering the Welcome via deliver_welcome. This function throws an error if the client does not support the given ciphersuite.

Source

pub fn identity_by_index(&self, index: usize, group: &Group) -> Option<Vec<u8>>

Convert an index in the tree into the corresponding identity.

Source

pub fn identity_by_id(&self, id: &[u8], group: &Group) -> Option<Vec<u8>>

Convert an identity in the tree into the corresponding key package reference.

Source

pub fn deliver_welcome( &self, welcome: Welcome, group: &Group, ) -> Result<(), SetupError<Provider::StorageError>>

Deliver a Welcome message to the intended recipients. It uses the given group group to obtain the current public tree of the group. Note, that this tree only exists if distribute_to_members was previously used to distribute the commit adding the members to the group. This function will throw an error if no key package was previously created for the client by get_fresh_key_package.

Source

pub fn distribute_to_members<AS: Fn(&Credential) -> bool>( &self, sender_id: &[u8], group: &mut Group, message: &MlsMessageIn, authentication_service: &AS, ) -> Result<(), ClientError<Provider::StorageError>>

Distribute a set of messages sent by the sender with identity sender_id to their intended recipients in group Group. This function also verifies that all members of that group agree on the public tree.

Source

pub fn check_group_states<AS: Fn(&Credential) -> bool>( &self, group: &mut Group, authentication_service: AS, )

Check if the public tree and the exporter secret with label “test” and length of the given group is the same for each group member. It also has each group member encrypt an application message and delivers all of these messages to all other members. This function panics if any of the above tests fail.

Source

pub fn random_new_members_for_group( &self, group: &Group, number_of_members: usize, ) -> Result<Vec<Vec<u8>>, SetupError<Provider::StorageError>>

Get number_of_members new members for the given group group for use with the add_members function. If not enough clients are left that are not already members of this group, this function will return an error. TODO #310: Make this function ensure that the given members support the ciphersuite of the group.

Source

pub fn create_group( &self, ciphersuite: Ciphersuite, ) -> Result<GroupId, SetupError<Provider::StorageError>>

Have a random client create a new group with ciphersuite ciphersuite and return the GroupId. Only works reliably if all clients support all ciphersuites, as it will throw an error if the randomly chosen client does not support the given ciphersuite. TODO #310: Fix to always work reliably, probably by introducing a mapping from ciphersuite to the set of client ids supporting it.

Source

pub fn create_random_group<AS: Fn(&Credential) -> bool>( &self, target_group_size: usize, ciphersuite: Ciphersuite, authentication_service: AS, ) -> Result<GroupId, SetupError<Provider::StorageError>>

Create a random group of size group_size and return the GroupId

Source

pub fn self_update<AS: Fn(&Credential) -> bool>( &self, action_type: ActionType, group: &mut Group, client_id: &[u8], leaf_node_parameters: LeafNodeParameters, authentication_service: &AS, ) -> Result<(), SetupError<Provider::StorageError>>

Have the client with identity client_id either propose or commit (depending on action_type) a self update in group group. Will throw an error if the client is not actually a member of group group.

Source

pub fn add_clients<AS: Fn(&Credential) -> bool>( &self, action_type: ActionType, group: &mut Group, adder_id: &[u8], addees: Vec<Vec<u8>>, authentication_service: &AS, ) -> Result<(), SetupError<Provider::StorageError>>

Has the adder either propose or commit (depending on the action_type) an add of the addee to the Group group. Returns an error if

  • the adder is not part of the group
  • the addee is already part of the group
  • the addee doesn’t support the group’s ciphersuite.
Source

pub fn remove_clients<AS: Fn(&Credential) -> bool>( &self, action_type: ActionType, group: &mut Group, remover_id: &[u8], target_members: &[LeafNodeIndex], authentication_service: AS, ) -> Result<(), SetupError<Provider::StorageError>>

Has the remover propose or commit (depending on the action_type) the removal the target_members from the Group group. If the remover or one of the target_members is not part of the group, it returns an error.

Source

pub fn perform_random_operation<AS: Fn(&Credential) -> bool>( &self, group: &mut Group, authentication_service: &AS, ) -> Result<(), SetupError<Provider::StorageError>>

This function picks a random member of group group and has them perform a random commit- or proposal action. TODO #133: This won’t work yet due to the missing proposal validation.

Auto Trait Implementations§

§

impl<Provider> !Freeze for MlsGroupTestSetup<Provider>

§

impl<Provider> RefUnwindSafe for MlsGroupTestSetup<Provider>

§

impl<Provider> Send for MlsGroupTestSetup<Provider>
where Provider: Send,

§

impl<Provider> Sync for MlsGroupTestSetup<Provider>
where Provider: Send + Sync,

§

impl<Provider> Unpin for MlsGroupTestSetup<Provider>
where Provider: Unpin,

§

impl<Provider> UnwindSafe for MlsGroupTestSetup<Provider>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Classify for T

§

type Classified = T

§

fn classify(self) -> T

§

impl<T> Declassify for T

§

type Declassified = T

§

fn declassify(self) -> T

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V