zk-token-sdk: add support for scalar - ciphertext/commitment multiplication (#24120)

This commit is contained in:
samkim-crypto 2022-04-09 10:19:29 -03:00 committed by GitHub
parent e98575743e
commit b2d502b461
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 84 additions and 27 deletions

View File

@ -460,10 +460,10 @@ impl ElGamalCiphertext {
impl<'a, 'b> Add<&'b ElGamalCiphertext> for &'a ElGamalCiphertext {
type Output = ElGamalCiphertext;
fn add(self, other: &'b ElGamalCiphertext) -> ElGamalCiphertext {
fn add(self, ciphertext: &'b ElGamalCiphertext) -> ElGamalCiphertext {
ElGamalCiphertext {
commitment: &self.commitment + &other.commitment,
handle: &self.handle + &other.handle,
commitment: &self.commitment + &ciphertext.commitment,
handle: &self.handle + &ciphertext.handle,
}
}
}
@ -477,10 +477,10 @@ define_add_variants!(
impl<'a, 'b> Sub<&'b ElGamalCiphertext> for &'a ElGamalCiphertext {
type Output = ElGamalCiphertext;
fn sub(self, other: &'b ElGamalCiphertext) -> ElGamalCiphertext {
fn sub(self, ciphertext: &'b ElGamalCiphertext) -> ElGamalCiphertext {
ElGamalCiphertext {
commitment: &self.commitment - &other.commitment,
handle: &self.handle - &other.handle,
commitment: &self.commitment - &ciphertext.commitment,
handle: &self.handle - &ciphertext.handle,
}
}
}
@ -494,10 +494,10 @@ define_sub_variants!(
impl<'a, 'b> Mul<&'b Scalar> for &'a ElGamalCiphertext {
type Output = ElGamalCiphertext;
fn mul(self, other: &'b Scalar) -> ElGamalCiphertext {
fn mul(self, scalar: &'b Scalar) -> ElGamalCiphertext {
ElGamalCiphertext {
commitment: &self.commitment * other,
handle: &self.handle * other,
commitment: &self.commitment * scalar,
handle: &self.handle * scalar,
}
}
}
@ -508,6 +508,23 @@ define_mul_variants!(
Output = ElGamalCiphertext
);
impl<'a, 'b> Mul<&'b ElGamalCiphertext> for &'a Scalar {
type Output = ElGamalCiphertext;
fn mul(self, ciphertext: &'b ElGamalCiphertext) -> ElGamalCiphertext {
ElGamalCiphertext {
commitment: self * &ciphertext.commitment,
handle: self * &ciphertext.handle,
}
}
}
define_mul_variants!(
LHS = Scalar,
RHS = ElGamalCiphertext,
Output = ElGamalCiphertext
);
/// Decryption handle for Pedersen commitment.
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct DecryptHandle(RistrettoPoint);
@ -535,8 +552,8 @@ impl DecryptHandle {
impl<'a, 'b> Add<&'b DecryptHandle> for &'a DecryptHandle {
type Output = DecryptHandle;
fn add(self, other: &'b DecryptHandle) -> DecryptHandle {
DecryptHandle(&self.0 + &other.0)
fn add(self, handle: &'b DecryptHandle) -> DecryptHandle {
DecryptHandle(&self.0 + &handle.0)
}
}
@ -549,8 +566,8 @@ define_add_variants!(
impl<'a, 'b> Sub<&'b DecryptHandle> for &'a DecryptHandle {
type Output = DecryptHandle;
fn sub(self, other: &'b DecryptHandle) -> DecryptHandle {
DecryptHandle(&self.0 - &other.0)
fn sub(self, handle: &'b DecryptHandle) -> DecryptHandle {
DecryptHandle(&self.0 - &handle.0)
}
}
@ -563,13 +580,23 @@ define_sub_variants!(
impl<'a, 'b> Mul<&'b Scalar> for &'a DecryptHandle {
type Output = DecryptHandle;
fn mul(self, other: &'b Scalar) -> DecryptHandle {
DecryptHandle(&self.0 * other)
fn mul(self, scalar: &'b Scalar) -> DecryptHandle {
DecryptHandle(&self.0 * scalar)
}
}
define_mul_variants!(LHS = DecryptHandle, RHS = Scalar, Output = DecryptHandle);
impl<'a, 'b> Mul<&'b DecryptHandle> for &'a Scalar {
type Output = DecryptHandle;
fn mul(self, handle: &'b DecryptHandle) -> DecryptHandle {
DecryptHandle(self * &handle.0)
}
}
define_mul_variants!(LHS = Scalar, RHS = DecryptHandle, Output = DecryptHandle);
#[cfg(test)]
mod tests {
use {
@ -700,6 +727,7 @@ mod tests {
ElGamal::encrypt_with(amount_0 * amount_1, &public, &(&opening * scalar));
assert_eq!(ciphertext_prod, ciphertext * scalar);
assert_eq!(ciphertext_prod, scalar * ciphertext);
}
#[test]

View File

@ -109,8 +109,8 @@ impl ConstantTimeEq for PedersenOpening {
impl<'a, 'b> Add<&'b PedersenOpening> for &'a PedersenOpening {
type Output = PedersenOpening;
fn add(self, other: &'b PedersenOpening) -> PedersenOpening {
PedersenOpening(&self.0 + &other.0)
fn add(self, opening: &'b PedersenOpening) -> PedersenOpening {
PedersenOpening(&self.0 + &opening.0)
}
}
@ -123,8 +123,8 @@ define_add_variants!(
impl<'a, 'b> Sub<&'b PedersenOpening> for &'a PedersenOpening {
type Output = PedersenOpening;
fn sub(self, other: &'b PedersenOpening) -> PedersenOpening {
PedersenOpening(&self.0 - &other.0)
fn sub(self, opening: &'b PedersenOpening) -> PedersenOpening {
PedersenOpening(&self.0 - &opening.0)
}
}
@ -137,8 +137,8 @@ define_sub_variants!(
impl<'a, 'b> Mul<&'b Scalar> for &'a PedersenOpening {
type Output = PedersenOpening;
fn mul(self, other: &'b Scalar) -> PedersenOpening {
PedersenOpening(&self.0 * other)
fn mul(self, scalar: &'b Scalar) -> PedersenOpening {
PedersenOpening(&self.0 * scalar)
}
}
@ -148,6 +148,20 @@ define_mul_variants!(
Output = PedersenOpening
);
impl<'a, 'b> Mul<&'b PedersenOpening> for &'a Scalar {
type Output = PedersenOpening;
fn mul(self, opening: &'b PedersenOpening) -> PedersenOpening {
PedersenOpening(self * &opening.0)
}
}
define_mul_variants!(
LHS = Scalar,
RHS = PedersenOpening,
Output = PedersenOpening
);
/// Pedersen commitment type.
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct PedersenCommitment(pub(crate) RistrettoPoint);
@ -171,8 +185,8 @@ impl PedersenCommitment {
impl<'a, 'b> Add<&'b PedersenCommitment> for &'a PedersenCommitment {
type Output = PedersenCommitment;
fn add(self, other: &'b PedersenCommitment) -> PedersenCommitment {
PedersenCommitment(&self.0 + &other.0)
fn add(self, commitment: &'b PedersenCommitment) -> PedersenCommitment {
PedersenCommitment(&self.0 + &commitment.0)
}
}
@ -185,8 +199,8 @@ define_add_variants!(
impl<'a, 'b> Sub<&'b PedersenCommitment> for &'a PedersenCommitment {
type Output = PedersenCommitment;
fn sub(self, other: &'b PedersenCommitment) -> PedersenCommitment {
PedersenCommitment(&self.0 - &other.0)
fn sub(self, commitment: &'b PedersenCommitment) -> PedersenCommitment {
PedersenCommitment(&self.0 - &commitment.0)
}
}
@ -199,8 +213,8 @@ define_sub_variants!(
impl<'a, 'b> Mul<&'b Scalar> for &'a PedersenCommitment {
type Output = PedersenCommitment;
fn mul(self, other: &'b Scalar) -> PedersenCommitment {
PedersenCommitment(&self.0 * other)
fn mul(self, scalar: &'b Scalar) -> PedersenCommitment {
PedersenCommitment(scalar * &self.0)
}
}
@ -210,6 +224,20 @@ define_mul_variants!(
Output = PedersenCommitment
);
impl<'a, 'b> Mul<&'b PedersenCommitment> for &'a Scalar {
type Output = PedersenCommitment;
fn mul(self, commitment: &'b PedersenCommitment) -> PedersenCommitment {
PedersenCommitment(self * &commitment.0)
}
}
define_mul_variants!(
LHS = Scalar,
RHS = PedersenCommitment,
Output = PedersenCommitment
);
#[cfg(test)]
mod tests {
use super::*;
@ -256,6 +284,7 @@ mod tests {
let comm_addition = Pedersen::with(amt_0 * amt_1, &(open * scalar));
assert_eq!(comm_addition, comm * scalar);
assert_eq!(comm_addition, scalar * comm);
}
#[test]