#![forbid(unsafe_code)]
#![allow(missing_docs)]
use napi::bindgen_prelude::Buffer;
use napi::bindgen_prelude::Result as NapiResult;
use napi_derive::napi;
fn map_err<E: std::fmt::Display>(e: E) -> napi::Error {
napi::Error::new(napi::Status::GenericFailure, e.to_string())
}
#[napi]
pub struct Cmp20;
#[napi]
impl Cmp20 {
#[napi]
pub fn keygen(threshold: u32, party_count: u32) -> NapiResult<Cmp20Keygen> {
let kg = confium_tc_cmp20::inprocess::keygen(threshold, party_count as usize)
.map_err(map_err)?;
Ok(Cmp20Keygen {
shares: kg.shares.into_iter().map(Into::into).collect(),
public_key: kg.public_key.into(),
})
}
#[napi]
pub fn sign(shares: Vec<Buffer>, threshold: u32, message: Buffer) -> NapiResult<Buffer> {
let share_blobs: Vec<Vec<u8>> = shares.into_iter().map(|b| b.to_vec()).collect();
let msg = message.to_vec();
let sig =
confium_tc_cmp20::inprocess::sign(&share_blobs, threshold, &msg).map_err(map_err)?;
Ok(sig.into())
}
#[napi]
pub fn sign_batch(
shares: Vec<Buffer>,
threshold: u32,
messages: Vec<Buffer>,
) -> NapiResult<Vec<Buffer>> {
let share_blobs: Vec<Vec<u8>> = shares.into_iter().map(|b| b.to_vec()).collect();
let msg_refs: Vec<&[u8]> = messages.iter().map(|b| b.as_ref()).collect();
let sigs = confium_tc_cmp20::inprocess::sign_batch(&share_blobs, threshold, &msg_refs)
.map_err(map_err)?;
Ok(sigs.into_iter().map(Into::into).collect())
}
}
#[napi(object)]
pub struct Cmp20Keygen {
pub shares: Vec<Buffer>,
#[napi(js_name = "publicKey")]
pub public_key: Buffer,
}
#[napi]
pub struct Gg18;
#[napi]
impl Gg18 {
#[napi]
pub fn keygen(threshold: u32, party_count: u32) -> NapiResult<Cmp20Keygen> {
let kg =
confium_tc_gg18::inprocess::keygen(threshold, party_count as usize).map_err(map_err)?;
Ok(Cmp20Keygen {
shares: kg.shares.into_iter().map(Into::into).collect(),
public_key: kg.public_key.into(),
})
}
#[napi]
pub fn sign(shares: Vec<Buffer>, threshold: u32, message: Buffer) -> NapiResult<Buffer> {
let share_blobs: Vec<Vec<u8>> = shares.into_iter().map(|b| b.to_vec()).collect();
let msg = message.to_vec();
let sig =
confium_tc_gg18::inprocess::sign(&share_blobs, threshold, &msg).map_err(map_err)?;
Ok(sig.into())
}
}
#[napi]
pub struct FrostP256;
#[napi]
impl FrostP256 {
#[napi]
pub fn generate_keypair() -> NapiResult<FrostKeypair> {
let kp = confium_tc_frost_p256::generate_keypair();
let sk: [u8; 32] = kp.to_signing_key().to_bytes().into();
let pk = kp.to_verifying_key().to_sec1_bytes();
Ok(FrostKeypair {
private_key: sk.to_vec().into(),
public_key: pk.to_vec().into(),
})
}
}
#[napi(object)]
pub struct FrostKeypair {
#[napi(js_name = "privateKey")]
pub private_key: Buffer,
#[napi(js_name = "publicKey")]
pub public_key: Buffer,
}
#[napi]
pub fn version() -> String {
env!("CARGO_PKG_VERSION").to_string()
}