From 1557a5a0df6c0c365167b816099c9c423aac2703 Mon Sep 17 00:00:00 2001 From: John Newby Date: Thu, 1 Aug 2019 15:09:57 +0200 Subject: [PATCH] Initial commit --- Cargo.toml | 13 +++++++++++++ src/lib.rs | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 Cargo.toml create mode 100644 src/lib.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..a23edf5 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "ecrecover" +version = "0.1.0" +authors = ["John Newby "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +c_vec = "1.3.3" +libc = "0.2.60" +parity-bytes = "0.1.0" +ethcore-builtin = { path = "../parity-ethereum/ethcore/builtin" } \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..7dee6ee --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,36 @@ +extern crate c_vec; +extern crate ethcore_builtin; +extern crate libc; +extern crate parity_bytes; + +use std::ffi::*; +use ethcore_builtin::EcRecover; +use crate::ethcore_builtin::Implementation; +use c_vec::{CVec}; +use parity_bytes::BytesRef; +use std::ptr::copy_nonoverlapping; + +const LENGTH: usize = 32; +#[repr(C)] +struct Buffer { + data: *mut [u8;LENGTH], +} + + +#[no_mangle] +pub unsafe extern "C" fn ecrecover(input: *const libc::c_uchar, output: *mut libc::c_uchar) { + let ecrecover = EcRecover { }; + let mut byte_ref = Vec::new(); + ecrecover.execute(unsafe { std::slice::from_raw_parts(input as *const u8, LENGTH) }, + &mut BytesRef::Flexible(&mut byte_ref)); + let mut ptr: &mut[u8] = unsafe { std::slice::from_raw_parts_mut(output as *mut u8, LENGTH) }; + ptr.copy_from_slice(byte_ref.as_slice()); +} + +#[cfg(test)] +mod tests { + #[test] + fn it_works() { + assert_eq!(2 + 2, 4); + } +}