Rust welding utility functions for key derivation.
This commit is contained in:
parent
7e9127538f
commit
bebe0cf4e7
|
@ -16,7 +16,10 @@ use std::path::Path;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use zcash_client_backend::{
|
use zcash_client_backend::{
|
||||||
constants::SAPLING_CONSENSUS_BRANCH_ID,
|
constants::SAPLING_CONSENSUS_BRANCH_ID,
|
||||||
encoding::{decode_extended_spending_key, encode_extended_spending_key},
|
encoding::{
|
||||||
|
decode_extended_spending_key, encode_extended_full_viewing_key,
|
||||||
|
encode_extended_spending_key,
|
||||||
|
},
|
||||||
keys::spending_key,
|
keys::spending_key,
|
||||||
};
|
};
|
||||||
use zcash_client_sqlite::{
|
use zcash_client_sqlite::{
|
||||||
|
@ -32,18 +35,23 @@ use zcash_client_sqlite::{
|
||||||
transact::create_to_address,
|
transact::create_to_address,
|
||||||
};
|
};
|
||||||
use zcash_primitives::{
|
use zcash_primitives::{
|
||||||
block::BlockHash, note_encryption::Memo, transaction::components::Amount,
|
block::BlockHash,
|
||||||
zip32::ExtendedFullViewingKey,
|
note_encryption::Memo,
|
||||||
|
transaction::components::Amount,
|
||||||
|
zip32::{ExtendedFullViewingKey, ExtendedSpendingKey},
|
||||||
};
|
};
|
||||||
use zcash_proofs::prover::LocalTxProver;
|
use zcash_proofs::prover::LocalTxProver;
|
||||||
|
|
||||||
use crate::utils::exception::unwrap_exc_or;
|
use crate::utils::exception::unwrap_exc_or;
|
||||||
|
|
||||||
#[cfg(feature = "mainnet")]
|
#[cfg(feature = "mainnet")]
|
||||||
use zcash_client_backend::constants::mainnet::HRP_SAPLING_EXTENDED_SPENDING_KEY;
|
use zcash_client_backend::constants::mainnet::{
|
||||||
|
HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, HRP_SAPLING_EXTENDED_SPENDING_KEY,
|
||||||
|
};
|
||||||
#[cfg(not(feature = "mainnet"))]
|
#[cfg(not(feature = "mainnet"))]
|
||||||
use zcash_client_backend::constants::testnet::HRP_SAPLING_EXTENDED_SPENDING_KEY;
|
use zcash_client_backend::constants::testnet::{
|
||||||
|
HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, HRP_SAPLING_EXTENDED_SPENDING_KEY,
|
||||||
|
};
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn Java_cash_z_wallet_sdk_jni_RustBackend_initLogs(
|
pub unsafe extern "C" fn Java_cash_z_wallet_sdk_jni_RustBackend_initLogs(
|
||||||
|
@ -51,7 +59,7 @@ pub unsafe extern "C" fn Java_cash_z_wallet_sdk_jni_RustBackend_initLogs(
|
||||||
_: JClass<'_>,
|
_: JClass<'_>,
|
||||||
) {
|
) {
|
||||||
android_logger::init_once(
|
android_logger::init_once(
|
||||||
Filter::default().with_min_level(Level::Trace),
|
Filter::default().with_min_level(Level::Debug),
|
||||||
Some("cash.z.rust.logs"),
|
Some("cash.z.rust.logs"),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -120,6 +128,112 @@ pub unsafe extern "C" fn Java_cash_z_wallet_sdk_jni_RustBackend_initAccountsTabl
|
||||||
unwrap_exc_or(&env, res, ptr::null_mut())
|
unwrap_exc_or(&env, res, ptr::null_mut())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn Java_cash_z_wallet_sdk_jni_RustBackend_deriveExtendedSpendingKeys(
|
||||||
|
env: JNIEnv<'_>,
|
||||||
|
_: JClass<'_>,
|
||||||
|
seed: jbyteArray,
|
||||||
|
accounts: jint,
|
||||||
|
) -> jobjectArray {
|
||||||
|
let res = panic::catch_unwind(|| {
|
||||||
|
let seed = env.convert_byte_array(seed).unwrap();
|
||||||
|
let accounts = if accounts > 0 {
|
||||||
|
accounts as u32
|
||||||
|
} else {
|
||||||
|
return Err(format_err!("accounts argument must be greater than zero"));
|
||||||
|
};
|
||||||
|
|
||||||
|
let extsks: Vec<_> = (0..accounts)
|
||||||
|
.map(|account| spending_key(&seed, 1, account))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
Ok(utils::rust_vec_to_java(
|
||||||
|
&env,
|
||||||
|
extsks,
|
||||||
|
"java/lang/String",
|
||||||
|
|env, extsk| {
|
||||||
|
env.new_string(encode_extended_spending_key(
|
||||||
|
HRP_SAPLING_EXTENDED_SPENDING_KEY,
|
||||||
|
&extsk,
|
||||||
|
))
|
||||||
|
},
|
||||||
|
|env| env.new_string(""),
|
||||||
|
))
|
||||||
|
});
|
||||||
|
unwrap_exc_or(&env, res, ptr::null_mut())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn Java_cash_z_wallet_sdk_jni_RustBackend_deriveExtendedFullViewingKeys(
|
||||||
|
env: JNIEnv<'_>,
|
||||||
|
_: JClass<'_>,
|
||||||
|
seed: jbyteArray,
|
||||||
|
accounts: jint,
|
||||||
|
) -> jobjectArray {
|
||||||
|
let res = panic::catch_unwind(|| {
|
||||||
|
let seed = env.convert_byte_array(seed).unwrap();
|
||||||
|
let accounts = if accounts > 0 {
|
||||||
|
accounts as u32
|
||||||
|
} else {
|
||||||
|
return Err(format_err!("accounts argument must be greater than zero"));
|
||||||
|
};
|
||||||
|
|
||||||
|
let extfvks: Vec<_> = (0..accounts)
|
||||||
|
.map(|account| ExtendedFullViewingKey::from(&spending_key(&seed, 1, account)))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
Ok(utils::rust_vec_to_java(
|
||||||
|
&env,
|
||||||
|
extfvks,
|
||||||
|
"java/lang/String",
|
||||||
|
|env, extfvk| {
|
||||||
|
env.new_string(encode_extended_full_viewing_key(
|
||||||
|
HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY,
|
||||||
|
&extfvk,
|
||||||
|
))
|
||||||
|
},
|
||||||
|
|env| env.new_string(""),
|
||||||
|
))
|
||||||
|
});
|
||||||
|
unwrap_exc_or(&env, res, ptr::null_mut())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn Java_cash_z_wallet_sdk_jni_RustBackend_deriveExtendedFullViewingKey(
|
||||||
|
env: JNIEnv<'_>,
|
||||||
|
_: JClass<'_>,
|
||||||
|
extsk_string: JString<'_>,
|
||||||
|
) -> jobjectArray {
|
||||||
|
let res = panic::catch_unwind(|| {
|
||||||
|
let extsk_string = utils::java_string_to_rust(&env, extsk_string);
|
||||||
|
let extfvk = match decode_extended_spending_key(
|
||||||
|
HRP_SAPLING_EXTENDED_SPENDING_KEY,
|
||||||
|
&extsk_string,
|
||||||
|
) {
|
||||||
|
Ok(Some(extsk)) => ExtendedFullViewingKey::from(&extsk),
|
||||||
|
Ok(None) => {
|
||||||
|
return Err(format_err!("Deriving viewing key from spending key returned no results. Encoding was valid but type was incorrect."));
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
return Err(format_err!(
|
||||||
|
"Error while deriving viewing key from spending key: {}",
|
||||||
|
e
|
||||||
|
));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let output = env
|
||||||
|
.new_string(encode_extended_full_viewing_key(
|
||||||
|
HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY,
|
||||||
|
&extfvk,
|
||||||
|
))
|
||||||
|
.expect("Couldn't create Java string!");
|
||||||
|
|
||||||
|
Ok(output.into_inner())
|
||||||
|
});
|
||||||
|
unwrap_exc_or(&env, res, ptr::null_mut())
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn Java_cash_z_wallet_sdk_jni_RustBackend_initBlocksTable(
|
pub unsafe extern "C" fn Java_cash_z_wallet_sdk_jni_RustBackend_initBlocksTable(
|
||||||
env: JNIEnv<'_>,
|
env: JNIEnv<'_>,
|
||||||
|
@ -145,6 +259,7 @@ pub unsafe extern "C" fn Java_cash_z_wallet_sdk_jni_RustBackend_initBlocksTable(
|
||||||
let sapling_tree =
|
let sapling_tree =
|
||||||
hex::decode(utils::java_string_to_rust(&env, sapling_tree_string)).unwrap();
|
hex::decode(utils::java_string_to_rust(&env, sapling_tree_string)).unwrap();
|
||||||
|
|
||||||
|
debug!("initializing blocks table with height {}", height);
|
||||||
match init_blocks_table(&db_data, height, hash, time, &sapling_tree) {
|
match init_blocks_table(&db_data, height, hash, time, &sapling_tree) {
|
||||||
Ok(()) => Ok(JNI_TRUE),
|
Ok(()) => Ok(JNI_TRUE),
|
||||||
Err(e) => Err(format_err!("Error while initializing blocks table: {}", e)),
|
Err(e) => Err(format_err!("Error while initializing blocks table: {}", e)),
|
||||||
|
@ -394,7 +509,8 @@ pub unsafe extern "C" fn Java_cash_z_wallet_sdk_jni_RustBackend_createToAddress(
|
||||||
};
|
};
|
||||||
let extsk = utils::java_string_to_rust(&env, extsk);
|
let extsk = utils::java_string_to_rust(&env, extsk);
|
||||||
let to = utils::java_string_to_rust(&env, to);
|
let to = utils::java_string_to_rust(&env, to);
|
||||||
let value = Amount::from_i64(value).map_err(|()| format_err!("Invalid amount, out of range"))?;
|
let value =
|
||||||
|
Amount::from_i64(value).map_err(|()| format_err!("Invalid amount, out of range"))?;
|
||||||
if value.is_negative() {
|
if value.is_negative() {
|
||||||
return Err(format_err!("Amount is negative"));
|
return Err(format_err!("Amount is negative"));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue