Browse Source

Add test for generating commitment randomness.

master
Simon 6 years ago
parent
commit
eb3d8aa12c
  1. 3
      include/librustzcash.h
  2. 28
      src/rustzcash.rs

3
include/librustzcash.h

@ -118,8 +118,7 @@ extern "C" {
/// Generate uniform Sapling commitment randomness `r`. /// Generate uniform Sapling commitment randomness `r`.
/// The result is of length 32. /// The result is of length 32.
/// Returns false if there was an error. void librustzcash_sapling_generate_r(
bool librustzcash_sapling_generate_commitment_randomness(
unsigned char *result unsigned char *result
); );

28
src/rustzcash.rs

@ -301,11 +301,28 @@ pub extern "system" fn librustzcash_ivk_to_pkd(
} }
} }
/// Test generation of commitment randomness
#[test]
fn test_gen_r() {
let mut r1 = [0u8; 32];
let mut r2 = [0u8; 32];
// Verify different r values are generated
librustzcash_sapling_generate_r(&mut r1);
librustzcash_sapling_generate_r(&mut r2);
assert_ne!(r1, r2);
// Verify r values are valid in the field
let mut repr = FsRepr::default();
repr.read_le(&r1[..]).expect("length is not 32 bytes");
let _ = Fs::from_repr(repr).unwrap();
repr.read_le(&r2[..]).expect("length is not 32 bytes");
let _ = Fs::from_repr(repr).unwrap();
}
/// Return 32 byte randomness, uniform, to be used for a Sapling commitment. /// Return 32 byte randomness, uniform, to be used for a Sapling commitment.
#[no_mangle] #[no_mangle]
pub extern "system" fn librustzcash_sapling_generate_commitment_randomness( pub extern "system" fn librustzcash_sapling_generate_r(result: *mut [c_uchar; 32]) {
result: *mut [c_uchar; 32],
) -> bool {
// create random 64 byte buffer // create random 64 byte buffer
let mut rng = OsRng::new().expect("should be able to construct RNG"); let mut rng = OsRng::new().expect("should be able to construct RNG");
let mut buffer = [0u8; 64]; let mut buffer = [0u8; 64];
@ -313,17 +330,12 @@ pub extern "system" fn librustzcash_sapling_generate_commitment_randomness(
buffer[i] = rng.gen(); buffer[i] = rng.gen();
} }
// TODO: Remove this debug statement
println!("buffer of random bytes: {:?}", &buffer[..]);
// reduce to uniform value // reduce to uniform value
let r = <Bls12 as JubjubEngine>::Fs::to_uniform(&buffer[..]); let r = <Bls12 as JubjubEngine>::Fs::to_uniform(&buffer[..]);
let result = unsafe { &mut *result }; let result = unsafe { &mut *result };
r.into_repr() r.into_repr()
.write_le(&mut result[..]) .write_le(&mut result[..])
.expect("result must be 32 bytes"); .expect("result must be 32 bytes");
true
} }
/// Compute Sapling note commitment. /// Compute Sapling note commitment.

Loading…
Cancel
Save