Skip to content

Commit 1049c06

Browse files
committed
feat: add the interface abstraction
1 parent 41fdaf7 commit 1049c06

26 files changed

+702
-367
lines changed

src/common/ciphersuite.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ impl CipherSuiteId {
1919
pub(crate) fn as_octets(&self) -> &[u8] {
2020
match &self {
2121
CipherSuiteId::BbsBls12381G1XmdSha256 => {
22-
b"BBS_BLS12381G1_XMD:SHA-256_SSWU_RO_H2G_HM2S_"
22+
b"BBS_BLS12381G1_XMD:SHA-256_SSWU_RO_"
2323
}
2424
CipherSuiteId::BbsBls12381G1XofShake256 => {
25-
b"BBS_BLS12381G1_XOF:SHAKE-256_SSWU_RO_H2G_HM2S_"
25+
b"BBS_BLS12381G1_XOF:SHAKE-256_SSWU_RO_"
2626
}
2727
CipherSuiteId::BlsSigBls12381G2XmdSha256Nul => {
2828
b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_"

src/common/hash_param/h2s.rs

+9-49
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,7 @@ use crate::{
66
};
77

88
use super::{
9-
constant::{
10-
DEFAULT_DST_SUFFIX_H2S,
11-
DEFAULT_DST_SUFFIX_MESSAGE_TO_SCALAR,
12-
MAX_DST_SIZE,
13-
MAX_MESSAGE_SIZE,
14-
XOF_NO_OF_BYTES,
15-
},
9+
constant::{DEFAULT_DST_SUFFIX_H2S, XOF_NO_OF_BYTES},
1610
ExpandMessageParameter,
1711
};
1812

@@ -22,14 +16,14 @@ pub(crate) trait HashToScalarParameter: ExpandMessageParameter {
2216
[Self::ID.as_octets(), DEFAULT_DST_SUFFIX_H2S.as_bytes()].concat()
2317
}
2418

25-
/// Default domain separation tag to be used in [MapMessageToScalarAsHash](https://identity.foundation/bbs-signature/draft-bbs-signatures.html#name-mapmessagetoscalarashash).
26-
fn default_map_message_to_scalar_as_hash_dst() -> Vec<u8> {
27-
[
28-
Self::ID.as_octets(),
29-
DEFAULT_DST_SUFFIX_MESSAGE_TO_SCALAR.as_bytes(),
30-
]
31-
.concat()
32-
}
19+
// /// Default domain separation tag to be used in [MapMessageToScalarAsHash](https://identity.foundation/bbs-signature/draft-bbs-signatures.html#name-mapmessagetoscalarashash).
20+
// fn default_map_message_to_scalar_as_hash_dst() -> Vec<u8> {
21+
// [
22+
// Self::ID.as_octets(),
23+
// DEFAULT_DST_SUFFIX_MESSAGE_TO_SCALAR.as_bytes(),
24+
// ]
25+
// .concat()
26+
// }
3327

3428
/// Hash arbitrary data to `n` number of scalars as specified in BBS
3529
/// specification.
@@ -57,38 +51,4 @@ pub(crate) trait HashToScalarParameter: ExpandMessageParameter {
5751

5852
Ok(out_scalar)
5953
}
60-
61-
/// Hash arbitrary data to a scalar as specified in [3.3.9.1 Hash to scalar](https://identity.foundation/bbs-signature/draft-bbs-signatures.html#name-mapmessagetoscalarashash).
62-
fn map_message_to_scalar_as_hash(
63-
message: &[u8],
64-
dst: Option<&[u8]>,
65-
) -> Result<Scalar, Error> {
66-
let default_map_message_to_scalar_as_hash_dst =
67-
Self::default_map_message_to_scalar_as_hash_dst();
68-
let dst = dst.unwrap_or(&default_map_message_to_scalar_as_hash_dst);
69-
70-
if !dst.is_ascii() {
71-
return Err(Error::BadParams {
72-
cause: "non-ascii dst".to_owned(),
73-
});
74-
}
75-
76-
// If len(dst) > 2^8 - 1 or len(msg) > 2^64 - 1, abort
77-
if message.len() as u64 > MAX_MESSAGE_SIZE {
78-
return Err(Error::MessageIsTooLarge);
79-
}
80-
if dst.len() > MAX_DST_SIZE as usize {
81-
return Err(Error::DstIsTooLarge);
82-
}
83-
84-
// hash_to_scalar(message || dst_prime, 1)
85-
Self::hash_to_scalar(message, Some(dst))
86-
}
87-
88-
/// Hash the input octets to scalar values representing the e component of a
89-
/// BBS signature.
90-
fn hash_to_e(input_octets: &[u8]) -> Result<Scalar, Error> {
91-
let e = Self::hash_to_scalar(input_octets, None)?;
92-
Ok(e)
93-
}
9454
}

src/schemes/bbs.rs

+9
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,12 @@ pub(crate) mod core;
1212

1313
/// BBS ciphersuites abstraction over core implementation.
1414
pub mod ciphersuites;
15+
16+
/// BBS Interface abstraction over ciphersuites, defining how messages are
17+
/// mapped to scalars, how generators are created and how core interfaces are
18+
/// used.
19+
pub mod interface;
20+
21+
/// Calculating the generators, that form part of the BBS Signature
22+
/// public parameters.
23+
pub mod generator;

src/schemes/bbs/api/generators.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,23 @@ use crate::{
77
memory_cached_generator::MemoryCachedGenerators,
88
Generators,
99
},
10+
interface::BbsInterfaceParameter,
1011
},
1112
Error,
1213
};
1314

14-
pub(crate) fn create_generators<C>(
15+
pub(crate) fn create_generators<I>(
1516
count: usize,
1617
private_holder_binding: Option<bool>,
1718
) -> Result<Vec<Vec<u8>>, Error>
1819
where
19-
C: BbsCiphersuiteParameters,
20+
I: BbsInterfaceParameter,
2021
{
2122
let mut result = Vec::new();
2223
let generators =
23-
MemoryCachedGenerators::<C>::new(count - 2, private_holder_binding)?;
24+
MemoryCachedGenerators::<I>::new(count - 2, private_holder_binding)?;
2425

25-
result.push(C::p1()?.to_affine().to_compressed().to_vec());
26+
result.push(I::Ciphersuite::p1()?.to_affine().to_compressed().to_vec());
2627
result.push(generators.Q.to_affine().to_compressed().to_vec());
2728
result.extend(
2829
generators

src/schemes/bbs/api/proof.rs

+24-20
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ use super::{
44
};
55
use crate::{
66
bbs::{
7-
ciphersuites::BbsCiphersuiteParameters,
87
core::{
98
generator::memory_cached_generator::MemoryCachedGenerators,
109
types::ProofMessage,
1110
},
11+
interface::BbsInterfaceParameter,
1212
},
1313
error::Error,
1414
schemes::bbs::core::{
@@ -34,42 +34,43 @@ pub fn get_proof_size(num_undisclosed_messages: usize) -> usize {
3434
}
3535

3636
// helper function for parsing a BBS Proof Generation Request
37-
fn _parse_request_helper<T, C>(
37+
fn _parse_request_helper<T, I>(
3838
request: &BbsProofGenRequest<'_, T>,
3939
) -> Result<
4040
(
4141
PublicKey,
4242
Signature,
43-
MemoryCachedGenerators<C>,
43+
MemoryCachedGenerators<I>,
4444
Vec<ProofMessage>,
4545
),
4646
Error,
4747
>
4848
where
4949
T: AsRef<[u8]>,
50-
C: BbsCiphersuiteParameters,
50+
I: BbsInterfaceParameter,
5151
{
5252
// Parse public key from request
5353
let pk = PublicKey::from_octets(request.public_key)?;
5454

5555
let (digested_messages, proof_messages) =
56-
digest_proof_messages::<_, C>(request.messages)?;
56+
digest_proof_messages::<_, I>(request.messages)?;
5757

5858
// Derive generators
5959
let generators =
60-
MemoryCachedGenerators::<C>::new(digested_messages.len(), None)?;
60+
MemoryCachedGenerators::<I>::new(digested_messages.len(), None)?;
6161

6262
// Parse signature from request
6363
let signature = Signature::from_octets(request.signature)?;
6464

6565
let verify_signature = request.verify_signature.unwrap_or(true);
6666
if verify_signature {
6767
// Verify the signature to check the messages supplied are valid
68-
if !(signature.verify::<_, _, _, C>(
68+
if !(signature.verify::<_, _, _, I::Ciphersuite>(
6969
&pk,
7070
request.header.as_ref(),
7171
&generators,
7272
&digested_messages,
73+
Some(I::api_id()),
7374
)?) {
7475
return Err(Error::SignatureVerification);
7576
}
@@ -79,36 +80,37 @@ where
7980
}
8081

8182
// Generate a BBS signature proof of knowledge.
82-
pub(crate) fn proof_gen<T, C>(
83+
pub(crate) fn proof_gen<T, I>(
8384
request: &BbsProofGenRequest<'_, T>,
8485
) -> Result<Vec<u8>, Error>
8586
where
8687
T: AsRef<[u8]>,
87-
C: BbsCiphersuiteParameters,
88+
I: BbsInterfaceParameter,
8889
{
8990
let (pk, signature, generators, proof_messages) =
90-
_parse_request_helper::<T, C>(request)?;
91+
_parse_request_helper::<T, I>(request)?;
9192

9293
// Generate the proof
93-
let proof = Proof::new::<_, _, C>(
94+
let proof = Proof::new::<_, _, I::Ciphersuite>(
9495
&pk,
9596
&signature,
9697
request.header.as_ref(),
9798
request.presentation_header.as_ref(),
9899
&generators,
99100
&proof_messages,
101+
Some(I::api_id()),
100102
)?;
101103

102104
Ok(proof.to_octets())
103105
}
104106

105107
// Verify a BBS signature proof of knowledge.
106-
pub(crate) fn proof_verify<T, C>(
108+
pub(crate) fn proof_verify<T, I>(
107109
request: &BbsProofVerifyRequest<'_, T>,
108110
) -> Result<bool, Error>
109111
where
110112
T: AsRef<[u8]>,
111-
C: BbsCiphersuiteParameters,
113+
I: BbsInterfaceParameter,
112114
{
113115
// Parse public key from request
114116
let public_key = PublicKey::from_octets(request.public_key)?;
@@ -124,43 +126,45 @@ where
124126

125127
// Digest the revealed proof messages
126128
let messages: BTreeMap<usize, Message> =
127-
digest_revealed_proof_messages::<_, C>(messages, total_message_count)?;
129+
digest_revealed_proof_messages::<_, I>(messages, total_message_count)?;
128130

129131
// Derive generators
130132
let generators =
131-
MemoryCachedGenerators::<C>::new(total_message_count, None)?;
133+
MemoryCachedGenerators::<I>::new(total_message_count, None)?;
132134

133-
proof.verify::<_, _, C>(
135+
proof.verify::<_, _, I::Ciphersuite>(
134136
&public_key,
135137
request.header.as_ref(),
136138
request.presentation_header.as_ref(),
137139
&generators,
138140
&messages,
141+
Some(I::api_id()),
139142
)
140143
}
141144

142145
// Generate a BBS signature proof of knowledge with a given rng.
143146
#[cfg(feature = "__private_bbs_fixtures_generator_api")]
144-
pub(crate) fn proof_gen_with_rng<T, R, C>(
147+
pub(crate) fn proof_gen_with_rng<T, R, I>(
145148
request: &BbsProofGenRequest<'_, T>,
146149
rng: R,
147150
) -> Result<Vec<u8>, Error>
148151
where
149152
T: AsRef<[u8]>,
150153
R: RngCore + CryptoRng,
151-
C: BbsCiphersuiteParameters,
154+
I: BbsInterfaceParameter,
152155
{
153156
let (pk, signature, generators, proof_messages) =
154-
_parse_request_helper::<T, C>(request)?;
157+
_parse_request_helper::<T, I>(request)?;
155158

156159
// Generate the proof
157-
let proof = Proof::new_with_rng::<_, _, _, C>(
160+
let proof = Proof::new_with_rng::<_, _, _, I::Ciphersuite>(
158161
&pk,
159162
&signature,
160163
request.header.as_ref(),
161164
request.presentation_header.as_ref(),
162165
&generators,
163166
&proof_messages,
167+
Some(I::api_id()),
164168
rng,
165169
)?;
166170

src/schemes/bbs/api/signature.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,25 @@ use super::{
44
};
55
use crate::{
66
bbs::{
7-
ciphersuites::{
8-
bls12_381::BBS_BLS12381G1_SIGNATURE_LENGTH,
9-
BbsCiphersuiteParameters,
10-
},
7+
ciphersuites::bls12_381::BBS_BLS12381G1_SIGNATURE_LENGTH,
118
core::{
129
generator::memory_cached_generator::MemoryCachedGenerators,
1310
key_pair::{PublicKey, SecretKey},
1411
signature::Signature,
1512
types::Message,
1613
},
14+
interface::BbsInterfaceParameter,
1715
},
1816
error::Error,
1917
};
2018

2119
// Create a BBS signature.
22-
pub(crate) fn sign<T, C>(
20+
pub(crate) fn sign<T, I>(
2321
request: &BbsSignRequest<'_, T>,
2422
) -> Result<[u8; BBS_BLS12381G1_SIGNATURE_LENGTH], Error>
2523
where
2624
T: AsRef<[u8]>,
27-
C: BbsCiphersuiteParameters,
25+
I: BbsInterfaceParameter,
2826
{
2927
// Parse the secret key
3028
let sk = SecretKey::from_bytes(request.secret_key)?;
@@ -33,46 +31,48 @@ where
3331
let pk = PublicKey::from_octets(request.public_key)?;
3432

3533
// Digest the supplied messages
36-
let messages: Vec<Message> = digest_messages::<_, C>(request.messages)?;
34+
let messages: Vec<Message> = digest_messages::<_, I>(request.messages)?;
3735

3836
// Derive generators
39-
let generators = MemoryCachedGenerators::<C>::new(messages.len(), None)?;
37+
let generators = MemoryCachedGenerators::<I>::new(messages.len(), None)?;
4038

4139
// Produce the signature and return
42-
Signature::new::<_, _, _, C>(
40+
Signature::new::<_, _, _, I::Ciphersuite>(
4341
&sk,
4442
&pk,
4543
request.header.as_ref(),
4644
&generators,
4745
&messages,
46+
Some(I::api_id()),
4847
)
4948
.map(|sig| sig.to_octets())
5049
}
5150

5251
// Verify a BBS signature.
53-
pub(crate) fn verify<T, C>(
52+
pub(crate) fn verify<T, I>(
5453
request: &BbsVerifyRequest<'_, T>,
5554
) -> Result<bool, Error>
5655
where
5756
T: AsRef<[u8]>,
58-
C: BbsCiphersuiteParameters,
57+
I: BbsInterfaceParameter,
5958
{
6059
// Parse public key from request
6160
let pk = PublicKey::from_octets(request.public_key)?;
6261

6362
// Digest the supplied messages
64-
let messages: Vec<Message> = digest_messages::<_, C>(request.messages)?;
63+
let messages: Vec<Message> = digest_messages::<_, I>(request.messages)?;
6564

6665
// Derive generators
67-
let generators = MemoryCachedGenerators::<C>::new(messages.len(), None)?;
66+
let generators = MemoryCachedGenerators::<I>::new(messages.len(), None)?;
6867

6968
// Parse signature from request
7069
let signature = Signature::from_octets(request.signature)?;
7170

72-
signature.verify::<_, _, _, C>(
71+
signature.verify::<_, _, _, I::Ciphersuite>(
7372
&pk,
7473
request.header.as_ref(),
7574
&generators,
7675
&messages,
76+
Some(I::api_id()),
7777
)
7878
}

0 commit comments

Comments
 (0)