use ark_ec::{pairing::Pairing, AffineRepr};
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
use ark_std::{collections::BTreeMap, vec::Vec};
use serde::{Deserialize, Serialize};
use serde_with::{serde_as, Same};
use crate::{error::ProofSystemError, setup_params::SetupParams, statement::Statement};
use bbs_plus::prelude::{PublicKeyG2, SignatureParamsG1};
use dock_crypto_utils::serde_utils::*;
#[serde_as]
#[derive(
Clone, Debug, PartialEq, Eq, CanonicalSerialize, CanonicalDeserialize, Serialize, Deserialize,
)]
#[serde(bound = "")]
pub struct PoKBBSSignatureG1<E: Pairing> {
#[serde_as(as = "BTreeMap<Same, ArkObjectBytes>")]
pub revealed_messages: BTreeMap<usize, E::ScalarField>,
pub signature_params: Option<SignatureParamsG1<E>>,
pub public_key: Option<PublicKeyG2<E>>,
pub signature_params_ref: Option<usize>,
pub public_key_ref: Option<usize>,
}
#[macro_export]
macro_rules! impl_bbs_statement {
($params: ident, $stmt: ident, $setup_param_name: ident) => {
pub fn new_statement_from_params<G: AffineRepr>(
signature_params: $params<E>,
public_key: PublicKeyG2<E>,
revealed_messages: BTreeMap<usize, E::ScalarField>,
) -> Statement<E, G> {
Statement::$stmt(Self {
revealed_messages,
signature_params: Some(signature_params),
public_key: Some(public_key),
signature_params_ref: None,
public_key_ref: None,
})
}
pub fn new_statement_from_params_ref<G: AffineRepr>(
signature_params_ref: usize,
public_key_ref: usize,
revealed_messages: BTreeMap<usize, E::ScalarField>,
) -> Statement<E, G> {
Statement::$stmt(Self {
revealed_messages,
signature_params: None,
public_key: None,
signature_params_ref: Some(signature_params_ref),
public_key_ref: Some(public_key_ref),
})
}
pub fn get_sig_params<'a, G: AffineRepr>(
&'a self,
setup_params: &'a [SetupParams<E, G>],
st_idx: usize,
) -> Result<&'a $params<E>, ProofSystemError> {
extract_param!(
setup_params,
&self.signature_params,
self.signature_params_ref,
$setup_param_name,
IncompatibleBBSPlusSetupParamAtIndex,
st_idx
)
}
pub fn get_public_key<'a, G: AffineRepr>(
&'a self,
setup_params: &'a [SetupParams<E, G>],
st_idx: usize,
) -> Result<&'a PublicKeyG2<E>, ProofSystemError> {
extract_param!(
setup_params,
&self.public_key,
self.public_key_ref,
BBSPlusPublicKey,
IncompatibleBBSPlusSetupParamAtIndex,
st_idx
)
}
};
}
impl<E: Pairing> PoKBBSSignatureG1<E> {
impl_bbs_statement!(SignatureParamsG1, PoKBBSSignatureG1, BBSPlusSignatureParams);
}