Skip to content

Commit 5c81e06

Browse files
committed
fin blind sign/verify
1 parent dac6372 commit 5c81e06

5 files changed

Lines changed: 105 additions & 9 deletions

File tree

bbs/src/bbs_bn254/blind.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@ use ark_serialize::CanonicalSerialize;
88
use ark_std::{UniformRand, rand::RngCore};
99
use sha2::{Digest, Sha256};
1010

11-
use crate::bbs_bn254::structs::{BlindedCommitment, CommitmentProof, Parameters};
11+
use crate::bbs_bn254::{Signature, structs::{BlindedCommitment, CommitmentProof, Parameters}};
1212

1313
/// Create a blinded commitment for a list of messages.
1414
/// Returns `Err` if message length exceeds available parameters.
15-
/// data with index at and behind `blind_index` will be blinded, should be between 1 and messages.len() - 1
15+
/// for example, if blind_index is 3, and the length of messages is 5
16+
/// the m0, m1, m2 are visual, while m3, m4 are blinded, the commitment will be C = r*H_0 + m3*H_4 + m4*H_5
1617
pub fn blind(
1718
params: &Parameters,
1819
messages: &[Scalar],
19-
blind_index: usize,
20+
blind_index: &usize,
2021
) -> Result<BlindedCommitment, &'static str> {
2122
let mut rng = ark_std::test_rng();
2223
blind_with_rng(params, messages, blind_index, &mut rng)
@@ -26,7 +27,7 @@ pub fn blind(
2627
pub fn blind_with_rng<R: RngCore>(
2728
params: &Parameters,
2829
messages: &[Scalar],
29-
blind_index: usize,
30+
blind_index: &usize,
3031
rng: &mut R,
3132
) -> Result<BlindedCommitment, &'static str> {
3233
if messages.len() > params.L {
@@ -35,7 +36,7 @@ pub fn blind_with_rng<R: RngCore>(
3536
if params.H.len() < messages.len() + 1 {
3637
return Err("parameters do not include enough message base points");
3738
}
38-
if blind_index == 0 || blind_index >= messages.len() {
39+
if *blind_index > messages.len() {
3940
return Err("invalid blind index");
4041
}
4142

@@ -44,7 +45,7 @@ pub fn blind_with_rng<R: RngCore>(
4445
let mut commitment = params.H[0] * blinding_factor;
4546

4647
// calc m_j*H_{j+1}
47-
for j in (blind_index - 1)..messages.len() {
48+
for j in *blind_index..messages.len() {
4849
commitment += params.H[j + 1] * messages[j];
4950
}
5051

@@ -54,6 +55,24 @@ pub fn blind_with_rng<R: RngCore>(
5455
})
5556
}
5657

58+
pub fn unblind(
59+
params: &Parameters,
60+
signature: &Signature,
61+
commitment: &BlindedCommitment,
62+
) -> Result<Signature, &'static str> {
63+
if params.H.len() < 2 {
64+
return Err("parameters do not include enough message base points");
65+
}
66+
67+
let unblinded_s = signature.s + commitment.blinding_factor;
68+
return Ok(Signature {
69+
A: signature.A,
70+
e: signature.e,
71+
s: unblinded_s,
72+
});
73+
}
74+
75+
5776
/// Generate a proof of knowledge for the blinded commitment.
5877
pub fn commitment_pok_prove(
5978
params: &Parameters,
@@ -156,7 +175,7 @@ mod tests {
156175
let messages = vec![Scalar::from(1u64), Scalar::from(2u64), Scalar::from(3u64)];
157176

158177
let mut rng = ark_std::test_rng();
159-
let commitment = blind_with_rng(&params, &messages, 1, &mut rng).unwrap();
178+
let commitment = blind_with_rng(&params, &messages, &1, &mut rng).unwrap();
160179
let proof =
161180
commitment_pok_prove_with_rng(&params, &commitment, &messages, &mut rng).unwrap();
162181

bbs/src/bbs_bn254/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ pub use blind::{
1010
commitment_pok_verify,
1111
};
1212
pub use keygen::{keygen, keygen_with_rng};
13-
pub use signer::sign_no_blind;
13+
pub use signer::{sign_no_blind, sign_with_blind};
1414
pub use structs::{Parameters, PrivateKey, PublicKey, Signature};

bbs/src/bbs_bn254/signer.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,54 @@ pub fn sign_no_blind_with_rng<R: RngCore>(
4545
// Output signature (A, e, s)
4646
Ok(Signature { A: a, e, s })
4747
}
48+
49+
50+
pub fn sign_with_blind(
51+
params: &Parameters,
52+
sk: &PrivateKey,
53+
blind_index: &usize,
54+
commitment: &G1,
55+
visual_messages: &[Scalar],
56+
) -> Result<Signature, &'static str> {
57+
let mut rng = test_rng();
58+
sign_with_blind_with_rng(params, sk, blind_index, commitment, visual_messages, &mut rng)
59+
}
60+
61+
pub fn sign_with_blind_with_rng<R: RngCore>(
62+
params: &Parameters,
63+
sk: &PrivateKey,
64+
blind_index: &usize,
65+
commitment: &G1,
66+
visual_messages: &[Scalar],
67+
rng: &mut R,
68+
) -> Result<Signature, &'static str> {
69+
// Check
70+
if visual_messages.len() > params.L {
71+
return Err("message length exceeds parameters");
72+
}
73+
if *blind_index > visual_messages.len() {
74+
return Err("invalid blind index");
75+
}
76+
77+
// Sample random scalars e and s'
78+
let e = Scalar::rand(rng);
79+
let s_prime = Scalar::rand(rng);
80+
81+
// Construct C' = g_1 + commitment + s'*H_0 + sum(m_i*H_i)
82+
let mut c_p = params.g1 + commitment + params.H[0] * s_prime;
83+
for (j, m_j) in visual_messages.iter().enumerate() {
84+
if j >= params.L {
85+
return Err("message length exceeds parameters");
86+
}
87+
c_p += params.H[j + 1] * m_j;
88+
}
89+
90+
// calc (x + e) ^ (-1)
91+
let mut tmp = sk.x + e;
92+
tmp = tmp.inverse().ok_or("failed to compute inverse")?;
93+
94+
// calc A = C' * (x + e) ^ (-1)
95+
let a = (c_p * tmp).into_affine() as G1;
96+
97+
return Ok(Signature { A: a, e, s: s_prime });
98+
}

bbs/src/bbs_bn254/verify.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,4 @@ pub fn verify_no_blind(
4242

4343
// Check if lhs == rhs
4444
return Ok(lhs == rhs);
45-
}
45+
}

bbs/tests/test_with_blind.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
mod tests {
2+
use ark_bn254::Fr as Scalar;
3+
use bbs::bbs_bn254::{blind::unblind, verify::verify_no_blind, *};
4+
#[test]
5+
fn test_no_blind() {
6+
let (params, pk, sk) = keygen(5);
7+
let messages = vec![
8+
Scalar::from(10u64),
9+
Scalar::from(20u64),
10+
Scalar::from(30u64),
11+
Scalar::from(40u64),
12+
Scalar::from(50u64),
13+
];
14+
15+
let commitment = blind(&params, &messages, &3).unwrap();
16+
17+
// m0, m1, m2 are visual, m3, m4 are blinded
18+
let visual_messages = messages[..3].to_vec();
19+
let mut signature = sign_with_blind(&params, &sk, &3, &commitment.commitment, &visual_messages).unwrap();
20+
21+
signature = unblind(&params, &signature, &commitment).unwrap();
22+
23+
let ok = verify_no_blind(&params, &pk, &messages, &signature).unwrap();
24+
assert!(ok);
25+
}
26+
}

0 commit comments

Comments
 (0)