CalDescent
2 years ago
commit
0a418e15df
14 changed files with 741 additions and 0 deletions
@ -0,0 +1,21 @@
|
||||
MIT License |
||||
|
||||
Copyright (c) 2020 Zero Currency Coin |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
of this software and associated documentation files (the "Software"), to deal |
||||
in the Software without restriction, including without limitation the rights |
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
copies of the Software, and to permit persons to whom the Software is |
||||
furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included in all |
||||
copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
SOFTWARE. |
@ -0,0 +1,22 @@
|
||||
# Pirate Chain LiteWalletJNI Build System |
||||
Based on code from https://github.com/PirateNetwork/cordova-plugin-litewallet<br /> |
||||
Adapted in July 2022 by Qortal dev team<br /><br /> |
||||
|
||||
|
||||
### Native Builds ### |
||||
|
||||
``` |
||||
cd src/ |
||||
cargo build --release |
||||
ls -l target/release |
||||
``` |
||||
|
||||
|
||||
### Cross Compilation via Docker ### |
||||
|
||||
``` |
||||
cd src/ |
||||
./build-docker.sh |
||||
./crosscompile.sh |
||||
ls -l target |
||||
``` |
@ -0,0 +1,13 @@
|
||||
[target.arm-unknown-linux-gnueabihf] |
||||
ar = "/opt/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-ar" |
||||
linker = "/opt/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc" |
||||
|
||||
[target.aarch64-unknown-linux-gnu] |
||||
ar = "/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-ar" |
||||
linker = "/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc" |
||||
|
||||
[target.x86_64-apple-darwin] |
||||
rustflags = [ |
||||
"-C", "link-arg=-undefined", |
||||
"-C", "link-arg=dynamic_lookup", |
||||
] |
@ -0,0 +1,8 @@
|
||||
[workspace] |
||||
members = [ |
||||
"lib", |
||||
"main" |
||||
] |
||||
|
||||
[profile.release] |
||||
debug = false |
@ -0,0 +1,5 @@
|
||||
FROM rust:1.60.0-slim-buster |
||||
RUN apt-get update && apt-get install -y tar unzip wget curl jq build-essential mingw-w64 |
||||
RUN cd /opt && curl https://codeload.github.com/raspberrypi/tools/tar.gz/master | tar -xz --strip=2 tools-master/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf |
||||
RUN wget "https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz?revision=61c3be5d-5175-4db6-9030-b565aae9f766&la=en&hash=0A37024B42028A9616F56A51C2D20755C5EBBCD7" -O gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz && mkdir -p /opt/arm/9 && tar Jxf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/arm/9 |
||||
WORKDIR /build |
@ -0,0 +1,15 @@
|
||||
INSTANCE_NAME="piratejni" |
||||
EXISTING_CONTAINER_ID=$(docker ps -aqf "name=${INSTANCE_NAME}") |
||||
EXISTING_RUNNING_CONTAINER_ID=$(docker ps -aqf "name=${INSTANCE_NAME}" --filter status=running) |
||||
|
||||
if [ -z "${EXISTING_RUNNING_CONTAINER_ID}" ]; then |
||||
|
||||
# Container not running - start it |
||||
echo "Starting new container ${INSTANCE_NAME}..." |
||||
docker rm "${INSTANCE_NAME}" |
||||
docker run -v "$(pwd)":/build --name "${INSTANCE_NAME}" -it "${INSTANCE_NAME}" "./main/build.sh" |
||||
|
||||
else |
||||
# Already running |
||||
echo "${INSTANCE_NAME} is already running with container ID ${EXISTING_CONTAINER_ID}. Doing nothing." |
||||
fi |
@ -0,0 +1,25 @@
|
||||
[package] |
||||
name = "rustlib" |
||||
version = "1.0.0" |
||||
authors = ["Aditya Kulkarni <[email protected]>"] |
||||
edition = "2018" |
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html |
||||
|
||||
[dependencies] |
||||
jni = { version = "0.10.2", default-features = false } |
||||
zecwalletlitelib = { git="https://github.com/Qortal/piratewallet-light-cli", default-features=false, rev="9d6704ec42cb5429d8433c486211891b2216ea4c" } |
||||
lazy_static = "1.4.0" |
||||
num-integer = "0.1.44" |
||||
android_logger = "0.8.6" |
||||
log = "0.4.8" |
||||
base64 = "0.11.0" |
||||
|
||||
serde = "1.0" |
||||
serde_json = "1.0" |
||||
serde_derive = "1.0" |
||||
hex = "0.3" |
||||
hex-serde = "0.1" |
||||
|
||||
tiny-bip39 = "0.6.2" |
||||
rand = "0.7.2" |
@ -0,0 +1,297 @@
|
||||
#[macro_use] |
||||
extern crate lazy_static; |
||||
|
||||
use std::sync::{Mutex, Arc}; |
||||
use std::cell::RefCell; |
||||
|
||||
use base64::{encode, decode}; |
||||
use bip39::{Mnemonic, Language}; |
||||
use rand::{Rng, rngs::OsRng}; |
||||
|
||||
extern crate serde; |
||||
#[macro_use] extern crate serde_json; |
||||
extern crate serde_derive; |
||||
use serde_derive::Deserialize; |
||||
|
||||
use zecwalletlitelib::{commands, lightclient::{LightClient, LightClientConfig}}; |
||||
|
||||
|
||||
#[derive(Deserialize, Clone)] |
||||
pub struct JsAddressParameters { |
||||
pub coin_type: String, |
||||
pub hrp_sapling_extended_spending_key: String, |
||||
pub hrp_sapling_extended_full_viewing_key: String, |
||||
pub hrp_sapling_payment_address: String, |
||||
#[serde(with = "hex_serde")] |
||||
pub b58_pubkey_address_prefix: [u8; 2], |
||||
#[serde(with = "hex_serde")] |
||||
pub b58_script_address_prefix: [u8; 2], |
||||
} |
||||
|
||||
|
||||
pub fn set_address_params(mut config: LightClientConfig, params: &str) -> LightClientConfig { |
||||
|
||||
let js_params: JsAddressParameters = match serde_json::from_str(¶ms) { |
||||
Ok(js) => js, |
||||
Err(_) => {return config} |
||||
}; |
||||
|
||||
let ct: u32 = match js_params.coin_type.parse() { |
||||
Ok(s) => s, |
||||
Err(_) => return config |
||||
}; |
||||
|
||||
if js_params.hrp_sapling_extended_spending_key.len() == 0 {return config} |
||||
if js_params.hrp_sapling_extended_full_viewing_key.len() == 0 {return config} |
||||
if js_params.hrp_sapling_payment_address.len() == 0 {return config} |
||||
if js_params.b58_pubkey_address_prefix.len() != 2 {return config} |
||||
if js_params.b58_script_address_prefix.len() != 2 {return config} |
||||
|
||||
LightClientConfig::set_coin_type(&mut config, ct); |
||||
LightClientConfig::set_hrp_sapling_extended_spending_key(&mut config, js_params.hrp_sapling_extended_spending_key); |
||||
LightClientConfig::set_hrp_sapling_extended_full_viewing_key(&mut config, js_params.hrp_sapling_extended_full_viewing_key); |
||||
LightClientConfig::set_hrp_sapling_payment_address(&mut config, js_params.hrp_sapling_payment_address); |
||||
LightClientConfig::set_b58_pubkey_address_prefix(&mut config, js_params.b58_pubkey_address_prefix); |
||||
LightClientConfig::set_b58_script_address_prefix(&mut config, js_params.b58_script_address_prefix); |
||||
|
||||
config |
||||
} |
||||
|
||||
|
||||
// We'll use a MUTEX to store a global lightclient instance,
|
||||
// so we don't have to keep creating it. We need to store it here, in rust
|
||||
// because we can't return such a complex structure back to JS
|
||||
lazy_static! { |
||||
static ref LIGHTCLIENT: Mutex<RefCell<Option<Arc<LightClient>>>> = Mutex::new(RefCell::new(None)); |
||||
} |
||||
pub fn init_new(server_uri: String, params: String, sapling_output_b64: String, sapling_spend_b64: String) -> String { |
||||
let server = LightClientConfig::get_server_or_default(Some(server_uri)); |
||||
let (mut config, latest_block_height) = match LightClientConfig::create(server) { |
||||
Ok((c, h)) => (c, h), |
||||
Err(e) => { |
||||
return format!("Error: {}", e); |
||||
} |
||||
}; |
||||
|
||||
//Set Encoding Specifications
|
||||
config = set_address_params(config, params.as_str()); |
||||
|
||||
let lightclient = match LightClient::new(&config, latest_block_height) { |
||||
Ok(mut l) => { |
||||
match l.set_sapling_params(&decode(&sapling_output_b64).unwrap(), &decode(&sapling_spend_b64).unwrap()) { |
||||
Ok(_) => l, |
||||
Err(e) => return format!("Error: {}", e) |
||||
} |
||||
}, |
||||
Err(e) => { |
||||
return format!("Error: {}", e); |
||||
} |
||||
}; |
||||
|
||||
let seed = match lightclient.do_seed_phrase() { |
||||
Ok(s) => s.dump(), |
||||
Err(e) => { |
||||
return format!("Error: {}", e); |
||||
} |
||||
}; |
||||
|
||||
LIGHTCLIENT.lock().unwrap().replace(Some(Arc::new(lightclient))); |
||||
|
||||
seed |
||||
} |
||||
|
||||
pub fn init_from_seed(server_uri: String, params: String, seed: String, birthday: u64, sapling_output_b64: String, sapling_spend_b64: String) -> String { |
||||
let server = LightClientConfig::get_server_or_default(Some(server_uri)); |
||||
let (mut config, _latest_block_height) = match LightClientConfig::create(server) { |
||||
Ok((c, h)) => (c, h), |
||||
Err(e) => { |
||||
return format!("Error: {}", e); |
||||
} |
||||
}; |
||||
|
||||
//Set Encoding Specifications
|
||||
config = set_address_params(config, params.as_str()); |
||||
|
||||
let lightclient = match LightClient::new_from_phrase(seed, &config, birthday, false) { |
||||
Ok(mut l) => { |
||||
match l.set_sapling_params(&decode(&sapling_output_b64).unwrap(), &decode(&sapling_spend_b64).unwrap()) { |
||||
Ok(_) => l, |
||||
Err(e) => return format!("Error: {}", e) |
||||
} |
||||
}, |
||||
Err(e) => { |
||||
return format!("Error: {}", e); |
||||
} |
||||
}; |
||||
|
||||
let seed = match lightclient.do_seed_phrase() { |
||||
Ok(s) => s.dump(), |
||||
Err(e) => { |
||||
return format!("Error: {}", e); |
||||
} |
||||
}; |
||||
|
||||
LIGHTCLIENT.lock().unwrap().replace(Some(Arc::new(lightclient))); |
||||
|
||||
seed |
||||
} |
||||
|
||||
pub fn init_from_b64(server_uri: String, params: String, base64_data: String, sapling_output_b64: String, sapling_spend_b64: String) -> String { |
||||
let server = LightClientConfig::get_server_or_default(Some(server_uri)); |
||||
let (mut config, _latest_block_height) = match LightClientConfig::create(server) { |
||||
Ok((c, h)) => (c, h), |
||||
Err(e) => { |
||||
let data = json!({ |
||||
"initalized": false, |
||||
"error": format!("{}", e) |
||||
}); |
||||
return serde_json::to_string(&data).unwrap(); |
||||
} |
||||
}; |
||||
|
||||
//Set Encoding Specifications
|
||||
config = set_address_params(config, params.as_str()); |
||||
|
||||
let decoded_bytes = match decode(&base64_data) { |
||||
Ok(b) => b, |
||||
Err(e) => { |
||||
let data = json!({ |
||||
"initalized": false, |
||||
"error": format!("Decoding Base64 {}", e) |
||||
}); |
||||
return serde_json::to_string(&data).unwrap(); |
||||
} |
||||
}; |
||||
|
||||
let lightclient = match LightClient::read_from_buffer(&config, &decoded_bytes[..]) { |
||||
Ok(mut l) => { |
||||
match l.set_sapling_params(&decode(&sapling_output_b64).unwrap(), &decode(&sapling_spend_b64).unwrap()) { |
||||
Ok(_) => l, |
||||
Err(e) => { |
||||
let data = json!({ |
||||
"initalized": false, |
||||
"error": format!("{}", e) |
||||
}); |
||||
return serde_json::to_string(&data).unwrap(); |
||||
} |
||||
} |
||||
}, |
||||
Err(e) => { |
||||
|
||||
let data = json!({ |
||||
"initalized": false, |
||||
"error": format!("{}", e) |
||||
}); |
||||
return serde_json::to_string(&data).unwrap(); |
||||
} |
||||
}; |
||||
|
||||
LIGHTCLIENT.lock().unwrap().replace(Some(Arc::new(lightclient))); |
||||
|
||||
let data = json!({ |
||||
"initalized": true, |
||||
"error": "none" |
||||
}); |
||||
|
||||
serde_json::to_string(&data).unwrap() |
||||
|
||||
} |
||||
|
||||
pub fn save_to_b64() -> String { |
||||
// Return the wallet as a base64 encoded string
|
||||
let lightclient: Arc<LightClient>; |
||||
{ |
||||
let lc = LIGHTCLIENT.lock().unwrap(); |
||||
|
||||
if lc.borrow().is_none() { |
||||
return format!("Error: Light Client is not initialized"); |
||||
} |
||||
|
||||
lightclient = lc.borrow().as_ref().unwrap().clone(); |
||||
}; |
||||
|
||||
match lightclient.do_save_to_buffer() { |
||||
Ok(buf) => encode(&buf), |
||||
Err(e) => { |
||||
format!("Error: {}", e) |
||||
} |
||||
} |
||||
} |
||||
|
||||
pub fn execute(cmd: String, args_list: String) -> String { |
||||
let resp: String; |
||||
{ |
||||
let lightclient: Arc<LightClient>; |
||||
{ |
||||
let lc = LIGHTCLIENT.lock().unwrap(); |
||||
|
||||
if lc.borrow().is_none() { |
||||
return format!("Error: Light Client is not initialized"); |
||||
} |
||||
|
||||
lightclient = lc.borrow().as_ref().unwrap().clone(); |
||||
}; |
||||
|
||||
let args = if args_list.is_empty() { vec![] } else { vec![args_list.as_ref()] }; |
||||
resp = commands::do_user_command(&cmd, &args, lightclient.as_ref()).clone(); |
||||
}; |
||||
|
||||
resp |
||||
} |
||||
|
||||
pub fn check_seed_phrase(seed_phrase: &str) ->String { |
||||
match Mnemonic::from_phrase(seed_phrase.to_string(), Language::English) { |
||||
Ok(_) => { |
||||
let data = json!({"checkSeedPhrase": "Ok"}); |
||||
return serde_json::to_string(&data).unwrap() |
||||
}, |
||||
Err(_) => { |
||||
let data = json!({"checkSeedPhrase": "Error"}); |
||||
return serde_json::to_string(&data).unwrap() |
||||
} |
||||
}; |
||||
} |
||||
|
||||
pub fn get_seed_phrase() -> String { |
||||
|
||||
let mut seed_bytes = [0u8; 32]; |
||||
let mut system_rng = OsRng; |
||||
system_rng.fill(&mut seed_bytes); |
||||
|
||||
let data = json!({ |
||||
"seedPhrase": Mnemonic::from_entropy(&seed_bytes,Language::English,).unwrap().phrase().to_string() |
||||
}); |
||||
|
||||
serde_json::to_string(&data).unwrap() |
||||
} |
||||
|
||||
pub fn get_seed_phrase_from_entropy(entropy: &str) -> String { |
||||
|
||||
let seed_bytes = entropy.as_bytes(); |
||||
|
||||
let data = json!({ |
||||
"seedPhrase": Mnemonic::from_entropy(&seed_bytes,Language::English,).unwrap().phrase().to_string() |
||||
}); |
||||
|
||||
serde_json::to_string(&data).unwrap() |
||||
} |
||||
|
||||
pub fn get_seed_phrase_from_entropy_b64(entropyb64: &str) -> String { |
||||
|
||||
let seed_bytes = match decode(&entropyb64) { |
||||
Ok(b) => b, |
||||
Err(e) => { |
||||
let data = json!({ |
||||
"initalized": false, |
||||
"error": format!("Decoding Base64 {}", e) |
||||
}); |
||||
return serde_json::to_string(&data).unwrap(); |
||||
} |
||||
}; |
||||
|
||||
let data = json!({ |
||||
"seedPhrase": Mnemonic::from_entropy(&seed_bytes,Language::English,).unwrap().phrase().to_string() |
||||
}); |
||||
|
||||
serde_json::to_string(&data).unwrap() |
||||
} |
@ -0,0 +1,16 @@
|
||||
[package] |
||||
name = "rust" |
||||
version = "1.0.0" |
||||
authors = ["Aditya Kulkarni <[email protected]>"] |
||||
edition = "2018" |
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html |
||||
|
||||
[dependencies] |
||||
jni = { version = "0.10.2", default-features = false } |
||||
android_logger = "0.8.6" |
||||
log = "0.4.8" |
||||
rustlib = { path = "../lib" } |
||||
|
||||
[lib] |
||||
crate-type = ["cdylib"] |
@ -0,0 +1,97 @@
|
||||
#!/bin/bash |
||||
|
||||
function build_openssl { |
||||
# Build openssl |
||||
OPENSSL_VERSION="1.1.1e" |
||||
OPENSSL_DIRNAME="openssl-${OPENSSL_VERSION}" |
||||
OPENSSL_EXT="tar.gz" |
||||
OPENSSL_FILENAME="${OPENSSL_DIRNAME}.${OPENSSL_EXT}" |
||||
OPENSSL_URL_PREFIX="https://www.openssl.org/source/old/1.1.1/" |
||||
OPENSSL_URL="${OPENSSL_URL_PREFIX}${OPENSSL_FILENAME}" |
||||
|
||||
# Download |
||||
if [ ! -f "${OPENSSL_FILENAME}" ]; then |
||||
curl "${OPENSSL_URL}" -O "${OPENSSL_FILENAME}" |
||||
fi |
||||
# Extract |
||||
if [ ! -d "${OPENSSL_DIRNAME}" ]; then |
||||
tar xvf "${OPENSSL_FILENAME}" |
||||
fi |
||||
# Build |
||||
if [ ! -d "${OPENSSL_DIRNAME}/${OPENSSL_DIRNAME}/${ARCH}" ]; then |
||||
cd "${OPENSSL_DIRNAME}" |
||||
|
||||
chmod +x config |
||||
./config |
||||
|
||||
make clean |
||||
make distclean |
||||
|
||||
export PATH=${TOOLCHAIN}:${TOOLCHAIN}/bin:$TOOLCHAIN/${ARCH}/bin:$PATH |
||||
|
||||
INSTALL_DIR=$(pwd)/${OPENSSL_DIRNAME}/${ARCH} |
||||
|
||||
./Configure --prefix=${INSTALL_DIR} --openssldir=${INSTALL_DIR}/ssl ${OPENSSL_ARCH} |
||||
make -j$(nproc) |
||||
make -j$(nproc) install |
||||
cd .. |
||||
fi |
||||
} |
||||
|
||||
function build_rustlib { |
||||
# Build rustlib |
||||
export OPENSSL_STATIC=yes |
||||
export OPENSSL_LIB_DIR=$(pwd)/${OPENSSL_DIRNAME}/${OPENSSL_DIRNAME}/${ARCH}/lib |
||||
export OPENSSL_INCLUDE_DIR=$(pwd)/${OPENSSL_DIRNAME}/${OPENSSL_DIRNAME}/${ARCH}/include |
||||
|
||||
rustup target add ${RUST_ARCH} |
||||
rustup component add rustfmt --toolchain 1.46.0-x86_64-unknown-linux-gnu |
||||
rustup show |
||||
|
||||
cargo build --target ${RUST_ARCH} --release |
||||
} |
||||
|
||||
function build { |
||||
local ARCH=$1 |
||||
|
||||
echo "Building ${ARCH} architecture..." |
||||
|
||||
if [ "$ARCH" == "arm-linux-gnueabihf" ] |
||||
then |
||||
export RUST_ARCH="arm-unknown-linux-gnueabihf" |
||||
export OPENSSL_ARCH="linux-generic32" |
||||
export TOOLCHAIN="/opt/arm-rpi-4.9.3-linux-gnueabihf" |
||||
export AR=${TOOLCHAIN}/bin/arm-linux-gnueabihf-ar |
||||
export CC=${TOOLCHAIN}/bin/arm-linux-gnueabihf-gcc |
||||
|
||||
elif [ "$ARCH" == "aarch64-linux-gnu" ] |
||||
then |
||||
export RUST_ARCH="aarch64-unknown-linux-gnu" |
||||
export OPENSSL_ARCH="linux-aarch64" |
||||
export TOOLCHAIN="/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu" |
||||
export AR=${TOOLCHAIN}/bin/aarch64-none-linux-gnu-ar |
||||
export CC=${TOOLCHAIN}/bin/aarch64-none-linux-gnu-gcc |
||||
|
||||
elif [ "$ARCH" == "x86_64-linux" ] |
||||
then |
||||
export RUST_ARCH="x86_64-unknown-linux-gnu" |
||||
export OPENSSL_ARCH="linux-x86_64" |
||||
|
||||
elif [ "$ARCH" == "x86_64-w64-mingw32" ] |
||||
then |
||||
export RUST_ARCH="x86_64-pc-windows-gnu" |
||||
export OPENSSL_ARCH="mingw64" |
||||
export TOOLCHAIN="/etc/alternatives" |
||||
export AR=${TOOLCHAIN}/x86_64-w64-mingw32-gcc-ar |
||||
export CC=${TOOLCHAIN}/x86_64-w64-mingw32-gcc |
||||
export WINDRES=x86_64-w64-mingw32-windres |
||||
fi |
||||
|
||||
build_openssl |
||||
build_rustlib |
||||
} |
||||
|
||||
build "x86_64-linux" |
||||
build "aarch64-linux-gnu" |
||||
#build "x86_64-w64-mingw32" # Build not working |
||||
#build "arm-linux-gnueabihf" # Library doesn't support 32bit |
@ -0,0 +1,214 @@
|
||||
// #![cfg(target_os="android")]
|
||||
#![allow(non_snake_case)] |
||||
|
||||
//#[macro_use] extern crate log;
|
||||
extern crate android_logger; |
||||
|
||||
use log::Level; |
||||
use android_logger::Config; |
||||
|
||||
use std::ffi::{CString, CStr}; |
||||
use jni::JNIEnv; |
||||
use jni::objects::{JObject, JString}; |
||||
use jni::sys::{jstring}; |
||||
|
||||
|
||||
#[no_mangle] |
||||
pub unsafe extern fn Java_com_rust_litewalletjni_LiteWalletJni_initlogging(env: JNIEnv, _: JObject) -> jstring { |
||||
android_logger::init_once( |
||||
Config::default().with_min_level(Level::Trace), |
||||
); |
||||
|
||||
let ok = format!("OK"); |
||||
let output = env.new_string(ok.as_str()).unwrap(); |
||||
return output.into_inner(); |
||||
} |
||||
|
||||
#[no_mangle] |
||||
pub unsafe extern "C" fn Java_com_rust_litewalletjni_LiteWalletJni_getseedphrase(env: JNIEnv) -> jstring { |
||||
|
||||
let results = rustlib::get_seed_phrase(); |
||||
//Create string to be passed back to Java
|
||||
let output = env.new_string(format!("{}", results)).expect("Couldn't create java string!"); |
||||
// Finally, extract the raw pointer to return.
|
||||
output.into_inner() |
||||
} |
||||
|
||||
#[no_mangle] |
||||
pub unsafe extern "C" fn Java_com_rust_litewalletjni_LiteWalletJni_getseedphrasefromentropy(env: JNIEnv, _: JObject, input: JString) -> jstring { |
||||
|
||||
let input: String = env.get_string(input).expect("Couldn't get java string!").into(); |
||||
|
||||
let results = rustlib::get_seed_phrase_from_entropy(input.as_str()); |
||||
//Create string to be passed back to Java
|
||||
let output = env.new_string(format!("{}", results)).expect("Couldn't create java string!"); |
||||
// Finally, extract the raw pointer to return.
|
||||
output.into_inner() |
||||
} |
||||
|
||||
#[no_mangle] |
||||
pub unsafe extern "C" fn Java_com_rust_litewalletjni_LiteWalletJni_getseedphrasefromentropyb64(env: JNIEnv, _: JObject, input: JString) -> jstring { |
||||
|
||||
let input: String = env.get_string(input).expect("Couldn't get java string!").into(); |
||||
|
||||
let results = rustlib::get_seed_phrase_from_entropy_b64(input.as_str()); |
||||
//Create string to be passed back to Java
|
||||
let output = env.new_string(format!("{}", results)).expect("Couldn't create java string!"); |
||||
// Finally, extract the raw pointer to return.
|
||||
output.into_inner() |
||||
} |
||||
|
||||
#[no_mangle] |
||||
pub unsafe extern "C" fn Java_com_rust_litewalletjni_LiteWalletJni_checkseedphrase(env: JNIEnv, _: JObject, input: JString) -> jstring { |
||||
|
||||
let input: String = env.get_string(input).expect("Couldn't get java string!").into(); |
||||
//generate key
|
||||
let results = rustlib::check_seed_phrase(input.as_str()); |
||||
//Create string to be passed back to Java
|
||||
let output = env.new_string(format!("{}", results)).expect("Couldn't create java string!"); |
||||
// Finally, extract the raw pointer to return.
|
||||
output.into_inner() |
||||
} |
||||
|
||||
#[no_mangle] |
||||
pub unsafe extern fn Java_com_rust_litewalletjni_LiteWalletJni_initnew(env: JNIEnv, _: JObject, j_serveruri: JString, j_params: JString, |
||||
j_sapling_output: JString, j_sapling_spend: JString) -> jstring { |
||||
let server_uri = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_serveruri).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let params = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_params).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let sapling_output = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_sapling_output).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
let sapling_spend = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_sapling_spend).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let seed = rustlib::init_new(server_uri, params, sapling_output, sapling_spend); |
||||
|
||||
let output = env.new_string(seed.as_str()).unwrap(); |
||||
output.into_inner() |
||||
} |
||||
|
||||
|
||||
#[no_mangle] |
||||
pub unsafe extern fn Java_com_rust_litewalletjni_LiteWalletJni_initfromseed(env: JNIEnv, _: JObject, j_serveruri: JString, j_params: JString, |
||||
j_seed: JString, j_birthday: JString, j_sapling_output: JString, j_sapling_spend: JString) -> jstring { |
||||
let server_uri = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_serveruri).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let params = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_params).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let seed = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_seed).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let birthday = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_birthday).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap().parse::<u64>().unwrap(); |
||||
|
||||
let sapling_output = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_sapling_output).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
let sapling_spend = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_sapling_spend).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let seed = rustlib::init_from_seed(server_uri, params, seed, birthday, sapling_output, sapling_spend); |
||||
|
||||
let output = env.new_string(seed.as_str()).unwrap(); |
||||
output.into_inner() |
||||
} |
||||
|
||||
|
||||
#[no_mangle] |
||||
pub unsafe extern fn Java_com_rust_litewalletjni_LiteWalletJni_initfromb64(env: JNIEnv, _: JObject, j_serveruri: JString, j_params: JString, |
||||
j_base64: JString, j_sapling_output: JString, j_sapling_spend: JString) -> jstring { |
||||
let base64 = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_base64).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let server_uri = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_serveruri).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let params = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_params).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let sapling_output = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_sapling_output).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
let sapling_spend = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_sapling_spend).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let seed = rustlib::init_from_b64(server_uri, params, base64, sapling_output, sapling_spend); |
||||
|
||||
let output = env.new_string(seed.as_str()).unwrap(); |
||||
output.into_inner() |
||||
} |
||||
|
||||
#[no_mangle] |
||||
pub unsafe extern fn Java_com_rust_litewalletjni_LiteWalletJni_save(env: JNIEnv, _: JObject) -> jstring { |
||||
let encoded = rustlib::save_to_b64(); |
||||
let output = env.new_string(encoded.as_str()).unwrap(); |
||||
output.into_inner() |
||||
} |
||||
|
||||
#[no_mangle] |
||||
pub unsafe extern fn Java_com_rust_litewalletjni_LiteWalletJni_execute(env: JNIEnv, _: JObject, j_command: JString, j_argslist: JString) -> jstring { |
||||
let cmd = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_command).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let args_list = CString::from( |
||||
CStr::from_ptr( |
||||
env.get_string(j_argslist).unwrap().as_ptr() |
||||
) |
||||
).into_string().unwrap(); |
||||
|
||||
let resp = rustlib::execute(cmd, args_list); |
||||
|
||||
let output = env.new_string(resp.as_str()).unwrap(); |
||||
output.into_inner() |
||||
} |
Loading…
Reference in new issue