use bn::{BigNumber, BigNumberContext};
use errors::IndyCryptoError;
pub fn get_pedersen_commitment(gen_1: &BigNumber, m: &BigNumber,
gen_2: &BigNumber, r: &BigNumber,
modulus: &BigNumber, ctx: &mut BigNumberContext) -> Result<BigNumber, IndyCryptoError> {
let commitment = gen_1.mod_exp(m, modulus, Some(ctx))?
.mod_mul(&gen_2.mod_exp(r, modulus, Some(ctx))?,
modulus, Some(ctx))?;
Ok(commitment)
}
pub fn get_generalised_pedersen_commitment(to_commit: Vec<(&BigNumber, &BigNumber)>,
gen_2: &BigNumber, r: &BigNumber,
modulus: &BigNumber, ctx: &mut BigNumberContext) -> Result<BigNumber, IndyCryptoError> {
let accumulated = get_exponentiated_generators(to_commit, modulus, ctx)?;
let commitment = accumulated.mod_mul(&gen_2.mod_exp(r, modulus, Some(ctx))?,
modulus, Some(ctx))?;
Ok(commitment)
}
pub fn get_exponentiated_generators(to_exponentiate: Vec<(&BigNumber, &BigNumber)>,
modulus: &BigNumber, ctx: &mut BigNumberContext) -> Result<BigNumber, IndyCryptoError> {
let mut accumulated = BigNumber::from_dec("1")?;
for &(g, m) in to_exponentiate.iter() {
accumulated = accumulated.mod_mul(
&g.mod_exp(m, modulus, Some(ctx))?, modulus, Some(ctx)
)?;
}
Ok(accumulated)
}