mirror of
https://github.com/Qortal/pirate-librustzcash.git
synced 2025-02-12 01:55:48 +00:00
Use C calling convention for librustzcash
The Rust-to-C++ interface speaks the C ABI. The "system" ABI happens to be equivalent to the C ABI on the platforms we currently target (in particular, we don't target win32 with an x86 architecture, which would use the stdcall ABI).
This commit is contained in:
parent
720ee6476f
commit
0028048800
@ -115,7 +115,7 @@ fn fixed_scalar_mult(from: &[u8], p_g: FixedGenerators) -> edwards::Point<Bls12,
|
|||||||
|
|
||||||
#[cfg(not(target_os = "windows"))]
|
#[cfg(not(target_os = "windows"))]
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_init_zksnark_params(
|
pub extern "C" fn librustzcash_init_zksnark_params(
|
||||||
spend_path: *const u8,
|
spend_path: *const u8,
|
||||||
spend_path_len: usize,
|
spend_path_len: usize,
|
||||||
spend_hash: *const c_char,
|
spend_hash: *const c_char,
|
||||||
@ -152,7 +152,7 @@ pub extern "system" fn librustzcash_init_zksnark_params(
|
|||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_init_zksnark_params(
|
pub extern "C" fn librustzcash_init_zksnark_params(
|
||||||
spend_path: *const u16,
|
spend_path: *const u16,
|
||||||
spend_path_len: usize,
|
spend_path_len: usize,
|
||||||
spend_hash: *const c_char,
|
spend_hash: *const c_char,
|
||||||
@ -238,7 +238,7 @@ fn init_zksnark_params(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_tree_uncommitted(result: *mut [c_uchar; 32]) {
|
pub extern "C" fn librustzcash_tree_uncommitted(result: *mut [c_uchar; 32]) {
|
||||||
let tmp = Note::<Bls12>::uncommitted().into_repr();
|
let tmp = Note::<Bls12>::uncommitted().into_repr();
|
||||||
|
|
||||||
// Should be okay, caller is responsible for ensuring the pointer
|
// Should be okay, caller is responsible for ensuring the pointer
|
||||||
@ -249,7 +249,7 @@ pub extern "system" fn librustzcash_tree_uncommitted(result: *mut [c_uchar; 32])
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_merkle_hash(
|
pub extern "C" fn librustzcash_merkle_hash(
|
||||||
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],
|
||||||
@ -275,10 +275,7 @@ pub extern "system" fn librustzcash_merkle_hash(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle] // ToScalar
|
#[no_mangle] // ToScalar
|
||||||
pub extern "system" fn librustzcash_to_scalar(
|
pub extern "C" fn librustzcash_to_scalar(input: *const [c_uchar; 64], result: *mut [c_uchar; 32]) {
|
||||||
input: *const [c_uchar; 64],
|
|
||||||
result: *mut [c_uchar; 32],
|
|
||||||
) {
|
|
||||||
// Should be okay, because caller is responsible for ensuring
|
// Should be okay, because caller is responsible for ensuring
|
||||||
// the pointer is a valid pointer to 32 bytes, and that is the
|
// the pointer is a valid pointer to 32 bytes, and that is the
|
||||||
// size of the representation
|
// size of the representation
|
||||||
@ -292,10 +289,7 @@ pub extern "system" fn librustzcash_to_scalar(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_ask_to_ak(
|
pub extern "C" fn librustzcash_ask_to_ak(ask: *const [c_uchar; 32], result: *mut [c_uchar; 32]) {
|
||||||
ask: *const [c_uchar; 32],
|
|
||||||
result: *mut [c_uchar; 32],
|
|
||||||
) {
|
|
||||||
let ask = unsafe { &*ask };
|
let ask = unsafe { &*ask };
|
||||||
let ak = fixed_scalar_mult(ask, FixedGenerators::SpendingKeyGenerator);
|
let ak = fixed_scalar_mult(ask, FixedGenerators::SpendingKeyGenerator);
|
||||||
|
|
||||||
@ -305,10 +299,7 @@ pub extern "system" fn librustzcash_ask_to_ak(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_nsk_to_nk(
|
pub extern "C" fn librustzcash_nsk_to_nk(nsk: *const [c_uchar; 32], result: *mut [c_uchar; 32]) {
|
||||||
nsk: *const [c_uchar; 32],
|
|
||||||
result: *mut [c_uchar; 32],
|
|
||||||
) {
|
|
||||||
let nsk = unsafe { &*nsk };
|
let nsk = unsafe { &*nsk };
|
||||||
let nk = fixed_scalar_mult(nsk, FixedGenerators::ProofGenerationKey);
|
let nk = fixed_scalar_mult(nsk, FixedGenerators::ProofGenerationKey);
|
||||||
|
|
||||||
@ -318,7 +309,7 @@ pub extern "system" fn librustzcash_nsk_to_nk(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_crh_ivk(
|
pub extern "C" fn librustzcash_crh_ivk(
|
||||||
ak: *const [c_uchar; 32],
|
ak: *const [c_uchar; 32],
|
||||||
nk: *const [c_uchar; 32],
|
nk: *const [c_uchar; 32],
|
||||||
result: *mut [c_uchar; 32],
|
result: *mut [c_uchar; 32],
|
||||||
@ -343,13 +334,13 @@ pub extern "system" fn librustzcash_crh_ivk(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_check_diversifier(diversifier: *const [c_uchar; 11]) -> bool {
|
pub extern "C" fn librustzcash_check_diversifier(diversifier: *const [c_uchar; 11]) -> bool {
|
||||||
let diversifier = Diversifier(unsafe { *diversifier });
|
let diversifier = Diversifier(unsafe { *diversifier });
|
||||||
diversifier.g_d::<Bls12>(&JUBJUB).is_some()
|
diversifier.g_d::<Bls12>(&JUBJUB).is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_ivk_to_pkd(
|
pub extern "C" fn librustzcash_ivk_to_pkd(
|
||||||
ivk: *const [c_uchar; 32],
|
ivk: *const [c_uchar; 32],
|
||||||
diversifier: *const [c_uchar; 11],
|
diversifier: *const [c_uchar; 11],
|
||||||
result: *mut [c_uchar; 32],
|
result: *mut [c_uchar; 32],
|
||||||
@ -390,7 +381,7 @@ fn test_gen_r() {
|
|||||||
|
|
||||||
/// Return 32 byte random scalar, uniformly.
|
/// Return 32 byte random scalar, uniformly.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_generate_r(result: *mut [c_uchar; 32]) {
|
pub extern "C" fn librustzcash_sapling_generate_r(result: *mut [c_uchar; 32]) {
|
||||||
// create random 64 byte buffer
|
// create random 64 byte buffer
|
||||||
let mut rng = OsRng;
|
let mut rng = OsRng;
|
||||||
let mut buffer = [0u8; 64];
|
let mut buffer = [0u8; 64];
|
||||||
@ -445,7 +436,7 @@ fn priv_get_note(
|
|||||||
|
|
||||||
/// Compute Sapling note nullifier.
|
/// Compute Sapling note nullifier.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_compute_nf(
|
pub extern "C" fn librustzcash_sapling_compute_nf(
|
||||||
diversifier: *const [c_uchar; 11],
|
diversifier: *const [c_uchar; 11],
|
||||||
pk_d: *const [c_uchar; 32],
|
pk_d: *const [c_uchar; 32],
|
||||||
value: u64,
|
value: u64,
|
||||||
@ -490,7 +481,7 @@ pub extern "system" fn librustzcash_sapling_compute_nf(
|
|||||||
|
|
||||||
/// Compute Sapling note commitment.
|
/// Compute Sapling note commitment.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_compute_cm(
|
pub extern "C" fn librustzcash_sapling_compute_cm(
|
||||||
diversifier: *const [c_uchar; 11],
|
diversifier: *const [c_uchar; 11],
|
||||||
pk_d: *const [c_uchar; 32],
|
pk_d: *const [c_uchar; 32],
|
||||||
value: u64,
|
value: u64,
|
||||||
@ -509,7 +500,7 @@ pub extern "system" fn librustzcash_sapling_compute_cm(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_ka_agree(
|
pub extern "C" fn librustzcash_sapling_ka_agree(
|
||||||
p: *const [c_uchar; 32],
|
p: *const [c_uchar; 32],
|
||||||
sk: *const [c_uchar; 32],
|
sk: *const [c_uchar; 32],
|
||||||
result: *mut [c_uchar; 32],
|
result: *mut [c_uchar; 32],
|
||||||
@ -537,7 +528,7 @@ pub extern "system" fn librustzcash_sapling_ka_agree(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_ka_derivepublic(
|
pub extern "C" fn librustzcash_sapling_ka_derivepublic(
|
||||||
diversifier: *const [c_uchar; 11],
|
diversifier: *const [c_uchar; 11],
|
||||||
esk: *const [c_uchar; 32],
|
esk: *const [c_uchar; 32],
|
||||||
result: *mut [c_uchar; 32],
|
result: *mut [c_uchar; 32],
|
||||||
@ -565,7 +556,7 @@ pub extern "system" fn librustzcash_sapling_ka_derivepublic(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_eh_isvalid(
|
pub extern "C" fn librustzcash_eh_isvalid(
|
||||||
n: u32,
|
n: u32,
|
||||||
k: u32,
|
k: u32,
|
||||||
input: *const c_uchar,
|
input: *const c_uchar,
|
||||||
@ -585,17 +576,14 @@ pub extern "system" fn librustzcash_eh_isvalid(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_verification_ctx_init(
|
pub extern "C" fn librustzcash_sapling_verification_ctx_init() -> *mut SaplingVerificationContext {
|
||||||
) -> *mut SaplingVerificationContext {
|
|
||||||
let ctx = Box::new(SaplingVerificationContext::new());
|
let ctx = Box::new(SaplingVerificationContext::new());
|
||||||
|
|
||||||
Box::into_raw(ctx)
|
Box::into_raw(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_verification_ctx_free(
|
pub extern "C" fn librustzcash_sapling_verification_ctx_free(ctx: *mut SaplingVerificationContext) {
|
||||||
ctx: *mut SaplingVerificationContext,
|
|
||||||
) {
|
|
||||||
drop(unsafe { Box::from_raw(ctx) });
|
drop(unsafe { Box::from_raw(ctx) });
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -604,7 +592,7 @@ const GROTH_PROOF_SIZE: usize = 48 // π_A
|
|||||||
+ 48; // π_C
|
+ 48; // π_C
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_check_spend(
|
pub extern "C" fn librustzcash_sapling_check_spend(
|
||||||
ctx: *mut SaplingVerificationContext,
|
ctx: *mut SaplingVerificationContext,
|
||||||
cv: *const [c_uchar; 32],
|
cv: *const [c_uchar; 32],
|
||||||
anchor: *const [c_uchar; 32],
|
anchor: *const [c_uchar; 32],
|
||||||
@ -659,7 +647,7 @@ pub extern "system" fn librustzcash_sapling_check_spend(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_check_output(
|
pub extern "C" fn librustzcash_sapling_check_output(
|
||||||
ctx: *mut SaplingVerificationContext,
|
ctx: *mut SaplingVerificationContext,
|
||||||
cv: *const [c_uchar; 32],
|
cv: *const [c_uchar; 32],
|
||||||
cm: *const [c_uchar; 32],
|
cm: *const [c_uchar; 32],
|
||||||
@ -702,7 +690,7 @@ pub extern "system" fn librustzcash_sapling_check_output(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_final_check(
|
pub extern "C" fn librustzcash_sapling_final_check(
|
||||||
ctx: *mut SaplingVerificationContext,
|
ctx: *mut SaplingVerificationContext,
|
||||||
value_balance: i64,
|
value_balance: i64,
|
||||||
binding_sig: *const [c_uchar; 64],
|
binding_sig: *const [c_uchar; 64],
|
||||||
@ -728,7 +716,7 @@ pub extern "system" fn librustzcash_sapling_final_check(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sprout_prove(
|
pub extern "C" fn librustzcash_sprout_prove(
|
||||||
proof_out: *mut [c_uchar; GROTH_PROOF_SIZE],
|
proof_out: *mut [c_uchar; GROTH_PROOF_SIZE],
|
||||||
|
|
||||||
phi: *const [c_uchar; 32],
|
phi: *const [c_uchar; 32],
|
||||||
@ -877,7 +865,7 @@ pub extern "system" fn librustzcash_sprout_prove(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sprout_verify(
|
pub extern "C" fn librustzcash_sprout_verify(
|
||||||
proof: *const [c_uchar; GROTH_PROOF_SIZE],
|
proof: *const [c_uchar; GROTH_PROOF_SIZE],
|
||||||
rt: *const [c_uchar; 32],
|
rt: *const [c_uchar; 32],
|
||||||
h_sig: *const [c_uchar; 32],
|
h_sig: *const [c_uchar; 32],
|
||||||
@ -926,7 +914,7 @@ pub extern "system" fn librustzcash_sprout_verify(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_output_proof(
|
pub extern "C" fn librustzcash_sapling_output_proof(
|
||||||
ctx: *mut SaplingProvingContext,
|
ctx: *mut SaplingProvingContext,
|
||||||
esk: *const [c_uchar; 32],
|
esk: *const [c_uchar; 32],
|
||||||
payment_address: *const [c_uchar; 43],
|
payment_address: *const [c_uchar; 43],
|
||||||
@ -978,7 +966,7 @@ pub extern "system" fn librustzcash_sapling_output_proof(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_spend_sig(
|
pub extern "C" fn librustzcash_sapling_spend_sig(
|
||||||
ask: *const [c_uchar; 32],
|
ask: *const [c_uchar; 32],
|
||||||
ar: *const [c_uchar; 32],
|
ar: *const [c_uchar; 32],
|
||||||
sighash: *const [c_uchar; 32],
|
sighash: *const [c_uchar; 32],
|
||||||
@ -1010,7 +998,7 @@ pub extern "system" fn librustzcash_sapling_spend_sig(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_binding_sig(
|
pub extern "C" fn librustzcash_sapling_binding_sig(
|
||||||
ctx: *const SaplingProvingContext,
|
ctx: *const SaplingProvingContext,
|
||||||
value_balance: i64,
|
value_balance: i64,
|
||||||
sighash: *const [c_uchar; 32],
|
sighash: *const [c_uchar; 32],
|
||||||
@ -1035,7 +1023,7 @@ pub extern "system" fn librustzcash_sapling_binding_sig(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_spend_proof(
|
pub extern "C" fn librustzcash_sapling_spend_proof(
|
||||||
ctx: *mut SaplingProvingContext,
|
ctx: *mut SaplingProvingContext,
|
||||||
ak: *const [c_uchar; 32],
|
ak: *const [c_uchar; 32],
|
||||||
nsk: *const [c_uchar; 32],
|
nsk: *const [c_uchar; 32],
|
||||||
@ -1135,19 +1123,19 @@ pub extern "system" fn librustzcash_sapling_spend_proof(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_proving_ctx_init() -> *mut SaplingProvingContext {
|
pub extern "C" fn librustzcash_sapling_proving_ctx_init() -> *mut SaplingProvingContext {
|
||||||
let ctx = Box::new(SaplingProvingContext::new());
|
let ctx = Box::new(SaplingProvingContext::new());
|
||||||
|
|
||||||
Box::into_raw(ctx)
|
Box::into_raw(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_sapling_proving_ctx_free(ctx: *mut SaplingProvingContext) {
|
pub extern "C" fn librustzcash_sapling_proving_ctx_free(ctx: *mut SaplingProvingContext) {
|
||||||
drop(unsafe { Box::from_raw(ctx) });
|
drop(unsafe { Box::from_raw(ctx) });
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_zip32_xsk_master(
|
pub extern "C" fn librustzcash_zip32_xsk_master(
|
||||||
seed: *const c_uchar,
|
seed: *const c_uchar,
|
||||||
seedlen: size_t,
|
seedlen: size_t,
|
||||||
xsk_master: *mut [c_uchar; 169],
|
xsk_master: *mut [c_uchar; 169],
|
||||||
@ -1161,7 +1149,7 @@ pub extern "system" fn librustzcash_zip32_xsk_master(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_zip32_xsk_derive(
|
pub extern "C" fn librustzcash_zip32_xsk_derive(
|
||||||
xsk_parent: *const [c_uchar; 169],
|
xsk_parent: *const [c_uchar; 169],
|
||||||
i: u32,
|
i: u32,
|
||||||
xsk_i: *mut [c_uchar; 169],
|
xsk_i: *mut [c_uchar; 169],
|
||||||
@ -1177,7 +1165,7 @@ pub extern "system" fn librustzcash_zip32_xsk_derive(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_zip32_xfvk_derive(
|
pub extern "C" fn librustzcash_zip32_xfvk_derive(
|
||||||
xfvk_parent: *const [c_uchar; 169],
|
xfvk_parent: *const [c_uchar; 169],
|
||||||
i: u32,
|
i: u32,
|
||||||
xfvk_i: *mut [c_uchar; 169],
|
xfvk_i: *mut [c_uchar; 169],
|
||||||
@ -1198,7 +1186,7 @@ pub extern "system" fn librustzcash_zip32_xfvk_derive(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "system" fn librustzcash_zip32_xfvk_address(
|
pub extern "C" fn librustzcash_zip32_xfvk_address(
|
||||||
xfvk: *const [c_uchar; 169],
|
xfvk: *const [c_uchar; 169],
|
||||||
j: *const [c_uchar; 11],
|
j: *const [c_uchar; 11],
|
||||||
j_ret: *mut [c_uchar; 11],
|
j_ret: *mut [c_uchar; 11],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user