ursa 0.3.7

This is the shared crypto library for Hyperledger components.
Documentation
use kex::{x25519::X25519Sha256 as X25519Sha256Impl, KeyExchangeScheme};
use keys::{KeyGenOption, PrivateKey, PublicKey};

use wasm_bindgen::prelude::*;

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

#[wasm_bindgen]
pub struct X25519Sha256;

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

    pub fn keypair(&self) -> Result<KeyPair, JsValue> {
        let scheme = X25519Sha256Impl {};
        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 = X25519Sha256Impl {};
        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 = X25519Sha256Impl {};
        let (pk, _) = maperr!(scheme.keypair(Some(KeyGenOption::FromSecretKey(sk))));
        Ok(pk.into())
    }

    pub fn computeSharedSecret(
        &self,
        sk: &WasmPrivateKey,
        pk: &WasmPublicKey,
    ) -> Result<WasmSessionKey, JsValue> {
        let sk = PrivateKey::from(sk);
        let pk = PublicKey::from(pk);
        let scheme = X25519Sha256Impl {};
        let secret = maperr!(scheme.compute_shared_secret(&sk, &pk));
        let secret = WasmSessionKey::from(secret);
        Ok(secret)
    }
}