use crate::errors::prelude::*;
use crate::keys::prelude::*;
use crate::signature::prelude::*;
use crate::{BlindSignatureContext, ProofNonce, RandomElem, SignatureMessage};
use std::collections::{BTreeMap, BTreeSet};
pub struct Issuer;
impl Issuer {
pub fn new_keys(message_count: usize) -> Result<(PublicKey, SecretKey), BBSError> {
generate(message_count)
}
pub fn new_short_keys(option: Option<KeyGenOption>) -> (DeterministicPublicKey, SecretKey) {
DeterministicPublicKey::new(option)
}
pub fn sign(
messages: &[SignatureMessage],
signkey: &SecretKey,
verkey: &PublicKey,
) -> Result<Signature, BBSError> {
Signature::new(messages, signkey, verkey)
}
pub fn blind_sign(
ctx: &BlindSignatureContext,
messages: &BTreeMap<usize, SignatureMessage>,
signkey: &SecretKey,
verkey: &PublicKey,
nonce: &ProofNonce,
) -> Result<BlindSignature, BBSError> {
let revealed_messages: BTreeSet<usize> = messages.keys().copied().collect();
if ctx.verify(&revealed_messages, verkey, nonce)? {
BlindSignature::new(&ctx.commitment, messages, signkey, verkey)
} else {
Err(BBSErrorKind::GeneralError {
msg: "Invalid proof of committed messages".to_string(),
}
.into())
}
}
pub fn generate_signing_nonce() -> ProofNonce {
ProofNonce::random()
}
}