use wasm_bindgen::prelude::*;
use bls;
use super::convert_from_js;
#[wasm_bindgen]
pub struct Generator(bls::Generator);
#[wasm_bindgen]
impl Generator {
pub fn new() -> Result<Generator, JsValue> {
Ok(Generator(maperr!(bls::Generator::new())))
}
pub fn as_bytes(&self) -> Vec<u8> {
self.0.as_bytes().to_vec()
}
pub fn from_bytes(bytes: &[u8]) -> Result<Generator, JsValue> {
Ok(Generator(maperr!(bls::Generator::from_bytes(bytes))))
}
}
#[wasm_bindgen]
pub struct SignKey(bls::SignKey);
#[wasm_bindgen]
impl SignKey {
pub fn new() -> Result<SignKey, JsValue> {
Ok(SignKey(maperr!(bls::SignKey::new(None))))
}
pub fn from_seed(seed: &[u8]) -> Result<SignKey, JsValue> {
Ok(SignKey(maperr!(bls::SignKey::new(Some(seed)))))
}
pub fn from_bytes(bytes: &[u8]) -> Result<SignKey, JsValue> {
Ok(SignKey(maperr!(bls::SignKey::from_bytes(bytes))))
}
pub fn to_bytes(&self) -> Result<Vec<u8>, JsValue> {
Ok(self.0.as_bytes().to_vec())
}
}
#[wasm_bindgen]
pub struct VerKey(bls::VerKey);
#[wasm_bindgen]
impl VerKey {
pub fn new(generator: Generator, sign_key: SignKey) -> Result<VerKey, JsValue> {
Ok(VerKey(maperr!(bls::VerKey::new(&generator.0, &sign_key.0))))
}
pub fn from_bytes(bytes: &[u8]) -> Result<VerKey, JsValue> {
Ok(VerKey(maperr!(bls::VerKey::from_bytes(bytes))))
}
pub fn to_bytes(&self) -> Result<Vec<u8>, JsValue> {
Ok(self.0.as_bytes().to_vec())
}
}
#[wasm_bindgen]
pub struct ProofOfPossession(bls::ProofOfPossession);
#[wasm_bindgen]
impl ProofOfPossession {
pub fn new(ver_key: &VerKey, sign_key: &SignKey) -> Result<ProofOfPossession, JsValue> {
Ok(ProofOfPossession(maperr!(bls::ProofOfPossession::new(&ver_key.0, &sign_key.0))))
}
pub fn from_bytes(bytes: &[u8]) -> Result<ProofOfPossession, JsValue> {
Ok(ProofOfPossession(maperr!(bls::ProofOfPossession::from_bytes(bytes))))
}
pub fn as_bytes(&self) -> Result<Vec<u8>, JsValue> {
Ok(self.0.as_bytes().to_vec())
}
}
#[wasm_bindgen]
pub struct Signature(bls::Signature);
#[wasm_bindgen]
impl Signature {
pub fn from_bytes(bytes: &[u8]) -> Result<Signature, JsValue> {
Ok(Signature(maperr!(bls::Signature::from_bytes(bytes))))
}
pub fn as_bytes(&self) -> Result<Vec<u8>, JsValue> {
Ok(self.0.as_bytes().to_vec())
}
}
#[wasm_bindgen]
pub struct MultiSignature(bls::MultiSignature);
#[wasm_bindgen]
impl MultiSignature {
pub fn new(signatures: Vec<JsValue>) -> Result<MultiSignature, JsValue> {
let sigs: Vec<bls::Signature> = signatures.iter().map(|x| x.into_serde().unwrap()).collect();
Ok(MultiSignature(bls::MultiSignature::new(sigs.iter().collect::<Vec<_>>().as_slice())?))
}
pub fn from_bytes(bytes: &[u8]) -> Result<MultiSignature, JsValue> {
Ok(MultiSignature(maperr!(bls::MultiSignature::from_bytes(bytes))))
}
pub fn as_bytes(&self) -> Result<Vec<u8>, JsValue> {
Ok(self.0.as_bytes().to_vec())
}
}
#[wasm_bindgen]
pub struct Bls(bls::Generator);
#[wasm_bindgen]
#[allow(non_snake_case)]
impl Bls {
pub fn new() -> Bls {
Bls(bls::Generator::new().unwrap())
}
pub fn sign(message: &[u8], sign_key: &SignKey) -> Result<Signature, JsValue> {
Ok(Signature(maperr!(bls::Bls::sign(message, &sign_key.0))))
}
pub fn verify(message: &[u8], signature: &Signature, ver_key: &VerKey, generator: &Generator) -> Result<bool, JsValue> {
Ok(maperr!(bls::Bls::verify(&signature.0, message, &ver_key.0, &generator.0)))
}
pub fn verifyProofOfPosession(pop: &ProofOfPossession, ver_key: &VerKey, generator: &Generator) -> Result<bool, JsValue> {
Ok(maperr!(bls::Bls::verify_proof_of_posession(&pop.0, &ver_key.0, &generator.0)))
}
pub fn verifyMultiSignature(multi_sig: &MultiSignature, message: &[u8], ver_keys: Vec<JsValue>, gen: &Generator) -> Result<bool, JsValue> {
let vks: Vec<bls::VerKey> = ver_keys.iter().map(|x| convert_from_js(x).unwrap()).collect();
Ok(maperr!(bls::Bls::verify_multi_sig(&multi_sig.0, message, vks.iter().collect::<Vec<_>>().as_slice(), &gen.0)))
}
}