ursa 0.3.7

This is the shared crypto library for Hyperledger components.
Documentation
use keys::KeyGenOption;
use signatures::{prelude::Ed25519Sha512 as Ed25519Sha512Impl, SignatureScheme};

use wasm_bindgen::prelude::*;

use super::{KeyPair, WasmPrivateKey, WasmPublicKey};

#[wasm_bindgen]
pub struct Ed25519Sha512;

#[wasm_bindgen]
#[allow(non_snake_case)]
impl Ed25519Sha512 {
    pub fn new() -> Self {
        Self
    }

    pub fn keypair(&self) -> Result<KeyPair, JsValue> {
        let scheme = Ed25519Sha512Impl {};
        let (pk, sk) = maperr!(scheme.keypair(None));
        Ok(KeyPair {
            pk: pk.into(),
            sk: sk.into(),
        })
    }

    pub fn keyPairFromSeed(&self, seed: &[u8]) -> Result<KeyPair, JsValue> {
        let scheme = Ed25519Sha512Impl {};
        let (pk, sk) = maperr!(scheme.keypair(Some(KeyGenOption::UseSeed(seed.to_vec()))));
        Ok(KeyPair {
            pk: pk.into(),
            sk: sk.into(),
        })
    }

    pub fn getPublicKey(&self, sk: &WasmPrivateKey) -> Result<WasmPublicKey, JsValue> {
        let sk = sk.into();
        let scheme = Ed25519Sha512Impl {};
        let (pk, _) = maperr!(scheme.keypair(Some(KeyGenOption::FromSecretKey(sk))));
        Ok(pk.into())
    }

    pub fn sign(&self, message: &[u8], sk: &WasmPrivateKey) -> Result<Vec<u8>, JsValue> {
        let sk = sk.into();
        let scheme = Ed25519Sha512Impl {};
        let sig = maperr!(scheme.sign(message, &sk));
        Ok(sig)
    }

    pub fn verify(
        &self,
        message: &[u8],
        signature: &[u8],
        pk: &WasmPublicKey,
    ) -> Result<bool, JsValue> {
        let pk = pk.into();
        let scheme = Ed25519Sha512Impl {};
        Ok(maperr!(scheme.verify(message, signature, &pk)))
    }
}