Skip to content

Commit

Permalink
add wallet-jni functions
Browse files Browse the repository at this point in the history
  • Loading branch information
ecioppettini committed Oct 21, 2020
1 parent 1b4c0b0 commit 7f87c5e
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 0 deletions.
47 changes: 47 additions & 0 deletions bindings/wallet-jni/java/WalletTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,53 @@ public void confirmVoteCast() throws IOException {
}
}

@Test
public void privateVoteCast() throws IOException {
final long walletPtr = Wallet.recover(
"neck bulb teach illegal soul cry monitor claw amount boring provide village rival draft stone");

final byte[] block0 = Files.readAllBytes(Paths.get("../../../test-vectors/block0"));

final String hexKey = "04fa1f7356482c094a11420cba35bd3ff76d184b8002f06cfcc9e06867d359eee24c2445958377ddc5e9f978178c01e3003d5c3322b77b6e251aa2699a35ba887e";
final byte[] encryptingKey = hexStringToByteArray(hexKey);

final long settingsPtr = Wallet.initialFunds(walletPtr, block0);

final byte[] id = new byte[Proposal.ID_SIZE];
final long proposalPtr = Proposal.withPrivatePayload(id, 0, 3, encryptingKey);

Wallet.setState(walletPtr, 10000000, 0);
try {
final byte[] transaction = Wallet.voteCast(walletPtr, settingsPtr, proposalPtr, 1);

final long before = Wallet.pendingTransactions(walletPtr);

final int sizeBefore = PendingTransactions.len(before);

assertEquals(sizeBefore, 1);

final byte[] fragmentId = PendingTransactions.get(before, 0);

PendingTransactions.delete(before);

Wallet.confirmTransaction(walletPtr, fragmentId);

final long after = Wallet.pendingTransactions(walletPtr);

final int sizeAfter = PendingTransactions.len(after);

assertEquals(sizeAfter, 0);

PendingTransactions.delete(after);
} catch (final Exception e) {
Proposal.delete(proposalPtr);
Settings.delete(settingsPtr);
Wallet.delete(walletPtr);
System.out.println(e.getMessage());
throw e;
}
}

@Test
public void testDecrypt() throws IOException {
final String hex = "017b938f189c7d1d9e4c75b02710a9c9a6b287b6ca55d624001828cba8aeb3a9d4c2a86261016693c7e05fb281f012fb2d7af44484da09c4d7b2dea6585965a4cc208d2b2fb1aa5ba6338520b3aa9c4f908fdd62816ebe01f496f8b4fc0344892fe245db072d054c3dedff926320589231298e216506c1f6858c5dba915c959a98ba0d0e3995aef91d4216b5172dedf2736b451d452916b81532eb7f8487e9f88a2de4f9261d0a0ddf11698796ad8b6894908024ebc4be9bba985ef9c0f2f71afce0b37520c66938313f6bf81b3fc24f5c93d216cd2528dabc716b8093359fda84db4e58d876d215713f2db000";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ public class Proposal {

public native static long withPublicPayload(byte [] votePlanId, int index, int numChoices);

public native static long withPrivatePayload(byte [] votePlanId, int index, int numChoices, byte [] encryptionKey);

public native static void delete(long proposalPtr);
}
77 changes: 77 additions & 0 deletions bindings/wallet-jni/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -526,6 +526,83 @@ pub extern "system" fn Java_com_iohk_jormungandrwallet_Proposal_withPublicPayloa
proposal as jlong
}

#[no_mangle]
pub extern "system" fn Java_com_iohk_jormungandrwallet_Proposal_withPrivatePayload(
env: JNIEnv,
_: JClass,
vote_plan_id: jbyteArray,
index: jint,
num_choices: jint,
encryption_key: jbyteArray,
) -> jlong {
let id_size = env.get_array_length(vote_plan_id).expect("invalid array");

let mut buffer = vec![0i8; id_size as usize];
env.get_byte_array_region(vote_plan_id, 0, &mut buffer)
.expect("invalid byte arrray read");

let encryption_key = {
let array_size = env.get_array_length(encryption_key).expect("invalid array");

// FIXME: remove magic number
if array_size != 65 {
let _ = env.throw_new(
"java/lang/IllegalArgumentException",
"encryption vote key should be 65 bytes long",
);

return 0;
}

let mut buffer = [0i8; 65];
env.get_byte_array_region(encryption_key, 0, &mut buffer)
.expect("invalid byte arrray read");

buffer
};

let index: u8 = match index.try_into() {
Ok(index) => index,
Err(_) => {
let _ = env.throw_new(
"java/lang/IllegalArgumentException",
"index should be a number between 0 and 255",
);

return 0;
}
};

let num_choices: u8 = match num_choices.try_into() {
Ok(index) => index,
Err(_) => {
let _ = env.throw_new(
"java/lang/IllegalArgumentException",
"numChoices should be a number between 0 and 255",
);

return 0;
}
};

let mut proposal = null_mut();
let r = unsafe {
vote::proposal_new(
buffer.as_ptr() as *const u8,
index,
num_choices,
vote::ProposalPrivate(encryption_key.as_ptr().cast::<u8>()),
&mut proposal,
)
};

if let Some(error) = r.error() {
let _ = env.throw(error.to_string());
}

proposal as jlong
}

#[no_mangle]
pub extern "system" fn Java_com_iohk_jormungandrwallet_Proposal_delete(
_: JNIEnv,
Expand Down

0 comments on commit 7f87c5e

Please sign in to comment.