use crate::{Blinding, Proof, PublicKey, SecretKey, Token};
use rand::prelude::*;
use wasm_bindgen::prelude::*;
use std::vec::Vec;
type BlindingList = Vec<Blinding>;
#[wasm_bindgen]
pub fn new_secret_key() -> SecretKey {
let rng = thread_rng();
SecretKey::new(rng)
}
#[wasm_bindgen]
pub fn get_public_key(sk: SecretKey) -> PublicKey {
PublicKey::from(&sk)
}
#[wasm_bindgen]
pub fn secret_key_from_seed(seed: &[u8]) -> SecretKey {
SecretKey::hash(seed)
}
#[wasm_bindgen]
pub fn new_token(sk: SecretKey, id: &[u8]) -> Option<Token> {
Token::new(&sk, id)
}
#[wasm_bindgen]
pub fn verify_token(token: Token, pk: PublicKey, id: &[u8]) -> bool {
token.verify(pk, id).unwrap_u8() == 1
}
#[wasm_bindgen]
pub fn create_blinding(data: &[u8]) -> Blinding {
Blinding::new(data)
}
#[wasm_bindgen]
pub fn add_blinding(token: Token, data: &[u8]) -> Token {
token - Blinding::new(data)
}
#[wasm_bindgen]
pub fn remove_blinding(token: Token, data: &[u8]) -> Token {
token + Blinding::new(data)
}
#[wasm_bindgen]
pub fn create_proof(token: Token, id: &[u8], blindings: JsValue, nonce: &[u8]) -> Option<Proof> {
let rng = thread_rng();
match serde_json::from_str::<BlindingList>(&blindings.as_string().unwrap()) {
Err(_) => None,
Ok(bs) => Proof::new(&token, &bs, id, nonce, rng),
}
}
#[wasm_bindgen]
pub fn verify_proof(proof: Proof, pk: PublicKey, id: &[u8], nonce: &[u8]) -> bool {
proof.open(pk, id, nonce).unwrap_u8() == 1
}