Add test for generating commitment randomness.
This commit is contained in:
@@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user