use std::convert::TryFrom;
use ed25519_dalek::Signature;
use wasm_bindgen::prelude::wasm_bindgen;
use wasm_bindgen::JsValue;
use crate::identity::{KeyPair as KeyPairNonWasm, PublicKey};
use crate::wasm::error::jserr;
#[wasm_bindgen]
#[derive(Debug)]
pub struct KeyPair(KeyPairNonWasm);
#[wasm_bindgen]
impl KeyPair {
#[wasm_bindgen(constructor)]
pub fn new() -> Self {
Self(KeyPairNonWasm::new())
}
#[wasm_bindgen(js_name = fromPrivateKey)]
pub fn from_private_key(private_key: String) -> Result<KeyPair, JsValue> {
let key_pair_inner = jserr!(KeyPairNonWasm::from_private_key_str(&private_key));
Ok(KeyPair(key_pair_inner))
}
#[wasm_bindgen(js_name = publicKey)]
pub fn public_key(&self) -> String {
hex::encode(self.0.public_key().to_bytes())
}
#[wasm_bindgen(js_name = privateKey)]
pub fn private_key(&self) -> String {
hex::encode(self.0.private_key().to_bytes())
}
#[wasm_bindgen]
pub fn sign(&self, value: String) -> String {
let signature = self.0.sign(value.as_bytes());
hex::encode(signature.to_bytes())
}
pub(super) fn as_inner(&self) -> &KeyPairNonWasm {
&self.0
}
}
impl Default for KeyPair {
fn default() -> Self {
Self::new()
}
}
#[wasm_bindgen(js_name = verifySignature)]
pub fn verify_signature(
public_key: String,
byte_string: String,
signature: String,
) -> Result<JsValue, JsValue> {
let public_key_bytes = jserr!(hex::decode(public_key));
let unsigned_bytes = byte_string.as_bytes();
let signature_bytes = jserr!(hex::decode(signature));
let public_key = jserr!(PublicKey::new(&hex::encode(&public_key_bytes)));
let signature = jserr!(Signature::try_from(&signature_bytes[..]));
match KeyPairNonWasm::verify(&public_key, unsigned_bytes, &signature) {
Ok(_) => Ok(JsValue::TRUE),
Err(_) => Ok(JsValue::FALSE),
}
}