Skip to content

Commit

Permalink
use proptest for limb logic
Browse files Browse the repository at this point in the history
  • Loading branch information
avahowell committed Jul 7, 2022
1 parent cc86d78 commit 17b9fa5
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 20 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions eddy/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@ futures = "0.3"
merlin = "3"
rand_core = "0.6"
rand = "0.8.5"
proptest = "1"
ark-ff = "0.3"
ark-std = "0.3"
4 changes: 3 additions & 1 deletion eddy/src/limb/value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@ impl From<u32> for Value {
}
}

type Blinding = decaf377::Fr;

impl Value {
pub fn transparent_encrypt<R: RngCore + CryptoRng>(
&self,
encryption_key: &EncryptionKey,
mut rng: R,
) -> (Ciphertext, decaf377::Fr) {
) -> (Ciphertext, Blinding) {
let elgamal_blind = decaf377::Fr::rand(&mut rng);
let c1 = elgamal_blind * decaf377::basepoint();
let c2 =
Expand Down
57 changes: 38 additions & 19 deletions eddy/src/value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ impl Value {
let x1 = x1.0 as u128;
let x2 = x2.0 as u128;
let x3 = x3.0 as u128;
Value(x0 | (x1 << 16) | (x2 << 32) | (x3 << 48))
Value(x0 + (x1 << 16) + (x2 << 32) + (x3 << 48))
}

pub fn transparent_encrypt<R: RngCore + CryptoRng>(
Expand All @@ -51,8 +51,8 @@ impl Value {
.collect::<Vec<_>>();

let mut blindings: [decaf377::Fr; 4] = Default::default();
for (i, limb) in encrypted_limbs.iter().enumerate() {
blindings[i] = limb.1;
for (i, (_, blinding)) in encrypted_limbs.iter().enumerate() {
blindings[i] = *blinding;
}

let ciphertext = Ciphertext {
Expand All @@ -73,24 +73,43 @@ mod tests {
use super::*;

use ark_ff::UniformRand;
use proptest::prelude::*;

#[test]
fn test_limb_decomposition() {
let value = Value(6545536u128);
let limbs = value.to_limbs();
let val_back = Value::from_limbs(limbs[0], limbs[1], limbs[2], limbs[3]);
assert_eq!(value.0, val_back.0);
}
proptest! {
#[test]
fn limb_value_addition_roundtrip(value1: u64, value2: u64) {
let value = Value::from(value1);
let value2 = Value::from(value2);
let limbs = value.to_limbs();
let limbs2 = value2.to_limbs();
let limbs3 = [
limbs[0].0 + limbs2[0].0,
limbs[1].0 + limbs2[1].0,
limbs[2].0 + limbs2[2].0,
limbs[3].0 + limbs2[3].0,
];
let value3 = Value::from_limbs(limbs3[0].into(), limbs3[1].into(), limbs3[2].into(), limbs3[3].into());
assert_eq!(value3.0, value.0 + value2.0);
}

#[test]
fn test_encrypt_verify_transparent() {
let mut rng = rand::thread_rng();
let value = Value::from(0x12345678);
let encryption_key = EncryptionKey(decaf377::basepoint() * decaf377::Fr::rand(&mut rng));
let (ciphertext, proof) = value
.transparent_encrypt(&encryption_key, &mut rng)
.unwrap();
#[test]
fn limb_value_roundtrip(value: u64) {
let value = Value::from(value);
let limbs = value.to_limbs();
let value2 = Value::from_limbs(limbs[0], limbs[1], limbs[2], limbs[3]);
assert_eq!(value.0, value2.0);
}

assert!(proof.verify(&ciphertext, &encryption_key).is_ok());
#[test]
fn encrypt_verify_roundtrip(value: u64) {
let mut rng = rand::thread_rng();
let encryption_key = EncryptionKey(decaf377::basepoint() * decaf377::Fr::rand(&mut rng));
let value = Value::from(value);
let (ciphertext, proof) = value
.transparent_encrypt(&encryption_key, &mut rng)
.unwrap();

assert!(proof.verify(&ciphertext, &encryption_key).is_ok());
}
}
}

0 comments on commit 17b9fa5

Please sign in to comment.