From 309a69958411ebd67d1e1eebd29b8f0a810c7880 Mon Sep 17 00:00:00 2001 From: Alberto Solavagione Date: Tue, 24 Oct 2023 15:52:41 +0200 Subject: [PATCH 1/6] code refactoring --- Cargo.toml | 2 + examples/bbsplus.rs | 2 +- examples/cl03.rs | 6 +- src/{signatures => bbsplus}/blind.rs | 94 +------ src/bbsplus/commitment.rs | 105 ++++++++ src/bbsplus/generators.rs | 2 +- src/bbsplus/keys.rs | 180 +++++++++++++ src/bbsplus/mod.rs | 7 +- src/{signatures => bbsplus}/proof.rs | 272 +------------------- src/{signatures => bbsplus}/signature.rs | 116 +-------- src/bbsplus/tests.rs | 2 +- src/cl03/bases.rs | 4 +- src/cl03/blind.rs | 109 ++++++++ src/{signatures => cl03}/commitment.rs | 94 +------ src/{keys/cl03_key.rs => cl03/keys.rs} | 81 +++++- src/cl03/mod.rs | 7 +- src/cl03/proof.rs | 291 ++++++++++++++++++++++ src/cl03/range_proof.rs | 4 +- src/cl03/sigma_protocols.rs | 4 +- src/cl03/signature.rs | 133 ++++++++++ src/cl03/tests.rs | 2 +- src/keys/bbsplus_key.rs | 63 ----- src/keys/key.rs | 88 ------- src/keys/mod.rs | 6 +- src/keys/pair.rs | 127 +--------- src/{signatures/mod.rs => keys/traits.rs} | 19 +- src/lib.rs | 1 - src/schemes/algorithms.rs | 2 +- src/schemes/generics.rs | 63 +++++ src/schemes/mod.rs | 3 +- src/utils/util.rs | 4 +- 31 files changed, 1032 insertions(+), 861 deletions(-) rename src/{signatures => bbsplus}/blind.rs (63%) create mode 100644 src/bbsplus/commitment.rs create mode 100644 src/bbsplus/keys.rs rename src/{signatures => bbsplus}/proof.rs (58%) rename src/{signatures => bbsplus}/signature.rs (65%) create mode 100644 src/cl03/blind.rs rename src/{signatures => cl03}/commitment.rs (70%) rename src/{keys/cl03_key.rs => cl03/keys.rs} (75%) create mode 100644 src/cl03/proof.rs create mode 100644 src/cl03/signature.rs delete mode 100644 src/keys/bbsplus_key.rs delete mode 100644 src/keys/key.rs rename src/{signatures/mod.rs => keys/traits.rs} (55%) create mode 100644 src/schemes/generics.rs diff --git a/Cargo.toml b/Cargo.toml index 17d2b52..1ffe090 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,3 +48,5 @@ path = "examples/bbsplus.rs" name = "cl03" path = "examples/cl03.rs" +[features] +cl03 = [] \ No newline at end of file diff --git a/examples/bbsplus.rs b/examples/bbsplus.rs index 2ee9c22..18739b3 100644 --- a/examples/bbsplus.rs +++ b/examples/bbsplus.rs @@ -16,7 +16,7 @@ use std::env; use elliptic_curve::hash2curve::ExpandMsg; -use zkryptium::{utils::{message::BBSplusMessage, random::generate_nonce}, keys::pair::KeyPair, bbsplus::{generators::{make_generators, global_generators, signer_specific_generators}, ciphersuites::BbsCiphersuite}, schemes::algorithms::{BBSplus, Scheme, BBS_BLS12381_SHAKE256, BBS_BLS12381_SHA256}, signatures::{commitment::Commitment, blind::BlindSignature, proof::{PoKSignature, ZKPoK}}}; +use zkryptium::{utils::{message::BBSplusMessage, random::generate_nonce}, keys::pair::KeyPair, bbsplus::{generators::{make_generators, global_generators, signer_specific_generators}, ciphersuites::BbsCiphersuite}, schemes::algorithms::{BBSplus, Scheme, BBS_BLS12381_SHAKE256, BBS_BLS12381_SHA256}, schemes::generics::{Commitment, BlindSignature, PoKSignature, ZKPoK}}; diff --git a/examples/cl03.rs b/examples/cl03.rs index 1543e67..c396e8c 100644 --- a/examples/cl03.rs +++ b/examples/cl03.rs @@ -15,7 +15,7 @@ use std::env; use digest::Digest; -use zkryptium::{schemes::algorithms::{CL03, Scheme, CL03_CL1024_SHA256, Ciphersuite}, signatures::{commitment::Commitment, blind::BlindSignature, proof::{PoKSignature, ZKPoK}}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, keys::{pair::KeyPair, cl03_key::CL03CommitmentPublicKey}, utils::message::CL03Message}; +use zkryptium::{schemes::algorithms::{CL03, Scheme, CL03_CL1024_SHA256, Ciphersuite}, schemes::generics::{Commitment, BlindSignature, PoKSignature, ZKPoK}, cl03::{ciphersuites::CLCiphersuite, bases::Bases, keys::CL03CommitmentPublicKey}, keys::pair::KeyPair, utils::message::CL03Message}; fn cl03_main() @@ -81,7 +81,9 @@ fn main() { let args: Vec = env::args().collect(); if args.len() != 2 { - println!("Usage: {} ", args[0]); + println!("Usage: {} + Ciphersuites: + - CL1024-SHA-256", args[0]); return; } diff --git a/src/signatures/blind.rs b/src/bbsplus/blind.rs similarity index 63% rename from src/signatures/blind.rs rename to src/bbsplus/blind.rs index a335172..12ff5ad 100644 --- a/src/signatures/blind.rs +++ b/src/bbsplus/blind.rs @@ -21,9 +21,9 @@ use elliptic_curve::{group::Curve, subtle::{CtOption, Choice}, hash2curve::Expan use rug::{Integer, ops::Pow}; use serde::{Deserialize, Serialize}; -use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, signer_specific_generators}}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, keys::{cl03_key::{CL03PublicKey, CL03SecretKey, CL03CommitmentPublicKey}, bbsplus_key::{BBSplusSecretKey, BBSplusPublicKey}}, utils::{random::{random_prime, random_bits}, util::{calculate_domain, ScalarExt, hash_to_scalar_old}}, errors::BlindSignError}; +use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, signer_specific_generators}}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{random::{random_prime, random_bits}, util::{calculate_domain, ScalarExt, hash_to_scalar_old}}, errors::BlindSignError, schemes::generics::{BlindSignature, Signature, ZKPoK}}; -use super::{commitment::{CL03Commitment, Commitment, BBSplusCommitment}, signature::{CL03Signature, BBSplusSignature, Signature}, proof::ZKPoK}; +use super::{commitment::BBSplusCommitment, keys::{BBSplusSecretKey, BBSplusPublicKey}, signature::BBSplusSignature}; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct BBSplusBlindSignature { @@ -33,19 +33,6 @@ pub struct BBSplusBlindSignature { } -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub struct CL03BlindSignature { - pub(crate) e: Integer, - pub(crate) rprime: Integer, - pub(crate) v: Integer, -} - -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub enum BlindSignature { - BBSplus(BBSplusBlindSignature), - CL03(CL03BlindSignature), - _Unreachable(std::marker::PhantomData) -} impl BlindSignature> { @@ -193,81 +180,4 @@ impl BlindSignature> { }) } -} - -impl BlindSignature> { - - pub fn e(&self) -> &Integer { - match self { - Self::CL03(inner) => &inner.e, - _ => panic!("Cannot happen!"), - } - } - - pub fn rprime(&self) -> &Integer { - match self { - Self::CL03(inner) => &inner.rprime, - _ => panic!("Cannot happen!"), - } - } - - pub fn v(&self) -> &Integer { - match self { - Self::CL03(inner) => &inner.v, - _ => panic!("Cannot happen!"), - } - } - - //TODO: ("remove the indexes"); - - pub fn blind_sign(pk: &CL03PublicKey, sk: &CL03SecretKey, a_bases: &Bases, zkpok: &ZKPoK>, revealed_messages: Option<&[CL03Message]>, C: &CL03Commitment, C_trusted: Option<&CL03Commitment>, commitment_pk: Option<&CL03CommitmentPublicKey>, unrevealed_message_indexes: &[usize], revealed_message_indexes: Option<&[usize]>) -> Self - where - CS::HashAlg: Digest - { - - if !zkpok.verify_proof(C, C_trusted, pk, a_bases, commitment_pk, unrevealed_message_indexes) { - panic!("Knowledge of committed secrets not verified"); - } - - let mut extended_commitment: Commitment> = Commitment::CL03(C.clone()); - if revealed_messages.is_some() && revealed_message_indexes.is_some() { - extended_commitment.extend_commitment_with_pk(revealed_messages.unwrap(), pk, a_bases, revealed_message_indexes); - } - let mut e = random_prime(CS::le); - let phi_n = (&sk.p - Integer::from(1)) * (&sk.q - Integer::from(1)); - while ((&e > &Integer::from(2).pow(CS::le-1)) && (&e < &Integer::from(2).pow(CS::le)) && (Integer::from(e.gcd_ref(&phi_n)) == 1)) == false { - e = random_prime(CS::le); - } - - let rprime = random_bits(CS::ls); - let e2n = Integer::from(e.invert_ref(&phi_n).unwrap()); - - // v = powmod(((Cx) * powmod(pk['b'], rprime, pk['N']) * pk['c']), e2n, pk['N']) - let v = Integer::from((extended_commitment.value() * Integer::from(pk.b.pow_mod_ref(&rprime, &pk.N).unwrap()) * &pk.c).pow_mod_ref(&e2n, &pk.N).unwrap()); - let sig = CL03BlindSignature{e, rprime, v}; - // sig = { 'e':e, 'rprime':rprime, 'v':v } - - Self::CL03(sig) - - } - - pub fn unblind_sign(&self, commitment: &Commitment>) -> Signature> { - let s = commitment.randomness().clone() + self.rprime(); - Signature::CL03(CL03Signature { e: self.e().clone(), s, v: self.v().clone()}) - } - - pub fn update_signature(&self, revealed_messages: Option<&[CL03Message]>, C: &CL03Commitment, sk: &CL03SecretKey, pk: &CL03PublicKey, a_bases: &Bases, revealed_message_indexes: Option<&[usize]>) -> Self { - let mut extended_commitment: Commitment> = Commitment::CL03(C.clone()); - if revealed_messages.is_some() && revealed_message_indexes.is_some() { - extended_commitment.extend_commitment_with_pk(revealed_messages.unwrap(), pk, a_bases, revealed_message_indexes); - } - - let phi_N = (&sk.p - Integer::from(1)) * (&sk.q - Integer::from(1)); - let e2n = Integer::from(self.e().invert_ref(&phi_N).unwrap()); - - let v = Integer::from((extended_commitment.value() * Integer::from(pk.b.pow_mod_ref(self.rprime(), &pk.N).unwrap()) * &pk.c).pow_mod_ref(&e2n, &pk.N).unwrap()); - - let sig = CL03BlindSignature{e: self.e().clone(), rprime: self.rprime().clone(), v}; - Self::CL03(sig) - } } \ No newline at end of file diff --git a/src/bbsplus/commitment.rs b/src/bbsplus/commitment.rs new file mode 100644 index 0000000..3d5ff35 --- /dev/null +++ b/src/bbsplus/commitment.rs @@ -0,0 +1,105 @@ +// Copyright 2023 Fondazione LINKS + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use bls12_381_plus::{Scalar, G1Projective}; +use elliptic_curve::hash2curve::ExpandMsg; +use rug::Integer; +use serde::{Deserialize, Serialize}; + +use crate::{utils::message::{Message, BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, global_generators}}, schemes::algorithms::{Scheme, BBSplus, CL03}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{util::{calculate_random_scalars, subgroup_check_g1}, random::random_bits}, schemes::generics::Commitment}; + + + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub struct BBSplusCommitment { + pub value: G1Projective, + pub s_prime: Scalar +} + + + +impl Commitment> { + + pub fn commit(messages: &[BBSplusMessage], generators: Option<&Generators>, unrevealed_message_indexes: &[usize]) -> Self + where + CS::Expander: for<'a> ExpandMsg<'a>, + { + + let s_prime = calculate_random_scalars::(1, None); + + if unrevealed_message_indexes.is_empty() { + panic!("Unrevealed message indexes empty"); + } + + let get_generators_fn = make_generators::; + + let gens: Generators; + if generators.is_none() { + gens = global_generators(get_generators_fn, unrevealed_message_indexes.iter().max().unwrap()+3).to_owned().clone(); + } + else { + gens = generators.unwrap().clone(); + } + + + if unrevealed_message_indexes.iter().max().unwrap() >= &gens.message_generators.len() { + panic!("Non enought generators!"); + } + + if subgroup_check_g1(gens.g1_base_point) == false { + panic!("Failed subgroup check"); + } + + for i in unrevealed_message_indexes { + if subgroup_check_g1(gens.message_generators[*i]) == false { + panic!("Failed subgroup check"); + } + } + + let mut commitment = gens.q1 * s_prime[0]; + + // let mut index: usize = 0; + + for i in unrevealed_message_indexes { + // commitment = commitment + (gens.message_generators[*i] * Scalar::from_bytes(&messages[index].to_bytes()).unwrap()); + commitment += gens.message_generators.get(*i).expect("index overflow") * &messages.get(*i).expect("Index overflow").get_value(); + + // index = index + 1; + } + + Self::BBSplus(BBSplusCommitment{value: commitment, s_prime: s_prime[0]}) + + } + + pub fn value(&self) -> &G1Projective { + match self { + Self::BBSplus(inner) => &inner.value, + _ => panic!("Cannot happen!") + } + } + + pub fn bbsPlusCommitment(&self) -> &BBSplusCommitment { + match self { + Self::BBSplus(inner) => &inner, + _ => panic!("Cannot happen!"), + } + } + + pub fn s_prime(&self) -> &Scalar { + match self { + Self::BBSplus(inner) => &inner.s_prime, + _ => panic!("Cannot happen!") + } + } +} \ No newline at end of file diff --git a/src/bbsplus/generators.rs b/src/bbsplus/generators.rs index 055192e..15bb186 100644 --- a/src/bbsplus/generators.rs +++ b/src/bbsplus/generators.rs @@ -22,7 +22,7 @@ use std::fs::File; use std::io::{BufWriter, Write}; use serde::ser::{Serializer, SerializeStruct}; -use crate::keys::bbsplus_key::BBSplusPublicKey; +use crate::bbsplus::keys::BBSplusPublicKey; use super::ciphersuites::BbsCiphersuite; #[derive(Clone, PartialEq, Eq, Debug, Deserialize)] diff --git a/src/bbsplus/keys.rs b/src/bbsplus/keys.rs new file mode 100644 index 0000000..c6862ee --- /dev/null +++ b/src/bbsplus/keys.rs @@ -0,0 +1,180 @@ +// Copyright 2023 Fondazione LINKS + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use bls12_381_plus::{Scalar, G2Projective, G2Affine}; +use elliptic_curve::group::Curve; +use ff::Field; +use hkdf::Hkdf; +use rand::{RngCore, Rng}; +use serde::{Serialize, Deserialize}; +use sha2::Sha256; +use digest::Digest; + +use crate::{keys::{traits::{PublicKey, PrivateKey}, pair::KeyPair}, schemes::algorithms::BBSplus}; + +use super::ciphersuites::BbsCiphersuite; + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub struct BBSplusPublicKey(pub G2Projective); + +impl BBSplusPublicKey{ + pub fn to_bytes(&self) -> [u8; 96] { + self.0.to_affine().to_compressed() + } + + pub fn encode(&self) -> String { + let pk_bytes = self.to_bytes(); + hex::encode(pk_bytes) + } + + pub fn from_bytes(bytes: &[u8]) -> Self{ + let bytes: [u8; 96] = bytes.try_into().expect("Invalid number of bytes to be coverted into a BBSplus public key! (max 96 bytes)"); + let g2 = G2Projective::from(G2Affine::from_compressed(&bytes).unwrap()); + Self(g2) + } +} + + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub struct BBSplusSecretKey(pub Scalar); + +impl BBSplusSecretKey{ + //in BE order + pub fn to_bytes(&self) -> [u8; 32] { + let bytes = self.0.to_be_bytes(); + // bytes.reverse(); + bytes + } + + pub fn encode(&self) -> String { + let sk_bytes = self.to_bytes(); + hex::encode(sk_bytes) + } + + pub fn from_bytes(bytes: &[u8]) -> Self { + let bytes: [u8; 32] = bytes.try_into().expect("Invalid number of bytes to be coverted into a BBSplus private key! (max 32 bytes)"); + // bytes.reverse(); + let s = Scalar::from_be_bytes(&bytes).unwrap(); + + Self(s) + } +} + + + +impl PublicKey for BBSplusPublicKey{ + type Output = [u8; 96]; + // type Params = G2Projective; + fn to_bytes(&self) -> Self::Output { + self.to_bytes() + } + + fn encode(&self) -> String { + let pk_bytes = self.to_bytes(); + hex::encode(pk_bytes) + } + + // fn get_params(&self) -> Self::Params { + // self.0 + // } +} + + + +impl PrivateKey for BBSplusSecretKey{ + type Output = [u8; 32]; + //in BE order + fn to_bytes(&self) -> Self::Output{ + self.to_bytes() + } + + fn encode(&self) -> String { + let sk_bytes = self.to_bytes(); + hex::encode(sk_bytes) + } +} + + + +impl KeyPair>{ + + pub fn generate_rng(rng: &mut R) -> Self { + let sk = Scalar::random(rng); + let pk: G2Projective = (G2Affine::generator() * sk).into(); + + Self{public: BBSplusPublicKey(pk), private: BBSplusSecretKey(sk)} + } + + pub fn generate(ikm: Option<&[u8]>, key_info: Option<&[u8]>) -> Self + { + + let ikm = if let Some(ikm_data) = ikm { + ikm_data.to_vec() + } else { + let mut rng = rand::thread_rng(); + (0..CS::IKM_LEN).map(|_| rng.gen()).collect() + }; + + let ikm = ikm.as_ref(); + + + let key_info = key_info.unwrap_or(&[]); + let init_salt = "BBS-SIG-KEYGEN-SALT-".as_bytes(); + + // if ikm.len() < 32 { + // return Err(BadParams { + // cause: format!("Invalid ikm length. Needs to be at least 32 bytes long. Got {}", ikm.len()) + // }) + // } + + // L = ceil((3 * ceil(log2(r))) / 16) + const L: usize = 48; + const L_BYTES: [u8; 2] = (L as u16).to_be_bytes(); + + // salt = H(salt) + let mut hasher = Sha256::new(); + hasher.update(init_salt); + let salt = hasher.finalize(); + + // PRK = HKDF-Extract(salt, IKM || I2OSP(0, 1)) + let prk = Hkdf::::new( + Some(&salt), + &[ikm, &[0u8; 1][..]].concat() + ); + + // OKM = HKDF-Expand(PRK, key_info || I2OSP(L, 2), L) + let mut okm = [0u8; 64]; + + prk.expand( + &[&key_info, &L_BYTES[..]].concat(), + &mut okm[(64-L)..] + ).expect( + &format!("The HKDF-expand output cannot be more than {} bytes long", 255 * Sha256::output_size()) + ); + + okm.reverse(); // okm is in be format + let sk = Scalar::from_bytes_wide(&okm); + let pk: G2Projective = G2Affine::generator() * sk; + // let pk_affine = pk.to_affine(); + + // // transform secret key from le to be + // let mut sk_bytes = sk.to_bytes(); + // sk_bytes.reverse(); + + // BBSplusKeyPair::new(BBSplusSecretKey(sk), BBSplusPublicKey(pk)) + + Self{public: BBSplusPublicKey(pk), private: BBSplusSecretKey(sk)} + } + +} diff --git a/src/bbsplus/mod.rs b/src/bbsplus/mod.rs index d65cb59..e0f77b7 100644 --- a/src/bbsplus/mod.rs +++ b/src/bbsplus/mod.rs @@ -14,4 +14,9 @@ pub mod generators; pub mod ciphersuites; -pub mod tests; \ No newline at end of file +pub mod tests; +pub mod keys; +pub mod blind; +pub mod commitment; +pub mod signature; +pub mod proof; \ No newline at end of file diff --git a/src/signatures/proof.rs b/src/bbsplus/proof.rs similarity index 58% rename from src/signatures/proof.rs rename to src/bbsplus/proof.rs index 5827145..0c9b7a5 100644 --- a/src/signatures/proof.rs +++ b/src/bbsplus/proof.rs @@ -20,9 +20,9 @@ use elliptic_curve::{hash2curve::ExpandMsg, group::Curve}; use rug::{Integer, ops::Pow}; use serde::{Serialize, Deserialize}; -use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, signer_specific_generators}}, cl03::{ciphersuites::CLCiphersuite, sigma_protocols::{NISPSecrets, NISP2Commitments, NISPMultiSecrets, NISPSignaturePoK}, range_proof::{Boudot2000RangeProof, RangeProof}, bases::Bases}, keys::{bbsplus_key::BBSplusPublicKey, cl03_key::{CL03CommitmentPublicKey, CL03PublicKey}}, utils::util::{get_remaining_indexes, get_messages, calculate_domain, calculate_random_scalars, ScalarExt, hash_to_scalar_old}}; +use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, signer_specific_generators}}, cl03::{ciphersuites::CLCiphersuite, sigma_protocols::{NISPSecrets, NISP2Commitments, NISPMultiSecrets, NISPSignaturePoK}, range_proof::{Boudot2000RangeProof, RangeProof}, bases::Bases}, utils::util::{get_remaining_indexes, get_messages, calculate_domain, calculate_random_scalars, ScalarExt, hash_to_scalar_old}, schemes::generics::{ZKPoK, PoKSignature}}; -use super::{signature::{BBSplusSignature, CL03Signature}, commitment::{Commitment, CL03Commitment, BBSplusCommitment}}; +use super::{signature::BBSplusSignature, keys::BBSplusPublicKey, commitment::BBSplusCommitment}; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct BBSplusPoKSignature{ @@ -98,27 +98,8 @@ impl BBSplusPoKSignature { } } -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -struct ProofOfValue { - value: NISPSecrets, - commitment: CL03Commitment -} - -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub struct CL03PoKSignature { - spok: NISPSignaturePoK, - range_proof_e: Boudot2000RangeProof, - proofs_commited_mi: Vec, - range_proofs_commited_mi: Vec -} -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub enum PoKSignature{ - BBSplus(BBSplusPoKSignature), - CL03(CL03PoKSignature), - _Unreachable(PhantomData) -} impl PoKSignature> { @@ -368,106 +349,6 @@ impl PoKSignature> { } } -impl PoKSignature> { - - pub fn proof_gen(signature: &CL03Signature, commitment_pk: &CL03CommitmentPublicKey, signer_pk: &CL03PublicKey, a_bases: &Bases, messages: &[CL03Message], unrevealed_message_indexes: &[usize]) -> Self - where - CS::HashAlg: Digest - { - - let min_e = Integer::from(2).pow(CS::le - 1) + 1; - let max_e = Integer::from(2).pow(CS::le) - 1; - let min_x = Integer::from(0); - let max_x = Integer::from(2).pow(CS::lm) - 1; - - let spok = NISPSignaturePoK::nisp5_MultiAttr_generate_proof::(signature, commitment_pk, signer_pk, a_bases, messages, unrevealed_message_indexes); - - //range proof e - let r_proof_e = match CS::RANGEPROOF_ALG { - RangeProof::Boudot2000 => Boudot2000RangeProof::prove::(&signature.e, &spok.Ce, &commitment_pk.g_bases[0], &commitment_pk.h, &commitment_pk.N, &min_e, &max_e), - }; - - let mut proofs_mi: Vec = Vec::new(); - let mut r_proofs_mi: Vec = Vec::new(); - for i in unrevealed_message_indexes { - let mi = messages.get(*i).expect("unreaveled_message_indexes not valid with respect to the messages!"); - let gi = &commitment_pk.g_bases.get(*i).expect("unreaveled_message_indexes not valid with respect to the commitment_pk.g_bases!"); - let cmi = Commitment::>::commit_with_commitment_pk(&[mi.clone()], commitment_pk, None).cl03Commitment().to_owned(); - let proof_mi_ri = NISPSecrets::nisp2sec_generate_proof::(mi, &cmi, &gi, &commitment_pk.h, &commitment_pk.N); - proofs_mi.push(ProofOfValue { value: proof_mi_ri, commitment: cmi.clone()}); - let r_proof_mi = match CS::RANGEPROOF_ALG { - RangeProof::Boudot2000 => Boudot2000RangeProof::prove::(&mi.value, &cmi, &gi, &commitment_pk.h, &commitment_pk.N, &min_x, &max_x), - }; - - r_proofs_mi.push(r_proof_mi); - } - - - Self::CL03(CL03PoKSignature{spok, range_proof_e: r_proof_e, proofs_commited_mi: proofs_mi, range_proofs_commited_mi: r_proofs_mi}) - - } - - pub fn proof_verify(&self, commitment_pk: &CL03CommitmentPublicKey, signer_pk: &CL03PublicKey, a_bases: &Bases, messages: &[CL03Message], unrevealed_message_indexes: &[usize], n_signed_messages: usize) ->bool - where - CS::HashAlg: Digest - { - - let min_e = Integer::from(2).pow(CS::le - 1) + 1; - let max_e = Integer::from(2).pow(CS::le) - 1; - let min_x = Integer::from(0); - let max_x = Integer::from(2).pow(CS::lm) - 1; - let CLSPoK = self.to_cl03_proof(); - let boolean_spok = NISPSignaturePoK::nisp5_MultiAttr_verify_proof::(&CLSPoK.spok, commitment_pk, signer_pk, a_bases, messages, unrevealed_message_indexes, n_signed_messages); - if !boolean_spok { - println!("Signature PoK Failed!"); - return false; - } - if CLSPoK.spok.Ce.value == CLSPoK.range_proof_e.E { - //Verify RANGE PROOFS e - let boolean_rproof_e = CLSPoK.range_proof_e.verify::(&commitment_pk.g_bases[0], &commitment_pk.h, &commitment_pk.N, &min_e, &max_e); - - if boolean_rproof_e { - //Verify RANGE PROOFS mi - let mut idx: usize = 0; - for i in unrevealed_message_indexes { - - let gi = &commitment_pk.g_bases.get(*i).expect("unreaveled_message_indexes not valid with respect to the commitment_pk.g_bases!"); - let ProofOfValue{value: proof_mi, commitment: cmi} = CLSPoK.proofs_commited_mi.get(idx).expect("index overflow"); - let boolean_proof_mi = proof_mi.nisp2sec_verify_proof::(&cmi, gi, &commitment_pk.h, &commitment_pk.N); - if !boolean_proof_mi { - println!("Knowledge verification of mi Failed!"); - return false; - } - let boolean_rproofs_mi = CLSPoK.range_proofs_commited_mi.get(idx).expect("index overflow").verify::(&gi, &commitment_pk.h, &commitment_pk.N, &min_x, &max_x); - if !boolean_rproofs_mi { - println!("Range proof verification on mi Failed!"); - return false; - } - idx += 1; - } - } - else { - println!("Range proof verification on e Failed!"); - return false; - } - } - else { - println!("Commitment on 'e' used in the SPoK different from the one used in the Range Proof!"); - return false - } - - true - } - - - pub fn to_cl03_proof(&self) -> &CL03PoKSignature { - match self { - Self::CL03(inner) => inner, - _ => panic!("Cannot happen!") - } - } -} - @@ -567,24 +448,7 @@ impl BBSplusZKPoK { } -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub struct CL03ZKPoK { - proof_C_Ctrusted: Option, - proof_commited_msgs: NISPMultiSecrets, - proofs_commited_mi: Vec, - range_proofs_mi: Vec, - proof_r: ProofOfValue, - range_proof_r: Boudot2000RangeProof -} -impl CL03ZKPoK {} - -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub enum ZKPoK { - BBSplus(BBSplusZKPoK), - CL03(CL03ZKPoK), - _Unreachable(PhantomData) -} impl ZKPoK> @@ -618,135 +482,3 @@ impl ZKPoK> todo!() } } - - -impl ZKPoK> { - pub fn generate_proof(messages: &[CL03Message], C: &CL03Commitment, C_trusted: Option<&CL03Commitment>, signer_pk: &CL03PublicKey, a_bases: &Bases, commitment_pk: Option<&CL03CommitmentPublicKey>, unrevealed_message_indexes: &[usize]) -> Self - where - CS::HashAlg: Digest - { - let mut proof_C_Ctrusted: Option = None; - if let Some(C_trusted) = C_trusted { - if let Some(commitment_pk) = commitment_pk { - proof_C_Ctrusted = Some(NISP2Commitments::nisp2_generate_proof_MultiSecrets::( - messages, - C, - &C_trusted, - signer_pk, - a_bases, - commitment_pk, - unrevealed_message_indexes, - )); - } - } - - - let proof_msgs = NISPMultiSecrets::nispMultiSecrets_generate_proof::(messages, C, signer_pk, a_bases, Some(unrevealed_message_indexes)); - - let min_x = Integer::from(0); - let max_x = Integer::from(2).pow(CS::lm) - 1; - //RANGE PROOF on unrevealde messages - let mut proofs_mi: Vec = Vec::new(); - let mut r_proofs_msgs: Vec = Vec::new(); - for i in unrevealed_message_indexes { - let mi = messages.get(*i).expect("unreaveled_message_indexes not valid with respect to the messages!"); - let ai = &a_bases.0.get(*i).expect("unreaveled_message_indexes not valid with respect to the commitment_pk.g_bases!"); - let cmi = Commitment::>::commit_with_pk(&[mi.clone()], signer_pk, a_bases, None).cl03Commitment().to_owned(); - let proof_mi = NISPSecrets::nisp2sec_generate_proof::(mi, &cmi, &ai, &signer_pk.b, &signer_pk.N); - proofs_mi.push(ProofOfValue { value: proof_mi, commitment: cmi.clone()}); - match CS::RANGEPROOF_ALG { - RangeProof::Boudot2000 => { - let r_proof_mi = Boudot2000RangeProof::prove::(&mi.value, &cmi, &ai, &signer_pk.b, &signer_pk.N, &min_x, &max_x); - r_proofs_msgs.push(r_proof_mi); - }, - }; - } - - //RANGE PROOF on randomness of C - let min_r = Integer::from(0); - let max_r = Integer::from(2).pow(CS::ln) - 1; - let r = CL03Message::new(C.randomness.clone()); - let cr = Commitment::>::commit_with_pk(&[r.clone()], &signer_pk, a_bases, None); - let proof_r = ProofOfValue{value: NISPSecrets::nisp2sec_generate_proof::(&r, cr.cl03Commitment(), &a_bases.0[0], &signer_pk.b, &signer_pk.N), commitment: cr.cl03Commitment().to_owned()}; - - let rproof_r = match CS::RANGEPROOF_ALG { - RangeProof::Boudot2000 => Boudot2000RangeProof::prove::(&r.value, cr.cl03Commitment(), &a_bases.0[0], &signer_pk.b, &signer_pk.N, &min_r, &max_r), - }; - - - Self::CL03(CL03ZKPoK{proof_C_Ctrusted, proof_commited_msgs: proof_msgs, proofs_commited_mi: proofs_mi, range_proofs_mi: r_proofs_msgs, proof_r: proof_r, range_proof_r: rproof_r}) - } - - pub fn verify_proof(&self, C: &CL03Commitment, C_trusted: Option<&CL03Commitment>, signer_pk: &CL03PublicKey, a_bases: &Bases, commitment_pk: Option<&CL03CommitmentPublicKey>, unrevealed_message_indexes: &[usize]) -> bool - where - CS::HashAlg: Digest - { - let zkpok = self.to_cl03_zkpok(); - - let mut boolean_C_Ctrusted: bool = true; - if let Some(C_trusted) = C_trusted { - if let Some(commitment_pk) = commitment_pk { - boolean_C_Ctrusted = zkpok.proof_C_Ctrusted.clone().unwrap().nisp2_verify_proof_MultiSecrets::(C, C_trusted, signer_pk, a_bases, commitment_pk, unrevealed_message_indexes); - } - } - - if !boolean_C_Ctrusted { - println!("The trusted commitment is different from commitment received!"); - return false; - } - - - let boolean_proof_msgs = zkpok.proof_commited_msgs.nispMultiSecrets_verify_proof::(C, signer_pk, a_bases, Some(unrevealed_message_indexes)); - - if !boolean_proof_msgs { - println!("Verification of the PoK of secrets Failed!"); - return false; - } - - let min_x = Integer::from(0); - let max_x = Integer::from(2).pow(CS::lm) - 1; - let mut idx = 0usize; - - for i in unrevealed_message_indexes { - let ai = &a_bases.0.get(*i).expect("unreaveled_message_indexes not valid with respect to the messages!"); - let proof_mi = zkpok.proofs_commited_mi.get(idx).expect("index overflow"); - let boolean_proof_mi = proof_mi.value.nisp2sec_verify_proof::(&proof_mi.commitment, ai, &signer_pk.b, &signer_pk.N); - - if !boolean_proof_mi { - println!("Verification of the Proof of Knowledge of m{}. Failed!", i); - return false; - } - let rproof_mi = zkpok.range_proofs_mi.get(idx).expect("index overflow"); - let boolean_rproof_mi = rproof_mi.verify::(&ai, &signer_pk.b, &signer_pk.N,&min_x, &max_x); - if !boolean_rproof_mi { - println!("Verification of the Range Proof of m{}. Failed", i); - return false; - } - - idx += 1; - } - - let boolean_proof_r = zkpok.proof_r.value.nisp2sec_verify_proof::(&zkpok.proof_r.commitment, &a_bases.0[0], &signer_pk.b, &signer_pk.N); - if !boolean_proof_r { - println!("Verification of the Proof of Knowledge of r. Failed!"); - return false; - } - - let min_r = Integer::from(0); - let max_r = Integer::from(2).pow(CS::ln) - 1; - let boolean_rproof_r = zkpok.range_proof_r.verify::(&a_bases.0[0], &signer_pk.b, &signer_pk.N, &min_r, &max_r); - if !boolean_rproof_r { - println!("Verification of the Range Proof of r. Failed"); - return false; - } - - true - } - - pub fn to_cl03_zkpok(&self) -> &CL03ZKPoK { - match self { - Self::CL03(inner) => &inner, - _ => panic!("Cannot happen!") - } - } -} \ No newline at end of file diff --git a/src/signatures/signature.rs b/src/bbsplus/signature.rs similarity index 65% rename from src/signatures/signature.rs rename to src/bbsplus/signature.rs index 6d09b51..d85319a 100644 --- a/src/signatures/signature.rs +++ b/src/bbsplus/signature.rs @@ -19,10 +19,12 @@ use ff::Field; use rug::{Integer, ops::Pow, integer::Order}; use serde::{Deserialize, Serialize}; -use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{CL03Message, BBSplusMessage}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, self, signer_specific_generators, make_generators}}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{random::{random_prime, random_bits}, util::{calculate_domain, serialize, hash_to_scalar_old}}, keys::{cl03_key::{CL03PublicKey, CL03SecretKey}, bbsplus_key::{BBSplusSecretKey, BBSplusPublicKey}}}; +use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{CL03Message, BBSplusMessage}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, self, signer_specific_generators, make_generators}}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{random::{random_prime, random_bits}, util::{calculate_domain, serialize, hash_to_scalar_old}}, schemes::generics::Signature}; use elliptic_curve::{hash2curve::ExpandMsg, group::Curve, subtle::{CtOption, Choice}}; +use super::keys::{BBSplusPublicKey, BBSplusSecretKey}; + #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] @@ -63,20 +65,6 @@ impl BBSplusSignature { } -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub struct CL03Signature { - pub(crate) e: Integer, - pub(crate) s: Integer, - pub(crate) v: Integer, -} - -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub enum Signature { - BBSplus(BBSplusSignature), - CL03(CL03Signature), - _Unreachable(PhantomData) -} - impl Signature> { pub fn a(&self) -> G1Projective { @@ -233,100 +221,4 @@ impl Signature> { pub fn from_bytes(data: &[u8; 112]) -> Self { Self::BBSplus(BBSplusSignature::from_bytes(data).unwrap()) } -} - -impl Signature> { - - pub fn sign(pk: &CL03PublicKey, sk: &CL03SecretKey, a_bases: &Bases, message: &CL03Message) -> Self { - let mut e = random_prime(CS::le); - let phi_n = (&sk.p - Integer::from(1)) * (&sk.q - Integer::from(1)); - - while ((&e > &Integer::from(2).pow(CS::le-1)) && (&e < &Integer::from(2).pow(CS::le)) && (Integer::from(e.gcd_ref(&phi_n)) == 1)) == false { - e = random_prime(CS::le); - } - - let s = random_bits(CS::ls); - let e2n = Integer::from(e.invert_ref(&phi_n).unwrap()); - // v = powmod((powmod(pk['a0'], m, pk['N']) * powmod(pk['b'], s, pk['N']) * pk['c']), (e2n), pk['N']) - let v = ((Integer::from(a_bases.0[0].pow_mod_ref(&message.value, &pk.N).unwrap())) * Integer::from(pk.b.pow_mod_ref(&s, &pk.N).unwrap()) * &pk.c).pow_mod(&e2n, &pk.N).unwrap(); - - let sig = CL03Signature{e, s, v}; - Self::CL03(sig) - } - - //TODO: tenere solo verify_multiattr visto che funzione anche con un solo messaggio? - pub fn verify(&self, pk: &CL03PublicKey, a_bases: &Bases, message: &CL03Message) -> bool { - - let sign = self.cl03Signature(); - - let lhs = Integer::from(sign.v.pow_mod_ref(&sign.e,&pk.N).unwrap()); - - let rhs = (Integer::from(a_bases.0[0].pow_mod_ref(&message.value, &pk.N).unwrap()) * Integer::from(pk.b.pow_mod_ref(&sign.s, &pk.N).unwrap()) * &pk.c) % &pk.N; - - if sign.e <= Integer::from(2).pow(CS::le-1) || sign.e >= Integer::from(2).pow(CS::le) { - return false - } - - if lhs == rhs { - return true - } - - false - } - - pub fn verify_multiattr(&self, pk: &CL03PublicKey, a_bases: &Bases, messages: &[CL03Message]) -> bool{ - if messages.len() > a_bases.0.len() { - panic!("Not enought a_bases!"); - } - - let sign = self.cl03Signature(); - - let lhs = Integer::from(sign.v.pow_mod_ref(&sign.e,&pk.N).unwrap()); - - let mut rhs = Integer::from(1); - - messages.iter().enumerate().for_each(|(i,m)| rhs = &rhs * Integer::from(a_bases.0[i].pow_mod_ref(&m.value, &pk.N).unwrap()) ); - - rhs = (&rhs * Integer::from(pk.b.pow_mod_ref(&sign.s, &pk.N).unwrap()) * &pk.c) % &pk.N; - - if sign.e <= Integer::from(2).pow(CS::le -1) { - return false; - } - - if lhs == rhs { - return true; - } - - false - } - - pub fn cl03Signature(&self) -> &CL03Signature{ - match self { - Self::CL03(inner) => inner, - _ => panic!("Cannot happen!") - } - } - - pub fn to_bytes(&self) -> Vec{ - let signature = self.cl03Signature(); - let mut bytes: Vec = Vec::new(); - let mut e_digits = vec!(0u8; CS::le as usize); - let mut s_digits = vec!(0u8; CS::ls as usize); - signature.e.write_digits(&mut e_digits, Order::MsfBe); - signature.s.write_digits(&mut s_digits, Order::MsfBe); - bytes.extend_from_slice(&e_digits); - bytes.extend_from_slice(&s_digits); - bytes.extend_from_slice(&signature.v.to_digits(Order::MsfBe)); - - bytes - } - - pub fn from_bytes(bytes: &[u8]) -> Self { - let e = Integer::from_digits(&bytes[0usize .. CS::le as usize], Order::MsfBe); - let s = Integer::from_digits(&bytes[CS::le as usize .. (CS::le as usize + CS::ls as usize)], Order::MsfBe); - let v = Integer::from_digits(&bytes[(CS::le as usize + CS::ls as usize) ..], Order::MsfBe); - - Self::CL03(CL03Signature { e, s, v }) - } -} - +} \ No newline at end of file diff --git a/src/bbsplus/tests.rs b/src/bbsplus/tests.rs index ff2be7e..7074f9a 100644 --- a/src/bbsplus/tests.rs +++ b/src/bbsplus/tests.rs @@ -18,7 +18,7 @@ use bbsplus::ciphersuites::BbsCiphersuite; use elliptic_curve::{hash2curve::ExpandMsg, group::Curve}; use schemes::algorithms::Scheme; -use crate::{utils::message::BBSplusMessage, bbsplus::{self, generators::{make_generators, global_generators}}, schemes::{self, algorithms::BBSplus}, signatures::{signature::{BBSplusSignature, Signature}, proof::{PoKSignature, ZKPoK}, commitment::Commitment, blind::BlindSignature}, keys::{bbsplus_key::{BBSplusSecretKey, BBSplusPublicKey}, pair::KeyPair}, utils::{util::{hash_to_scalar_old, ScalarExt, calculate_random_scalars, get_messages}, message::Message}}; +use crate::{utils::message::BBSplusMessage, bbsplus::{self, generators::{make_generators, global_generators}, keys::{BBSplusSecretKey, BBSplusPublicKey}, signature::BBSplusSignature}, schemes::{self, algorithms::BBSplus}, schemes::generics::{Signature, PoKSignature, ZKPoK, Commitment, BlindSignature}, keys::pair::KeyPair, utils::{util::{hash_to_scalar_old, ScalarExt, calculate_random_scalars, get_messages}, message::Message}}; pub(crate) fn key_pair_gen(filename: &str) where diff --git a/src/cl03/bases.rs b/src/cl03/bases.rs index e60f9d5..c4bb1da 100644 --- a/src/cl03/bases.rs +++ b/src/cl03/bases.rs @@ -16,7 +16,9 @@ use rug::Integer; use serde::{Serialize, Deserialize}; -use crate::{keys::cl03_key::CL03PublicKey, utils::random::random_qr}; +use crate::utils::random::random_qr; + +use super::keys::CL03PublicKey; #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Bases(pub Vec); diff --git a/src/cl03/blind.rs b/src/cl03/blind.rs new file mode 100644 index 0000000..618a2aa --- /dev/null +++ b/src/cl03/blind.rs @@ -0,0 +1,109 @@ +// Copyright 2023 Fondazione LINKS + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +use std::panic; +use digest::Digest; +use rug::{Integer, ops::Pow}; +use serde::{Deserialize, Serialize}; + +use crate::{schemes::algorithms::{CL03}, utils::message::{BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, signer_specific_generators}}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{random::{random_prime, random_bits}, util::{calculate_domain, ScalarExt, hash_to_scalar_old}}, errors::BlindSignError, schemes::generics::{BlindSignature, Commitment, Signature, ZKPoK}}; + +use super::{keys::{CL03SecretKey, CL03PublicKey, CL03CommitmentPublicKey}, commitment::CL03Commitment, signature::CL03Signature}; + + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub struct CL03BlindSignature { + pub(crate) e: Integer, + pub(crate) rprime: Integer, + pub(crate) v: Integer, +} + + +impl BlindSignature> { + + pub fn e(&self) -> &Integer { + match self { + Self::CL03(inner) => &inner.e, + _ => panic!("Cannot happen!"), + } + } + + pub fn rprime(&self) -> &Integer { + match self { + Self::CL03(inner) => &inner.rprime, + _ => panic!("Cannot happen!"), + } + } + + pub fn v(&self) -> &Integer { + match self { + Self::CL03(inner) => &inner.v, + _ => panic!("Cannot happen!"), + } + } + + //TODO: ("remove the indexes"); + + pub fn blind_sign(pk: &CL03PublicKey, sk: &CL03SecretKey, a_bases: &Bases, zkpok: &ZKPoK>, revealed_messages: Option<&[CL03Message]>, C: &CL03Commitment, C_trusted: Option<&CL03Commitment>, commitment_pk: Option<&CL03CommitmentPublicKey>, unrevealed_message_indexes: &[usize], revealed_message_indexes: Option<&[usize]>) -> Self + where + CS::HashAlg: Digest + { + + if !zkpok.verify_proof(C, C_trusted, pk, a_bases, commitment_pk, unrevealed_message_indexes) { + panic!("Knowledge of committed secrets not verified"); + } + + let mut extended_commitment: Commitment> = Commitment::CL03(C.clone()); + if revealed_messages.is_some() && revealed_message_indexes.is_some() { + extended_commitment.extend_commitment_with_pk(revealed_messages.unwrap(), pk, a_bases, revealed_message_indexes); + } + let mut e = random_prime(CS::le); + let phi_n = (&sk.p - Integer::from(1)) * (&sk.q - Integer::from(1)); + while ((&e > &Integer::from(2).pow(CS::le-1)) && (&e < &Integer::from(2).pow(CS::le)) && (Integer::from(e.gcd_ref(&phi_n)) == 1)) == false { + e = random_prime(CS::le); + } + + let rprime = random_bits(CS::ls); + let e2n = Integer::from(e.invert_ref(&phi_n).unwrap()); + + // v = powmod(((Cx) * powmod(pk['b'], rprime, pk['N']) * pk['c']), e2n, pk['N']) + let v = Integer::from((extended_commitment.value() * Integer::from(pk.b.pow_mod_ref(&rprime, &pk.N).unwrap()) * &pk.c).pow_mod_ref(&e2n, &pk.N).unwrap()); + let sig = CL03BlindSignature{e, rprime, v}; + // sig = { 'e':e, 'rprime':rprime, 'v':v } + + Self::CL03(sig) + + } + + pub fn unblind_sign(&self, commitment: &Commitment>) -> Signature> { + let s = commitment.randomness().clone() + self.rprime(); + Signature::CL03(CL03Signature { e: self.e().clone(), s, v: self.v().clone()}) + } + + pub fn update_signature(&self, revealed_messages: Option<&[CL03Message]>, C: &CL03Commitment, sk: &CL03SecretKey, pk: &CL03PublicKey, a_bases: &Bases, revealed_message_indexes: Option<&[usize]>) -> Self { + let mut extended_commitment: Commitment> = Commitment::CL03(C.clone()); + if revealed_messages.is_some() && revealed_message_indexes.is_some() { + extended_commitment.extend_commitment_with_pk(revealed_messages.unwrap(), pk, a_bases, revealed_message_indexes); + } + + let phi_N = (&sk.p - Integer::from(1)) * (&sk.q - Integer::from(1)); + let e2n = Integer::from(self.e().invert_ref(&phi_N).unwrap()); + + let v = Integer::from((extended_commitment.value() * Integer::from(pk.b.pow_mod_ref(self.rprime(), &pk.N).unwrap()) * &pk.c).pow_mod_ref(&e2n, &pk.N).unwrap()); + + let sig = CL03BlindSignature{e: self.e().clone(), rprime: self.rprime().clone(), v}; + Self::CL03(sig) + } +} \ No newline at end of file diff --git a/src/signatures/commitment.rs b/src/cl03/commitment.rs similarity index 70% rename from src/signatures/commitment.rs rename to src/cl03/commitment.rs index 72857b0..cff2fc4 100644 --- a/src/signatures/commitment.rs +++ b/src/cl03/commitment.rs @@ -17,7 +17,9 @@ use elliptic_curve::hash2curve::ExpandMsg; use rug::Integer; use serde::{Deserialize, Serialize}; -use crate::{utils::message::{Message, BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, global_generators}}, schemes::algorithms::{Scheme, BBSplus, CL03}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{util::{calculate_random_scalars, subgroup_check_g1}, random::random_bits}, keys::cl03_key::{CL03PublicKey, CL03CommitmentPublicKey}}; +use crate::{utils::message::{Message, BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, global_generators}}, schemes::algorithms::{Scheme, BBSplus, CL03}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{util::{calculate_random_scalars, subgroup_check_g1}, random::random_bits}, schemes::generics::Commitment}; + +use super::keys::{CL03CommitmentPublicKey, CL03PublicKey}; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] @@ -27,94 +29,6 @@ pub struct CL03Commitment { } -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub struct BBSplusCommitment { - pub value: G1Projective, - pub s_prime: Scalar -} - -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub enum Commitment { - BBSplus(BBSplusCommitment), - CL03(CL03Commitment), - _Unreachable(std::marker::PhantomData) -} - -impl Commitment> { - - pub fn commit(messages: &[BBSplusMessage], generators: Option<&Generators>, unrevealed_message_indexes: &[usize]) -> Self - where - CS::Expander: for<'a> ExpandMsg<'a>, - { - - let s_prime = calculate_random_scalars::(1, None); - - if unrevealed_message_indexes.is_empty() { - panic!("Unrevealed message indexes empty"); - } - - let get_generators_fn = make_generators::; - - let gens: Generators; - if generators.is_none() { - gens = global_generators(get_generators_fn, unrevealed_message_indexes.iter().max().unwrap()+3).to_owned().clone(); - } - else { - gens = generators.unwrap().clone(); - } - - - if unrevealed_message_indexes.iter().max().unwrap() >= &gens.message_generators.len() { - panic!("Non enought generators!"); - } - - if subgroup_check_g1(gens.g1_base_point) == false { - panic!("Failed subgroup check"); - } - - for i in unrevealed_message_indexes { - if subgroup_check_g1(gens.message_generators[*i]) == false { - panic!("Failed subgroup check"); - } - } - - let mut commitment = gens.q1 * s_prime[0]; - - // let mut index: usize = 0; - - for i in unrevealed_message_indexes { - // commitment = commitment + (gens.message_generators[*i] * Scalar::from_bytes(&messages[index].to_bytes()).unwrap()); - commitment += gens.message_generators.get(*i).expect("index overflow") * &messages.get(*i).expect("Index overflow").get_value(); - - // index = index + 1; - } - - Self::BBSplus(BBSplusCommitment{value: commitment, s_prime: s_prime[0]}) - - } - - pub fn value(&self) -> &G1Projective { - match self { - Self::BBSplus(inner) => &inner.value, - _ => panic!("Cannot happen!") - } - } - - pub fn bbsPlusCommitment(&self) -> &BBSplusCommitment { - match self { - Self::BBSplus(inner) => &inner, - _ => panic!("Cannot happen!"), - } - } - - pub fn s_prime(&self) -> &Scalar { - match self { - Self::BBSplus(inner) => &inner.s_prime, - _ => panic!("Cannot happen!") - } - } -} - impl Commitment> { pub(crate) fn commit_v(v: &Integer, commitment_pk: &CL03CommitmentPublicKey) -> Self { @@ -245,4 +159,4 @@ impl Commitment> { _ => panic!("Cannot happen!") } } -} \ No newline at end of file +} diff --git a/src/keys/cl03_key.rs b/src/cl03/keys.rs similarity index 75% rename from src/keys/cl03_key.rs rename to src/cl03/keys.rs index 280be72..b6a9241 100644 --- a/src/keys/cl03_key.rs +++ b/src/cl03/keys.rs @@ -15,7 +15,7 @@ use rug::{Integer, integer::{IsPrime, Order}}; use serde::{Serialize, Deserialize}; -use crate::{utils::random::{random_prime, random_qr, random_number}, cl03::ciphersuites::CLCiphersuite, schemes::algorithms::Scheme}; +use crate::{utils::random::{random_prime, random_qr, random_number}, cl03::ciphersuites::CLCiphersuite, schemes::algorithms::{Scheme, CL03}, keys::{traits::{PublicKey, PrivateKey}, pair::KeyPair}}; #[derive(Clone, PartialEq, PartialOrd, Eq, Hash, Debug, Ord, Serialize, Deserialize)] @@ -116,6 +116,84 @@ impl CL03SecretKey{ } + + +impl PublicKey for CL03PublicKey{ + type Output = [u8; 512]; + // type Params = (Integer, Integer, Integer, Vec<(Integer, bool)>); + fn encode(&self) -> String { + todo!() + } + + fn to_bytes(&self) -> Self::Output { + todo!() + } + + // fn get_params(&self) -> (Integer, Integer, Integer, Vec<(Integer, bool)>) { + // (self.N.clone(), self.b.clone(), self.c.clone(), self.a_bases.clone()) + // } +} + +impl PrivateKey for CL03SecretKey{ + type Output = [u8; 512]; + fn encode(&self) -> String { + todo!() + } + + fn to_bytes(&self) -> Self::Output { + todo!() + } +} + + + + +impl KeyPair>{ + + pub fn generate() -> Self { + let n = CS::SECPARAM; + let mut pprime = random_prime(n); + let mut p = Integer::from(2) * pprime.clone() + Integer::from(1); + loop{ + if p.is_probably_prime(50) !=IsPrime::No { + break; + } + pprime = random_prime(n); + p = Integer::from(2) * pprime + Integer::from(1); + } + + let mut qprime = random_prime(n); + let mut q = Integer::from(2) * qprime.clone() + Integer::from(1); + loop{ + if p != q && q.is_probably_prime(100) !=IsPrime::No { + break; + } + qprime = random_prime(n); + q = Integer::from(2) * qprime + Integer::from(1); + } + + let N = p.clone() * q.clone(); + + // let mut a_bases: Vec = Vec::new(); + + // let n_attr = n_attributes.unwrap_or(1); + // for _i in 0..n_attr { + // let a = random_qr(&N); + // a_bases.push(a); + // } + + let b = random_qr(&N); + let c = random_qr(&N); + + let pk = CL03PublicKey::new(N, b, c); + let sk = CL03SecretKey::new(p, q); + + Self{public: pk, private: sk} + } +} + + + pub struct CL03CommitmentPublicKey { pub N: Integer, pub h: Integer, @@ -185,3 +263,4 @@ impl CL03CommitmentPublicKey { CL03CommitmentPublicKey{N: N, h: h, g_bases: g_bases} } } + diff --git a/src/cl03/mod.rs b/src/cl03/mod.rs index 945afb3..900b11e 100644 --- a/src/cl03/mod.rs +++ b/src/cl03/mod.rs @@ -16,4 +16,9 @@ pub mod ciphersuites; pub mod tests; pub mod sigma_protocols; pub mod range_proof; -pub mod bases; \ No newline at end of file +pub mod bases; +pub mod keys; +pub mod blind; +pub mod commitment; +pub mod signature; +pub mod proof; \ No newline at end of file diff --git a/src/cl03/proof.rs b/src/cl03/proof.rs new file mode 100644 index 0000000..40e94ba --- /dev/null +++ b/src/cl03/proof.rs @@ -0,0 +1,291 @@ +// Copyright 2023 Fondazione LINKS + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::marker::PhantomData; + +use bls12_381_plus::{G1Projective, Scalar, G2Projective, G2Prepared, Gt, multi_miller_loop, G1Affine}; +use digest::Digest; +use elliptic_curve::{hash2curve::ExpandMsg, group::Curve}; +use rug::{Integer, ops::Pow}; +use serde::{Serialize, Deserialize}; + +use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, signer_specific_generators}}, cl03::{ciphersuites::CLCiphersuite, sigma_protocols::{NISPSecrets, NISP2Commitments, NISPMultiSecrets, NISPSignaturePoK}, range_proof::{Boudot2000RangeProof, RangeProof}, bases::Bases}, utils::util::{get_remaining_indexes, get_messages, calculate_domain, calculate_random_scalars, ScalarExt, hash_to_scalar_old}, schemes::generics::{ZKPoK, PoKSignature, Commitment}}; + +use super::{signature::CL03Signature, commitment::CL03Commitment, keys::{CL03CommitmentPublicKey, CL03PublicKey}}; + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +struct ProofOfValue { + value: NISPSecrets, + commitment: CL03Commitment +} + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub struct CL03PoKSignature { + spok: NISPSignaturePoK, + range_proof_e: Boudot2000RangeProof, + proofs_commited_mi: Vec, + range_proofs_commited_mi: Vec +} + + + + +impl PoKSignature> { + + pub fn proof_gen(signature: &CL03Signature, commitment_pk: &CL03CommitmentPublicKey, signer_pk: &CL03PublicKey, a_bases: &Bases, messages: &[CL03Message], unrevealed_message_indexes: &[usize]) -> Self + where + CS::HashAlg: Digest + { + + let min_e = Integer::from(2).pow(CS::le - 1) + 1; + let max_e = Integer::from(2).pow(CS::le) - 1; + let min_x = Integer::from(0); + let max_x = Integer::from(2).pow(CS::lm) - 1; + + let spok = NISPSignaturePoK::nisp5_MultiAttr_generate_proof::(signature, commitment_pk, signer_pk, a_bases, messages, unrevealed_message_indexes); + + //range proof e + let r_proof_e = match CS::RANGEPROOF_ALG { + RangeProof::Boudot2000 => Boudot2000RangeProof::prove::(&signature.e, &spok.Ce, &commitment_pk.g_bases[0], &commitment_pk.h, &commitment_pk.N, &min_e, &max_e), + }; + + let mut proofs_mi: Vec = Vec::new(); + let mut r_proofs_mi: Vec = Vec::new(); + for i in unrevealed_message_indexes { + let mi = messages.get(*i).expect("unreaveled_message_indexes not valid with respect to the messages!"); + let gi = &commitment_pk.g_bases.get(*i).expect("unreaveled_message_indexes not valid with respect to the commitment_pk.g_bases!"); + let cmi = Commitment::>::commit_with_commitment_pk(&[mi.clone()], commitment_pk, None).cl03Commitment().to_owned(); + let proof_mi_ri = NISPSecrets::nisp2sec_generate_proof::(mi, &cmi, &gi, &commitment_pk.h, &commitment_pk.N); + proofs_mi.push(ProofOfValue { value: proof_mi_ri, commitment: cmi.clone()}); + let r_proof_mi = match CS::RANGEPROOF_ALG { + RangeProof::Boudot2000 => Boudot2000RangeProof::prove::(&mi.value, &cmi, &gi, &commitment_pk.h, &commitment_pk.N, &min_x, &max_x), + }; + + r_proofs_mi.push(r_proof_mi); + } + + + Self::CL03(CL03PoKSignature{spok, range_proof_e: r_proof_e, proofs_commited_mi: proofs_mi, range_proofs_commited_mi: r_proofs_mi}) + + } + + pub fn proof_verify(&self, commitment_pk: &CL03CommitmentPublicKey, signer_pk: &CL03PublicKey, a_bases: &Bases, messages: &[CL03Message], unrevealed_message_indexes: &[usize], n_signed_messages: usize) ->bool + where + CS::HashAlg: Digest + { + + let min_e = Integer::from(2).pow(CS::le - 1) + 1; + let max_e = Integer::from(2).pow(CS::le) - 1; + let min_x = Integer::from(0); + let max_x = Integer::from(2).pow(CS::lm) - 1; + let CLSPoK = self.to_cl03_proof(); + let boolean_spok = NISPSignaturePoK::nisp5_MultiAttr_verify_proof::(&CLSPoK.spok, commitment_pk, signer_pk, a_bases, messages, unrevealed_message_indexes, n_signed_messages); + if !boolean_spok { + println!("Signature PoK Failed!"); + return false; + } + if CLSPoK.spok.Ce.value == CLSPoK.range_proof_e.E { + //Verify RANGE PROOFS e + let boolean_rproof_e = CLSPoK.range_proof_e.verify::(&commitment_pk.g_bases[0], &commitment_pk.h, &commitment_pk.N, &min_e, &max_e); + + if boolean_rproof_e { + //Verify RANGE PROOFS mi + let mut idx: usize = 0; + for i in unrevealed_message_indexes { + + let gi = &commitment_pk.g_bases.get(*i).expect("unreaveled_message_indexes not valid with respect to the commitment_pk.g_bases!"); + let ProofOfValue{value: proof_mi, commitment: cmi} = CLSPoK.proofs_commited_mi.get(idx).expect("index overflow"); + let boolean_proof_mi = proof_mi.nisp2sec_verify_proof::(&cmi, gi, &commitment_pk.h, &commitment_pk.N); + if !boolean_proof_mi { + println!("Knowledge verification of mi Failed!"); + return false; + } + let boolean_rproofs_mi = CLSPoK.range_proofs_commited_mi.get(idx).expect("index overflow").verify::(&gi, &commitment_pk.h, &commitment_pk.N, &min_x, &max_x); + if !boolean_rproofs_mi { + println!("Range proof verification on mi Failed!"); + return false; + } + idx += 1; + } + } + else { + println!("Range proof verification on e Failed!"); + return false; + } + } + else { + println!("Commitment on 'e' used in the SPoK different from the one used in the Range Proof!"); + return false + } + + true + } + + + pub fn to_cl03_proof(&self) -> &CL03PoKSignature { + match self { + Self::CL03(inner) => inner, + _ => panic!("Cannot happen!") + } + } +} + + + + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub struct CL03ZKPoK { + proof_C_Ctrusted: Option, + proof_commited_msgs: NISPMultiSecrets, + proofs_commited_mi: Vec, + range_proofs_mi: Vec, + proof_r: ProofOfValue, + range_proof_r: Boudot2000RangeProof +} + +impl CL03ZKPoK {} + + + + +impl ZKPoK> { + pub fn generate_proof(messages: &[CL03Message], C: &CL03Commitment, C_trusted: Option<&CL03Commitment>, signer_pk: &CL03PublicKey, a_bases: &Bases, commitment_pk: Option<&CL03CommitmentPublicKey>, unrevealed_message_indexes: &[usize]) -> Self + where + CS::HashAlg: Digest + { + let mut proof_C_Ctrusted: Option = None; + if let Some(C_trusted) = C_trusted { + if let Some(commitment_pk) = commitment_pk { + proof_C_Ctrusted = Some(NISP2Commitments::nisp2_generate_proof_MultiSecrets::( + messages, + C, + &C_trusted, + signer_pk, + a_bases, + commitment_pk, + unrevealed_message_indexes, + )); + } + } + + + let proof_msgs = NISPMultiSecrets::nispMultiSecrets_generate_proof::(messages, C, signer_pk, a_bases, Some(unrevealed_message_indexes)); + + let min_x = Integer::from(0); + let max_x = Integer::from(2).pow(CS::lm) - 1; + //RANGE PROOF on unrevealde messages + let mut proofs_mi: Vec = Vec::new(); + let mut r_proofs_msgs: Vec = Vec::new(); + for i in unrevealed_message_indexes { + let mi = messages.get(*i).expect("unreaveled_message_indexes not valid with respect to the messages!"); + let ai = &a_bases.0.get(*i).expect("unreaveled_message_indexes not valid with respect to the commitment_pk.g_bases!"); + let cmi = Commitment::>::commit_with_pk(&[mi.clone()], signer_pk, a_bases, None).cl03Commitment().to_owned(); + let proof_mi = NISPSecrets::nisp2sec_generate_proof::(mi, &cmi, &ai, &signer_pk.b, &signer_pk.N); + proofs_mi.push(ProofOfValue { value: proof_mi, commitment: cmi.clone()}); + match CS::RANGEPROOF_ALG { + RangeProof::Boudot2000 => { + let r_proof_mi = Boudot2000RangeProof::prove::(&mi.value, &cmi, &ai, &signer_pk.b, &signer_pk.N, &min_x, &max_x); + r_proofs_msgs.push(r_proof_mi); + }, + }; + } + + //RANGE PROOF on randomness of C + let min_r = Integer::from(0); + let max_r = Integer::from(2).pow(CS::ln) - 1; + let r = CL03Message::new(C.randomness.clone()); + let cr = Commitment::>::commit_with_pk(&[r.clone()], &signer_pk, a_bases, None); + let proof_r = ProofOfValue{value: NISPSecrets::nisp2sec_generate_proof::(&r, cr.cl03Commitment(), &a_bases.0[0], &signer_pk.b, &signer_pk.N), commitment: cr.cl03Commitment().to_owned()}; + + let rproof_r = match CS::RANGEPROOF_ALG { + RangeProof::Boudot2000 => Boudot2000RangeProof::prove::(&r.value, cr.cl03Commitment(), &a_bases.0[0], &signer_pk.b, &signer_pk.N, &min_r, &max_r), + }; + + + Self::CL03(CL03ZKPoK{proof_C_Ctrusted, proof_commited_msgs: proof_msgs, proofs_commited_mi: proofs_mi, range_proofs_mi: r_proofs_msgs, proof_r: proof_r, range_proof_r: rproof_r}) + } + + pub fn verify_proof(&self, C: &CL03Commitment, C_trusted: Option<&CL03Commitment>, signer_pk: &CL03PublicKey, a_bases: &Bases, commitment_pk: Option<&CL03CommitmentPublicKey>, unrevealed_message_indexes: &[usize]) -> bool + where + CS::HashAlg: Digest + { + let zkpok = self.to_cl03_zkpok(); + + let mut boolean_C_Ctrusted: bool = true; + if let Some(C_trusted) = C_trusted { + if let Some(commitment_pk) = commitment_pk { + boolean_C_Ctrusted = zkpok.proof_C_Ctrusted.clone().unwrap().nisp2_verify_proof_MultiSecrets::(C, C_trusted, signer_pk, a_bases, commitment_pk, unrevealed_message_indexes); + } + } + + if !boolean_C_Ctrusted { + println!("The trusted commitment is different from commitment received!"); + return false; + } + + + let boolean_proof_msgs = zkpok.proof_commited_msgs.nispMultiSecrets_verify_proof::(C, signer_pk, a_bases, Some(unrevealed_message_indexes)); + + if !boolean_proof_msgs { + println!("Verification of the PoK of secrets Failed!"); + return false; + } + + let min_x = Integer::from(0); + let max_x = Integer::from(2).pow(CS::lm) - 1; + let mut idx = 0usize; + + for i in unrevealed_message_indexes { + let ai = &a_bases.0.get(*i).expect("unreaveled_message_indexes not valid with respect to the messages!"); + let proof_mi = zkpok.proofs_commited_mi.get(idx).expect("index overflow"); + let boolean_proof_mi = proof_mi.value.nisp2sec_verify_proof::(&proof_mi.commitment, ai, &signer_pk.b, &signer_pk.N); + + if !boolean_proof_mi { + println!("Verification of the Proof of Knowledge of m{}. Failed!", i); + return false; + } + let rproof_mi = zkpok.range_proofs_mi.get(idx).expect("index overflow"); + let boolean_rproof_mi = rproof_mi.verify::(&ai, &signer_pk.b, &signer_pk.N,&min_x, &max_x); + if !boolean_rproof_mi { + println!("Verification of the Range Proof of m{}. Failed", i); + return false; + } + + idx += 1; + } + + let boolean_proof_r = zkpok.proof_r.value.nisp2sec_verify_proof::(&zkpok.proof_r.commitment, &a_bases.0[0], &signer_pk.b, &signer_pk.N); + if !boolean_proof_r { + println!("Verification of the Proof of Knowledge of r. Failed!"); + return false; + } + + let min_r = Integer::from(0); + let max_r = Integer::from(2).pow(CS::ln) - 1; + let boolean_rproof_r = zkpok.range_proof_r.verify::(&a_bases.0[0], &signer_pk.b, &signer_pk.N, &min_r, &max_r); + if !boolean_rproof_r { + println!("Verification of the Range Proof of r. Failed"); + return false; + } + + true + } + + pub fn to_cl03_zkpok(&self) -> &CL03ZKPoK { + match self { + Self::CL03(inner) => &inner, + _ => panic!("Cannot happen!") + } + } +} \ No newline at end of file diff --git a/src/cl03/range_proof.rs b/src/cl03/range_proof.rs index a071365..35444fd 100644 --- a/src/cl03/range_proof.rs +++ b/src/cl03/range_proof.rs @@ -16,7 +16,9 @@ use digest::Digest; use rug::{Integer, integer::Order, ops::Pow, Complete}; use serde::{Serialize, Deserialize}; -use crate::{utils::{random::rand_int, util::divm}, signatures::commitment::CL03Commitment}; +use crate::utils::{random::rand_int, util::divm}; + +use super::commitment::CL03Commitment; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub enum RangeProof{ diff --git a/src/cl03/sigma_protocols.rs b/src/cl03/sigma_protocols.rs index 9143879..a31ac74 100644 --- a/src/cl03/sigma_protocols.rs +++ b/src/cl03/sigma_protocols.rs @@ -16,9 +16,9 @@ use digest::Digest; use rug::{Integer, integer::Order, Complete}; use serde::{Deserialize, Serialize}; -use crate::{utils::{message::CL03Message, random::random_bits, util::divm}, signatures::{commitment::{CL03Commitment, Commitment}, signature::CL03Signature}, keys::cl03_key::{CL03PublicKey, CL03CommitmentPublicKey}, schemes::algorithms::CL03}; +use crate::{utils::{message::CL03Message, random::random_bits, util::divm}, schemes::algorithms::CL03, schemes::generics::Commitment}; -use super::{ciphersuites::CLCiphersuite, bases::Bases}; +use super::{ciphersuites::CLCiphersuite, bases::Bases, keys::{CL03PublicKey, CL03CommitmentPublicKey}, commitment::CL03Commitment, signature::CL03Signature}; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] diff --git a/src/cl03/signature.rs b/src/cl03/signature.rs new file mode 100644 index 0000000..7333c1f --- /dev/null +++ b/src/cl03/signature.rs @@ -0,0 +1,133 @@ +// Copyright 2023 Fondazione LINKS + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::marker::PhantomData; + +use bls12_381_plus::{G1Projective, Scalar, G1Affine, G2Projective, Gt, multi_miller_loop, G2Prepared}; +use ff::Field; +use rug::{Integer, ops::Pow, integer::Order}; +use serde::{Deserialize, Serialize}; + +use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{CL03Message, BBSplusMessage}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, self, signer_specific_generators, make_generators}}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{random::{random_prime, random_bits}, util::{calculate_domain, serialize, hash_to_scalar_old}}, schemes::generics::Signature}; + +use elliptic_curve::{hash2curve::ExpandMsg, group::Curve, subtle::{CtOption, Choice}}; + +use super::keys::{CL03PublicKey, CL03SecretKey}; + + + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub struct CL03Signature { + pub(crate) e: Integer, + pub(crate) s: Integer, + pub(crate) v: Integer, +} + + + +impl Signature> { + + pub fn sign(pk: &CL03PublicKey, sk: &CL03SecretKey, a_bases: &Bases, message: &CL03Message) -> Self { + let mut e = random_prime(CS::le); + let phi_n = (&sk.p - Integer::from(1)) * (&sk.q - Integer::from(1)); + + while ((&e > &Integer::from(2).pow(CS::le-1)) && (&e < &Integer::from(2).pow(CS::le)) && (Integer::from(e.gcd_ref(&phi_n)) == 1)) == false { + e = random_prime(CS::le); + } + + let s = random_bits(CS::ls); + let e2n = Integer::from(e.invert_ref(&phi_n).unwrap()); + // v = powmod((powmod(pk['a0'], m, pk['N']) * powmod(pk['b'], s, pk['N']) * pk['c']), (e2n), pk['N']) + let v = ((Integer::from(a_bases.0[0].pow_mod_ref(&message.value, &pk.N).unwrap())) * Integer::from(pk.b.pow_mod_ref(&s, &pk.N).unwrap()) * &pk.c).pow_mod(&e2n, &pk.N).unwrap(); + + let sig = CL03Signature{e, s, v}; + Self::CL03(sig) + } + + //TODO: tenere solo verify_multiattr visto che funzione anche con un solo messaggio? + pub fn verify(&self, pk: &CL03PublicKey, a_bases: &Bases, message: &CL03Message) -> bool { + + let sign = self.cl03Signature(); + + let lhs = Integer::from(sign.v.pow_mod_ref(&sign.e,&pk.N).unwrap()); + + let rhs = (Integer::from(a_bases.0[0].pow_mod_ref(&message.value, &pk.N).unwrap()) * Integer::from(pk.b.pow_mod_ref(&sign.s, &pk.N).unwrap()) * &pk.c) % &pk.N; + + if sign.e <= Integer::from(2).pow(CS::le-1) || sign.e >= Integer::from(2).pow(CS::le) { + return false + } + + if lhs == rhs { + return true + } + + false + } + + pub fn verify_multiattr(&self, pk: &CL03PublicKey, a_bases: &Bases, messages: &[CL03Message]) -> bool{ + if messages.len() > a_bases.0.len() { + panic!("Not enought a_bases!"); + } + + let sign = self.cl03Signature(); + + let lhs = Integer::from(sign.v.pow_mod_ref(&sign.e,&pk.N).unwrap()); + + let mut rhs = Integer::from(1); + + messages.iter().enumerate().for_each(|(i,m)| rhs = &rhs * Integer::from(a_bases.0[i].pow_mod_ref(&m.value, &pk.N).unwrap()) ); + + rhs = (&rhs * Integer::from(pk.b.pow_mod_ref(&sign.s, &pk.N).unwrap()) * &pk.c) % &pk.N; + + if sign.e <= Integer::from(2).pow(CS::le -1) { + return false; + } + + if lhs == rhs { + return true; + } + + false + } + + pub fn cl03Signature(&self) -> &CL03Signature{ + match self { + Self::CL03(inner) => inner, + _ => panic!("Cannot happen!") + } + } + + pub fn to_bytes(&self) -> Vec{ + let signature = self.cl03Signature(); + let mut bytes: Vec = Vec::new(); + let mut e_digits = vec!(0u8; CS::le as usize); + let mut s_digits = vec!(0u8; CS::ls as usize); + signature.e.write_digits(&mut e_digits, Order::MsfBe); + signature.s.write_digits(&mut s_digits, Order::MsfBe); + bytes.extend_from_slice(&e_digits); + bytes.extend_from_slice(&s_digits); + bytes.extend_from_slice(&signature.v.to_digits(Order::MsfBe)); + + bytes + } + + pub fn from_bytes(bytes: &[u8]) -> Self { + let e = Integer::from_digits(&bytes[0usize .. CS::le as usize], Order::MsfBe); + let s = Integer::from_digits(&bytes[CS::le as usize .. (CS::le as usize + CS::ls as usize)], Order::MsfBe); + let v = Integer::from_digits(&bytes[(CS::le as usize + CS::ls as usize) ..], Order::MsfBe); + + Self::CL03(CL03Signature { e, s, v }) + } +} + diff --git a/src/cl03/tests.rs b/src/cl03/tests.rs index b9bb77e..fbf369e 100644 --- a/src/cl03/tests.rs +++ b/src/cl03/tests.rs @@ -14,7 +14,7 @@ use digest::Digest; -use crate::{keys::{pair::KeyPair, cl03_key::CL03CommitmentPublicKey}, schemes::algorithms::{Scheme, CL03, Ciphersuite}, utils::message::CL03Message, signatures::{signature::Signature, commitment::Commitment, proof::{ZKPoK, PoKSignature}, blind::BlindSignature}, cl03::bases::Bases}; +use crate::{keys::pair::KeyPair, schemes::algorithms::{Scheme, CL03, Ciphersuite}, utils::message::CL03Message, schemes::generics::{Signature, Commitment, ZKPoK, PoKSignature, BlindSignature}, cl03::{bases::Bases, keys::CL03CommitmentPublicKey}}; use super::ciphersuites::CLCiphersuite; diff --git a/src/keys/bbsplus_key.rs b/src/keys/bbsplus_key.rs deleted file mode 100644 index 71b0f0c..0000000 --- a/src/keys/bbsplus_key.rs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2023 Fondazione LINKS - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use bls12_381_plus::{Scalar, G2Projective, G2Affine}; -use elliptic_curve::group::Curve; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub struct BBSplusPublicKey(pub G2Projective); - -impl BBSplusPublicKey{ - pub fn to_bytes(&self) -> [u8; 96] { - self.0.to_affine().to_compressed() - } - - pub fn encode(&self) -> String { - let pk_bytes = self.to_bytes(); - hex::encode(pk_bytes) - } - - pub fn from_bytes(bytes: &[u8]) -> Self{ - let bytes: [u8; 96] = bytes.try_into().expect("Invalid number of bytes to be coverted into a BBSplus public key! (max 96 bytes)"); - let g2 = G2Projective::from(G2Affine::from_compressed(&bytes).unwrap()); - Self(g2) - } -} - - -#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub struct BBSplusSecretKey(pub Scalar); - -impl BBSplusSecretKey{ - //in BE order - pub fn to_bytes(&self) -> [u8; 32] { - let bytes = self.0.to_be_bytes(); - // bytes.reverse(); - bytes - } - - pub fn encode(&self) -> String { - let sk_bytes = self.to_bytes(); - hex::encode(sk_bytes) - } - - pub fn from_bytes(bytes: &[u8]) -> Self { - let bytes: [u8; 32] = bytes.try_into().expect("Invalid number of bytes to be coverted into a BBSplus private key! (max 32 bytes)"); - // bytes.reverse(); - let s = Scalar::from_be_bytes(&bytes).unwrap(); - - Self(s) - } -} \ No newline at end of file diff --git a/src/keys/key.rs b/src/keys/key.rs deleted file mode 100644 index 71f04b2..0000000 --- a/src/keys/key.rs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2023 Fondazione LINKS - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use serde::{Serialize, de::DeserializeOwned}; - -use super::{cl03_key::{CL03PublicKey, CL03SecretKey}, bbsplus_key::{BBSplusPublicKey, BBSplusSecretKey}}; - - - -pub trait PublicKey: Serialize + DeserializeOwned + Send + Sync + 'static { - type Output: ?Sized; - // type Params; - fn to_bytes(&self) -> Self::Output; - fn encode(&self) -> String; - // fn get_params(&self) -> Self::Params; -} -pub trait PrivateKey: Serialize + DeserializeOwned + Send + Sync + 'static { - type Output: ?Sized; - fn to_bytes(&self) -> Self::Output; - fn encode(&self) -> String; -} - -impl PublicKey for BBSplusPublicKey{ - type Output = [u8; 96]; - // type Params = G2Projective; - fn to_bytes(&self) -> Self::Output { - self.to_bytes() - } - - fn encode(&self) -> String { - let pk_bytes = self.to_bytes(); - hex::encode(pk_bytes) - } - - // fn get_params(&self) -> Self::Params { - // self.0 - // } -} -impl PublicKey for CL03PublicKey{ - type Output = [u8; 512]; - // type Params = (Integer, Integer, Integer, Vec<(Integer, bool)>); - fn encode(&self) -> String { - todo!() - } - - fn to_bytes(&self) -> Self::Output { - todo!() - } - - // fn get_params(&self) -> (Integer, Integer, Integer, Vec<(Integer, bool)>) { - // (self.N.clone(), self.b.clone(), self.c.clone(), self.a_bases.clone()) - // } -} - -impl PrivateKey for BBSplusSecretKey{ - type Output = [u8; 32]; - //in BE order - fn to_bytes(&self) -> Self::Output{ - self.to_bytes() - } - - fn encode(&self) -> String { - let sk_bytes = self.to_bytes(); - hex::encode(sk_bytes) - } -} -impl PrivateKey for CL03SecretKey{ - type Output = [u8; 512]; - fn encode(&self) -> String { - todo!() - } - - fn to_bytes(&self) -> Self::Output { - todo!() - } -} - diff --git a/src/keys/mod.rs b/src/keys/mod.rs index d83cf38..ed6c273 100644 --- a/src/keys/mod.rs +++ b/src/keys/mod.rs @@ -12,7 +12,5 @@ // See the License for the specific language governing permissions and // limitations under the License. -pub mod key; -pub mod bbsplus_key; -pub mod pair; -pub mod cl03_key; \ No newline at end of file +pub mod traits; +pub mod pair; \ No newline at end of file diff --git a/src/keys/pair.rs b/src/keys/pair.rs index dcc821a..b53874a 100644 --- a/src/keys/pair.rs +++ b/src/keys/pair.rs @@ -35,17 +35,17 @@ use crate::schemes::algorithms::CL03; use crate::schemes::algorithms::Scheme; use crate::utils::random::random_prime; use crate::utils::random::random_qr; -use super::bbsplus_key::BBSplusPublicKey; -use super::bbsplus_key::BBSplusSecretKey; -use super::cl03_key::CL03PublicKey; -use super::cl03_key::CL03SecretKey; +use crate::bbsplus::keys::BBSplusPublicKey; +use crate::bbsplus::keys::BBSplusSecretKey; +use crate::cl03::keys::CL03PublicKey; +use crate::cl03::keys::CL03SecretKey; use sha2::Digest; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct KeyPair{ - public: S::PubKey, - private: S::PrivKey, + pub(crate) public: S::PubKey, + pub(crate) private: S::PrivKey, } impl KeyPair @@ -88,121 +88,6 @@ where S: Scheme } -impl KeyPair>{ - - pub fn generate() -> Self { - let n = CS::SECPARAM; - let mut pprime = random_prime(n); - let mut p = Integer::from(2) * pprime.clone() + Integer::from(1); - loop{ - if p.is_probably_prime(50) !=IsPrime::No { - break; - } - pprime = random_prime(n); - p = Integer::from(2) * pprime + Integer::from(1); - } - - let mut qprime = random_prime(n); - let mut q = Integer::from(2) * qprime.clone() + Integer::from(1); - loop{ - if p != q && q.is_probably_prime(100) !=IsPrime::No { - break; - } - qprime = random_prime(n); - q = Integer::from(2) * qprime + Integer::from(1); - } - - let N = p.clone() * q.clone(); - - // let mut a_bases: Vec = Vec::new(); - - // let n_attr = n_attributes.unwrap_or(1); - // for _i in 0..n_attr { - // let a = random_qr(&N); - // a_bases.push(a); - // } - - let b = random_qr(&N); - let c = random_qr(&N); - - let pk = CL03PublicKey::new(N, b, c); - let sk = CL03SecretKey::new(p, q); - - Self{public: pk, private: sk} - } -} - -impl KeyPair>{ - - pub fn generate_rng(rng: &mut R) -> Self { - let sk = Scalar::random(rng); - let pk: G2Projective = G2Affine::generator() * sk; - - Self{public: BBSplusPublicKey(pk), private: BBSplusSecretKey(sk)} - } - - pub fn generate(ikm: Option<&[u8]>, key_info: Option<&[u8]>) -> Self - { - - let ikm = if let Some(ikm_data) = ikm { - ikm_data.to_vec() - } else { - let mut rng = rand::thread_rng(); - (0..CS::IKM_LEN).map(|_| rng.gen()).collect() - }; - - let ikm = ikm.as_ref(); - - - let key_info = key_info.unwrap_or(&[]); - let init_salt = "BBS-SIG-KEYGEN-SALT-".as_bytes(); - - // if ikm.len() < 32 { - // return Err(BadParams { - // cause: format!("Invalid ikm length. Needs to be at least 32 bytes long. Got {}", ikm.len()) - // }) - // } - - // L = ceil((3 * ceil(log2(r))) / 16) - const L: usize = 48; - const L_BYTES: [u8; 2] = (L as u16).to_be_bytes(); - - // salt = H(salt) - let mut hasher = Sha256::new(); - hasher.update(init_salt); - let salt = hasher.finalize(); - - // PRK = HKDF-Extract(salt, IKM || I2OSP(0, 1)) - let prk = Hkdf::::new( - Some(&salt), - &[ikm, &[0u8; 1][..]].concat() - ); - - // OKM = HKDF-Expand(PRK, key_info || I2OSP(L, 2), L) - let mut okm = [0u8; 64]; - - prk.expand( - &[&key_info, &L_BYTES[..]].concat(), - &mut okm[(64-L)..] - ).expect( - &format!("The HKDF-expand output cannot be more than {} bytes long", 255 * Sha256::output_size()) - ); - - okm.reverse(); // okm is in be format - let sk = Scalar::from_bytes_wide(&okm); - let pk: G2Projective = G2Affine::generator() * sk; - // let pk_affine = pk.to_affine(); - - // // transform secret key from le to be - // let mut sk_bytes = sk.to_bytes(); - // sk_bytes.reverse(); - - // BBSplusKeyPair::new(BBSplusSecretKey(sk), BBSplusPublicKey(pk)) - - Self{public: BBSplusPublicKey(pk), private: BBSplusSecretKey(sk)} - } - -} diff --git a/src/signatures/mod.rs b/src/keys/traits.rs similarity index 55% rename from src/signatures/mod.rs rename to src/keys/traits.rs index 7d599cd..2d57cc0 100644 --- a/src/signatures/mod.rs +++ b/src/keys/traits.rs @@ -12,7 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -pub mod signature; -pub mod commitment; -pub mod blind; -pub mod proof; \ No newline at end of file +use serde::{Serialize, de::DeserializeOwned}; + +pub trait PublicKey: Serialize + DeserializeOwned + Send + Sync + 'static { + type Output: ?Sized; + // type Params; + fn to_bytes(&self) -> Self::Output; + fn encode(&self) -> String; + // fn get_params(&self) -> Self::Params; +} +pub trait PrivateKey: Serialize + DeserializeOwned + Send + Sync + 'static { + type Output: ?Sized; + fn to_bytes(&self) -> Self::Output; + fn encode(&self) -> String; +} + diff --git a/src/lib.rs b/src/lib.rs index 505b9a2..410d0ce 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,7 +19,6 @@ pub mod utils; pub mod keys; -pub mod signatures; pub mod schemes; pub mod bbsplus; pub mod cl03; diff --git a/src/schemes/algorithms.rs b/src/schemes/algorithms.rs index fc323a5..07f3b0f 100644 --- a/src/schemes/algorithms.rs +++ b/src/schemes/algorithms.rs @@ -17,7 +17,7 @@ use serde::{Serialize, Deserialize, de::DeserializeOwned}; use sha2::Sha256; use sha3::Shake256; use std::marker::PhantomData; -use crate::{keys::{key::{PrivateKey, PublicKey}, bbsplus_key::{BBSplusSecretKey, BBSplusPublicKey}, cl03_key::{CL03SecretKey, CL03PublicKey}}, bbsplus::ciphersuites::{BbsCiphersuite, Bls12381Shake256, Bls12381Sha256}, cl03::ciphersuites::{CLCiphersuite, CL1024Sha256}}; +use crate::{keys::{traits::{PrivateKey, PublicKey}}, bbsplus::{ciphersuites::{BbsCiphersuite, Bls12381Shake256, Bls12381Sha256}, keys::{BBSplusSecretKey, BBSplusPublicKey}}, cl03::{ciphersuites::{CLCiphersuite, CL1024Sha256}, keys::{CL03SecretKey, CL03PublicKey}}}; pub type BBS_BLS12381_SHAKE256 = BBSplus; pub type BBS_BLS12381_SHA256 = BBSplus; diff --git a/src/schemes/generics.rs b/src/schemes/generics.rs new file mode 100644 index 0000000..b8fff8b --- /dev/null +++ b/src/schemes/generics.rs @@ -0,0 +1,63 @@ +// Copyright 2023 Fondazione LINKS + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::marker::PhantomData; + +use serde::{Serialize, Deserialize}; + +use crate::{bbsplus::{blind::BBSplusBlindSignature, commitment::BBSplusCommitment, proof::{BBSplusPoKSignature, BBSplusZKPoK}, signature::BBSplusSignature}, cl03::{blind::CL03BlindSignature, commitment::CL03Commitment, proof::{CL03PoKSignature, CL03ZKPoK}, signature::CL03Signature}}; + +use super::algorithms::Scheme; + + + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub enum BlindSignature { + BBSplus(BBSplusBlindSignature), + CL03(CL03BlindSignature), + _Unreachable(std::marker::PhantomData) +} + + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub enum Commitment { + BBSplus(BBSplusCommitment), + CL03(CL03Commitment), + _Unreachable(std::marker::PhantomData) +} + + + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub enum PoKSignature{ + BBSplus(BBSplusPoKSignature), + CL03(CL03PoKSignature), + _Unreachable(PhantomData) +} + + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub enum ZKPoK { + BBSplus(BBSplusZKPoK), + CL03(CL03ZKPoK), + _Unreachable(PhantomData) +} + + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub enum Signature { + BBSplus(BBSplusSignature), + CL03(CL03Signature), + _Unreachable(PhantomData) +} diff --git a/src/schemes/mod.rs b/src/schemes/mod.rs index 6e2cd17..4a20b50 100644 --- a/src/schemes/mod.rs +++ b/src/schemes/mod.rs @@ -12,4 +12,5 @@ // See the License for the specific language governing permissions and // limitations under the License. -pub mod algorithms; \ No newline at end of file +pub mod algorithms; +pub mod generics; \ No newline at end of file diff --git a/src/utils/util.rs b/src/utils/util.rs index 62ba7e1..6409a90 100644 --- a/src/utils/util.rs +++ b/src/utils/util.rs @@ -21,7 +21,9 @@ use elliptic_curve::{hash2curve::{ExpandMsg, Expander}, group::Curve}; use rand::RngCore; use rug::{Integer, integer::Order}; use super::message::BBSplusMessage; -use crate::{bbsplus::ciphersuites::BbsCiphersuite, keys::bbsplus_key::BBSplusPublicKey}; +use crate::{bbsplus::ciphersuites::BbsCiphersuite, bbsplus::keys::BBSplusPublicKey}; + + pub fn hash_to_scalar(msg_octects: &[u8], dst: Option<&[u8]>) -> Scalar where From 4afff4ff91e41474922e803d2552e038c95aaccc Mon Sep 17 00:00:00 2001 From: Alberto Solavagione Date: Tue, 24 Oct 2023 16:06:24 +0200 Subject: [PATCH 2/6] test refactoring --- src/bbsplus/generators.rs | 8 +- src/bbsplus/mod.rs | 1 - src/bbsplus/signature.rs | 6 +- src/cl03/mod.rs | 1 - src/lib.rs | 349 +---------------------- src/bbsplus/tests.rs => tests/bbsplus.rs | 316 +++++++++++++++++++- src/cl03/tests.rs => tests/cl03.rs | 46 ++- 7 files changed, 367 insertions(+), 360 deletions(-) rename src/bbsplus/tests.rs => tests/bbsplus.rs (71%) rename src/cl03/tests.rs => tests/cl03.rs (93%) diff --git a/src/bbsplus/generators.rs b/src/bbsplus/generators.rs index 15bb186..f60b285 100644 --- a/src/bbsplus/generators.rs +++ b/src/bbsplus/generators.rs @@ -27,10 +27,10 @@ use super::ciphersuites::BbsCiphersuite; #[derive(Clone, PartialEq, Eq, Debug, Deserialize)] pub struct Generators { - pub(crate) g1_base_point: G1Projective, - pub(crate) q1: G1Projective, - pub(crate) q2: G1Projective, - pub(crate) message_generators: Vec + pub g1_base_point: G1Projective, + pub q1: G1Projective, + pub q2: G1Projective, + pub message_generators: Vec } impl Serialize for Generators { diff --git a/src/bbsplus/mod.rs b/src/bbsplus/mod.rs index e0f77b7..67dc19d 100644 --- a/src/bbsplus/mod.rs +++ b/src/bbsplus/mod.rs @@ -14,7 +14,6 @@ pub mod generators; pub mod ciphersuites; -pub mod tests; pub mod keys; pub mod blind; pub mod commitment; diff --git a/src/bbsplus/signature.rs b/src/bbsplus/signature.rs index d85319a..a992b0a 100644 --- a/src/bbsplus/signature.rs +++ b/src/bbsplus/signature.rs @@ -29,9 +29,9 @@ use super::keys::{BBSplusPublicKey, BBSplusSecretKey}; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct BBSplusSignature { - pub(crate) a: G1Projective, - pub(crate) e: Scalar, - pub(crate) s: Scalar, + pub a: G1Projective, + pub e: Scalar, + pub s: Scalar, } impl BBSplusSignature { diff --git a/src/cl03/mod.rs b/src/cl03/mod.rs index 900b11e..22d08c6 100644 --- a/src/cl03/mod.rs +++ b/src/cl03/mod.rs @@ -13,7 +13,6 @@ // limitations under the License. pub mod ciphersuites; -pub mod tests; pub mod sigma_protocols; pub mod range_proof; pub mod bases; diff --git a/src/lib.rs b/src/lib.rs index 410d0ce..b799ffd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,351 +22,4 @@ pub mod keys; pub mod schemes; pub mod bbsplus; pub mod cl03; -pub mod errors; - - -#[cfg(test)] -mod bbsplus_tests { - use crate::{schemes::algorithms::{BBS_BLS12381_SHA256, BBS_BLS12381_SHAKE256}, bbsplus::tests::{map_message_to_scalar_as_hash, message_generators, msg_signature, h2s, mocked_rng, proof_check, key_pair_gen, blind_sign, blind_messages_proof_gen, update_signature}}; - - //KEYPAIR - - #[test] - fn keypair() { - key_pair_gen::("./fixture_data/keyPair.json"); - } - - - //MAP MESSAGE TO SCALAR - SHA256 - - #[test] - fn map_message_to_scalar_as_hash_sha256() { - map_message_to_scalar_as_hash::("./fixture_data/bls12-381-sha-256/MapMessageToScalarAsHash.json"); - } - - //MAP MESSAGE TO SCALAR - SHAKE256 - - #[test] - fn map_message_to_scalar_as_hash_shake256() { - map_message_to_scalar_as_hash::("./fixture_data/bls12-381-shake-256/MapMessageToScalarAsHash.json"); - } - - - //GENERATORS - SHA256 - #[test] - fn message_generators_sha256() { - message_generators::("./fixture_data/bls12-381-sha-256/generators.json"); - } - - //GENERATORS - SHAKE256 - - #[test] - fn message_generators_shake256() { - message_generators::("./fixture_data/bls12-381-shake-256/generators.json"); - } - - - //MSG SIGNATURE - #[test] - fn msg_signature_sha256_1() { - msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature001.json"); - } - #[test] - fn msg_signature_sha256_2() { - msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature002.json"); - } - #[test] - fn msg_signature_sha256_3() { - msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature003.json"); - } - #[test] - fn msg_signature_sha256_4() { - msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json"); - } - #[test] - fn msg_signature_sha256_5() { - msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature005.json"); - } - #[test] - fn msg_signature_sha256_6() { - msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature006.json"); - } - #[test] - fn msg_signature_sha256_7() { - msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature007.json"); - } - #[test] - fn msg_signature_sha256_8() { - msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature008.json"); - } - #[test] - fn msg_signature_sha256_9() { - msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature009.json"); - } - - - //MSG SIGNATURE - SHAKE256 - #[test] - fn msg_signature_shake256_1() { - msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature001.json"); - } - #[test] - fn msg_signature_shake256_2() { - msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature002.json"); - } - #[test] - fn msg_signature_shake256_3() { - msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature003.json"); - } - #[test] - fn msg_signature_shake256_4() { - msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json"); - } - #[test] - fn msg_signature_shake256_5() { - msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature005.json"); - } - #[test] - fn msg_signature_shake256_6() { - msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature006.json"); - } - #[test] - fn msg_signature_shake256_7() { - msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature007.json"); - } - #[test] - fn msg_signature_shake256_8() { - msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature008.json"); - } - #[test] - fn msg_signature_shake256_9() { - msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature009.json"); - } - - //h2s - SHA256 - #[test] - fn h2s_sha256_1() { - h2s::("./fixture_data/bls12-381-sha-256/", "h2s/h2s001.json"); - } - #[test] - fn h2s_sha256_2() { - h2s::("./fixture_data/bls12-381-sha-256/", "h2s/h2s002.json"); - } - - //h2s - SHAKE256 - #[test] - fn h2s_shake256_1() { - h2s::("./fixture_data/bls12-381-shake-256/", "h2s/h2s001.json"); - } - #[test] - fn h2s_shake256_2() { - h2s::("./fixture_data/bls12-381-shake-256/", "h2s/h2s002.json"); - } - - const SEED: &str = "332e313431353932363533353839373933323338343632363433333833323739"; - - //mocked_rng - SHA256 - #[test] - fn mocked_rng_sha256() { - mocked_rng::("./fixture_data/bls12-381-sha-256/", "mockedRng.json", SEED); - } - - //mocked_rng - SHAKE256 - #[test] - fn mocked_rng_shake256() { - mocked_rng::("./fixture_data/bls12-381-shake-256/", "mockedRng.json", SEED); - } - - - - //SIGNATURE POK - SHA256 - #[test] - fn proof_check_sha256_1() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature001.json", "proof/proof001.json", SEED) - } - #[test] - fn proof_check_sha256_2() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof002.json", SEED) - } - #[test] - fn proof_check_sha256_3() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof003.json", SEED) - } - #[test] - fn proof_check_sha256_4() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof004.json", SEED) - } - #[test] - fn proof_check_sha256_5() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof005.json", SEED) - } - #[test] - fn proof_check_sha256_6() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof006.json", SEED) - } - #[test] - fn proof_check_sha256_7() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof007.json", SEED) - } - #[test] - fn proof_check_sha256_8() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof008.json", SEED) - } - #[test] - fn proof_check_sha256_9() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof009.json", SEED) - } - #[test] - fn proof_check_sha256_10() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof010.json", SEED) - } - #[test] - fn proof_check_sha256_11() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof011.json", SEED) - } - #[test] - fn proof_check_sha256_12() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof012.json", SEED) - } - #[test] - fn proof_check_sha256_13() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof013.json", SEED) - } - - - - //SIGNATURE POK - SHAKE256 - - #[test] - fn proof_check_shake256_1() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature001.json", "proof/proof001.json", SEED) - } - #[test] - fn proof_check_shake256_2() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof002.json", SEED) - } - #[test] - fn proof_check_shake256_3() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof003.json", SEED) - } - #[test] - fn proof_check_shake256_4() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof004.json", SEED) - } - #[test] - fn proof_check_shake256_5() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof005.json", SEED) - } - #[test] - fn proof_check_shake256_6() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof006.json", SEED) - } - #[test] - fn proof_check_shake256_7() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof007.json", SEED) - } - #[test] - fn proof_check_shake256_8() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof008.json", SEED) - } - #[test] - fn proof_check_shake256_9() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof009.json", SEED) - } - #[test] - fn proof_check_shake256_10() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof010.json", SEED) - } - #[test] - fn proof_check_shake256_11() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof011.json", SEED) - } - #[test] - fn proof_check_shake256_12() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof012.json", SEED) - } - #[test] - fn proof_check_shake256_13() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof013.json", SEED) - } - - //ZKPoK (BlindMessagesProofGen) - SHA2563 - #[test] - fn zkpok_sha256() { - blind_messages_proof_gen::("./fixture_data/bls12-381-sha-256/"); - } - - #[test] - //ZKPoK (BlindMessagesProofGen) - SHAKE256 - fn zkpok_shake256() { - blind_messages_proof_gen::("./fixture_data/bls12-381-shake-256/"); - } - - - - //Blind Signature and ZKPoK - SHA256 - #[test] - fn blind_sign_sha256() { - blind_sign::("./fixture_data/bls12-381-sha-256/"); - } - - //Blind Signature and ZKPoK - SHAKE256 - #[test] - fn blind_sign_shake256() { - blind_sign::("./fixture_data/bls12-381-shake-256/"); - } - - - //Update Blinded Signature - SHA256 - #[test] - fn update_signature_sha256() { - update_signature::("./fixture_data/bls12-381-sha-256/"); - } - - //Update Blinded Signature - SHAKE256 - #[test] - fn update_signature_shake256() { - update_signature::("./fixture_data/bls12-381-shake-256/"); - } - -} - - -#[cfg(test)] -mod cl03_tests { - use crate::{cl03::tests::{signature, zkpok, blind_sign, spok, update_signature}, schemes::algorithms::CL03_CL1024_SHA256}; - - //Signature (sign) - CL1024-SHA256 - #[test] - fn signature_cl1024_sha256() { - signature::(); - } - - - //Proof of knowledge of secrets (ZKPoK) - CL1024-SHA256 - #[test] - fn zkpok_cl1024_sha256() { - zkpok::(); - } - - - //Blind signature - CL1024-SHA256 - #[test] - fn blind_sign_cl1024_sha256() { - blind_sign::(); - } - - - //Signature Proof of Knowledge - CL1024-SHA256 - #[test] - fn spok_cl1024_sha256() { - spok::(); - } - - //Signature update - CL1024-SHA256 - #[test] - fn update_signature_cl1024_sha256() { - update_signature::(); - } - -} \ No newline at end of file +pub mod errors; \ No newline at end of file diff --git a/src/bbsplus/tests.rs b/tests/bbsplus.rs similarity index 71% rename from src/bbsplus/tests.rs rename to tests/bbsplus.rs index 7074f9a..0391d40 100644 --- a/src/bbsplus/tests.rs +++ b/tests/bbsplus.rs @@ -18,7 +18,321 @@ use bbsplus::ciphersuites::BbsCiphersuite; use elliptic_curve::{hash2curve::ExpandMsg, group::Curve}; use schemes::algorithms::Scheme; -use crate::{utils::message::BBSplusMessage, bbsplus::{self, generators::{make_generators, global_generators}, keys::{BBSplusSecretKey, BBSplusPublicKey}, signature::BBSplusSignature}, schemes::{self, algorithms::BBSplus}, schemes::generics::{Signature, PoKSignature, ZKPoK, Commitment, BlindSignature}, keys::pair::KeyPair, utils::{util::{hash_to_scalar_old, ScalarExt, calculate_random_scalars, get_messages}, message::Message}}; +use zkryptium::{utils::message::BBSplusMessage, bbsplus::{self, generators::{make_generators, global_generators}, keys::{BBSplusSecretKey, BBSplusPublicKey}, signature::BBSplusSignature}, schemes::{self, algorithms::BBSplus}, schemes::generics::{Signature, PoKSignature, ZKPoK, Commitment, BlindSignature}, keys::pair::KeyPair, utils::{util::{hash_to_scalar_old, ScalarExt, calculate_random_scalars, get_messages}, message::Message}}; + + + + +#[cfg(test)] +mod bbsplus_tests { + use zkryptium::schemes::algorithms::{BBS_BLS12381_SHA256, BBS_BLS12381_SHAKE256}; + use super::{map_message_to_scalar_as_hash, message_generators, msg_signature, h2s, mocked_rng, proof_check, key_pair_gen, blind_sign, blind_messages_proof_gen, update_signature}; + + //KEYPAIR + + #[test] + fn keypair() { + key_pair_gen::("./fixture_data/keyPair.json"); + } + + + //MAP MESSAGE TO SCALAR - SHA256 + + #[test] + fn map_message_to_scalar_as_hash_sha256() { + map_message_to_scalar_as_hash::("./fixture_data/bls12-381-sha-256/MapMessageToScalarAsHash.json"); + } + + //MAP MESSAGE TO SCALAR - SHAKE256 + + #[test] + fn map_message_to_scalar_as_hash_shake256() { + map_message_to_scalar_as_hash::("./fixture_data/bls12-381-shake-256/MapMessageToScalarAsHash.json"); + } + + + //GENERATORS - SHA256 + #[test] + fn message_generators_sha256() { + message_generators::("./fixture_data/bls12-381-sha-256/generators.json"); + } + + //GENERATORS - SHAKE256 + + #[test] + fn message_generators_shake256() { + message_generators::("./fixture_data/bls12-381-shake-256/generators.json"); + } + + + //MSG SIGNATURE + #[test] + fn msg_signature_sha256_1() { + msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature001.json"); + } + #[test] + fn msg_signature_sha256_2() { + msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature002.json"); + } + #[test] + fn msg_signature_sha256_3() { + msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature003.json"); + } + #[test] + fn msg_signature_sha256_4() { + msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json"); + } + #[test] + fn msg_signature_sha256_5() { + msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature005.json"); + } + #[test] + fn msg_signature_sha256_6() { + msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature006.json"); + } + #[test] + fn msg_signature_sha256_7() { + msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature007.json"); + } + #[test] + fn msg_signature_sha256_8() { + msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature008.json"); + } + #[test] + fn msg_signature_sha256_9() { + msg_signature::("./fixture_data/bls12-381-sha-256/", "signature/signature009.json"); + } + + + //MSG SIGNATURE - SHAKE256 + #[test] + fn msg_signature_shake256_1() { + msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature001.json"); + } + #[test] + fn msg_signature_shake256_2() { + msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature002.json"); + } + #[test] + fn msg_signature_shake256_3() { + msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature003.json"); + } + #[test] + fn msg_signature_shake256_4() { + msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json"); + } + #[test] + fn msg_signature_shake256_5() { + msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature005.json"); + } + #[test] + fn msg_signature_shake256_6() { + msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature006.json"); + } + #[test] + fn msg_signature_shake256_7() { + msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature007.json"); + } + #[test] + fn msg_signature_shake256_8() { + msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature008.json"); + } + #[test] + fn msg_signature_shake256_9() { + msg_signature::("./fixture_data/bls12-381-shake-256/", "signature/signature009.json"); + } + + //h2s - SHA256 + #[test] + fn h2s_sha256_1() { + h2s::("./fixture_data/bls12-381-sha-256/", "h2s/h2s001.json"); + } + #[test] + fn h2s_sha256_2() { + h2s::("./fixture_data/bls12-381-sha-256/", "h2s/h2s002.json"); + } + + //h2s - SHAKE256 + #[test] + fn h2s_shake256_1() { + h2s::("./fixture_data/bls12-381-shake-256/", "h2s/h2s001.json"); + } + #[test] + fn h2s_shake256_2() { + h2s::("./fixture_data/bls12-381-shake-256/", "h2s/h2s002.json"); + } + + const SEED: &str = "332e313431353932363533353839373933323338343632363433333833323739"; + + //mocked_rng - SHA256 + #[test] + fn mocked_rng_sha256() { + mocked_rng::("./fixture_data/bls12-381-sha-256/", "mockedRng.json", SEED); + } + + //mocked_rng - SHAKE256 + #[test] + fn mocked_rng_shake256() { + mocked_rng::("./fixture_data/bls12-381-shake-256/", "mockedRng.json", SEED); + } + + + + //SIGNATURE POK - SHA256 + #[test] + fn proof_check_sha256_1() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature001.json", "proof/proof001.json", SEED) + } + #[test] + fn proof_check_sha256_2() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof002.json", SEED) + } + #[test] + fn proof_check_sha256_3() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof003.json", SEED) + } + #[test] + fn proof_check_sha256_4() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof004.json", SEED) + } + #[test] + fn proof_check_sha256_5() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof005.json", SEED) + } + #[test] + fn proof_check_sha256_6() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof006.json", SEED) + } + #[test] + fn proof_check_sha256_7() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof007.json", SEED) + } + #[test] + fn proof_check_sha256_8() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof008.json", SEED) + } + #[test] + fn proof_check_sha256_9() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof009.json", SEED) + } + #[test] + fn proof_check_sha256_10() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof010.json", SEED) + } + #[test] + fn proof_check_sha256_11() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof011.json", SEED) + } + #[test] + fn proof_check_sha256_12() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof012.json", SEED) + } + #[test] + fn proof_check_sha256_13() { + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof013.json", SEED) + } + + + + //SIGNATURE POK - SHAKE256 + + #[test] + fn proof_check_shake256_1() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature001.json", "proof/proof001.json", SEED) + } + #[test] + fn proof_check_shake256_2() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof002.json", SEED) + } + #[test] + fn proof_check_shake256_3() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof003.json", SEED) + } + #[test] + fn proof_check_shake256_4() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof004.json", SEED) + } + #[test] + fn proof_check_shake256_5() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof005.json", SEED) + } + #[test] + fn proof_check_shake256_6() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof006.json", SEED) + } + #[test] + fn proof_check_shake256_7() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof007.json", SEED) + } + #[test] + fn proof_check_shake256_8() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof008.json", SEED) + } + #[test] + fn proof_check_shake256_9() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof009.json", SEED) + } + #[test] + fn proof_check_shake256_10() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof010.json", SEED) + } + #[test] + fn proof_check_shake256_11() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof011.json", SEED) + } + #[test] + fn proof_check_shake256_12() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof012.json", SEED) + } + #[test] + fn proof_check_shake256_13() { + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof013.json", SEED) + } + + //ZKPoK (BlindMessagesProofGen) - SHA2563 + #[test] + fn zkpok_sha256() { + blind_messages_proof_gen::("./fixture_data/bls12-381-sha-256/"); + } + + #[test] + //ZKPoK (BlindMessagesProofGen) - SHAKE256 + fn zkpok_shake256() { + blind_messages_proof_gen::("./fixture_data/bls12-381-shake-256/"); + } + + + + //Blind Signature and ZKPoK - SHA256 + #[test] + fn blind_sign_sha256() { + blind_sign::("./fixture_data/bls12-381-sha-256/"); + } + + //Blind Signature and ZKPoK - SHAKE256 + #[test] + fn blind_sign_shake256() { + blind_sign::("./fixture_data/bls12-381-shake-256/"); + } + + + //Update Blinded Signature - SHA256 + #[test] + fn update_signature_sha256() { + update_signature::("./fixture_data/bls12-381-sha-256/"); + } + + //Update Blinded Signature - SHAKE256 + #[test] + fn update_signature_shake256() { + update_signature::("./fixture_data/bls12-381-shake-256/"); + } + +} + + + + pub(crate) fn key_pair_gen(filename: &str) where diff --git a/src/cl03/tests.rs b/tests/cl03.rs similarity index 93% rename from src/cl03/tests.rs rename to tests/cl03.rs index fbf369e..f2d2954 100644 --- a/src/cl03/tests.rs +++ b/tests/cl03.rs @@ -14,9 +14,51 @@ use digest::Digest; -use crate::{keys::pair::KeyPair, schemes::algorithms::{Scheme, CL03, Ciphersuite}, utils::message::CL03Message, schemes::generics::{Signature, Commitment, ZKPoK, PoKSignature, BlindSignature}, cl03::{bases::Bases, keys::CL03CommitmentPublicKey}}; +use zkryptium::{keys::pair::KeyPair, schemes::algorithms::{Scheme, CL03, Ciphersuite}, utils::message::CL03Message, schemes::generics::{Signature, Commitment, ZKPoK, PoKSignature, BlindSignature}, cl03::{bases::Bases, keys::CL03CommitmentPublicKey}}; -use super::ciphersuites::CLCiphersuite; +use zkryptium::cl03::ciphersuites::CLCiphersuite; + + +#[cfg(test)] +mod cl03_tests { + use zkryptium::schemes::algorithms::CL03_CL1024_SHA256; + use super::{signature, zkpok, blind_sign, spok, update_signature}; + + + //Signature (sign) - CL1024-SHA256 + #[test] + fn signature_cl1024_sha256() { + signature::(); + } + + + //Proof of knowledge of secrets (ZKPoK) - CL1024-SHA256 + #[test] + fn zkpok_cl1024_sha256() { + zkpok::(); + } + + + //Blind signature - CL1024-SHA256 + #[test] + fn blind_sign_cl1024_sha256() { + blind_sign::(); + } + + + //Signature Proof of Knowledge - CL1024-SHA256 + #[test] + fn spok_cl1024_sha256() { + spok::(); + } + + //Signature update - CL1024-SHA256 + #[test] + fn update_signature_cl1024_sha256() { + update_signature::(); + } + +} From 1b92d0a3453695730ec06746754cdbbb9c63252d Mon Sep 17 00:00:00 2001 From: Alberto Solavagione Date: Tue, 24 Oct 2023 16:35:16 +0200 Subject: [PATCH 3/6] code cleanup --- Cargo.toml | 3 +++ examples/bbsplus.rs | 2 +- src/bbsplus/blind.rs | 8 ++------ src/bbsplus/ciphersuites.rs | 1 - src/bbsplus/commitment.rs | 4 +--- src/bbsplus/generators.rs | 5 +++-- src/bbsplus/keys.rs | 4 ++-- src/bbsplus/proof.rs | 9 ++++----- src/bbsplus/signature.rs | 8 ++------ src/cl03/bases.rs | 4 ++-- src/cl03/blind.rs | 4 ++-- src/cl03/ciphersuites.rs | 3 ++- src/cl03/commitment.rs | 9 ++++----- src/cl03/keys.rs | 1 + src/cl03/proof.rs | 7 ++----- src/cl03/range_proof.rs | 4 ++-- src/cl03/sigma_protocols.rs | 4 ++-- src/cl03/signature.rs | 9 +-------- src/keys/pair.rs | 23 ----------------------- src/lib.rs | 2 +- src/schemes/algorithms.rs | 4 +--- tests/bbsplus.rs | 7 ++++--- tests/cl03.rs | 9 +++++++-- 23 files changed, 49 insertions(+), 85 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1ffe090..90c3ae3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,9 @@ dotenv = "0.15.0" name = "zkryptium" path = "src/lib.rs" + + + [[example]] name = "bbsplus" path = "examples/bbsplus.rs" diff --git a/examples/bbsplus.rs b/examples/bbsplus.rs index 18739b3..9f699a2 100644 --- a/examples/bbsplus.rs +++ b/examples/bbsplus.rs @@ -16,7 +16,7 @@ use std::env; use elliptic_curve::hash2curve::ExpandMsg; -use zkryptium::{utils::{message::BBSplusMessage, random::generate_nonce}, keys::pair::KeyPair, bbsplus::{generators::{make_generators, global_generators, signer_specific_generators}, ciphersuites::BbsCiphersuite}, schemes::algorithms::{BBSplus, Scheme, BBS_BLS12381_SHAKE256, BBS_BLS12381_SHA256}, schemes::generics::{Commitment, BlindSignature, PoKSignature, ZKPoK}}; +use zkryptium::{utils::{message::BBSplusMessage, random::generate_nonce}, keys::pair::KeyPair, bbsplus::{generators::{make_generators, signer_specific_generators}, ciphersuites::BbsCiphersuite}, schemes::algorithms::{BBSplus, Scheme, BBS_BLS12381_SHAKE256, BBS_BLS12381_SHA256}, schemes::generics::{Commitment, BlindSignature, PoKSignature, ZKPoK}}; diff --git a/src/bbsplus/blind.rs b/src/bbsplus/blind.rs index 12ff5ad..c848ba3 100644 --- a/src/bbsplus/blind.rs +++ b/src/bbsplus/blind.rs @@ -14,16 +14,13 @@ use std::panic; - use bls12_381_plus::{G1Projective, Scalar, G1Affine}; -use digest::Digest; use elliptic_curve::{group::Curve, subtle::{CtOption, Choice}, hash2curve::ExpandMsg}; -use rug::{Integer, ops::Pow}; use serde::{Deserialize, Serialize}; +use crate::{schemes::algorithms::BBSplus, utils::message::BBSplusMessage, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, signer_specific_generators}}, utils::util::{calculate_domain, ScalarExt, hash_to_scalar_old}, errors::BlindSignError, schemes::generics::{BlindSignature, Signature, ZKPoK}}; +use super::{commitment::BBSplusCommitment, keys::{BBSplusSecretKey, BBSplusPublicKey}, signature::BBSplusSignature}; -use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, signer_specific_generators}}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{random::{random_prime, random_bits}, util::{calculate_domain, ScalarExt, hash_to_scalar_old}}, errors::BlindSignError, schemes::generics::{BlindSignature, Signature, ZKPoK}}; -use super::{commitment::BBSplusCommitment, keys::{BBSplusSecretKey, BBSplusPublicKey}, signature::BBSplusSignature}; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct BBSplusBlindSignature { @@ -33,7 +30,6 @@ pub struct BBSplusBlindSignature { } - impl BlindSignature> { pub fn blind_sign(revealed_messages: &[BBSplusMessage], commitment: &BBSplusCommitment, zkpok: &ZKPoK>, sk: &BBSplusSecretKey, pk: &BBSplusPublicKey, generators: Option<&Generators>, revealed_message_indexes: &[usize], unrevealed_message_indexes: &[usize], nonce: &[u8], header: Option<&[u8]>) -> Result> diff --git a/src/bbsplus/ciphersuites.rs b/src/bbsplus/ciphersuites.rs index b311b9c..3030a80 100644 --- a/src/bbsplus/ciphersuites.rs +++ b/src/bbsplus/ciphersuites.rs @@ -16,7 +16,6 @@ use serde::{Deserialize, Serialize}; use sha3::Shake256; use sha2::Sha256; use elliptic_curve::hash2curve::{ExpandMsg, ExpandMsgXof, ExpandMsgXmd}; - use crate::schemes::algorithms::Ciphersuite; diff --git a/src/bbsplus/commitment.rs b/src/bbsplus/commitment.rs index 3d5ff35..1a614af 100644 --- a/src/bbsplus/commitment.rs +++ b/src/bbsplus/commitment.rs @@ -14,10 +14,8 @@ use bls12_381_plus::{Scalar, G1Projective}; use elliptic_curve::hash2curve::ExpandMsg; -use rug::Integer; use serde::{Deserialize, Serialize}; - -use crate::{utils::message::{Message, BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, global_generators}}, schemes::algorithms::{Scheme, BBSplus, CL03}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{util::{calculate_random_scalars, subgroup_check_g1}, random::random_bits}, schemes::generics::Commitment}; +use crate::{utils::message::{Message, BBSplusMessage}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, global_generators}}, schemes::algorithms::BBSplus, utils::util::{calculate_random_scalars, subgroup_check_g1}, schemes::generics::Commitment}; diff --git a/src/bbsplus/generators.rs b/src/bbsplus/generators.rs index f60b285..8f89462 100644 --- a/src/bbsplus/generators.rs +++ b/src/bbsplus/generators.rs @@ -13,7 +13,6 @@ // limitations under the License. use bls12_381_plus::G1Projective; - use elliptic_curve::group::Curve; use elliptic_curve::hash2curve::{ExpandMsg, Expander}; use serde::{Serialize, Deserialize}; @@ -21,10 +20,12 @@ use std::env; use std::fs::File; use std::io::{BufWriter, Write}; use serde::ser::{Serializer, SerializeStruct}; - use crate::bbsplus::keys::BBSplusPublicKey; use super::ciphersuites::BbsCiphersuite; + + + #[derive(Clone, PartialEq, Eq, Debug, Deserialize)] pub struct Generators { pub g1_base_point: G1Projective, diff --git a/src/bbsplus/keys.rs b/src/bbsplus/keys.rs index c6862ee..d521180 100644 --- a/src/bbsplus/keys.rs +++ b/src/bbsplus/keys.rs @@ -20,11 +20,11 @@ use rand::{RngCore, Rng}; use serde::{Serialize, Deserialize}; use sha2::Sha256; use digest::Digest; - use crate::{keys::{traits::{PublicKey, PrivateKey}, pair::KeyPair}, schemes::algorithms::BBSplus}; - use super::ciphersuites::BbsCiphersuite; + + #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct BBSplusPublicKey(pub G2Projective); diff --git a/src/bbsplus/proof.rs b/src/bbsplus/proof.rs index 0c9b7a5..ced91bd 100644 --- a/src/bbsplus/proof.rs +++ b/src/bbsplus/proof.rs @@ -12,17 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::marker::PhantomData; + use bls12_381_plus::{G1Projective, Scalar, G2Projective, G2Prepared, Gt, multi_miller_loop, G1Affine}; -use digest::Digest; use elliptic_curve::{hash2curve::ExpandMsg, group::Curve}; -use rug::{Integer, ops::Pow}; use serde::{Serialize, Deserialize}; +use crate::{schemes::algorithms::BBSplus, utils::message::BBSplusMessage, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, signer_specific_generators}}, utils::util::{get_remaining_indexes, get_messages, calculate_domain, calculate_random_scalars, ScalarExt, hash_to_scalar_old}, schemes::generics::{ZKPoK, PoKSignature}}; +use super::{signature::BBSplusSignature, keys::BBSplusPublicKey, commitment::BBSplusCommitment}; + -use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, signer_specific_generators}}, cl03::{ciphersuites::CLCiphersuite, sigma_protocols::{NISPSecrets, NISP2Commitments, NISPMultiSecrets, NISPSignaturePoK}, range_proof::{Boudot2000RangeProof, RangeProof}, bases::Bases}, utils::util::{get_remaining_indexes, get_messages, calculate_domain, calculate_random_scalars, ScalarExt, hash_to_scalar_old}, schemes::generics::{ZKPoK, PoKSignature}}; -use super::{signature::BBSplusSignature, keys::BBSplusPublicKey, commitment::BBSplusCommitment}; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct BBSplusPoKSignature{ diff --git a/src/bbsplus/signature.rs b/src/bbsplus/signature.rs index a992b0a..1223d5d 100644 --- a/src/bbsplus/signature.rs +++ b/src/bbsplus/signature.rs @@ -12,17 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::marker::PhantomData; + use bls12_381_plus::{G1Projective, Scalar, G1Affine, G2Projective, Gt, multi_miller_loop, G2Prepared}; use ff::Field; -use rug::{Integer, ops::Pow, integer::Order}; use serde::{Deserialize, Serialize}; - -use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{CL03Message, BBSplusMessage}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, self, signer_specific_generators, make_generators}}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{random::{random_prime, random_bits}, util::{calculate_domain, serialize, hash_to_scalar_old}}, schemes::generics::Signature}; - +use crate::{schemes::algorithms::BBSplus, utils::message::BBSplusMessage, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, signer_specific_generators, make_generators}}, utils::util::{calculate_domain, serialize, hash_to_scalar_old}, schemes::generics::Signature}; use elliptic_curve::{hash2curve::ExpandMsg, group::Curve, subtle::{CtOption, Choice}}; - use super::keys::{BBSplusPublicKey, BBSplusSecretKey}; diff --git a/src/cl03/bases.rs b/src/cl03/bases.rs index c4bb1da..4eb5983 100644 --- a/src/cl03/bases.rs +++ b/src/cl03/bases.rs @@ -15,11 +15,11 @@ use rug::Integer; use serde::{Serialize, Deserialize}; - use crate::utils::random::random_qr; - use super::keys::CL03PublicKey; + + #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Bases(pub Vec); diff --git a/src/cl03/blind.rs b/src/cl03/blind.rs index 618a2aa..a70c459 100644 --- a/src/cl03/blind.rs +++ b/src/cl03/blind.rs @@ -17,10 +17,10 @@ use std::panic; use digest::Digest; use rug::{Integer, ops::Pow}; use serde::{Deserialize, Serialize}; +use crate::{schemes::algorithms::CL03, utils::message::CL03Message, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::random::{random_prime, random_bits}, schemes::generics::{BlindSignature, Commitment, Signature, ZKPoK}}; +use super::{keys::{CL03SecretKey, CL03PublicKey, CL03CommitmentPublicKey}, commitment::CL03Commitment, signature::CL03Signature}; -use crate::{schemes::algorithms::{CL03}, utils::message::{BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, signer_specific_generators}}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{random::{random_prime, random_bits}, util::{calculate_domain, ScalarExt, hash_to_scalar_old}}, errors::BlindSignError, schemes::generics::{BlindSignature, Commitment, Signature, ZKPoK}}; -use super::{keys::{CL03SecretKey, CL03PublicKey, CL03CommitmentPublicKey}, commitment::CL03Commitment, signature::CL03Signature}; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] diff --git a/src/cl03/ciphersuites.rs b/src/cl03/ciphersuites.rs index 700da05..0e84ade 100644 --- a/src/cl03/ciphersuites.rs +++ b/src/cl03/ciphersuites.rs @@ -14,10 +14,11 @@ use serde::{Deserialize, Serialize}; use sha2::Sha256; - use crate::schemes::algorithms::Ciphersuite; use super::range_proof::RangeProof; + + pub trait CLCiphersuite: Eq + 'static + Ciphersuite{ const SECPARAM: u32; const ln: u32; // NOTE: length of n (i.e. special RSA modulus), ln will be used to generate all randomness and bases for public keys diff --git a/src/cl03/commitment.rs b/src/cl03/commitment.rs index cff2fc4..f3360ba 100644 --- a/src/cl03/commitment.rs +++ b/src/cl03/commitment.rs @@ -12,16 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -use bls12_381_plus::{Scalar, G1Projective}; -use elliptic_curve::hash2curve::ExpandMsg; -use rug::Integer; -use serde::{Deserialize, Serialize}; -use crate::{utils::message::{Message, BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, global_generators}}, schemes::algorithms::{Scheme, BBSplus, CL03}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{util::{calculate_random_scalars, subgroup_check_g1}, random::random_bits}, schemes::generics::Commitment}; +use rug::Integer; +use serde::{Deserialize, Serialize}; +use crate::{utils::message::{Message, CL03Message}, schemes::algorithms::CL03, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::random::random_bits, schemes::generics::Commitment}; use super::keys::{CL03CommitmentPublicKey, CL03PublicKey}; + #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct CL03Commitment { pub value: Integer, diff --git a/src/cl03/keys.rs b/src/cl03/keys.rs index b6a9241..6cfcd1b 100644 --- a/src/cl03/keys.rs +++ b/src/cl03/keys.rs @@ -18,6 +18,7 @@ use serde::{Serialize, Deserialize}; use crate::{utils::random::{random_prime, random_qr, random_number}, cl03::ciphersuites::CLCiphersuite, schemes::algorithms::{Scheme, CL03}, keys::{traits::{PublicKey, PrivateKey}, pair::KeyPair}}; + #[derive(Clone, PartialEq, PartialOrd, Eq, Hash, Debug, Ord, Serialize, Deserialize)] pub struct CL03PublicKey{ pub N: Integer, diff --git a/src/cl03/proof.rs b/src/cl03/proof.rs index 40e94ba..39866ba 100644 --- a/src/cl03/proof.rs +++ b/src/cl03/proof.rs @@ -12,17 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::marker::PhantomData; -use bls12_381_plus::{G1Projective, Scalar, G2Projective, G2Prepared, Gt, multi_miller_loop, G1Affine}; use digest::Digest; -use elliptic_curve::{hash2curve::ExpandMsg, group::Curve}; use rug::{Integer, ops::Pow}; use serde::{Serialize, Deserialize}; +use crate::{schemes::algorithms::CL03, utils::message::CL03Message, cl03::{ciphersuites::CLCiphersuite, sigma_protocols::{NISPSecrets, NISP2Commitments, NISPMultiSecrets, NISPSignaturePoK}, range_proof::{Boudot2000RangeProof, RangeProof}, bases::Bases}, schemes::generics::{ZKPoK, PoKSignature, Commitment}}; +use super::{signature::CL03Signature, commitment::CL03Commitment, keys::{CL03CommitmentPublicKey, CL03PublicKey}}; -use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{BBSplusMessage, CL03Message}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, make_generators, signer_specific_generators}}, cl03::{ciphersuites::CLCiphersuite, sigma_protocols::{NISPSecrets, NISP2Commitments, NISPMultiSecrets, NISPSignaturePoK}, range_proof::{Boudot2000RangeProof, RangeProof}, bases::Bases}, utils::util::{get_remaining_indexes, get_messages, calculate_domain, calculate_random_scalars, ScalarExt, hash_to_scalar_old}, schemes::generics::{ZKPoK, PoKSignature, Commitment}}; -use super::{signature::CL03Signature, commitment::CL03Commitment, keys::{CL03CommitmentPublicKey, CL03PublicKey}}; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] struct ProofOfValue { diff --git a/src/cl03/range_proof.rs b/src/cl03/range_proof.rs index 35444fd..364bc05 100644 --- a/src/cl03/range_proof.rs +++ b/src/cl03/range_proof.rs @@ -15,11 +15,11 @@ use digest::Digest; use rug::{Integer, integer::Order, ops::Pow, Complete}; use serde::{Serialize, Deserialize}; - use crate::utils::{random::rand_int, util::divm}; - use super::commitment::CL03Commitment; + + #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub enum RangeProof{ Boudot2000, diff --git a/src/cl03/sigma_protocols.rs b/src/cl03/sigma_protocols.rs index a31ac74..c010048 100644 --- a/src/cl03/sigma_protocols.rs +++ b/src/cl03/sigma_protocols.rs @@ -15,12 +15,12 @@ use digest::Digest; use rug::{Integer, integer::Order, Complete}; use serde::{Deserialize, Serialize}; - use crate::{utils::{message::CL03Message, random::random_bits, util::divm}, schemes::algorithms::CL03, schemes::generics::Commitment}; - use super::{ciphersuites::CLCiphersuite, bases::Bases, keys::{CL03PublicKey, CL03CommitmentPublicKey}, commitment::CL03Commitment, signature::CL03Signature}; + + #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub(crate) struct NISP2Commitments { challenge: Integer, diff --git a/src/cl03/signature.rs b/src/cl03/signature.rs index 7333c1f..e5a009d 100644 --- a/src/cl03/signature.rs +++ b/src/cl03/signature.rs @@ -12,17 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::marker::PhantomData; -use bls12_381_plus::{G1Projective, Scalar, G1Affine, G2Projective, Gt, multi_miller_loop, G2Prepared}; -use ff::Field; use rug::{Integer, ops::Pow, integer::Order}; use serde::{Deserialize, Serialize}; - -use crate::{schemes::algorithms::{Scheme, BBSplus, CL03}, utils::message::{CL03Message, BBSplusMessage}, bbsplus::{ciphersuites::BbsCiphersuite, generators::{Generators, self, signer_specific_generators, make_generators}}, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::{random::{random_prime, random_bits}, util::{calculate_domain, serialize, hash_to_scalar_old}}, schemes::generics::Signature}; - -use elliptic_curve::{hash2curve::ExpandMsg, group::Curve, subtle::{CtOption, Choice}}; - +use crate::{schemes::algorithms::CL03, utils::message::CL03Message, cl03::{ciphersuites::CLCiphersuite, bases::Bases}, utils::random::{random_prime, random_bits}, schemes::generics::Signature}; use super::keys::{CL03PublicKey, CL03SecretKey}; diff --git a/src/keys/pair.rs b/src/keys/pair.rs index b53874a..9708548 100644 --- a/src/keys/pair.rs +++ b/src/keys/pair.rs @@ -14,32 +14,9 @@ use std::env; -use bls12_381_plus::G2Affine; -use bls12_381_plus::G2Projective; -use bls12_381_plus::Scalar; -use ff::Field; -use hkdf::Hkdf; -use rand::Rng; -use rand::RngCore; -use rug::Integer; -use rug::integer::IsPrime; use serde::Deserialize; use serde::Serialize; -use sha2::Sha256; - -use crate::bbsplus::ciphersuites::BbsCiphersuite; -use crate::cl03::ciphersuites::CLCiphersuite; - -use crate::schemes::algorithms::BBSplus; -use crate::schemes::algorithms::CL03; use crate::schemes::algorithms::Scheme; -use crate::utils::random::random_prime; -use crate::utils::random::random_qr; -use crate::bbsplus::keys::BBSplusPublicKey; -use crate::bbsplus::keys::BBSplusSecretKey; -use crate::cl03::keys::CL03PublicKey; -use crate::cl03::keys::CL03SecretKey; -use sha2::Digest; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] diff --git a/src/lib.rs b/src/lib.rs index b799ffd..6dd85f9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,4 +22,4 @@ pub mod keys; pub mod schemes; pub mod bbsplus; pub mod cl03; -pub mod errors; \ No newline at end of file +pub mod errors; diff --git a/src/schemes/algorithms.rs b/src/schemes/algorithms.rs index 07f3b0f..75cf109 100644 --- a/src/schemes/algorithms.rs +++ b/src/schemes/algorithms.rs @@ -17,7 +17,7 @@ use serde::{Serialize, Deserialize, de::DeserializeOwned}; use sha2::Sha256; use sha3::Shake256; use std::marker::PhantomData; -use crate::{keys::{traits::{PrivateKey, PublicKey}}, bbsplus::{ciphersuites::{BbsCiphersuite, Bls12381Shake256, Bls12381Sha256}, keys::{BBSplusSecretKey, BBSplusPublicKey}}, cl03::{ciphersuites::{CLCiphersuite, CL1024Sha256}, keys::{CL03SecretKey, CL03PublicKey}}}; +use crate::{keys::traits::{PrivateKey, PublicKey}, bbsplus::{ciphersuites::{BbsCiphersuite, Bls12381Shake256, Bls12381Sha256}, keys::{BBSplusSecretKey, BBSplusPublicKey}}, cl03::{ciphersuites::{CLCiphersuite, CL1024Sha256}, keys::{CL03SecretKey, CL03PublicKey}}}; pub type BBS_BLS12381_SHAKE256 = BBSplus; pub type BBS_BLS12381_SHA256 = BBSplus; @@ -68,6 +68,4 @@ impl Scheme for CL03 { type Ciphersuite = CS; type PrivKey = CL03SecretKey; type PubKey = CL03PublicKey; - - } \ No newline at end of file diff --git a/tests/bbsplus.rs b/tests/bbsplus.rs index 0391d40..20fd037 100644 --- a/tests/bbsplus.rs +++ b/tests/bbsplus.rs @@ -12,17 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::fs; +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(non_camel_case_types)] +use std::fs; use bbsplus::ciphersuites::BbsCiphersuite; use elliptic_curve::{hash2curve::ExpandMsg, group::Curve}; use schemes::algorithms::Scheme; - use zkryptium::{utils::message::BBSplusMessage, bbsplus::{self, generators::{make_generators, global_generators}, keys::{BBSplusSecretKey, BBSplusPublicKey}, signature::BBSplusSignature}, schemes::{self, algorithms::BBSplus}, schemes::generics::{Signature, PoKSignature, ZKPoK, Commitment, BlindSignature}, keys::pair::KeyPair, utils::{util::{hash_to_scalar_old, ScalarExt, calculate_random_scalars, get_messages}, message::Message}}; - #[cfg(test)] mod bbsplus_tests { use zkryptium::schemes::algorithms::{BBS_BLS12381_SHA256, BBS_BLS12381_SHAKE256}; diff --git a/tests/cl03.rs b/tests/cl03.rs index f2d2954..5473e8c 100644 --- a/tests/cl03.rs +++ b/tests/cl03.rs @@ -12,13 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -use digest::Digest; -use zkryptium::{keys::pair::KeyPair, schemes::algorithms::{Scheme, CL03, Ciphersuite}, utils::message::CL03Message, schemes::generics::{Signature, Commitment, ZKPoK, PoKSignature, BlindSignature}, cl03::{bases::Bases, keys::CL03CommitmentPublicKey}}; +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(non_camel_case_types)] +use digest::Digest; +use zkryptium::{keys::pair::KeyPair, schemes::algorithms::{Scheme, CL03, Ciphersuite}, utils::message::CL03Message, schemes::generics::{Signature, Commitment, ZKPoK, PoKSignature, BlindSignature}, cl03::{bases::Bases, keys::CL03CommitmentPublicKey}}; use zkryptium::cl03::ciphersuites::CLCiphersuite; + #[cfg(test)] mod cl03_tests { use zkryptium::schemes::algorithms::CL03_CL1024_SHA256; @@ -62,6 +66,7 @@ mod cl03_tests { + pub(crate) fn signature() where S::Ciphersuite: CLCiphersuite, From 89761535d1d05d90d96b13eedbb186b764ec4698 Mon Sep 17 00:00:00 2001 From: Alberto Solavagione Date: Tue, 24 Oct 2023 17:26:04 +0200 Subject: [PATCH 4/6] implemented features --- Cargo.toml | 10 +- src/lib.rs | 6 +- src/schemes/algorithms.rs | 20 +- src/schemes/generics.rs | 19 +- src/utils/message.rs | 20 +- src/utils/util.rs | 14 +- tests/bbsplus.rs | 1122 ++++++++++++++++++------------------- tests/cl03.rs | 319 ++++++----- 8 files changed, 793 insertions(+), 737 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 90c3ae3..5cd0ccb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ name = "zkryptium" version = "0.1.0" edition = "2021" license = "Apache-2.0" +authors = ["LINKS Foundation"] rust-version = "1.65" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -39,17 +40,20 @@ dotenv = "0.15.0" [lib] name = "zkryptium" path = "src/lib.rs" - - +features = ["cl03"] [[example]] name = "bbsplus" path = "examples/bbsplus.rs" +features = ["bbsplus"] [[example]] name = "cl03" path = "examples/cl03.rs" +features = ["cl03"] [features] -cl03 = [] \ No newline at end of file +cl03 = [] +bbsplus = [] +default = ["cl03", "bbsplus"] \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 6dd85f9..f5ee1d8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,6 +20,10 @@ pub mod utils; pub mod keys; pub mod schemes; +pub mod errors; + +#[cfg(feature = "bbsplus")] pub mod bbsplus; +#[cfg(feature = "cl03")] pub mod cl03; -pub mod errors; + diff --git a/src/schemes/algorithms.rs b/src/schemes/algorithms.rs index 75cf109..035707f 100644 --- a/src/schemes/algorithms.rs +++ b/src/schemes/algorithms.rs @@ -17,17 +17,28 @@ use serde::{Serialize, Deserialize, de::DeserializeOwned}; use sha2::Sha256; use sha3::Shake256; use std::marker::PhantomData; -use crate::{keys::traits::{PrivateKey, PublicKey}, bbsplus::{ciphersuites::{BbsCiphersuite, Bls12381Shake256, Bls12381Sha256}, keys::{BBSplusSecretKey, BBSplusPublicKey}}, cl03::{ciphersuites::{CLCiphersuite, CL1024Sha256}, keys::{CL03SecretKey, CL03PublicKey}}}; +use crate::keys::traits::{PrivateKey, PublicKey}; +#[cfg(feature = "bbsplus")] +use crate::bbsplus::{ciphersuites::{BbsCiphersuite, Bls12381Shake256, Bls12381Sha256}, keys::{BBSplusSecretKey, BBSplusPublicKey}}; + +#[cfg(feature = "cl03")] +use crate::cl03::{ciphersuites::{CLCiphersuite, CL1024Sha256}, keys::{CL03SecretKey, CL03PublicKey}}; + +#[cfg(feature = "bbsplus")] pub type BBS_BLS12381_SHAKE256 = BBSplus; +#[cfg(feature = "bbsplus")] pub type BBS_BLS12381_SHA256 = BBSplus; -pub type CL03_CL1024_SHA256 = CL03; +#[cfg(feature = "cl03")] +pub type CL03_CL1024_SHA256 = CL03; +#[cfg(feature = "bbsplus")] #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct BBSplus(PhantomData); +#[cfg(feature = "cl03")] #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct CL03(PhantomData); @@ -36,11 +47,12 @@ pub trait Ciphersuite: 'static + Eq{ type HashAlg: HashMarker; } - +#[cfg(feature = "bbsplus")] impl Ciphersuite for Bls12381Sha256{ type HashAlg = Shake256; } +#[cfg(feature = "bbsplus")] impl Ciphersuite for Bls12381Shake256{ type HashAlg = Sha256; @@ -58,12 +70,14 @@ Eq type PubKey: PublicKey; } +#[cfg(feature = "bbsplus")] impl Scheme for BBSplus { type Ciphersuite = CS; type PrivKey = BBSplusSecretKey; type PubKey = BBSplusPublicKey; } +#[cfg(feature = "cl03")] impl Scheme for CL03 { type Ciphersuite = CS; type PrivKey = CL03SecretKey; diff --git a/src/schemes/generics.rs b/src/schemes/generics.rs index b8fff8b..c9206a3 100644 --- a/src/schemes/generics.rs +++ b/src/schemes/generics.rs @@ -13,18 +13,21 @@ // limitations under the License. use std::marker::PhantomData; - use serde::{Serialize, Deserialize}; - -use crate::{bbsplus::{blind::BBSplusBlindSignature, commitment::BBSplusCommitment, proof::{BBSplusPoKSignature, BBSplusZKPoK}, signature::BBSplusSignature}, cl03::{blind::CL03BlindSignature, commitment::CL03Commitment, proof::{CL03PoKSignature, CL03ZKPoK}, signature::CL03Signature}}; - use super::algorithms::Scheme; +#[cfg(feature = "cl03")] +use crate::cl03::{blind::CL03BlindSignature, commitment::CL03Commitment, proof::{CL03PoKSignature, CL03ZKPoK}, signature::CL03Signature}; + +#[cfg(feature = "bbsplus")] +use crate::bbsplus::{blind::BBSplusBlindSignature, commitment::BBSplusCommitment, proof::{BBSplusPoKSignature, BBSplusZKPoK}, signature::BBSplusSignature}; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub enum BlindSignature { + #[cfg(feature = "bbsplus")] BBSplus(BBSplusBlindSignature), + #[cfg(feature = "cl03")] CL03(CL03BlindSignature), _Unreachable(std::marker::PhantomData) } @@ -32,7 +35,9 @@ pub enum BlindSignature { #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub enum Commitment { + #[cfg(feature = "bbsplus")] BBSplus(BBSplusCommitment), + #[cfg(feature = "cl03")] CL03(CL03Commitment), _Unreachable(std::marker::PhantomData) } @@ -41,7 +46,9 @@ pub enum Commitment { #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub enum PoKSignature{ + #[cfg(feature = "bbsplus")] BBSplus(BBSplusPoKSignature), + #[cfg(feature = "cl03")] CL03(CL03PoKSignature), _Unreachable(PhantomData) } @@ -49,7 +56,9 @@ pub enum PoKSignature{ #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub enum ZKPoK { + #[cfg(feature = "bbsplus")] BBSplus(BBSplusZKPoK), + #[cfg(feature = "cl03")] CL03(CL03ZKPoK), _Unreachable(PhantomData) } @@ -57,7 +66,9 @@ pub enum ZKPoK { #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub enum Signature { + #[cfg(feature = "bbsplus")] BBSplus(BBSplusSignature), + #[cfg(feature = "cl03")] CL03(CL03Signature), _Unreachable(PhantomData) } diff --git a/src/utils/message.rs b/src/utils/message.rs index db75c08..3ea09fe 100644 --- a/src/utils/message.rs +++ b/src/utils/message.rs @@ -20,7 +20,18 @@ use rug::{Integer, integer::Order}; use bls12_381_plus::Scalar; use serde::{Serialize, Deserialize}; -use crate::{utils::util::hash_to_scalar_old, cl03::ciphersuites::CLCiphersuite, bbsplus::ciphersuites::BbsCiphersuite}; + + +#[cfg(feature = "cl03")] +use crate::cl03::ciphersuites::CLCiphersuite; + +#[cfg(feature = "bbsplus")] +use crate::bbsplus::ciphersuites::BbsCiphersuite; +#[cfg(feature = "bbsplus")] +use crate::utils::util::hash_to_scalar_old; + + + pub const BBS_MESSAGE_LENGTH: usize = usize::MAX; @@ -33,11 +44,13 @@ pub trait Message { fn get_value(&self) -> Self::Value; } +#[cfg(feature = "bbsplus")] #[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct BBSplusMessage{ pub value: Scalar } +#[cfg(feature = "bbsplus")] impl BBSplusMessage { pub fn new(msg: Scalar) -> Self{ @@ -64,11 +77,12 @@ impl BBSplusMessage { } +#[cfg(feature = "cl03")] #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct CL03Message{ pub value: Integer } - +#[cfg(feature = "cl03")] impl CL03Message { pub fn new(msg: Integer) -> Self { @@ -87,6 +101,7 @@ impl CL03Message { } +#[cfg(feature = "bbsplus")] impl Message for BBSplusMessage { type Value = Scalar; @@ -112,6 +127,7 @@ impl Message for BBSplusMessage { } } +#[cfg(feature = "cl03")] impl Message for CL03Message { type Value = Integer; diff --git a/src/utils/util.rs b/src/utils/util.rs index 6409a90..6488670 100644 --- a/src/utils/util.rs +++ b/src/utils/util.rs @@ -20,11 +20,14 @@ use bls12_381_plus::{Scalar, G1Projective, G2Projective}; use elliptic_curve::{hash2curve::{ExpandMsg, Expander}, group::Curve}; use rand::RngCore; use rug::{Integer, integer::Order}; + +#[cfg(feature = "bbsplus")] use super::message::BBSplusMessage; +#[cfg(feature = "bbsplus")] use crate::{bbsplus::ciphersuites::BbsCiphersuite, bbsplus::keys::BBSplusPublicKey}; - +#[cfg(feature = "bbsplus")] pub fn hash_to_scalar(msg_octects: &[u8], dst: Option<&[u8]>) -> Scalar where C::Expander: for<'a> ExpandMsg<'a>, @@ -53,6 +56,7 @@ where hashed_scalar } +#[cfg(feature = "bbsplus")] pub fn hash_to_scalar_old(msg_octects: &[u8], count: usize, dst: Option<&[u8]>) -> Vec where C::Expander: for<'a> ExpandMsg<'a>, @@ -103,6 +107,8 @@ where // } + +#[cfg(feature = "bbsplus")] pub fn subgroup_check_g1(p: G1Projective) -> bool { if p.is_on_curve().into() /*&& p.is_identity().into()*/ { true @@ -112,6 +118,8 @@ pub fn subgroup_check_g1(p: G1Projective) -> bool { } } + +#[cfg(feature = "bbsplus")] pub(crate) fn calculate_domain(pk: &BBSplusPublicKey, q1: G1Projective, q2: G1Projective, h_points: &[G1Projective], header: Option<&[u8]>) -> Scalar where CS::Expander: for<'a> ExpandMsg<'a>, @@ -232,6 +240,8 @@ pub fn get_remaining_indexes(length: usize, indexes: &[usize]) -> Vec{ remaining } + +#[cfg(feature = "bbsplus")] pub fn get_messages(messages: &[BBSplusMessage], indexes: &[usize]) -> Vec { let mut out: Vec = Vec::new(); for i in indexes { @@ -242,6 +252,8 @@ pub fn get_messages(messages: &[BBSplusMessage], indexes: &[usize]) -> Vec(count: usize, seed: Option<&[u8]>) -> Vec where CS: BbsCiphersuite, diff --git a/tests/bbsplus.rs b/tests/bbsplus.rs index 20fd037..b1e0781 100644 --- a/tests/bbsplus.rs +++ b/tests/bbsplus.rs @@ -16,19 +16,19 @@ #![allow(non_upper_case_globals)] #![allow(non_camel_case_types)] -use std::fs; -use bbsplus::ciphersuites::BbsCiphersuite; -use elliptic_curve::{hash2curve::ExpandMsg, group::Curve}; -use schemes::algorithms::Scheme; -use zkryptium::{utils::message::BBSplusMessage, bbsplus::{self, generators::{make_generators, global_generators}, keys::{BBSplusSecretKey, BBSplusPublicKey}, signature::BBSplusSignature}, schemes::{self, algorithms::BBSplus}, schemes::generics::{Signature, PoKSignature, ZKPoK, Commitment, BlindSignature}, keys::pair::KeyPair, utils::{util::{hash_to_scalar_old, ScalarExt, calculate_random_scalars, get_messages}, message::Message}}; - - +#[cfg(feature = "bbsplus")] #[cfg(test)] mod bbsplus_tests { + + use std::fs; + use bbsplus::ciphersuites::BbsCiphersuite; + use elliptic_curve::{hash2curve::ExpandMsg, group::Curve}; + use schemes::algorithms::Scheme; + use zkryptium::{utils::message::BBSplusMessage, bbsplus::{self, generators::{make_generators, global_generators}, keys::{BBSplusSecretKey, BBSplusPublicKey}, signature::BBSplusSignature}, schemes::{self, algorithms::BBSplus}, schemes::generics::{Signature, PoKSignature, ZKPoK, Commitment, BlindSignature}, keys::pair::KeyPair, utils::{util::{hash_to_scalar_old, ScalarExt, calculate_random_scalars, get_messages}, message::Message}}; use zkryptium::schemes::algorithms::{BBS_BLS12381_SHA256, BBS_BLS12381_SHAKE256}; - use super::{map_message_to_scalar_as_hash, message_generators, msg_signature, h2s, mocked_rng, proof_check, key_pair_gen, blind_sign, blind_messages_proof_gen, update_signature}; - + + //KEYPAIR #[test] @@ -163,18 +163,18 @@ mod bbsplus_tests { h2s::("./fixture_data/bls12-381-shake-256/", "h2s/h2s002.json"); } - const SEED: &str = "332e313431353932363533353839373933323338343632363433333833323739"; + const seed: &str = "332e313431353932363533353839373933323338343632363433333833323739"; //mocked_rng - SHA256 #[test] fn mocked_rng_sha256() { - mocked_rng::("./fixture_data/bls12-381-sha-256/", "mockedRng.json", SEED); + mocked_rng::("./fixture_data/bls12-381-sha-256/", "mockedRng.json"); } //mocked_rng - SHAKE256 #[test] fn mocked_rng_shake256() { - mocked_rng::("./fixture_data/bls12-381-shake-256/", "mockedRng.json", SEED); + mocked_rng::("./fixture_data/bls12-381-shake-256/", "mockedRng.json"); } @@ -182,55 +182,55 @@ mod bbsplus_tests { //SIGNATURE POK - SHA256 #[test] fn proof_check_sha256_1() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature001.json", "proof/proof001.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature001.json", "proof/proof001.json") } #[test] fn proof_check_sha256_2() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof002.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof002.json") } #[test] fn proof_check_sha256_3() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof003.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof003.json") } #[test] fn proof_check_sha256_4() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof004.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof004.json") } #[test] fn proof_check_sha256_5() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof005.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof005.json") } #[test] fn proof_check_sha256_6() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof006.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof006.json") } #[test] fn proof_check_sha256_7() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof007.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof007.json") } #[test] fn proof_check_sha256_8() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof008.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof008.json") } #[test] fn proof_check_sha256_9() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof009.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof009.json") } #[test] fn proof_check_sha256_10() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof010.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof010.json") } #[test] fn proof_check_sha256_11() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof011.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof011.json") } #[test] fn proof_check_sha256_12() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof012.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof012.json") } #[test] fn proof_check_sha256_13() { - proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof013.json", SEED) + proof_check::("./fixture_data/bls12-381-sha-256/", "signature/signature004.json", "proof/proof013.json") } @@ -239,55 +239,55 @@ mod bbsplus_tests { #[test] fn proof_check_shake256_1() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature001.json", "proof/proof001.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature001.json", "proof/proof001.json") } #[test] fn proof_check_shake256_2() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof002.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof002.json") } #[test] fn proof_check_shake256_3() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof003.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof003.json") } #[test] fn proof_check_shake256_4() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof004.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof004.json") } #[test] fn proof_check_shake256_5() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof005.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof005.json") } #[test] fn proof_check_shake256_6() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof006.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof006.json") } #[test] fn proof_check_shake256_7() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof007.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof007.json") } #[test] fn proof_check_shake256_8() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof008.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof008.json") } #[test] fn proof_check_shake256_9() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof009.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof009.json") } #[test] fn proof_check_shake256_10() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof010.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof010.json") } #[test] fn proof_check_shake256_11() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof011.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof011.json") } #[test] fn proof_check_shake256_12() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof012.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof012.json") } #[test] fn proof_check_shake256_13() { - proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof013.json", SEED) + proof_check::("./fixture_data/bls12-381-shake-256/", "signature/signature004.json", "proof/proof013.json") } //ZKPoK (BlindMessagesProofGen) - SHA2563 @@ -329,691 +329,687 @@ mod bbsplus_tests { update_signature::("./fixture_data/bls12-381-shake-256/"); } -} + pub(crate) fn key_pair_gen(filename: &str) + where + S::Ciphersuite: BbsCiphersuite + { + eprintln!("Key Pair"); + let data = fs::read_to_string(filename).expect("Unable to read file"); + let data_json: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); + let IKM = data_json["ikm"].as_str().unwrap(); + let KEY_INFO = data_json["keyInfo"].as_str().unwrap(); + let SK_expected = data_json["keyPair"]["secretKey"].as_str().unwrap(); + let PK_expected = data_json["keyPair"]["publicKey"].as_str().unwrap(); + let keypair = KeyPair::>::generate(Some(&hex::decode(IKM).unwrap()), Some(&hex::decode(KEY_INFO).unwrap())); + let sk = keypair.private_key().encode(); + let pk = keypair.public_key().encode(); + let result1 = sk == SK_expected; + if result1 == false{ + println!(" keyGen: {}", result1); + println!(" Expected key: {}", SK_expected); + println!(" Generated key: {}", sk); + } -pub(crate) fn key_pair_gen(filename: &str) -where - S::Ciphersuite: BbsCiphersuite -{ - eprintln!("Key Pair"); - let data = fs::read_to_string(filename).expect("Unable to read file"); - let data_json: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); - let IKM = data_json["ikm"].as_str().unwrap(); - let KEY_INFO = data_json["keyInfo"].as_str().unwrap(); - let SK_expected = data_json["keyPair"]["secretKey"].as_str().unwrap(); - let PK_expected = data_json["keyPair"]["publicKey"].as_str().unwrap(); + let result2 = pk == PK_expected; - let keypair = KeyPair::>::generate(Some(&hex::decode(IKM).unwrap()), Some(&hex::decode(KEY_INFO).unwrap())); - let sk = keypair.private_key().encode(); - let pk = keypair.public_key().encode(); + if result2 == false{ + println!(" skToPk: {}", result2); + println!(" Expected key: {}", PK_expected); + println!(" Generated key: {}", pk); + } + let result = result1 && result2; - let result1 = sk == SK_expected; + assert!(result, "Failed"); - if result1 == false{ - println!(" keyGen: {}", result1); - println!(" Expected key: {}", SK_expected); - println!(" Generated key: {}", sk); } - let result2 = pk == PK_expected; - - if result2 == false{ - println!(" skToPk: {}", result2); - println!(" Expected key: {}", PK_expected); - println!(" Generated key: {}", pk); - } - let result = result1 && result2; - - assert!(result, "Failed"); + pub(crate) fn map_message_to_scalar_as_hash(filename: &str) + where + S::Ciphersuite: BbsCiphersuite, + ::Expander: for<'a> ExpandMsg<'a>, + { + let path_messages = "./fixture_data/messages.json"; + let data = fs::read_to_string(path_messages).expect("Unable to read file"); + let messages: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); + // println!("{}", messages); -} - -pub(crate) fn map_message_to_scalar_as_hash(filename: &str) -where - S::Ciphersuite: BbsCiphersuite, - ::Expander: for<'a> ExpandMsg<'a>, -{ - let path_messages = "./fixture_data/messages.json"; - let data = fs::read_to_string(path_messages).expect("Unable to read file"); - let messages: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); - // println!("{}", messages); + // let filename = "./fixture_data/bls12-381-sha-256/MapMessageToScalarAsHash.json"; + let data = fs::read_to_string(filename).expect("Unable to read file"); + let result: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); + eprintln!("{}", result["caseName"]); + // println!("{}", result["dst"].as_str().unwrap()); + let dst = hex::decode(result["dst"].as_str().unwrap()).unwrap(); + let cases = result["cases"].as_array().unwrap(); - // let filename = "./fixture_data/bls12-381-sha-256/MapMessageToScalarAsHash.json"; - let data = fs::read_to_string(filename).expect("Unable to read file"); - let result: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); - eprintln!("{}", result["caseName"]); - // println!("{}", result["dst"].as_str().unwrap()); - let dst = hex::decode(result["dst"].as_str().unwrap()).unwrap(); - let cases = result["cases"].as_array().unwrap(); + let mut boolean = true; + let mut idx = 0usize; + for m in messages.as_array().unwrap() { + let msg = &cases[idx]["message"]; + assert_eq!(m, msg); - let mut boolean = true; - let mut idx = 0usize; - for m in messages.as_array().unwrap() { - let msg = &cases[idx]["message"]; - assert_eq!(m, msg); + let msg_hex = hex::decode(msg.as_str().unwrap()).unwrap(); - let msg_hex = hex::decode(msg.as_str().unwrap()).unwrap(); + let out = hex::encode(BBSplusMessage::map_message_to_scalar_as_hash::(&msg_hex, Some(&dst)).to_bytes_be()); + let out_expected = cases[idx]["scalar"].as_str().unwrap(); - let out = hex::encode(BBSplusMessage::map_message_to_scalar_as_hash::(&msg_hex, Some(&dst)).to_bytes_be()); - let out_expected = cases[idx]["scalar"].as_str().unwrap(); + if out != out_expected{ + boolean = false; + }; - if out != out_expected{ - boolean = false; - }; + idx += 1; + } - idx += 1; + assert_eq!(boolean, true); } - assert_eq!(boolean, true); -} - - -pub(crate) fn message_generators(filename: &str) -where - S::Ciphersuite: BbsCiphersuite, - ::Expander: for<'a> ExpandMsg<'a>, -{ - let data = fs::read_to_string(filename).expect("Unable to read file"); - let res: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); - eprintln!("Message Generators"); - let mut generators_expected: Vec<&str> = Vec::new(); - for g in res["MsgGenerators"].as_array().unwrap() { - generators_expected.push(g.as_str().unwrap()); - } - - let get_generators_fn = make_generators::; - let generators = global_generators(get_generators_fn, generators_expected.len() + 2); - // print_generators(&generators); + pub(crate) fn message_generators(filename: &str) + where + S::Ciphersuite: BbsCiphersuite, + ::Expander: for<'a> ExpandMsg<'a>, + { + let data = fs::read_to_string(filename).expect("Unable to read file"); + let res: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); + eprintln!("Message Generators"); - let expected_BP = res["BP"].as_str().unwrap(); - // println!("{}", BP); + let mut generators_expected: Vec<&str> = Vec::new(); + for g in res["MsgGenerators"].as_array().unwrap() { + generators_expected.push(g.as_str().unwrap()); + } - //check BP - let BP = hex::encode(generators.g1_base_point.to_affine().to_compressed()); + let get_generators_fn = make_generators::; + let generators = global_generators(get_generators_fn, generators_expected.len() + 2); + // print_generators(&generators); - let mut result = BP == expected_BP; - // println!("{}", result); + let expected_BP = res["BP"].as_str().unwrap(); + // println!("{}", BP); - if result == false { - eprintln!("{}", result); - eprintln!(" GENERATOR BP: {}", result); - eprintln!(" Expected: {}", expected_BP); - eprintln!(" Computed: {}", BP); - } + //check BP + let BP = hex::encode(generators.g1_base_point.to_affine().to_compressed()); - let expected_Q1 = res["Q1"].as_str().unwrap(); - let Q1 = hex::encode(generators.q1.to_affine().to_compressed()); + let mut result = BP == expected_BP; + // println!("{}", result); - if expected_Q1 != Q1 { - result = false; - eprintln!(" GENERATOR Q1: {}", result); - eprintln!(" Expected: {}", expected_Q1); - eprintln!(" Computed: {}", Q1); - } + if result == false { + eprintln!("{}", result); + eprintln!(" GENERATOR BP: {}", result); + eprintln!(" Expected: {}", expected_BP); + eprintln!(" Computed: {}", BP); + } + let expected_Q1 = res["Q1"].as_str().unwrap(); + let Q1 = hex::encode(generators.q1.to_affine().to_compressed()); - let expected_Q2 = res["Q2"].as_str().unwrap(); - let Q2 = hex::encode(generators.q2.to_affine().to_compressed()); + if expected_Q1 != Q1 { + result = false; + eprintln!(" GENERATOR Q1: {}", result); + eprintln!(" Expected: {}", expected_Q1); + eprintln!(" Computed: {}", Q1); + } - if expected_Q2 != Q2 { - result = false; - eprintln!(" GENERATOR Q2: {}", result); - eprintln!(" Expected: {}", expected_Q2); - eprintln!(" Computed: {}", Q2); - } + let expected_Q2 = res["Q2"].as_str().unwrap(); + let Q2 = hex::encode(generators.q2.to_affine().to_compressed()); - generators_expected.iter().enumerate().for_each(|(i, expected_g)| { - let g = hex::encode(generators.message_generators.get(i).expect("index overflow").to_affine().to_compressed()); - if *expected_g != g{ + if expected_Q2 != Q2 { result = false; - eprintln!(" GENERATOR {}: {}", i, result); - eprintln!(" Expected: {}", *expected_g); - eprintln!(" Computed: {}", g); + eprintln!(" GENERATOR Q2: {}", result); + eprintln!(" Expected: {}", expected_Q2); + eprintln!(" Computed: {}", Q2); } - }); - assert_eq!(result, true); + generators_expected.iter().enumerate().for_each(|(i, expected_g)| { + let g = hex::encode(generators.message_generators.get(i).expect("index overflow").to_affine().to_compressed()); + if *expected_g != g{ + result = false; + eprintln!(" GENERATOR {}: {}", i, result); + eprintln!(" Expected: {}", *expected_g); + eprintln!(" Computed: {}", g); + } + }); -} + assert_eq!(result, true); -pub(crate) fn msg_signature(pathname: &str, filename: &str) -where - S::Ciphersuite: BbsCiphersuite, - ::Expander: for<'a> ExpandMsg<'a>, -{ - let data = fs::read_to_string([pathname, filename].concat()).expect("Unable to read file"); - let res: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); - eprintln!("{}", res["caseName"]); + } - let header_hex = res["header"].as_str().unwrap(); - let msgs_hex: Vec<&str> = res["messages"].as_array().unwrap().iter().map(|m| m.as_str().unwrap()).collect(); - let SK_hex = res["signerKeyPair"]["secretKey"].as_str().unwrap(); - let PK_hex = res["signerKeyPair"]["publicKey"].as_str().unwrap(); - let SIGNATURE_expected = res["signature"].as_str().unwrap(); - let RESULT_expected = res["result"]["valid"].as_bool().unwrap(); - let header = hex::decode(header_hex).unwrap(); - let SK = BBSplusSecretKey::from_bytes(&hex::decode(SK_hex).unwrap()); - let PK = BBSplusPublicKey::from_bytes(&hex::decode(PK_hex).unwrap()); + pub(crate) fn msg_signature(pathname: &str, filename: &str) + where + S::Ciphersuite: BbsCiphersuite, + ::Expander: for<'a> ExpandMsg<'a>, + { + let data = fs::read_to_string([pathname, filename].concat()).expect("Unable to read file"); + let res: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); + eprintln!("{}", res["caseName"]); + let header_hex = res["header"].as_str().unwrap(); + let msgs_hex: Vec<&str> = res["messages"].as_array().unwrap().iter().map(|m| m.as_str().unwrap()).collect(); + let SK_hex = res["signerKeyPair"]["secretKey"].as_str().unwrap(); + let PK_hex = res["signerKeyPair"]["publicKey"].as_str().unwrap(); + let SIGNATURE_expected = res["signature"].as_str().unwrap(); + let RESULT_expected = res["result"]["valid"].as_bool().unwrap(); - //Map Messages to Scalars - let data = fs::read_to_string([pathname, "MapMessageToScalarAsHash.json"].concat()).expect("Unable to read file"); - let msg_scalars: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); + let header = hex::decode(header_hex).unwrap(); + let SK = BBSplusSecretKey::from_bytes(&hex::decode(SK_hex).unwrap()); + let PK = BBSplusPublicKey::from_bytes(&hex::decode(PK_hex).unwrap()); - let dst = hex::decode(msg_scalars["dst"].as_str().unwrap()).unwrap(); - let msg_scalars: Vec = msgs_hex.iter().map(|m| BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))).collect(); - - //Precompute generators - let get_generators_fn = make_generators::; - let generators = global_generators(get_generators_fn, msg_scalars.len() + 2); + //Map Messages to Scalars + let data = fs::read_to_string([pathname, "MapMessageToScalarAsHash.json"].concat()).expect("Unable to read file"); + let msg_scalars: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); - //Sign the message - let signature = Signature::>::sign(Some(&msg_scalars), &SK, &PK, Some(&generators), Some(&header)); + let dst = hex::decode(msg_scalars["dst"].as_str().unwrap()).unwrap(); - let result0 = hex::encode(signature.to_bytes()) == SIGNATURE_expected; + let msg_scalars: Vec = msgs_hex.iter().map(|m| BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))).collect(); + + //Precompute generators + let get_generators_fn = make_generators::; + let generators = global_generators(get_generators_fn, msg_scalars.len() + 2); - let result1 = result0 == RESULT_expected; - if !result1 { - eprintln!(" SIGN: {}", result1); - eprintln!(" Expected: {}", SIGNATURE_expected); - eprintln!(" Computed: {}", hex::encode(signature.to_bytes())); - assert!(result1, "failed") - } + //Sign the message + let signature = Signature::>::sign(Some(&msg_scalars), &SK, &PK, Some(&generators), Some(&header)); + let result0 = hex::encode(signature.to_bytes()) == SIGNATURE_expected; + let result1 = result0 == RESULT_expected; + if !result1 { + eprintln!(" SIGN: {}", result1); + eprintln!(" Expected: {}", SIGNATURE_expected); + eprintln!(" Computed: {}", hex::encode(signature.to_bytes())); + assert!(result1, "failed") + } - //Verify the signature - let signature_expected = Signature::>::from_bytes(&hex::decode(SIGNATURE_expected).unwrap().try_into().unwrap()); - let result2 = signature_expected.verify(&PK, Some(&msg_scalars), Some(&generators), Some(&header)); - let result3 = result2 == RESULT_expected; - if !result3 { - eprintln!(" VERIFY: {}", result3); - eprintln!(" Expected: {}", RESULT_expected); - eprintln!(" Computed: {}", result2); - assert!(result3, "failed"); - - }else { - eprintln!(" SIGN: {}", result1); - eprintln!(" Expected: {}", SIGNATURE_expected); - eprintln!(" Computed: {}", hex::encode(signature.to_bytes())); - - eprintln!(" VERIFY: {}", result3); - eprintln!(" Expected: {}", RESULT_expected); - eprintln!(" Computed: {}", result2); - if RESULT_expected == false { - eprintln!("{} ({})", result3, res["result"]["reason"].as_str().unwrap()); + //Verify the signature + + let signature_expected = Signature::>::from_bytes(&hex::decode(SIGNATURE_expected).unwrap().try_into().unwrap()); + let result2 = signature_expected.verify(&PK, Some(&msg_scalars), Some(&generators), Some(&header)); + let result3 = result2 == RESULT_expected; + + if !result3 { + eprintln!(" VERIFY: {}", result3); + eprintln!(" Expected: {}", RESULT_expected); + eprintln!(" Computed: {}", result2); + assert!(result3, "failed"); + + }else { + eprintln!(" SIGN: {}", result1); + eprintln!(" Expected: {}", SIGNATURE_expected); + eprintln!(" Computed: {}", hex::encode(signature.to_bytes())); + + eprintln!(" VERIFY: {}", result3); + eprintln!(" Expected: {}", RESULT_expected); + eprintln!(" Computed: {}", result2); + if RESULT_expected == false { + eprintln!("{} ({})", result3, res["result"]["reason"].as_str().unwrap()); + } } - } -} + } + + pub(crate) fn h2s(pathname: &str, filename: &str) + where + S::Ciphersuite: BbsCiphersuite, + ::Expander: for<'a> ExpandMsg<'a>, + { + let data = fs::read_to_string([pathname, filename].concat()).expect("Unable to read file"); + let res: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); + eprintln!("{}", res["caseName"]); -pub(crate) fn h2s(pathname: &str, filename: &str) -where - S::Ciphersuite: BbsCiphersuite, - ::Expander: for<'a> ExpandMsg<'a>, -{ - let data = fs::read_to_string([pathname, filename].concat()).expect("Unable to read file"); - let res: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); - eprintln!("{}", res["caseName"]); + let msg_hex = res["message"].as_str().unwrap(); + let dst_hex = res["dst"].as_str().unwrap(); + let count = usize::try_from(res["count"].as_u64().unwrap()).unwrap(); + let scalars_hex = res["scalars"].as_array().unwrap(); - let msg_hex = res["message"].as_str().unwrap(); - let dst_hex = res["dst"].as_str().unwrap(); - let count = usize::try_from(res["count"].as_u64().unwrap()).unwrap(); - let scalars_hex = res["scalars"].as_array().unwrap(); + let msg = hex::decode(msg_hex).unwrap(); + let dst = hex::decode(dst_hex).unwrap(); - let msg = hex::decode(msg_hex).unwrap(); - let dst = hex::decode(dst_hex).unwrap(); + assert_eq!(count, scalars_hex.len(), "count != len(SCALARS_hex)"); - assert_eq!(count, scalars_hex.len(), "count != len(SCALARS_hex)"); + let scalars = hash_to_scalar_old::(&msg, count, Some(&dst)); - let scalars = hash_to_scalar_old::(&msg, count, Some(&dst)); + let mut results = true; - let mut results = true; + for i in 0..count { + let scalar_hex = hex::encode(scalars[i].to_bytes_be()); + let scalar_expected = scalars_hex[i].as_str().unwrap(); - for i in 0..count { - let scalar_hex = hex::encode(scalars[i].to_bytes_be()); - let scalar_expected = scalars_hex[i].as_str().unwrap(); + if scalar_hex != scalar_expected { + if results { + results = false; + eprintln!("{}", results); + } - if scalar_hex != scalar_expected { - if results { - results = false; - eprintln!("{}", results); + eprintln!(" count: {}", i); + eprintln!(" Expected scalar: {}", scalar_expected); + eprintln!(" Computed scalar: {}", scalar_hex); } - eprintln!(" count: {}", i); - eprintln!(" Expected scalar: {}", scalar_expected); - eprintln!(" Computed scalar: {}", scalar_hex); } + assert!(results, "Failed"); } - assert!(results, "Failed"); -} - -pub(crate) fn mocked_rng(pathname: &str, filename: &str, SEED: &str) -where - S::Ciphersuite: BbsCiphersuite, - ::Expander: for<'a> ExpandMsg<'a>, -{ - let data = fs::read_to_string([pathname, filename].concat()).expect("Unable to read file"); - let res: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); - eprintln!("Mocked Random Scalars"); + pub(crate) fn mocked_rng(pathname: &str, filename: &str) + where + S::Ciphersuite: BbsCiphersuite, + ::Expander: for<'a> ExpandMsg<'a>, + { + let data = fs::read_to_string([pathname, filename].concat()).expect("Unable to read file"); + let res: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); + eprintln!("Mocked Random Scalars"); - let mocked_scalars_hex: Vec<&str> = res["mockedScalars"].as_array().unwrap().iter().map(|s| s.as_str().unwrap()).collect(); + let mocked_scalars_hex: Vec<&str> = res["mockedScalars"].as_array().unwrap().iter().map(|s| s.as_str().unwrap()).collect(); - let count = mocked_scalars_hex.len(); + let count = mocked_scalars_hex.len(); - let r = calculate_random_scalars::(count, Some(&hex::decode(SEED).unwrap())); + let r = calculate_random_scalars::(count, Some(&hex::decode(seed).unwrap())); - let mut results = true; + let mut results = true; - for i in 0..count{ - let scalar_hex = hex::encode(r[i].to_bytes_be()); + for i in 0..count{ + let scalar_hex = hex::encode(r[i].to_bytes_be()); - let scalar_expected = mocked_scalars_hex[i]; + let scalar_expected = mocked_scalars_hex[i]; - if scalar_hex != scalar_expected { - if results == true { - results = false + if scalar_hex != scalar_expected { + if results == true { + results = false + } + eprintln!(" count: {}", i); + eprintln!(" Expected scalar: {}", scalar_expected); + eprintln!(" Computed scalar: {}", scalar_hex); } - eprintln!(" count: {}", i); - eprintln!(" Expected scalar: {}", scalar_expected); - eprintln!(" Computed scalar: {}", scalar_hex); } - } - assert!(results, "Failed"); -} + assert!(results, "Failed"); + } -pub(crate) fn proof_check(pathname: &str, sign_filename: &str, proof_filename: &str, SEED: &str) -where - S::Ciphersuite: BbsCiphersuite, - ::Expander: for<'a> ExpandMsg<'a>, -{ - let data = fs::read_to_string([pathname, proof_filename].concat()).expect("Unable to read file"); - let proof_json: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); + pub(crate) fn proof_check(pathname: &str, sign_filename: &str, proof_filename: &str) + where + S::Ciphersuite: BbsCiphersuite, + ::Expander: for<'a> ExpandMsg<'a>, + { + let data = fs::read_to_string([pathname, proof_filename].concat()).expect("Unable to read file"); + let proof_json: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse"); - let signerPK_hex = proof_json["signerPublicKey"].as_str().unwrap(); - let header_hex = proof_json["header"].as_str().unwrap(); - let ph_hex = proof_json["presentationHeader"].as_str().unwrap(); - let revealed_msgs_hex = proof_json["revealedMessages"].as_object().unwrap(); + let signerPK_hex = proof_json["signerPublicKey"].as_str().unwrap(); + let header_hex = proof_json["header"].as_str().unwrap(); + let ph_hex = proof_json["presentationHeader"].as_str().unwrap(); + let revealed_msgs_hex = proof_json["revealedMessages"].as_object().unwrap(); - let proof_expected = proof_json["proof"].as_str().unwrap(); - let result_expected = proof_json["result"]["valid"].as_bool().unwrap(); + let proof_expected = proof_json["proof"].as_str().unwrap(); + let result_expected = proof_json["result"]["valid"].as_bool().unwrap(); - let ph = hex::decode(ph_hex).unwrap(); - let idxs_list: Vec = revealed_msgs_hex.keys().filter_map(|k| k.parse::().ok()).collect(); + let ph = hex::decode(ph_hex).unwrap(); + let idxs_list: Vec = revealed_msgs_hex.keys().filter_map(|k| k.parse::().ok()).collect(); - let msgs_hex: Vec<&str> = revealed_msgs_hex.values().filter_map(|m| m.as_str()).collect(); + let msgs_hex: Vec<&str> = revealed_msgs_hex.values().filter_map(|m| m.as_str()).collect(); - let revealed_message_indexes = idxs_list; + let revealed_message_indexes = idxs_list; - let revealed_messages = msgs_hex; + let revealed_messages = msgs_hex; - //Get Message Signature + //Get Message Signature - let data_sign = fs::read_to_string([pathname, sign_filename].concat()).expect("Unable to read file"); - let sign_json: serde_json::Value = serde_json::from_str(&data_sign).expect("Unable to parse"); + let data_sign = fs::read_to_string([pathname, sign_filename].concat()).expect("Unable to read file"); + let sign_json: serde_json::Value = serde_json::from_str(&data_sign).expect("Unable to parse"); - let msgs_hex: Vec<&str> = sign_json["messages"].as_array().unwrap().iter().filter_map(|m| m.as_str()).collect(); - let signature_expected = sign_json["signature"].as_str().unwrap(); + let msgs_hex: Vec<&str> = sign_json["messages"].as_array().unwrap().iter().filter_map(|m| m.as_str()).collect(); + let signature_expected = sign_json["signature"].as_str().unwrap(); - let signature = Signature::>::from_bytes(hex::decode(signature_expected).unwrap().as_slice().try_into().unwrap()); - let bbs_signature = signature.bbsPlusSignature(); - - let header = hex::decode(header_hex).unwrap(); - let PK = BBSplusPublicKey::from_bytes(&hex::decode(signerPK_hex).unwrap()); + let signature = Signature::>::from_bytes(hex::decode(signature_expected).unwrap().as_slice().try_into().unwrap()); + let bbs_signature = signature.bbsPlusSignature(); + + let header = hex::decode(header_hex).unwrap(); + let PK = BBSplusPublicKey::from_bytes(&hex::decode(signerPK_hex).unwrap()); - let mut messages = msgs_hex; - let mut idx = 0usize; - - for i in &revealed_message_indexes { - messages[*i] = revealed_messages[idx]; - idx += 1; - } + let mut messages = msgs_hex; + let mut idx = 0usize; - //Map Messages to Scalars - let data_scalars = fs::read_to_string([pathname, "MapMessageToScalarAsHash.json"].concat()).expect("Unable to read file"); - let scalars_json: serde_json::Value = serde_json::from_str(&data_scalars).expect("Unable to parse"); - let dst = hex::decode(scalars_json["dst"].as_str().unwrap()).unwrap(); + for i in &revealed_message_indexes { + messages[*i] = revealed_messages[idx]; + idx += 1; + } - let mut msg_scalars: Vec = Vec::new(); - for m in messages { - msg_scalars.push(BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))); - } + //Map Messages to Scalars + let data_scalars = fs::read_to_string([pathname, "MapMessageToScalarAsHash.json"].concat()).expect("Unable to read file"); + let scalars_json: serde_json::Value = serde_json::from_str(&data_scalars).expect("Unable to parse"); + let dst = hex::decode(scalars_json["dst"].as_str().unwrap()).unwrap(); + let mut msg_scalars: Vec = Vec::new(); + for m in messages { + msg_scalars.push(BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))); + } - //Precompute generators - let L = msg_scalars.len() + 1; - // NOTE: one extra generator, for additional test vectors with one extra message - let get_generators_fn = make_generators::; - let generators = global_generators(get_generators_fn, L + 2); - let proof = PoKSignature::>::proof_gen(bbs_signature, &PK, Some(&msg_scalars), Some(&generators), Some(&revealed_message_indexes), Some(&header), Some(&ph), Some(&hex::decode(SEED).unwrap())); + //Precompute generators + let L = msg_scalars.len() + 1; + // NOTE: one extra generator, for additional test vectors with one extra message + let get_generators_fn = make_generators::; + let generators = global_generators(get_generators_fn, L + 2); - let result0 = hex::encode(proof.to_bytes()) == proof_expected; - let result1 = result0 == result_expected; - if result1 == false{ - println!(" proofGen: {}", result1); - println!(" Expected: {}", proof_expected); - println!(" Computed: {}", hex::encode(proof.to_bytes())); - assert!(result1, "Failed"); - } + let proof = PoKSignature::>::proof_gen(bbs_signature, &PK, Some(&msg_scalars), Some(&generators), Some(&revealed_message_indexes), Some(&header), Some(&ph), Some(&hex::decode(seed).unwrap())); - // Verify the Proof - let disclosed_messages = get_messages(&msg_scalars, &revealed_message_indexes); + let result0 = hex::encode(proof.to_bytes()) == proof_expected; + let result1 = result0 == result_expected; + if result1 == false{ + println!(" proofGen: {}", result1); + println!(" Expected: {}", proof_expected); + println!(" Computed: {}", hex::encode(proof.to_bytes())); + assert!(result1, "Failed"); + } - let PROOF = PoKSignature::>::from_bytes(&hex::decode(proof_expected).unwrap()); - let result2 = PROOF.proof_verify(&PK, Some(&disclosed_messages), Some(&generators), Some(&revealed_message_indexes), Some(&header), Some(&ph)); - let result3 = result2 == result_expected; - if !result3 { - eprintln!(" proofVerify: {}", result3); - eprintln!(" Expected: {}", result_expected); - eprintln!(" Computed: {}", result2); - assert!(result3, "failed"); - - }else { - eprintln!(" proofGen: {}", result1); - eprintln!(" Expected: {}", signature_expected); - eprintln!(" Computed: {}", hex::encode(signature.to_bytes())); - - eprintln!(" proofVerify: {}", result3); - eprintln!(" Expected: {}", result_expected); - eprintln!(" Computed: {}", result2); - if result_expected == false { - eprintln!("{} ({})", result3, proof_json["result"]["reason"].as_str().unwrap()); + // Verify the Proof + let disclosed_messages = get_messages(&msg_scalars, &revealed_message_indexes); + + let PROOF = PoKSignature::>::from_bytes(&hex::decode(proof_expected).unwrap()); + let result2 = PROOF.proof_verify(&PK, Some(&disclosed_messages), Some(&generators), Some(&revealed_message_indexes), Some(&header), Some(&ph)); + let result3 = result2 == result_expected; + if !result3 { + eprintln!(" proofVerify: {}", result3); + eprintln!(" Expected: {}", result_expected); + eprintln!(" Computed: {}", result2); + assert!(result3, "failed"); + + }else { + eprintln!(" proofGen: {}", result1); + eprintln!(" Expected: {}", signature_expected); + eprintln!(" Computed: {}", hex::encode(signature.to_bytes())); + + eprintln!(" proofVerify: {}", result3); + eprintln!(" Expected: {}", result_expected); + eprintln!(" Computed: {}", result2); + if result_expected == false { + eprintln!("{} ({})", result3, proof_json["result"]["reason"].as_str().unwrap()); + } } } -} -pub(crate) fn blind_messages_proof_gen(pathname: &str) -where - S::Ciphersuite: BbsCiphersuite, - ::Expander: for<'a> ExpandMsg<'a>, -{ - const IKM: &str = "746869732d49532d6a7573742d616e2d546573742d494b4d2d746f2d67656e65726174652d246528724074232d6b6579"; - const KEY_INFO: &str = "746869732d49532d736f6d652d6b65792d6d657461646174612d746f2d62652d757365642d696e2d746573742d6b65792d67656e"; - const msgs: [&str; 3] = ["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "87a8bd656d49ee07b8110e1d8fd4f1dcef6fb9bc368c492d9bc8c4f98a739ac6", "96012096adda3f13dd4adbe4eea481a4c4b5717932b73b00e31807d3c5894b90"]; - const msgs_wrong: [&str; 3] = ["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "87a8bd656d49ee07b8110e1d8fd4f1dcef6fb9bc368c492d9bc8c4f98a739ac7", "96012096adda3f13dd4adbe4eea481a4c4b5717932b73b00e31807d3c5894b91"]; - const header_hex: &str = "11223344556677889900aabbccddeeff"; - let header = hex::decode(header_hex).unwrap(); - let unrevealed_message_indexes = [1usize]; - let revealed_message_indexes = [0usize, 2usize]; - // let nonce = generate_nonce(); - let nonce = b"aaaa".as_slice(); + pub(crate) fn blind_messages_proof_gen(pathname: &str) + where + S::Ciphersuite: BbsCiphersuite, + ::Expander: for<'a> ExpandMsg<'a>, + { + const IKM: &str = "746869732d49532d6a7573742d616e2d546573742d494b4d2d746f2d67656e65726174652d246528724074232d6b6579"; + const KEY_INFO: &str = "746869732d49532d736f6d652d6b65792d6d657461646174612d746f2d62652d757365642d696e2d746573742d6b65792d67656e"; + const msgs: [&str; 3] = ["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "87a8bd656d49ee07b8110e1d8fd4f1dcef6fb9bc368c492d9bc8c4f98a739ac6", "96012096adda3f13dd4adbe4eea481a4c4b5717932b73b00e31807d3c5894b90"]; + const msgs_wrong: [&str; 3] = ["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "87a8bd656d49ee07b8110e1d8fd4f1dcef6fb9bc368c492d9bc8c4f98a739ac7", "96012096adda3f13dd4adbe4eea481a4c4b5717932b73b00e31807d3c5894b91"]; + const header_hex: &str = "11223344556677889900aabbccddeeff"; + let header = hex::decode(header_hex).unwrap(); + let unrevealed_message_indexes = [1usize]; + let revealed_message_indexes = [0usize, 2usize]; + // let nonce = generate_nonce(); + let nonce = b"aaaa".as_slice(); + + let keypair = KeyPair::>::generate( + Some(&hex::decode(&IKM).unwrap()), + Some(&hex::decode(&KEY_INFO).unwrap()) + ); + + let sk = keypair.private_key(); + let pk = keypair.public_key(); + + + let get_generators_fn = make_generators::<::Ciphersuite>; + let generators = global_generators(get_generators_fn, msgs.len() + 2); + + //Map Messages to Scalars + let data_scalars = fs::read_to_string([pathname, "MapMessageToScalarAsHash.json"].concat()).expect("Unable to read file"); + let scalars_json: serde_json::Value = serde_json::from_str(&data_scalars).expect("Unable to parse"); + let dst = hex::decode(scalars_json["dst"].as_str().unwrap()).unwrap(); + + let msgs_scalars: Vec = msgs.iter().map(|m| BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))).collect(); + let msgs_scalars_wrong: Vec = msgs_wrong.iter().map(|m| BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))).collect(); + + let commitment = Commitment::>::commit(&msgs_scalars, Some(&generators), &unrevealed_message_indexes); + let commitment_wrong = Commitment::>::commit(&msgs_scalars_wrong, Some(&generators), &unrevealed_message_indexes); + + + let unrevealed_msgs: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { + if unrevealed_message_indexes.contains(&i) { + Some(*m) + } else { + None + } + }).collect(); - let keypair = KeyPair::>::generate( - Some(&hex::decode(&IKM).unwrap()), - Some(&hex::decode(&KEY_INFO).unwrap()) - ); + let revealed_msgs: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { + if !unrevealed_message_indexes.contains(&i) { + Some(*m) + } else { + None + } + }).collect(); - let sk = keypair.private_key(); - let pk = keypair.public_key(); + let unrevealed_msgs_wrong: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { + if unrevealed_message_indexes.contains(&i) { + Some(*m) + } else { + None + } + }).collect(); + let revealed_msgs_wrong: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { + if !unrevealed_message_indexes.contains(&i) { + Some(*m) + } else { + None + } + }).collect(); - let get_generators_fn = make_generators::<::Ciphersuite>; - let generators = global_generators(get_generators_fn, msgs.len() + 2); + let zkpok = ZKPoK::>::generate_proof(&unrevealed_msgs, commitment.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, &nonce); + let verify = zkpok.verify_proof(commitment.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, nonce); - //Map Messages to Scalars - let data_scalars = fs::read_to_string([pathname, "MapMessageToScalarAsHash.json"].concat()).expect("Unable to read file"); - let scalars_json: serde_json::Value = serde_json::from_str(&data_scalars).expect("Unable to parse"); - let dst = hex::decode(scalars_json["dst"].as_str().unwrap()).unwrap(); + assert!(verify, "Error! Verification should PASS"); - let msgs_scalars: Vec = msgs.iter().map(|m| BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))).collect(); - let msgs_scalars_wrong: Vec = msgs_wrong.iter().map(|m| BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))).collect(); + let wrong_zkpok = ZKPoK::>::generate_proof(&unrevealed_msgs_wrong, commitment_wrong.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, &nonce); + let verify = wrong_zkpok.verify_proof(commitment.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, nonce); - let commitment = Commitment::>::commit(&msgs_scalars, Some(&generators), &unrevealed_message_indexes); - let commitment_wrong = Commitment::>::commit(&msgs_scalars_wrong, Some(&generators), &unrevealed_message_indexes); + assert!(!verify, "Error! Verification should FAIL"); - - let unrevealed_msgs: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { - if unrevealed_message_indexes.contains(&i) { - Some(*m) - } else { - None - } - }).collect(); - let revealed_msgs: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { - if !unrevealed_message_indexes.contains(&i) { - Some(*m) - } else { - None - } - }).collect(); + + } - let unrevealed_msgs_wrong: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { - if unrevealed_message_indexes.contains(&i) { - Some(*m) - } else { - None - } - }).collect(); + pub(crate) fn blind_sign(pathname: &str) + where + S::Ciphersuite: BbsCiphersuite, + ::Expander: for<'a> ExpandMsg<'a>, + { + const IKM: &str = "746869732d49532d6a7573742d616e2d546573742d494b4d2d746f2d67656e65726174652d246528724074232d6b6579"; + const KEY_INFO: &str = "746869732d49532d736f6d652d6b65792d6d657461646174612d746f2d62652d757365642d696e2d746573742d6b65792d67656e"; + const msgs: [&str; 3] = ["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "87a8bd656d49ee07b8110e1d8fd4f1dcef6fb9bc368c492d9bc8c4f98a739ac6", "96012096adda3f13dd4adbe4eea481a4c4b5717932b73b00e31807d3c5894b90"]; + const msgs_wrong: [&str; 3] = ["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "87a8bd656d49ee07b8110e1d8fd4f1dcef6fb9bc368c492d9bc8c4f98a739ac7", "96012096adda3f13dd4adbe4eea481a4c4b5717932b73b00e31807d3c5894b91"]; + const header_hex: &str = "11223344556677889900aabbccddeeff"; + let header = hex::decode(header_hex).unwrap(); + let unrevealed_message_indexes = [1usize]; + let revealed_message_indexes = [0usize, 2usize]; + // let nonce = generate_nonce(); + let nonce = b"aaaa".as_slice(); - let revealed_msgs_wrong: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { - if !unrevealed_message_indexes.contains(&i) { - Some(*m) - } else { - None - } - }).collect(); + let keypair = KeyPair::>::generate( + Some(&hex::decode(&IKM).unwrap()), + Some(&hex::decode(&KEY_INFO).unwrap()) + ); - let zkpok = ZKPoK::>::generate_proof(&unrevealed_msgs, commitment.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, &nonce); - let verify = zkpok.verify_proof(commitment.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, nonce); + let sk = keypair.private_key(); + let pk = keypair.public_key(); - assert!(verify, "Error! Verification should PASS"); + let get_generators_fn = make_generators::<::Ciphersuite>; + let generators = global_generators(get_generators_fn, msgs.len() + 2); - let wrong_zkpok = ZKPoK::>::generate_proof(&unrevealed_msgs_wrong, commitment_wrong.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, &nonce); - let verify = wrong_zkpok.verify_proof(commitment.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, nonce); + //Map Messages to Scalars + let data_scalars = fs::read_to_string([pathname, "MapMessageToScalarAsHash.json"].concat()).expect("Unable to read file"); + let scalars_json: serde_json::Value = serde_json::from_str(&data_scalars).expect("Unable to parse"); + let dst = hex::decode(scalars_json["dst"].as_str().unwrap()).unwrap(); - assert!(!verify, "Error! Verification should FAIL"); + let msgs_scalars: Vec = msgs.iter().map(|m| BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))).collect(); + let msgs_scalars_wrong: Vec = msgs_wrong.iter().map(|m| BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))).collect(); + let commitment = Commitment::>::commit(&msgs_scalars, Some(&generators), &unrevealed_message_indexes); + let commitment_wrong = Commitment::>::commit(&msgs_scalars_wrong, Some(&generators), &unrevealed_message_indexes); - -} + + let unrevealed_msgs: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { + if unrevealed_message_indexes.contains(&i) { + Some(*m) + } else { + None + } + }).collect(); -pub(crate) fn blind_sign(pathname: &str) -where - S::Ciphersuite: BbsCiphersuite, - ::Expander: for<'a> ExpandMsg<'a>, -{ - const IKM: &str = "746869732d49532d6a7573742d616e2d546573742d494b4d2d746f2d67656e65726174652d246528724074232d6b6579"; - const KEY_INFO: &str = "746869732d49532d736f6d652d6b65792d6d657461646174612d746f2d62652d757365642d696e2d746573742d6b65792d67656e"; - const msgs: [&str; 3] = ["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "87a8bd656d49ee07b8110e1d8fd4f1dcef6fb9bc368c492d9bc8c4f98a739ac6", "96012096adda3f13dd4adbe4eea481a4c4b5717932b73b00e31807d3c5894b90"]; - const msgs_wrong: [&str; 3] = ["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "87a8bd656d49ee07b8110e1d8fd4f1dcef6fb9bc368c492d9bc8c4f98a739ac7", "96012096adda3f13dd4adbe4eea481a4c4b5717932b73b00e31807d3c5894b91"]; - const header_hex: &str = "11223344556677889900aabbccddeeff"; - let header = hex::decode(header_hex).unwrap(); - let unrevealed_message_indexes = [1usize]; - let revealed_message_indexes = [0usize, 2usize]; - // let nonce = generate_nonce(); - let nonce = b"aaaa".as_slice(); - - let keypair = KeyPair::>::generate( - Some(&hex::decode(&IKM).unwrap()), - Some(&hex::decode(&KEY_INFO).unwrap()) - ); - - let sk = keypair.private_key(); - let pk = keypair.public_key(); - - let get_generators_fn = make_generators::<::Ciphersuite>; - let generators = global_generators(get_generators_fn, msgs.len() + 2); - - //Map Messages to Scalars - let data_scalars = fs::read_to_string([pathname, "MapMessageToScalarAsHash.json"].concat()).expect("Unable to read file"); - let scalars_json: serde_json::Value = serde_json::from_str(&data_scalars).expect("Unable to parse"); - let dst = hex::decode(scalars_json["dst"].as_str().unwrap()).unwrap(); - - let msgs_scalars: Vec = msgs.iter().map(|m| BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))).collect(); - let msgs_scalars_wrong: Vec = msgs_wrong.iter().map(|m| BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))).collect(); - - let commitment = Commitment::>::commit(&msgs_scalars, Some(&generators), &unrevealed_message_indexes); - let commitment_wrong = Commitment::>::commit(&msgs_scalars_wrong, Some(&generators), &unrevealed_message_indexes); + let revealed_msgs: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { + if !unrevealed_message_indexes.contains(&i) { + Some(*m) + } else { + None + } + }).collect(); - - let unrevealed_msgs: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { - if unrevealed_message_indexes.contains(&i) { - Some(*m) - } else { - None - } - }).collect(); + let unrevealed_msgs_wrong: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { + if unrevealed_message_indexes.contains(&i) { + Some(*m) + } else { + None + } + }).collect(); - let revealed_msgs: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { - if !unrevealed_message_indexes.contains(&i) { - Some(*m) - } else { - None - } - }).collect(); + let revealed_msgs_wrong: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { + if !unrevealed_message_indexes.contains(&i) { + Some(*m) + } else { + None + } + }).collect(); - let unrevealed_msgs_wrong: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { - if unrevealed_message_indexes.contains(&i) { - Some(*m) - } else { - None - } - }).collect(); + let zkpok = ZKPoK::>::generate_proof(&unrevealed_msgs, commitment.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, &nonce); + + let blind_signature = BlindSignature::>::blind_sign(&revealed_msgs, commitment.bbsPlusCommitment(), &zkpok, sk, pk, Some(&generators), &revealed_message_indexes, &unrevealed_message_indexes, &nonce, Some(&header)); - let revealed_msgs_wrong: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { - if !unrevealed_message_indexes.contains(&i) { - Some(*m) - } else { - None + if let Err(e) = &blind_signature { + println!("Error: {}", e); } - }).collect(); + + assert!(blind_signature.is_ok(), "Blind Signature Error"); - let zkpok = ZKPoK::>::generate_proof(&unrevealed_msgs, commitment.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, &nonce); + let wrong_zkpok = ZKPoK::>::generate_proof(&unrevealed_msgs_wrong, commitment_wrong.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, &nonce); + let blind_signature_wrong = BlindSignature::>::blind_sign(&revealed_msgs, commitment.bbsPlusCommitment(), &wrong_zkpok, sk, pk, Some(&generators), &revealed_message_indexes, &unrevealed_message_indexes, &nonce, Some(&header)); + + assert!(blind_signature_wrong.is_err(), "Blind Signature generation MUST fail"); - let blind_signature = BlindSignature::>::blind_sign(&revealed_msgs, commitment.bbsPlusCommitment(), &zkpok, sk, pk, Some(&generators), &revealed_message_indexes, &unrevealed_message_indexes, &nonce, Some(&header)); + let unblind_signature = blind_signature.unwrap().unblind_sign(commitment.bbsPlusCommitment()); - if let Err(e) = &blind_signature { - println!("Error: {}", e); - } - - assert!(blind_signature.is_ok(), "Blind Signature Error"); + let verify = unblind_signature.verify(pk, Some(&msgs_scalars), Some(&generators), Some(&header)); - let wrong_zkpok = ZKPoK::>::generate_proof(&unrevealed_msgs_wrong, commitment_wrong.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, &nonce); - let blind_signature_wrong = BlindSignature::>::blind_sign(&revealed_msgs, commitment.bbsPlusCommitment(), &wrong_zkpok, sk, pk, Some(&generators), &revealed_message_indexes, &unrevealed_message_indexes, &nonce, Some(&header)); - - assert!(blind_signature_wrong.is_err(), "Blind Signature generation MUST fail"); + assert!(verify, "Unblinded Signature NOT VALID!"); - let unblind_signature = blind_signature.unwrap().unblind_sign(commitment.bbsPlusCommitment()); + let verify_wrong = unblind_signature.verify(pk, Some(&msgs_scalars_wrong), Some(&generators), Some(&header)); - let verify = unblind_signature.verify(pk, Some(&msgs_scalars), Some(&generators), Some(&header)); + assert!(!verify_wrong, "Unblinded Signature MUST be INVALID!"); - assert!(verify, "Unblinded Signature NOT VALID!"); - let verify_wrong = unblind_signature.verify(pk, Some(&msgs_scalars_wrong), Some(&generators), Some(&header)); + } - assert!(!verify_wrong, "Unblinded Signature MUST be INVALID!"); -} + pub(crate) fn update_signature(pathname: &str) + where + S::Ciphersuite: BbsCiphersuite, + ::Expander: for<'a> ExpandMsg<'a>, + { + const IKM: &str = "746869732d49532d6a7573742d616e2d546573742d494b4d2d746f2d67656e65726174652d246528724074232d6b6579"; + const KEY_INFO: &str = "746869732d49532d736f6d652d6b65792d6d657461646174612d746f2d62652d757365642d696e2d746573742d6b65792d67656e"; + const msgs: [&str; 3] = ["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "87a8bd656d49ee07b8110e1d8fd4f1dcef6fb9bc368c492d9bc8c4f98a739ac6", "96012096adda3f13dd4adbe4eea481a4c4b5717932b73b00e31807d3c5894b90"]; + const header_hex: &str = "11223344556677889900aabbccddeeff"; + let header = hex::decode(header_hex).unwrap(); + let unrevealed_message_indexes = [1usize]; + let revealed_message_indexes = [0usize, 2usize]; + // let nonce = generate_nonce(); + let nonce = b"aaaa".as_slice(); + let keypair = KeyPair::>::generate( + Some(&hex::decode(&IKM).unwrap()), + Some(&hex::decode(&KEY_INFO).unwrap()) + ); + let sk = keypair.private_key(); + let pk = keypair.public_key(); -pub(crate) fn update_signature(pathname: &str) -where - S::Ciphersuite: BbsCiphersuite, - ::Expander: for<'a> ExpandMsg<'a>, -{ - const IKM: &str = "746869732d49532d6a7573742d616e2d546573742d494b4d2d746f2d67656e65726174652d246528724074232d6b6579"; - const KEY_INFO: &str = "746869732d49532d736f6d652d6b65792d6d657461646174612d746f2d62652d757365642d696e2d746573742d6b65792d67656e"; - const msgs: [&str; 3] = ["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "87a8bd656d49ee07b8110e1d8fd4f1dcef6fb9bc368c492d9bc8c4f98a739ac6", "96012096adda3f13dd4adbe4eea481a4c4b5717932b73b00e31807d3c5894b90"]; - const header_hex: &str = "11223344556677889900aabbccddeeff"; - let header = hex::decode(header_hex).unwrap(); - let unrevealed_message_indexes = [1usize]; - let revealed_message_indexes = [0usize, 2usize]; - // let nonce = generate_nonce(); - let nonce = b"aaaa".as_slice(); + let get_generators_fn = make_generators::<::Ciphersuite>; + let generators = global_generators(get_generators_fn, msgs.len() + 2); - let keypair = KeyPair::>::generate( - Some(&hex::decode(&IKM).unwrap()), - Some(&hex::decode(&KEY_INFO).unwrap()) - ); + //Map Messages to Scalars + let data_scalars = fs::read_to_string([pathname, "MapMessageToScalarAsHash.json"].concat()).expect("Unable to read file"); + let scalars_json: serde_json::Value = serde_json::from_str(&data_scalars).expect("Unable to parse"); + let dst = hex::decode(scalars_json["dst"].as_str().unwrap()).unwrap(); - let sk = keypair.private_key(); - let pk = keypair.public_key(); + let msgs_scalars: Vec = msgs.iter().map(|m| BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))).collect(); + + let commitment = Commitment::>::commit(&msgs_scalars, Some(&generators), &unrevealed_message_indexes); + + + let unrevealed_msgs: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { + if unrevealed_message_indexes.contains(&i) { + Some(*m) + } else { + None + } + }).collect(); - let get_generators_fn = make_generators::<::Ciphersuite>; - let generators = global_generators(get_generators_fn, msgs.len() + 2); + let revealed_msgs: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { + if !unrevealed_message_indexes.contains(&i) { + Some(*m) + } else { + None + } + }).collect(); - //Map Messages to Scalars - let data_scalars = fs::read_to_string([pathname, "MapMessageToScalarAsHash.json"].concat()).expect("Unable to read file"); - let scalars_json: serde_json::Value = serde_json::from_str(&data_scalars).expect("Unable to parse"); - let dst = hex::decode(scalars_json["dst"].as_str().unwrap()).unwrap(); + let zkpok = ZKPoK::>::generate_proof(&unrevealed_msgs, commitment.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, &nonce); - let msgs_scalars: Vec = msgs.iter().map(|m| BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(m).unwrap(), Some(&dst))).collect(); - - let commitment = Commitment::>::commit(&msgs_scalars, Some(&generators), &unrevealed_message_indexes); - - - let unrevealed_msgs: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { - if unrevealed_message_indexes.contains(&i) { - Some(*m) - } else { - None - } - }).collect(); + let blind_signature_result = BlindSignature::>::blind_sign(&revealed_msgs, commitment.bbsPlusCommitment(), &zkpok, sk, pk, Some(&generators), &revealed_message_indexes, &unrevealed_message_indexes, &nonce, Some(&header)); - let revealed_msgs: Vec = msgs_scalars.iter().enumerate().filter_map(|(i, m)| { - if !unrevealed_message_indexes.contains(&i) { - Some(*m) - } else { - None + if let Err(e) = &blind_signature_result { + println!("Error: {}", e); } - }).collect(); + + assert!(blind_signature_result.is_ok(), "Blind Signature Error"); + let blind_signature = blind_signature_result.unwrap(); - let zkpok = ZKPoK::>::generate_proof(&unrevealed_msgs, commitment.bbsPlusCommitment(), &generators, &unrevealed_message_indexes, &nonce); + let unblind_signature = blind_signature.unblind_sign(commitment.bbsPlusCommitment()); - let blind_signature_result = BlindSignature::>::blind_sign(&revealed_msgs, commitment.bbsPlusCommitment(), &zkpok, sk, pk, Some(&generators), &revealed_message_indexes, &unrevealed_message_indexes, &nonce, Some(&header)); + let verify = unblind_signature.verify(pk, Some(&msgs_scalars), Some(&generators), Some(&header)); - if let Err(e) = &blind_signature_result { - println!("Error: {}", e); - } - - assert!(blind_signature_result.is_ok(), "Blind Signature Error"); - let blind_signature = blind_signature_result.unwrap(); - - let unblind_signature = blind_signature.unblind_sign(commitment.bbsPlusCommitment()); - - let verify = unblind_signature.verify(pk, Some(&msgs_scalars), Some(&generators), Some(&header)); + assert!(verify, "Unblinded Signature NOT VALID!"); - assert!(verify, "Unblinded Signature NOT VALID!"); + const new_message: &str = "8872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02"; + const update_index: usize = 0usize; + let new_message_scalar = BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(new_message).unwrap(), Some(&dst)); - const new_message: &str = "8872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02"; - const update_index: usize = 0usize; - let new_message_scalar = BBSplusMessage::map_message_to_scalar_as_hash::(&hex::decode(new_message).unwrap(), Some(&dst)); + let mut new_msgs_scalars = msgs_scalars.clone(); + new_msgs_scalars[update_index] = new_message_scalar; - let mut new_msgs_scalars = msgs_scalars.clone(); - new_msgs_scalars[update_index] = new_message_scalar; + let updated_signature = blind_signature.update_signature(sk, &generators, &revealed_msgs, &new_message_scalar, update_index); + let unblind_updated_signature: Signature::Ciphersuite>> = Signature::BBSplus(BBSplusSignature { a: updated_signature.a(), e: unblind_signature.e(), s: unblind_signature.s()}); + let verify = unblind_updated_signature.verify(pk, Some(&new_msgs_scalars), Some(&generators), Some(&header)); - let updated_signature = blind_signature.update_signature(sk, &generators, &revealed_msgs, &new_message_scalar, update_index); - let unblind_updated_signature: Signature::Ciphersuite>> = Signature::BBSplus(BBSplusSignature { a: updated_signature.a(), e: unblind_signature.e(), s: unblind_signature.s()}); - let verify = unblind_updated_signature.verify(pk, Some(&new_msgs_scalars), Some(&generators), Some(&header)); - - assert!(verify, "Unblinded Signature NOT VALID!"); + assert!(verify, "Unblinded Signature NOT VALID!"); + } } diff --git a/tests/cl03.rs b/tests/cl03.rs index 5473e8c..f0e81e9 100644 --- a/tests/cl03.rs +++ b/tests/cl03.rs @@ -16,17 +16,18 @@ #![allow(non_snake_case)] #![allow(non_upper_case_globals)] #![allow(non_camel_case_types)] - -use digest::Digest; -use zkryptium::{keys::pair::KeyPair, schemes::algorithms::{Scheme, CL03, Ciphersuite}, utils::message::CL03Message, schemes::generics::{Signature, Commitment, ZKPoK, PoKSignature, BlindSignature}, cl03::{bases::Bases, keys::CL03CommitmentPublicKey}}; -use zkryptium::cl03::ciphersuites::CLCiphersuite; - + +#[cfg(feature = "cl03")] #[cfg(test)] mod cl03_tests { + + use digest::Digest; + use zkryptium::{keys::pair::KeyPair, schemes::algorithms::{Scheme, CL03, Ciphersuite}, utils::message::CL03Message, schemes::generics::{Signature, Commitment, ZKPoK, PoKSignature, BlindSignature}, cl03::{bases::Bases, keys::CL03CommitmentPublicKey}}; + use zkryptium::cl03::ciphersuites::CLCiphersuite; use zkryptium::schemes::algorithms::CL03_CL1024_SHA256; - use super::{signature, zkpok, blind_sign, spok, update_signature}; + // use super::{signature, zkpok, blind_sign, spok, update_signature}; //Signature (sign) - CL1024-SHA256 @@ -62,237 +63,235 @@ mod cl03_tests { update_signature::(); } -} - + pub(crate) fn signature() + where + S::Ciphersuite: CLCiphersuite, + ::HashAlg: Digest + { + const msg: &str = "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02"; + const wrong_msg: &str = "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03"; -pub(crate) fn signature() -where - S::Ciphersuite: CLCiphersuite, - ::HashAlg: Digest -{ - const msg: &str = "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02"; - const wrong_msg: &str = "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03"; + let cl03_keypair = KeyPair::>::generate(); + let a_bases = Bases::generate(cl03_keypair.public_key(), 1); - let cl03_keypair = KeyPair::>::generate(); - let a_bases = Bases::generate(cl03_keypair.public_key(), 1); + let message = CL03Message::map_message_to_integer_as_hash::(&hex::decode(msg).unwrap()); + + let wrong_message = CL03Message::map_message_to_integer_as_hash::(&hex::decode(wrong_msg).unwrap()); - let message = CL03Message::map_message_to_integer_as_hash::(&hex::decode(msg).unwrap()); - - let wrong_message = CL03Message::map_message_to_integer_as_hash::(&hex::decode(wrong_msg).unwrap()); + let signature = Signature::>::sign(cl03_keypair.public_key(), cl03_keypair.private_key(), &a_bases, &message); - let signature = Signature::>::sign(cl03_keypair.public_key(), cl03_keypair.private_key(), &a_bases, &message); + let valid = signature.verify(cl03_keypair.public_key(), &a_bases, &message); - let valid = signature.verify(cl03_keypair.public_key(), &a_bases, &message); + assert!(valid, "Error! Signature should be VALID"); - assert!(valid, "Error! Signature should be VALID"); + let valid = signature.verify(cl03_keypair.public_key(), &a_bases, &wrong_message); - let valid = signature.verify(cl03_keypair.public_key(), &a_bases, &wrong_message); - - assert!(!valid, "Error! Signature should be INVALID"); -} + assert!(!valid, "Error! Signature should be INVALID"); + } -pub(crate) fn zkpok() -where - S::Ciphersuite: CLCiphersuite, - ::HashAlg: Digest -{ - const msgs: &[&str] = &["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; + pub(crate) fn zkpok() + where + S::Ciphersuite: CLCiphersuite, + ::HashAlg: Digest + { + const msgs: &[&str] = &["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; - const wrong_msgs: &[&str] = &["7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; + const wrong_msgs: &[&str] = &["7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; - let cl03_keypair = KeyPair::>::generate(); - let a_bases = Bases::generate(cl03_keypair.public_key(), msgs.len()); + let cl03_keypair = KeyPair::>::generate(); + let a_bases = Bases::generate(cl03_keypair.public_key(), msgs.len()); - let messages: Vec = msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); - let wrong_messages: Vec = wrong_msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); + let messages: Vec = msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); + let wrong_messages: Vec = wrong_msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); - let unrevealed_message_indexes = [0usize]; - let commitment = Commitment::>::commit_with_pk(&messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); - let wrong_commitment = Commitment::>::commit_with_pk(&wrong_messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); - + let unrevealed_message_indexes = [0usize]; + let commitment = Commitment::>::commit_with_pk(&messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); + let wrong_commitment = Commitment::>::commit_with_pk(&wrong_messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); + - let zkpok = ZKPoK::>::generate_proof(&messages, commitment.cl03Commitment(), None, cl03_keypair.public_key(), &a_bases, None, &unrevealed_message_indexes); + let zkpok = ZKPoK::>::generate_proof(&messages, commitment.cl03Commitment(), None, cl03_keypair.public_key(), &a_bases, None, &unrevealed_message_indexes); - let valid = zkpok.verify_proof(commitment.cl03Commitment(), None, cl03_keypair.public_key(), &a_bases, None, &unrevealed_message_indexes); + let valid = zkpok.verify_proof(commitment.cl03Commitment(), None, cl03_keypair.public_key(), &a_bases, None, &unrevealed_message_indexes); - assert!(valid, "Error! ZKPoK verification should PASS"); + assert!(valid, "Error! ZKPoK verification should PASS"); - let valid = zkpok.verify_proof(wrong_commitment.cl03Commitment(), None, cl03_keypair.public_key(), &a_bases, None, &unrevealed_message_indexes); + let valid = zkpok.verify_proof(wrong_commitment.cl03Commitment(), None, cl03_keypair.public_key(), &a_bases, None, &unrevealed_message_indexes); - assert!(!valid, "Error! ZKPok verification should FAIL"); + assert!(!valid, "Error! ZKPok verification should FAIL"); - //Trusted Party Commitment + //Trusted Party Commitment - let trusted_party_commitment_pk = CL03CommitmentPublicKey::generate::(None, Some(msgs.len().try_into().unwrap())); - let trusted_party_commitment = Commitment::>::commit_with_commitment_pk(&messages, &trusted_party_commitment_pk, Some(&unrevealed_message_indexes)); - let trusted_party_commitment_wrong = Commitment::>::commit_with_commitment_pk(&wrong_messages, &trusted_party_commitment_pk, Some(&unrevealed_message_indexes)); - - - let zkpok2 = ZKPoK::>::generate_proof(&messages, commitment.cl03Commitment(), Some(trusted_party_commitment.cl03Commitment()), cl03_keypair.public_key(), &a_bases, Some(&trusted_party_commitment_pk), &unrevealed_message_indexes); + let trusted_party_commitment_pk = CL03CommitmentPublicKey::generate::(None, Some(msgs.len().try_into().unwrap())); + let trusted_party_commitment = Commitment::>::commit_with_commitment_pk(&messages, &trusted_party_commitment_pk, Some(&unrevealed_message_indexes)); + let trusted_party_commitment_wrong = Commitment::>::commit_with_commitment_pk(&wrong_messages, &trusted_party_commitment_pk, Some(&unrevealed_message_indexes)); + + + let zkpok2 = ZKPoK::>::generate_proof(&messages, commitment.cl03Commitment(), Some(trusted_party_commitment.cl03Commitment()), cl03_keypair.public_key(), &a_bases, Some(&trusted_party_commitment_pk), &unrevealed_message_indexes); - let valid = zkpok2.verify_proof(commitment.cl03Commitment(), Some(trusted_party_commitment.cl03Commitment()), cl03_keypair.public_key(), &a_bases, Some(&trusted_party_commitment_pk), &unrevealed_message_indexes); + let valid = zkpok2.verify_proof(commitment.cl03Commitment(), Some(trusted_party_commitment.cl03Commitment()), cl03_keypair.public_key(), &a_bases, Some(&trusted_party_commitment_pk), &unrevealed_message_indexes); - assert!(valid, "Error! ZKPoK verification should PASS"); + assert!(valid, "Error! ZKPoK verification should PASS"); - let zkpok2_wrong_tp_commitment = ZKPoK::>::generate_proof(&messages, commitment.cl03Commitment(), Some(trusted_party_commitment_wrong.cl03Commitment()), cl03_keypair.public_key(), &a_bases, Some(&trusted_party_commitment_pk), &unrevealed_message_indexes); + let zkpok2_wrong_tp_commitment = ZKPoK::>::generate_proof(&messages, commitment.cl03Commitment(), Some(trusted_party_commitment_wrong.cl03Commitment()), cl03_keypair.public_key(), &a_bases, Some(&trusted_party_commitment_pk), &unrevealed_message_indexes); - let valid = zkpok2_wrong_tp_commitment.verify_proof(commitment.cl03Commitment(), Some(trusted_party_commitment.cl03Commitment()), cl03_keypair.public_key(), &a_bases, Some(&trusted_party_commitment_pk), &unrevealed_message_indexes); + let valid = zkpok2_wrong_tp_commitment.verify_proof(commitment.cl03Commitment(), Some(trusted_party_commitment.cl03Commitment()), cl03_keypair.public_key(), &a_bases, Some(&trusted_party_commitment_pk), &unrevealed_message_indexes); - assert!(!valid, "Error! ZKPoK verification should FAIL"); + assert!(!valid, "Error! ZKPoK verification should FAIL"); -} + } -pub(crate) fn blind_sign() -where - S::Ciphersuite: CLCiphersuite, - ::HashAlg: Digest -{ + pub(crate) fn blind_sign() + where + S::Ciphersuite: CLCiphersuite, + ::HashAlg: Digest + { - const msgs: &[&str] = &["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; - // const msg: &str = "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02"; - const wrong_msgs: &[&str] = &["7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; + const msgs: &[&str] = &["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; + // const msg: &str = "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02"; + const wrong_msgs: &[&str] = &["7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; - let cl03_keypair = KeyPair::>::generate(); - let a_bases = Bases::generate(cl03_keypair.public_key(), msgs.len()); + let cl03_keypair = KeyPair::>::generate(); + let a_bases = Bases::generate(cl03_keypair.public_key(), msgs.len()); - let messages: Vec = msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); - // let msg_intger = CL03Message::map_message_to_integer_as_hash::(&hex::decode(msg).unwrap()); - // let messages = [msg_intger.clone()]; - let wrong_messages: Vec = wrong_msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); + let messages: Vec = msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); + // let msg_intger = CL03Message::map_message_to_integer_as_hash::(&hex::decode(msg).unwrap()); + // let messages = [msg_intger.clone()]; + let wrong_messages: Vec = wrong_msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); - - let unrevealed_message_indexes = [0usize]; - let revealed_message_indexes = [1usize, 2usize]; - let revealed_messages: Vec = messages.iter().enumerate().filter(|&(i,_)| revealed_message_indexes.contains(&i) ).map(|(_, m)| m.clone()).collect(); - let revealed_messages_wrong : Vec = wrong_messages.iter().enumerate().filter(|&(i,_)| revealed_message_indexes.contains(&i) ).map(|(_, m)| m.clone()).collect(); + + let unrevealed_message_indexes = [0usize]; + let revealed_message_indexes = [1usize, 2usize]; + let revealed_messages: Vec = messages.iter().enumerate().filter(|&(i,_)| revealed_message_indexes.contains(&i) ).map(|(_, m)| m.clone()).collect(); + let revealed_messages_wrong : Vec = wrong_messages.iter().enumerate().filter(|&(i,_)| revealed_message_indexes.contains(&i) ).map(|(_, m)| m.clone()).collect(); - let commitment = Commitment::>::commit_with_pk(&messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); - let wrong_commitment = Commitment::>::commit_with_pk(&wrong_messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); + let commitment = Commitment::>::commit_with_pk(&messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); + let wrong_commitment = Commitment::>::commit_with_pk(&wrong_messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); - let zkpok = ZKPoK::>::generate_proof(&messages, commitment.cl03Commitment(), None, cl03_keypair.public_key(), &a_bases, None, &unrevealed_message_indexes); + let zkpok = ZKPoK::>::generate_proof(&messages, commitment.cl03Commitment(), None, cl03_keypair.public_key(), &a_bases, None, &unrevealed_message_indexes); - let blind_signature = BlindSignature::>::blind_sign(cl03_keypair.public_key(), cl03_keypair.private_key(), &a_bases, &zkpok, Some(&revealed_messages), commitment.cl03Commitment(), None, None, &unrevealed_message_indexes, Some(&revealed_message_indexes)); - let unblided_signature = blind_signature.unblind_sign(&commitment); - let verify = unblided_signature.verify_multiattr(cl03_keypair.public_key(), &a_bases, &messages); + let blind_signature = BlindSignature::>::blind_sign(cl03_keypair.public_key(), cl03_keypair.private_key(), &a_bases, &zkpok, Some(&revealed_messages), commitment.cl03Commitment(), None, None, &unrevealed_message_indexes, Some(&revealed_message_indexes)); + let unblided_signature = blind_signature.unblind_sign(&commitment); + let verify = unblided_signature.verify_multiattr(cl03_keypair.public_key(), &a_bases, &messages); - assert!(verify, "Error! The unblided signature verification should PASS!"); + assert!(verify, "Error! The unblided signature verification should PASS!"); - let blind_signature_wrong = BlindSignature::>::blind_sign(cl03_keypair.public_key(), cl03_keypair.private_key(), &a_bases, &zkpok, Some(&revealed_messages_wrong), commitment.cl03Commitment(), None, None, &unrevealed_message_indexes, Some(&revealed_message_indexes)); - let unblided_signature_wrong = blind_signature_wrong.unblind_sign(&commitment); - let verify = unblided_signature_wrong.verify_multiattr(cl03_keypair.public_key(), &a_bases, &messages); + let blind_signature_wrong = BlindSignature::>::blind_sign(cl03_keypair.public_key(), cl03_keypair.private_key(), &a_bases, &zkpok, Some(&revealed_messages_wrong), commitment.cl03Commitment(), None, None, &unrevealed_message_indexes, Some(&revealed_message_indexes)); + let unblided_signature_wrong = blind_signature_wrong.unblind_sign(&commitment); + let verify = unblided_signature_wrong.verify_multiattr(cl03_keypair.public_key(), &a_bases, &messages); - assert!(!verify, "Error! The unblinded signature verification SHOULD FAIL!"); + assert!(!verify, "Error! The unblinded signature verification SHOULD FAIL!"); -} + } -pub(crate) fn spok() -where - S::Ciphersuite: CLCiphersuite, - ::HashAlg: Digest -{ - const msgs: &[&str] = &["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; - // const msg: &str = "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02"; - const wrong_msgs: &[&str] = &["7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; + pub(crate) fn spok() + where + S::Ciphersuite: CLCiphersuite, + ::HashAlg: Digest + { + const msgs: &[&str] = &["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; + // const msg: &str = "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02"; + const wrong_msgs: &[&str] = &["7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; - - let n_attr = msgs.len(); - let cl03_keypair = KeyPair::>::generate(); - let a_bases = Bases::generate(cl03_keypair.public_key(), n_attr); + + let n_attr = msgs.len(); + let cl03_keypair = KeyPair::>::generate(); + let a_bases = Bases::generate(cl03_keypair.public_key(), n_attr); - let messages: Vec = msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); - // let msg_intger = CL03Message::map_message_to_integer_as_hash::(&hex::decode(msg).unwrap()); - // let messages = [msg_intger.clone()]; - let wrong_messages: Vec = wrong_msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); + let messages: Vec = msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); + // let msg_intger = CL03Message::map_message_to_integer_as_hash::(&hex::decode(msg).unwrap()); + // let messages = [msg_intger.clone()]; + let wrong_messages: Vec = wrong_msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); - - let unrevealed_message_indexes = [0usize]; - let revealed_message_indexes = [1usize, 2usize]; - let revealed_messages: Vec = messages.iter().enumerate().filter(|&(i,_)| revealed_message_indexes.contains(&i) ).map(|(_, m)| m.clone()).collect(); - let revealed_messages_wrong : Vec = wrong_messages.iter().enumerate().filter(|&(i,_)| revealed_message_indexes.contains(&i) ).map(|(_, m)| m.clone()).collect(); + + let unrevealed_message_indexes = [0usize]; + let revealed_message_indexes = [1usize, 2usize]; + let revealed_messages: Vec = messages.iter().enumerate().filter(|&(i,_)| revealed_message_indexes.contains(&i) ).map(|(_, m)| m.clone()).collect(); + let revealed_messages_wrong : Vec = wrong_messages.iter().enumerate().filter(|&(i,_)| revealed_message_indexes.contains(&i) ).map(|(_, m)| m.clone()).collect(); - let commitment = Commitment::>::commit_with_pk(&messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); - let wrong_commitment = Commitment::>::commit_with_pk(&wrong_messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); + let commitment = Commitment::>::commit_with_pk(&messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); + let wrong_commitment = Commitment::>::commit_with_pk(&wrong_messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); - let zkpok = ZKPoK::>::generate_proof(&messages, commitment.cl03Commitment(), None, cl03_keypair.public_key(), &a_bases, None, &unrevealed_message_indexes); + let zkpok = ZKPoK::>::generate_proof(&messages, commitment.cl03Commitment(), None, cl03_keypair.public_key(), &a_bases, None, &unrevealed_message_indexes); - let blind_signature = BlindSignature::>::blind_sign(cl03_keypair.public_key(), cl03_keypair.private_key(), &a_bases, &zkpok, Some(&revealed_messages), commitment.cl03Commitment(), None, None, &unrevealed_message_indexes, Some(&revealed_message_indexes)); - let unblided_signature = blind_signature.unblind_sign(&commitment); - let verify = unblided_signature.verify_multiattr(cl03_keypair.public_key(), &a_bases, &messages); + let blind_signature = BlindSignature::>::blind_sign(cl03_keypair.public_key(), cl03_keypair.private_key(), &a_bases, &zkpok, Some(&revealed_messages), commitment.cl03Commitment(), None, None, &unrevealed_message_indexes, Some(&revealed_message_indexes)); + let unblided_signature = blind_signature.unblind_sign(&commitment); + let verify = unblided_signature.verify_multiattr(cl03_keypair.public_key(), &a_bases, &messages); - assert!(verify, "Error! The unblided signature verification should PASS!"); + assert!(verify, "Error! The unblided signature verification should PASS!"); - let blind_signature_wrong = BlindSignature::>::blind_sign(cl03_keypair.public_key(), cl03_keypair.private_key(), &a_bases, &zkpok, Some(&revealed_messages_wrong), commitment.cl03Commitment(), None, None, &unrevealed_message_indexes, Some(&revealed_message_indexes)); - let unblided_signature_wrong = blind_signature_wrong.unblind_sign(&commitment); - let verify = unblided_signature_wrong.verify_multiattr(cl03_keypair.public_key(), &a_bases, &messages); + let blind_signature_wrong = BlindSignature::>::blind_sign(cl03_keypair.public_key(), cl03_keypair.private_key(), &a_bases, &zkpok, Some(&revealed_messages_wrong), commitment.cl03Commitment(), None, None, &unrevealed_message_indexes, Some(&revealed_message_indexes)); + let unblided_signature_wrong = blind_signature_wrong.unblind_sign(&commitment); + let verify = unblided_signature_wrong.verify_multiattr(cl03_keypair.public_key(), &a_bases, &messages); - assert!(!verify, "Error! The unblinded signature verification SHOULD FAIL!"); + assert!(!verify, "Error! The unblinded signature verification SHOULD FAIL!"); - let commitment_pk = CL03CommitmentPublicKey::generate::(Some(cl03_keypair.public_key().N.clone()), Some(n_attr)); + let commitment_pk = CL03CommitmentPublicKey::generate::(Some(cl03_keypair.public_key().N.clone()), Some(n_attr)); - let signature_pok = PoKSignature::>::proof_gen(unblided_signature.cl03Signature(), &commitment_pk, cl03_keypair.public_key(), &a_bases, &messages, &unrevealed_message_indexes); - let valid_proof = signature_pok.proof_verify(&commitment_pk, cl03_keypair.public_key(), &a_bases, &revealed_messages, &unrevealed_message_indexes, n_attr); - - assert!(valid_proof, "Error! The signature proof of knowledge should PASS!"); + let signature_pok = PoKSignature::>::proof_gen(unblided_signature.cl03Signature(), &commitment_pk, cl03_keypair.public_key(), &a_bases, &messages, &unrevealed_message_indexes); + let valid_proof = signature_pok.proof_verify(&commitment_pk, cl03_keypair.public_key(), &a_bases, &revealed_messages, &unrevealed_message_indexes, n_attr); + + assert!(valid_proof, "Error! The signature proof of knowledge should PASS!"); - let signature_pok = PoKSignature::>::proof_gen(unblided_signature.cl03Signature(), &commitment_pk, cl03_keypair.public_key(), &a_bases, &messages, &unrevealed_message_indexes); - let valid_proof = signature_pok.proof_verify(&commitment_pk, cl03_keypair.public_key(), &a_bases, &revealed_messages_wrong, &unrevealed_message_indexes, n_attr); - - assert!(!valid_proof, "Error! The signature proof of knowledge should FAIL!"); + let signature_pok = PoKSignature::>::proof_gen(unblided_signature.cl03Signature(), &commitment_pk, cl03_keypair.public_key(), &a_bases, &messages, &unrevealed_message_indexes); + let valid_proof = signature_pok.proof_verify(&commitment_pk, cl03_keypair.public_key(), &a_bases, &revealed_messages_wrong, &unrevealed_message_indexes, n_attr); + + assert!(!valid_proof, "Error! The signature proof of knowledge should FAIL!"); -} + } -pub(crate) fn update_signature() -where - S::Ciphersuite: CLCiphersuite, - ::HashAlg: Digest -{ - const msgs: &[&str] = &["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; - const updated_msgs: &[&str] = &["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; + pub(crate) fn update_signature() + where + S::Ciphersuite: CLCiphersuite, + ::HashAlg: Digest + { + const msgs: &[&str] = &["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; + const updated_msgs: &[&str] = &["9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f02", "7872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f03", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e310a1debdda4a45f04"]; - let n_attr = msgs.len(); - let cl03_keypair = KeyPair::>::generate(); - let a_bases = Bases::generate(cl03_keypair.public_key(), n_attr); + let n_attr = msgs.len(); + let cl03_keypair = KeyPair::>::generate(); + let a_bases = Bases::generate(cl03_keypair.public_key(), n_attr); - let messages: Vec = msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); - let updated_messages: Vec = updated_msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); - - let unrevealed_message_indexes = [0usize]; - let revealed_message_indexes = [1usize, 2usize]; - let revealed_messages: Vec = messages.iter().enumerate().filter(|&(i,_)| revealed_message_indexes.contains(&i) ).map(|(_, m)| m.clone()).collect(); - let revealed_updated_messages: Vec = updated_messages.iter().enumerate().filter(|&(i,_)| revealed_message_indexes.contains(&i) ).map(|(_, m)| m.clone()).collect(); - let commitment = Commitment::>::commit_with_pk(&messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); + let messages: Vec = msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); + let updated_messages: Vec = updated_msgs.iter().map(|&m| CL03Message::map_message_to_integer_as_hash::(&hex::decode(m).unwrap()) ).collect(); - let zkpok = ZKPoK::>::generate_proof(&messages, commitment.cl03Commitment(), None, cl03_keypair.public_key(), &a_bases, None, &unrevealed_message_indexes); + let unrevealed_message_indexes = [0usize]; + let revealed_message_indexes = [1usize, 2usize]; + let revealed_messages: Vec = messages.iter().enumerate().filter(|&(i,_)| revealed_message_indexes.contains(&i) ).map(|(_, m)| m.clone()).collect(); + let revealed_updated_messages: Vec = updated_messages.iter().enumerate().filter(|&(i,_)| revealed_message_indexes.contains(&i) ).map(|(_, m)| m.clone()).collect(); + let commitment = Commitment::>::commit_with_pk(&messages, cl03_keypair.public_key(), &a_bases, Some(&unrevealed_message_indexes)); + + let zkpok = ZKPoK::>::generate_proof(&messages, commitment.cl03Commitment(), None, cl03_keypair.public_key(), &a_bases, None, &unrevealed_message_indexes); - let blind_signature = BlindSignature::>::blind_sign(cl03_keypair.public_key(), cl03_keypair.private_key(), &a_bases, &zkpok, Some(&revealed_messages), commitment.cl03Commitment(), None, None, &unrevealed_message_indexes, Some(&revealed_message_indexes)); - let unblided_signature = blind_signature.unblind_sign(&commitment); - let verify = unblided_signature.verify_multiattr(cl03_keypair.public_key(), &a_bases, &messages); + let blind_signature = BlindSignature::>::blind_sign(cl03_keypair.public_key(), cl03_keypair.private_key(), &a_bases, &zkpok, Some(&revealed_messages), commitment.cl03Commitment(), None, None, &unrevealed_message_indexes, Some(&revealed_message_indexes)); + let unblided_signature = blind_signature.unblind_sign(&commitment); + let verify = unblided_signature.verify_multiattr(cl03_keypair.public_key(), &a_bases, &messages); - assert!(verify, "Error! The unblided signature verification should PASS!"); + assert!(verify, "Error! The unblided signature verification should PASS!"); - let updated_signature = blind_signature.update_signature(Some(&revealed_updated_messages), &commitment.cl03Commitment(), cl03_keypair.private_key(), cl03_keypair.public_key(), &a_bases, Some(&revealed_message_indexes)); - let unblinded_updated_signature = updated_signature.unblind_sign(&commitment); + let updated_signature = blind_signature.update_signature(Some(&revealed_updated_messages), &commitment.cl03Commitment(), cl03_keypair.private_key(), cl03_keypair.public_key(), &a_bases, Some(&revealed_message_indexes)); + let unblinded_updated_signature = updated_signature.unblind_sign(&commitment); - let verify = unblinded_updated_signature.verify_multiattr(cl03_keypair.public_key(), &a_bases, &updated_messages); - assert!(verify, "Error! The unblided signature verification should PASS!"); + let verify = unblinded_updated_signature.verify_multiattr(cl03_keypair.public_key(), &a_bases, &updated_messages); + assert!(verify, "Error! The unblided signature verification should PASS!"); + } } \ No newline at end of file From ee1d8ea8941bf076ee461891490ea20381a558f6 Mon Sep 17 00:00:00 2001 From: Alberto Solavagione Date: Tue, 24 Oct 2023 17:28:56 +0200 Subject: [PATCH 5/6] add desc to cargo --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index 5cd0ccb..58afb46 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" license = "Apache-2.0" authors = ["LINKS Foundation"] +description = "Rust crypto library for zero-knowledge proofs" rust-version = "1.65" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 8804dd80f9bfb37f6f4c95138c0699c7e801e2b1 Mon Sep 17 00:00:00 2001 From: Alberto Solavagione Date: Tue, 24 Oct 2023 17:34:44 +0200 Subject: [PATCH 6/6] gitignore fix --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0ccdc50..a038b62 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,7 @@ Cargo.lock /target -keypair.txt \ No newline at end of file +keypair.txt + + +.vscode \ No newline at end of file