Browse Source

Use lazy_static to initialize the Jubjub parameters, to avoid passing parameters around.

master
Sean Bowe 7 years ago
parent
commit
37f20fb90c
  1. 7
      Cargo.lock
  2. 1
      Cargo.toml
  3. 23
      include/librustzcash.h
  4. 35
      src/rustzcash.rs

7
Cargo.lock generated

@ -100,6 +100,11 @@ dependencies = [
"typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "lazy_static"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.40" version = "0.2.40"
@ -109,6 +114,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
name = "librustzcash" name = "librustzcash"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)",
"pairing 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "pairing 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)",
"sapling-crypto 0.0.1 (git+https://github.com/zcash-hackworks/sapling-crypto?rev=e554b473dd10885d232f42237c13282f5b6fee43)", "sapling-crypto 0.0.1 (git+https://github.com/zcash-hackworks/sapling-crypto?rev=e554b473dd10885d232f42237c13282f5b6fee43)",
@ -198,6 +204,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "1a70b146671de62ec8c8ed572219ca5d594d9b06c0b364d5e67b722fc559b48c" "checksum futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "1a70b146671de62ec8c8ed572219ca5d594d9b06c0b364d5e67b722fc559b48c"
"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
"checksum generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d" "checksum generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d"
"checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d"
"checksum libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)" = "6fd41f331ac7c5b8ac259b8bf82c75c0fb2e469bbf37d2becbba9a6a2221965b" "checksum libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)" = "6fd41f331ac7c5b8ac259b8bf82c75c0fb2e469bbf37d2becbba9a6a2221965b"
"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
"checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30"

1
Cargo.toml

@ -11,6 +11,7 @@ crate-type = ["staticlib"]
[dependencies] [dependencies]
libc = "0.2" libc = "0.2"
pairing = "0.14.1" pairing = "0.14.1"
lazy_static = "1"
[dependencies.sapling-crypto] [dependencies.sapling-crypto]
git = "https://github.com/zcash-hackworks/sapling-crypto" git = "https://github.com/zcash-hackworks/sapling-crypto"

23
include/librustzcash.h

@ -3,37 +3,26 @@
#include <stdint.h> #include <stdint.h>
struct librustzcash_params {
};
extern "C" { extern "C" {
uint64_t librustzcash_xor(uint64_t a, uint64_t b); uint64_t librustzcash_xor(uint64_t a, uint64_t b);
/// Initializes some parameters for sapling-crypto, /// Writes the "uncommitted" note value for empty leaves
/// returning a pointer to the parameters. You should /// of the merkle tree. `result` must be a valid pointer
/// free this when you're done with /// to 32 bytes which will be written.
/// `librustzcash_free_params()`. void librustzcash_tree_uncommitted(
librustzcash_params* librustzcash_init_params(); unsigned char *result
);
/// Frees some parameters that were previously returned
/// from `librustzcash_init_params()`. Only call this
/// once.
void librustzcash_free_params(librustzcash_params* params);
/// Computes a merkle tree hash for a given depth. /// Computes a merkle tree hash for a given depth.
/// The `depth` parameter should not be larger than /// The `depth` parameter should not be larger than
/// 62. /// 62.
/// ///
/// Params must be a valid pointer that was returned
/// from `librustzcash_init_params()`.
///
/// `a` and `b` each must be of length 32, and must each /// `a` and `b` each must be of length 32, and must each
/// be scalars of BLS12-381. /// be scalars of BLS12-381.
/// ///
/// The result of the merkle tree hash is placed in /// The result of the merkle tree hash is placed in
/// `result`, which must also be of length 32. /// `result`, which must also be of length 32.
void librustzcash_merkle_hash( void librustzcash_merkle_hash(
const librustzcash_params* params,
size_t depth, size_t depth,
const unsigned char *a, const unsigned char *a,
const unsigned char *b, const unsigned char *b,

35
src/rustzcash.rs

@ -2,6 +2,9 @@ extern crate libc;
extern crate sapling_crypto; extern crate sapling_crypto;
extern crate pairing; extern crate pairing;
#[macro_use]
extern crate lazy_static;
use pairing::{ use pairing::{
BitIterator, BitIterator,
PrimeFieldRepr, PrimeFieldRepr,
@ -23,40 +26,34 @@ use sapling_crypto::{
use libc::{uint64_t, size_t, c_uchar}; use libc::{uint64_t, size_t, c_uchar};
pub struct SaplingParams { lazy_static! {
pub jubjub_params: JubjubBls12 static ref JUBJUB: JubjubBls12 = {
} JubjubBls12::new()
};
#[no_mangle]
pub extern "system" fn librustzcash_init_params() -> *mut SaplingParams {
Box::into_raw(Box::new(SaplingParams{
jubjub_params: JubjubBls12::new()
}))
} }
#[no_mangle] #[no_mangle]
pub extern "system" fn librustzcash_free_params( pub extern "system" fn librustzcash_tree_uncommitted(
params: *mut SaplingParams result: *mut [c_uchar; 32]
) )
{ {
let tmp = unsafe { Box::from_raw(params) }; let tmp = sapling_crypto::primitives::Note::<Bls12>::uncommitted().into_repr();
// Should be okay, caller is responsible for ensuring the pointer
// is a valid pointer to 32 bytes that can be mutated.
let result = unsafe { &mut *result };
drop(tmp); tmp.write_be(&mut result[..]).unwrap();
} }
#[no_mangle] #[no_mangle]
pub extern "system" fn librustzcash_merkle_hash( pub extern "system" fn librustzcash_merkle_hash(
params: *const SaplingParams,
depth: size_t, depth: size_t,
a: *const [c_uchar; 32], a: *const [c_uchar; 32],
b: *const [c_uchar; 32], b: *const [c_uchar; 32],
result: *mut [c_uchar; 32], result: *mut [c_uchar; 32],
) )
{ {
// Should be okay, because caller is responsible for ensuring
// params points to valid parameters.
let params = unsafe { &*params };
let mut a_repr = FrRepr::default(); let mut a_repr = FrRepr::default();
let mut b_repr = FrRepr::default(); let mut b_repr = FrRepr::default();
@ -86,7 +83,7 @@ pub extern "system" fn librustzcash_merkle_hash(
lhs.iter().map(|&x| x) lhs.iter().map(|&x| x)
.take(Fr::NUM_BITS as usize) .take(Fr::NUM_BITS as usize)
.chain(rhs.iter().map(|&x| x).take(Fr::NUM_BITS as usize)), .chain(rhs.iter().map(|&x| x).take(Fr::NUM_BITS as usize)),
&params.jubjub_params &JUBJUB
).into_xy().0.into_repr(); ).into_xy().0.into_repr();
// Should be okay, caller is responsible for ensuring the pointer // Should be okay, caller is responsible for ensuring the pointer

Loading…
Cancel
Save