use bn::{BigNumber, BigNumberContext};
use errors::prelude::*;
pub fn get_pedersen_commitment(gen_1: &BigNumber, m: &BigNumber,
gen_2: &BigNumber, r: &BigNumber,
modulus: &BigNumber, ctx: &mut BigNumberContext) -> IndyCryptoResult<BigNumber> {
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_generalized_pedersen_commitment(to_commit: Vec<(&BigNumber, &BigNumber)>,
modulus: &BigNumber, ctx: &mut BigNumberContext) -> IndyCryptoResult<BigNumber> {
let accumulated = get_exponentiated_generators(to_commit, modulus, ctx)?;
Ok(accumulated)
}
pub fn get_exponentiated_generators(to_exponentiate: Vec<(&BigNumber, &BigNumber)>,
modulus: &BigNumber, ctx: &mut BigNumberContext) -> IndyCryptoResult<BigNumber> {
let accumulated = to_exponentiate.iter()
.fold(BigNumber::from_u32(1),
|acc, &(g, m)| acc?.mod_mul(&g.mod_exp(m, modulus, Some(ctx))?, modulus, Some(ctx)))?;
Ok(accumulated)
}