Skip to content

Commit

Permalink
bindings/rust/src/lib.rs: rectify the API omissions in no_std.
Browse files Browse the repository at this point in the history
Fixes #227.
  • Loading branch information
dot-asm committed Jul 3, 2024
1 parent e99f7db commit 71a0087
Showing 1 changed file with 101 additions and 42 deletions.
143 changes: 101 additions & 42 deletions bindings/rust/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1035,44 +1035,6 @@ macro_rules! sig_variant_impl {
Ok(sig)
}

#[cfg(not(feature = "std"))]
pub fn verify(
&self,
sig_groupcheck: bool,
msg: &[u8],
dst: &[u8],
aug: &[u8],
pk: &PublicKey,
pk_validate: bool,
) -> BLST_ERROR {
if sig_groupcheck {
match self.validate(false) {
Err(err) => return err,
_ => (),
}
}
if pk_validate {
match pk.validate() {
Err(err) => return err,
_ => (),
}
}
unsafe {
$verify(
&pk.point,
&self.point,
$hash_or_encode,
msg.as_ptr(),
msg.len(),
dst.as_ptr(),
dst.len(),
aug.as_ptr(),
aug.len(),
)
}
}

#[cfg(feature = "std")]
pub fn verify(
&self,
sig_groupcheck: bool,
Expand All @@ -1092,6 +1054,57 @@ macro_rules! sig_variant_impl {
)
}

#[cfg(not(feature = "std"))]
pub fn aggregate_verify(
&self,
sig_groupcheck: bool,
msgs: &[&[u8]],
dst: &[u8],
pks: &[&PublicKey],
pks_validate: bool,
) -> BLST_ERROR {
let n_elems = pks.len();
if n_elems == 0 || msgs.len() != n_elems {
return BLST_ERROR::BLST_VERIFY_FAIL;
}

let mut pairing = Pairing::new($hash_or_encode, dst);

let err = pairing.aggregate(
&pks[0].point,
pks_validate,
&self.point,
sig_groupcheck,
&msgs[0],
&[],
);
if err != BLST_ERROR::BLST_SUCCESS {
return err;
}

for i in 1..n_elems {
let err = pairing.aggregate(
&pks[i].point,
pks_validate,
&unsafe { ptr::null::<$sig_aff>().as_ref() },
false,
&msgs[i],
&[],
);
if err != BLST_ERROR::BLST_SUCCESS {
return err;
}
}

pairing.commit();

if pairing.finalverify(None) {
BLST_ERROR::BLST_SUCCESS
} else {
BLST_ERROR::BLST_VERIFY_FAIL
}
}

#[cfg(feature = "std")]
pub fn aggregate_verify(
&self,
Expand Down Expand Up @@ -1175,7 +1188,6 @@ macro_rules! sig_variant_impl {

// pks are assumed to be verified for proof of possession,
// which implies that they are already group-checked
#[cfg(feature = "std")]
pub fn fast_aggregate_verify(
&self,
sig_groupcheck: bool,
Expand All @@ -1197,7 +1209,6 @@ macro_rules! sig_variant_impl {
)
}

#[cfg(feature = "std")]
pub fn fast_aggregate_verify_pre_aggregated(
&self,
sig_groupcheck: bool,
Expand Down Expand Up @@ -1288,6 +1299,56 @@ macro_rules! sig_variant_impl {
}
}

#[cfg(not(feature = "std"))]
#[allow(clippy::too_many_arguments)]
pub fn verify_multiple_aggregate_signatures(
msgs: &[&[u8]],
dst: &[u8],
pks: &[&PublicKey],
pks_validate: bool,
sigs: &[&Signature],
sigs_groupcheck: bool,
rands: &[blst_scalar],
rand_bits: usize,
) -> BLST_ERROR {
let n_elems = pks.len();
if n_elems == 0
|| msgs.len() != n_elems
|| sigs.len() != n_elems
|| rands.len() != n_elems
{
return BLST_ERROR::BLST_VERIFY_FAIL;
}

// TODO - check msg uniqueness?

let mut pairing = Pairing::new($hash_or_encode, dst);

for i in 0..n_elems {
let err = pairing.mul_n_aggregate(
&pks[i].point,
pks_validate,
&sigs[i].point,
sigs_groupcheck,
&rands[i].b,
rand_bits,
msgs[i],
&[],
);
if err != BLST_ERROR::BLST_SUCCESS {
return err;
}
}

pairing.commit();

if pairing.finalverify(None) {
BLST_ERROR::BLST_SUCCESS
} else {
BLST_ERROR::BLST_VERIFY_FAIL
}
}

pub fn from_aggregate(agg_sig: &AggregateSignature) -> Self {
let mut sig_aff = <$sig_aff>::default();
unsafe {
Expand Down Expand Up @@ -1556,7 +1617,6 @@ macro_rules! sig_variant_impl {
}

#[test]
#[cfg(feature = "std")]
fn test_aggregate() {
let num_msgs = 10;
let dst = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_";
Expand Down Expand Up @@ -1629,7 +1689,6 @@ macro_rules! sig_variant_impl {
}

#[test]
#[cfg(feature = "std")]
fn test_multiple_agg_sigs() {
let dst = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_";
let num_pks_per_sig = 10;
Expand Down

0 comments on commit 71a0087

Please sign in to comment.