fast-paillier 0.1.0

Optimized Paillier encryption scheme
Documentation
use rug::Integer;

use crate::{DecryptionKey, EncryptionKey};

impl serde::Serialize for EncryptionKey {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        self.n().serialize(serializer)
    }
}

impl<'de> serde::Deserialize<'de> for EncryptionKey {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let n = Integer::deserialize(deserializer)?;
        Ok(EncryptionKey::from_n(n))
    }
}

impl serde::Serialize for DecryptionKey {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        let pq = [self.p(), self.q()];
        pq.serialize(serializer)
    }
}

impl<'de> serde::Deserialize<'de> for DecryptionKey {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let [p, q] = <[Integer; 2]>::deserialize(deserializer)?;
        DecryptionKey::from_primes(p, q)
            .map_err(|_| <D::Error as serde::de::Error>::custom("invalid paillier key"))
    }
}