use crate::simplex::types::Subject;
use bytes::Bytes;
use commonware_codec::Encode;
use commonware_cryptography::{certificate, Digest};
use commonware_utils::union;
pub mod bls12381_multisig;
pub mod bls12381_threshold;
pub mod ed25519;
commonware_macros::stability_mod!(ALPHA, pub mod secp256r1);
#[cfg(not(target_arch = "wasm32"))]
pub mod reporter;
#[derive(Clone, Debug)]
pub struct Namespace {
pub notarize: Vec<u8>,
pub nullify: Vec<u8>,
pub finalize: Vec<u8>,
pub seed: Vec<u8>,
}
impl Namespace {
pub fn new(namespace: &[u8]) -> Self {
Self {
notarize: notarize_namespace(namespace),
nullify: nullify_namespace(namespace),
finalize: finalize_namespace(namespace),
seed: seed_namespace(namespace),
}
}
}
impl certificate::Namespace for Namespace {
fn derive(namespace: &[u8]) -> Self {
Self::new(namespace)
}
}
impl<'a, D: Digest> certificate::Subject for Subject<'a, D> {
type Namespace = Namespace;
fn namespace<'b>(&self, derived: &'b Self::Namespace) -> &'b [u8] {
match self {
Self::Notarize { .. } => &derived.notarize,
Self::Nullify { .. } => &derived.nullify,
Self::Finalize { .. } => &derived.finalize,
}
}
fn message(&self) -> Bytes {
match self {
Self::Notarize { proposal } => proposal.encode(),
Self::Nullify { round } => round.encode(),
Self::Finalize { proposal } => proposal.encode(),
}
}
}
pub trait Scheme<D: Digest>: for<'a> certificate::Scheme<Subject<'a, D> = Subject<'a, D>> {}
impl<D: Digest, S> Scheme<D> for S where
S: for<'a> certificate::Scheme<Subject<'a, D> = Subject<'a, D>>
{
}
const SEED_SUFFIX: &[u8] = b"_SEED";
const NOTARIZE_SUFFIX: &[u8] = b"_NOTARIZE";
const NULLIFY_SUFFIX: &[u8] = b"_NULLIFY";
const FINALIZE_SUFFIX: &[u8] = b"_FINALIZE";
#[inline]
pub(crate) fn seed_namespace(namespace: &[u8]) -> Vec<u8> {
union(namespace, SEED_SUFFIX)
}
#[inline]
pub(crate) fn notarize_namespace(namespace: &[u8]) -> Vec<u8> {
union(namespace, NOTARIZE_SUFFIX)
}
#[inline]
pub(crate) fn nullify_namespace(namespace: &[u8]) -> Vec<u8> {
union(namespace, NULLIFY_SUFFIX)
}
#[inline]
pub(crate) fn finalize_namespace(namespace: &[u8]) -> Vec<u8> {
union(namespace, FINALIZE_SUFFIX)
}