saorsa-core 0.6.0

Saorsa - Core P2P networking library with DHT, QUIC transport, and four-word addresses
Documentation
/// Threshold authentication requiring t-of-n signatures
/// NOTE: saorsa-seal 0.1.1 doesn't export the expected types (ThresholdVerifier, ShareSignature, PublicKeyShare)
/// This is a placeholder implementation until the proper types are available
#[derive(Debug, Clone)]
pub struct ThresholdWriteAuth {
    threshold: usize,
    total: usize,
    pub_keys: Vec<PubKey>,
}

impl ThresholdWriteAuth {
    /// Create a new threshold auth with public keys
    pub fn new(threshold: usize, total: usize, pub_keys: Vec<PubKey>) -> Result<Self> {
        if threshold > total {
            anyhow::bail!("Threshold cannot exceed total");
        }
        if threshold == 0 {
            anyhow::bail!("Threshold must be at least 1");
        }
        if pub_keys.len() != total {
            anyhow::bail!("Public keys count must equal total");
        }

        Ok(Self {
            threshold,
            total,
            pub_keys,
        })
    }

    /// Create from public keys with validation
    pub fn from_pub_keys(threshold: usize, total: usize, pub_keys: Vec<PubKey>) -> Result<Self> {
        Self::new(threshold, total, pub_keys)
    }

    /// Get the threshold value
    pub fn threshold(&self) -> usize {
        self.threshold
    }

    /// Get the total number of keys
    pub fn total(&self) -> usize {
        self.total
    }

    /// Get the public keys
    pub fn pub_keys(&self) -> &[PubKey] {
        &self.pub_keys
    }
}

#[async_trait]
impl WriteAuth for ThresholdWriteAuth {
    async fn verify(&self, _record: &[u8], sigs: &[Sig]) -> Result<bool> {
        // Verify we have at least threshold signatures
        if sigs.len() < self.threshold {
            return Ok(false);
        }

        // Validate against total possible signatures
        if sigs.len() > self.total {
            return Ok(false);
        }

        // TODO: Implement actual threshold signature verification once saorsa-seal exports proper types
        // For now, this is a placeholder that validates against pub_keys length
        // In production, this would use proper threshold cryptography with self.pub_keys
        Ok(sigs.len() >= self.threshold && self.pub_keys.len() == self.total)
    }
}