· 7 years ago · Feb 25, 2018, 03:52 AM
1#[macro_use]
2extern crate neon;
3
4use neon::vm::{Call, JsResult};
5use neon::js::binary::JsBuffer;
6use neon::js::error::JsError;
7use neon::js::error;
8use neon::vm::Lock;
9use neon::mem::Handle;
10
11extern crate ed25519_dalek;
12use ed25519_dalek::{SecretKey, PublicKey};
13
14extern crate blake2;
15use blake2::Blake2b;
16
17fn privkey_to_pubkey(call: Call) -> JsResult<JsBuffer> {
18 let scope = call.scope;
19 let args = call.arguments;
20
21 let mut private_key = [0; 32];
22 let mut privkey_handle: Handle<JsBuffer> = args.require(scope, 0)?.check()?;
23 privkey_handle.grab(|contents| {
24 let slice = contents.as_slice();
25 private_key.clone_from_slice(slice)
26 });
27
28 let secret_key = SecretKey::from_bytes(&private_key)
29 .or_else(|err| error::throw(JsError::new(scope, error::Kind::Error, err.to_string().as_str())?))?;
30 let public_key = PublicKey::from_secret::<Blake2b>(&secret_key);
31 let public_key = public_key.to_bytes();
32
33 let mut buffer = JsBuffer::new(scope, public_key.len() as u32)?;
34 buffer.grab(|mut contents| {
35 let slice = contents.as_mut_slice();
36 slice.clone_from_slice(&public_key);
37 });
38 Ok(buffer)
39}
40
41register_module!(m, {
42 m.export("privkeyToPubkey", privkey_to_pubkey)
43});