use serde::{de::DeserializeOwned, Serialize};
pub const CURRENT_VERSION: u16 = 1;
#[cfg(any(test, feature = "test-utils"))]
pub const V_TEST: u16 = u16::MAX;
pub trait StorageProvider<const VERSION: u16> {
type Error: core::fmt::Debug + std::error::Error;
fn version() -> u16 {
VERSION
}
fn write_mls_join_config<
GroupId: traits::GroupId<VERSION>,
MlsGroupJoinConfig: traits::MlsGroupJoinConfig<VERSION>,
>(
&self,
group_id: &GroupId,
config: &MlsGroupJoinConfig,
) -> Result<(), Self::Error>;
fn append_own_leaf_node<
GroupId: traits::GroupId<VERSION>,
LeafNode: traits::LeafNode<VERSION>,
>(
&self,
group_id: &GroupId,
leaf_node: &LeafNode,
) -> Result<(), Self::Error>;
fn queue_proposal<
GroupId: traits::GroupId<VERSION>,
ProposalRef: traits::ProposalRef<VERSION>,
QueuedProposal: traits::QueuedProposal<VERSION>,
>(
&self,
group_id: &GroupId,
proposal_ref: &ProposalRef,
proposal: &QueuedProposal,
) -> Result<(), Self::Error>;
fn write_tree<GroupId: traits::GroupId<VERSION>, TreeSync: traits::TreeSync<VERSION>>(
&self,
group_id: &GroupId,
tree: &TreeSync,
) -> Result<(), Self::Error>;
fn write_interim_transcript_hash<
GroupId: traits::GroupId<VERSION>,
InterimTranscriptHash: traits::InterimTranscriptHash<VERSION>,
>(
&self,
group_id: &GroupId,
interim_transcript_hash: &InterimTranscriptHash,
) -> Result<(), Self::Error>;
fn write_context<
GroupId: traits::GroupId<VERSION>,
GroupContext: traits::GroupContext<VERSION>,
>(
&self,
group_id: &GroupId,
group_context: &GroupContext,
) -> Result<(), Self::Error>;
fn write_confirmation_tag<
GroupId: traits::GroupId<VERSION>,
ConfirmationTag: traits::ConfirmationTag<VERSION>,
>(
&self,
group_id: &GroupId,
confirmation_tag: &ConfirmationTag,
) -> Result<(), Self::Error>;
fn write_group_state<
GroupState: traits::GroupState<VERSION>,
GroupId: traits::GroupId<VERSION>,
>(
&self,
group_id: &GroupId,
group_state: &GroupState,
) -> Result<(), Self::Error>;
fn write_message_secrets<
GroupId: traits::GroupId<VERSION>,
MessageSecrets: traits::MessageSecrets<VERSION>,
>(
&self,
group_id: &GroupId,
message_secrets: &MessageSecrets,
) -> Result<(), Self::Error>;
fn write_resumption_psk_store<
GroupId: traits::GroupId<VERSION>,
ResumptionPskStore: traits::ResumptionPskStore<VERSION>,
>(
&self,
group_id: &GroupId,
resumption_psk_store: &ResumptionPskStore,
) -> Result<(), Self::Error>;
fn write_own_leaf_index<
GroupId: traits::GroupId<VERSION>,
LeafNodeIndex: traits::LeafNodeIndex<VERSION>,
>(
&self,
group_id: &GroupId,
own_leaf_index: &LeafNodeIndex,
) -> Result<(), Self::Error>;
fn set_use_ratchet_tree_extension<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
value: bool,
) -> Result<(), Self::Error>;
fn write_group_epoch_secrets<
GroupId: traits::GroupId<VERSION>,
GroupEpochSecrets: traits::GroupEpochSecrets<VERSION>,
>(
&self,
group_id: &GroupId,
group_epoch_secrets: &GroupEpochSecrets,
) -> Result<(), Self::Error>;
fn write_signature_key_pair<
SignaturePublicKey: traits::SignaturePublicKey<VERSION>,
SignatureKeyPair: traits::SignatureKeyPair<VERSION>,
>(
&self,
public_key: &SignaturePublicKey,
signature_key_pair: &SignatureKeyPair,
) -> Result<(), Self::Error>;
fn write_encryption_key_pair<
EncryptionKey: traits::EncryptionKey<VERSION>,
HpkeKeyPair: traits::HpkeKeyPair<VERSION>,
>(
&self,
public_key: &EncryptionKey,
key_pair: &HpkeKeyPair,
) -> Result<(), Self::Error>;
fn write_encryption_epoch_key_pairs<
GroupId: traits::GroupId<VERSION>,
EpochKey: traits::EpochKey<VERSION>,
HpkeKeyPair: traits::HpkeKeyPair<VERSION>,
>(
&self,
group_id: &GroupId,
epoch: &EpochKey,
leaf_index: u32,
key_pairs: &[HpkeKeyPair],
) -> Result<(), Self::Error>;
fn write_key_package<
HashReference: traits::HashReference<VERSION>,
KeyPackage: traits::KeyPackage<VERSION>,
>(
&self,
hash_ref: &HashReference,
key_package: &KeyPackage,
) -> Result<(), Self::Error>;
fn write_psk<PskId: traits::PskId<VERSION>, PskBundle: traits::PskBundle<VERSION>>(
&self,
psk_id: &PskId,
psk: &PskBundle,
) -> Result<(), Self::Error>;
fn mls_group_join_config<
GroupId: traits::GroupId<VERSION>,
MlsGroupJoinConfig: traits::MlsGroupJoinConfig<VERSION>,
>(
&self,
group_id: &GroupId,
) -> Result<Option<MlsGroupJoinConfig>, Self::Error>;
fn own_leaf_nodes<GroupId: traits::GroupId<VERSION>, LeafNode: traits::LeafNode<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<Vec<LeafNode>, Self::Error>;
fn aad<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<Vec<u8>, Self::Error>;
fn queued_proposal_refs<
GroupId: traits::GroupId<VERSION>,
ProposalRef: traits::ProposalRef<VERSION>,
>(
&self,
group_id: &GroupId,
) -> Result<Vec<ProposalRef>, Self::Error>;
fn queued_proposals<
GroupId: traits::GroupId<VERSION>,
ProposalRef: traits::ProposalRef<VERSION>,
QueuedProposal: traits::QueuedProposal<VERSION>,
>(
&self,
group_id: &GroupId,
) -> Result<Vec<(ProposalRef, QueuedProposal)>, Self::Error>;
fn treesync<GroupId: traits::GroupId<VERSION>, TreeSync: traits::TreeSync<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<Option<TreeSync>, Self::Error>;
fn group_context<
GroupId: traits::GroupId<VERSION>,
GroupContext: traits::GroupContext<VERSION>,
>(
&self,
group_id: &GroupId,
) -> Result<Option<GroupContext>, Self::Error>;
fn interim_transcript_hash<
GroupId: traits::GroupId<VERSION>,
InterimTranscriptHash: traits::InterimTranscriptHash<VERSION>,
>(
&self,
group_id: &GroupId,
) -> Result<Option<InterimTranscriptHash>, Self::Error>;
fn confirmation_tag<
GroupId: traits::GroupId<VERSION>,
ConfirmationTag: traits::ConfirmationTag<VERSION>,
>(
&self,
group_id: &GroupId,
) -> Result<Option<ConfirmationTag>, Self::Error>;
fn group_state<GroupState: traits::GroupState<VERSION>, GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<Option<GroupState>, Self::Error>;
fn message_secrets<
GroupId: traits::GroupId<VERSION>,
MessageSecrets: traits::MessageSecrets<VERSION>,
>(
&self,
group_id: &GroupId,
) -> Result<Option<MessageSecrets>, Self::Error>;
fn resumption_psk_store<
GroupId: traits::GroupId<VERSION>,
ResumptionPskStore: traits::ResumptionPskStore<VERSION>,
>(
&self,
group_id: &GroupId,
) -> Result<Option<ResumptionPskStore>, Self::Error>;
fn own_leaf_index<
GroupId: traits::GroupId<VERSION>,
LeafNodeIndex: traits::LeafNodeIndex<VERSION>,
>(
&self,
group_id: &GroupId,
) -> Result<Option<LeafNodeIndex>, Self::Error>;
fn use_ratchet_tree_extension<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<Option<bool>, Self::Error>;
fn group_epoch_secrets<
GroupId: traits::GroupId<VERSION>,
GroupEpochSecrets: traits::GroupEpochSecrets<VERSION>,
>(
&self,
group_id: &GroupId,
) -> Result<Option<GroupEpochSecrets>, Self::Error>;
fn signature_key_pair<
SignaturePublicKey: traits::SignaturePublicKey<VERSION>,
SignatureKeyPair: traits::SignatureKeyPair<VERSION>,
>(
&self,
public_key: &SignaturePublicKey,
) -> Result<Option<SignatureKeyPair>, Self::Error>;
fn encryption_key_pair<
HpkeKeyPair: traits::HpkeKeyPair<VERSION>,
EncryptionKey: traits::EncryptionKey<VERSION>,
>(
&self,
public_key: &EncryptionKey,
) -> Result<Option<HpkeKeyPair>, Self::Error>;
fn encryption_epoch_key_pairs<
GroupId: traits::GroupId<VERSION>,
EpochKey: traits::EpochKey<VERSION>,
HpkeKeyPair: traits::HpkeKeyPair<VERSION>,
>(
&self,
group_id: &GroupId,
epoch: &EpochKey,
leaf_index: u32,
) -> Result<Vec<HpkeKeyPair>, Self::Error>;
fn key_package<
KeyPackageRef: traits::HashReference<VERSION>,
KeyPackage: traits::KeyPackage<VERSION>,
>(
&self,
hash_ref: &KeyPackageRef,
) -> Result<Option<KeyPackage>, Self::Error>;
fn psk<PskBundle: traits::PskBundle<VERSION>, PskId: traits::PskId<VERSION>>(
&self,
psk_id: &PskId,
) -> Result<Option<PskBundle>, Self::Error>;
fn remove_proposal<
GroupId: traits::GroupId<VERSION>,
ProposalRef: traits::ProposalRef<VERSION>,
>(
&self,
group_id: &GroupId,
proposal_ref: &ProposalRef,
) -> Result<(), Self::Error>;
fn delete_own_leaf_nodes<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn delete_group_config<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn delete_tree<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn delete_confirmation_tag<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn delete_group_state<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn delete_context<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn delete_interim_transcript_hash<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn delete_message_secrets<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn delete_all_resumption_psk_secrets<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn delete_own_leaf_index<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn delete_use_ratchet_tree_extension<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn delete_group_epoch_secrets<GroupId: traits::GroupId<VERSION>>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn clear_proposal_queue<
GroupId: traits::GroupId<VERSION>,
ProposalRef: traits::ProposalRef<VERSION>,
>(
&self,
group_id: &GroupId,
) -> Result<(), Self::Error>;
fn delete_signature_key_pair<SignaturePublicKey: traits::SignaturePublicKey<VERSION>>(
&self,
public_key: &SignaturePublicKey,
) -> Result<(), Self::Error>;
fn delete_encryption_key_pair<EncryptionKey: traits::EncryptionKey<VERSION>>(
&self,
public_key: &EncryptionKey,
) -> Result<(), Self::Error>;
fn delete_encryption_epoch_key_pairs<
GroupId: traits::GroupId<VERSION>,
EpochKey: traits::EpochKey<VERSION>,
>(
&self,
group_id: &GroupId,
epoch: &EpochKey,
leaf_index: u32,
) -> Result<(), Self::Error>;
fn delete_key_package<KeyPackageRef: traits::HashReference<VERSION>>(
&self,
hash_ref: &KeyPackageRef,
) -> Result<(), Self::Error>;
fn delete_psk<PskKey: traits::PskId<VERSION>>(
&self,
psk_id: &PskKey,
) -> Result<(), Self::Error>;
}
pub trait Key<const VERSION: u16>: Serialize {}
pub trait Entity<const VERSION: u16>: Serialize + DeserializeOwned {}
impl Entity<CURRENT_VERSION> for bool {}
impl Entity<CURRENT_VERSION> for u8 {}
pub mod traits {
use super::{Entity, Key};
pub trait GroupId<const VERSION: u16>: Key<VERSION> {}
pub trait SignaturePublicKey<const VERSION: u16>: Key<VERSION> {}
pub trait HashReference<const VERSION: u16>: Key<VERSION> {}
pub trait PskId<const VERSION: u16>: Key<VERSION> {}
pub trait EncryptionKey<const VERSION: u16>: Key<VERSION> {}
pub trait EpochKey<const VERSION: u16>: Key<VERSION> {}
pub trait QueuedProposal<const VERSION: u16>: Entity<VERSION> {}
pub trait TreeSync<const VERSION: u16>: Entity<VERSION> {}
pub trait GroupContext<const VERSION: u16>: Entity<VERSION> {}
pub trait InterimTranscriptHash<const VERSION: u16>: Entity<VERSION> {}
pub trait ConfirmationTag<const VERSION: u16>: Entity<VERSION> {}
pub trait SignatureKeyPair<const VERSION: u16>: Entity<VERSION> {}
pub trait PskBundle<const VERSION: u16>: Entity<VERSION> {}
pub trait HpkeKeyPair<const VERSION: u16>: Entity<VERSION> {}
pub trait GroupState<const VERSION: u16>: Entity<VERSION> {}
pub trait GroupEpochSecrets<const VERSION: u16>: Entity<VERSION> {}
pub trait LeafNodeIndex<const VERSION: u16>: Entity<VERSION> {}
pub trait GroupUseRatchetTreeExtension<const VERSION: u16>: Entity<VERSION> {}
pub trait MessageSecrets<const VERSION: u16>: Entity<VERSION> {}
pub trait ResumptionPskStore<const VERSION: u16>: Entity<VERSION> {}
pub trait KeyPackage<const VERSION: u16>: Entity<VERSION> {}
pub trait MlsGroupJoinConfig<const VERSION: u16>: Entity<VERSION> {}
pub trait LeafNode<const VERSION: u16>: Entity<VERSION> {}
pub trait ProposalRef<const VERSION: u16>: Entity<VERSION> + Key<VERSION> {}
}
impl<const VERSION: u16> Entity<VERSION> for Vec<u8> {}