pub struct Membership { /* private fields */ }Expand description
A Membership provides cryptographically signed group affiliations.
Memberships link a member (via their IDCard) to a group (via the group’s public key). They can contain additional information like roles and are cryptographically signed by the group owner to prove authenticity.
§Example
use rust_bottle::*;
use rand::rngs::OsRng;
let rng = &mut OsRng;
let member_key = Ed25519Key::generate(rng);
let member_idcard = IDCard::new(&member_key.public_key_bytes());
let group_key = Ed25519Key::generate(rng);
let mut membership = Membership::new(&member_idcard, &group_key.public_key_bytes());
membership.set_info("role", "admin");
let signed = membership.sign(rng, &group_key).unwrap();Implementations§
Source§impl Membership
impl Membership
Sourcepub fn new(member_idcard: &IDCard, group_public_key: &[u8]) -> Self
pub fn new(member_idcard: &IDCard, group_public_key: &[u8]) -> Self
Create a new membership linking a member to a group.
§Arguments
member_idcard- The member’s IDCardgroup_public_key- The group’s public key
§Returns
A new Membership instance (not yet signed)
§Example
use rust_bottle::*;
use rand::rngs::OsRng;
let rng = &mut OsRng;
let member_key = Ed25519Key::generate(rng);
let member_idcard = IDCard::new(&member_key.public_key_bytes());
let group_key = Ed25519Key::generate(rng);
let membership = Membership::new(&member_idcard, &group_key.public_key_bytes());Sourcepub fn set_info(&mut self, key: &str, value: &str)
pub fn set_info(&mut self, key: &str, value: &str)
Set information key-value pair.
Information fields can store application-specific data like roles, departments, or other metadata about the membership.
§Arguments
key- Information keyvalue- Information value
§Example
use rust_bottle::*;
use rand::rngs::OsRng;
let rng = &mut OsRng;
let member_key = Ed25519Key::generate(rng);
let member_idcard = IDCard::new(&member_key.public_key_bytes());
let group_key = Ed25519Key::generate(rng);
let mut membership = Membership::new(&member_idcard, &group_key.public_key_bytes());
membership.set_info("role", "admin");
membership.set_info("department", "Engineering");Sourcepub fn sign<R: RngCore>(
&mut self,
rng: &mut R,
signer: &dyn Sign,
) -> Result<Vec<u8>>
pub fn sign<R: RngCore>( &mut self, rng: &mut R, signer: &dyn Sign, ) -> Result<Vec<u8>>
Sign the membership with a private key.
This creates a cryptographic signature of the membership (excluding the signature field itself) and stores it. The signed membership is then serialized and returned.
§Arguments
rng- A random number generatorsigner- A signer implementing theSigntrait (typically the group owner’s key)
§Returns
Ok(Vec<u8>)- Serialized signed membershipErr(BottleError::Serialization)- If serialization failsErr(BottleError::VerifyFailed)- If signing fails
§Example
use rust_bottle::*;
use rand::rngs::OsRng;
let rng = &mut OsRng;
let member_key = Ed25519Key::generate(rng);
let member_idcard = IDCard::new(&member_key.public_key_bytes());
let group_key = Ed25519Key::generate(rng);
let mut membership = Membership::new(&member_idcard, &group_key.public_key_bytes());
let signed = membership.sign(rng, &group_key).unwrap();Sourcepub fn verify(&self, _group_idcard: &IDCard) -> Result<()>
pub fn verify(&self, _group_idcard: &IDCard) -> Result<()>
Verify the membership signature.
§Note
This is a simplified implementation that only checks for the presence of a signature. Full verification would require extracting the signing key from the group’s IDCard and verifying the signature cryptographically.
§Arguments
_group_idcard- The group’s IDCard (currently not used)
§Returns
Ok(())- If signature existsErr(BottleError::VerifyFailed)- If signature is missing
Trait Implementations§
Source§impl Clone for Membership
impl Clone for Membership
Source§fn clone(&self) -> Membership
fn clone(&self) -> Membership
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more