Skip to main content

indy_crypto/utils/
commitment.rs

1use bn::{BigNumber, BigNumberContext};
2use errors::prelude::*;
3
4
5/// Generate a pedersen commitment to a given number
6///
7/// # Arguments
8/// * `gen_1` - first generator
9/// * `m` - exponent of the first generator
10/// * `gen_2` - second generator
11/// * `r` - exponent of the second generator
12/// * `modulus` - all computations are done this modulo
13/// * `ctx` - big number context
14///
15/// # Result
16/// Return the pedersen commitment, i.e `(gen_1^m)*(gen_2^r)`
17pub fn get_pedersen_commitment(gen_1: &BigNumber, m: &BigNumber,
18                               gen_2: &BigNumber, r: &BigNumber,
19                               modulus: &BigNumber, ctx: &mut BigNumberContext) -> IndyCryptoResult<BigNumber> {
20    let commitment = gen_1.mod_exp(m, modulus, Some(ctx))?
21        .mod_mul(&gen_2.mod_exp(r, modulus, Some(ctx))?,
22                 modulus, Some(ctx))?;
23    Ok(commitment)
24}
25
26
27/// Generate a pedersen commitment over `n` values
28///
29/// # Arguments
30/// * `to_commit` - a list of 2-tuples where the first element of the tuple is a generator and
31/// the second is the value being committed to, like [(g_1, m_1), (g_2, m_2), (g_3, m_3), ... (g_i, m_i)]
32/// * `modulus` - all computations are done this modulo
33/// * `ctx` - big number context
34///
35/// # Result
36/// Return the pedersen commitment, i.e `(g_1^m_1)*(g_2^m_2)*...(g_i^m_i)*(gen_2^r)`
37pub fn get_generalized_pedersen_commitment(to_commit: Vec<(&BigNumber, &BigNumber)>,
38                                           modulus: &BigNumber, ctx: &mut BigNumberContext) -> IndyCryptoResult<BigNumber> {
39    let accumulated = get_exponentiated_generators(to_commit, modulus, ctx)?;
40
41    Ok(accumulated)
42}
43
44
45/// Exponentiate the given generators to corresponding exponents
46///
47/// # Arguments
48/// * `to_exponentiate` - a list of 2-tuples where the first element of the tuple is a generator and
49/// the second is the exponent, like [(g_1, e_1), (g_2, e_2), (g_3, e_3), ... (g_i, e_i)]
50/// * `modulus` - all computations are done this modulo
51/// * `ctx` - big number context
52///
53/// # Result
54/// Return the exponentiation, i.e `(g_1^e_1)*(g_2^e_2)*...(g_i^e_i)`
55pub fn get_exponentiated_generators(to_exponentiate: Vec<(&BigNumber, &BigNumber)>,
56                                    modulus: &BigNumber, ctx: &mut BigNumberContext) -> IndyCryptoResult<BigNumber> {
57    let accumulated = to_exponentiate.iter()
58                                     .fold(BigNumber::from_u32(1),
59                                           |acc, &(g, m)| acc?.mod_mul(&g.mod_exp(m, modulus, Some(ctx))?, modulus, Some(ctx)))?;
60    Ok(accumulated)
61}