From 77199ddc008ca33c2082d7b90e3c81e0f3da3455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Lindstr=C3=B8m?= Date: Tue, 16 Apr 2024 12:11:47 +0200 Subject: [PATCH] multi-pairing tests --- fastcrypto/src/groups/bls12381.rs | 11 +++++- fastcrypto/src/tests/bls12381_group_tests.rs | 40 +++++++++++++++----- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/fastcrypto/src/groups/bls12381.rs b/fastcrypto/src/groups/bls12381.rs index 61bc9cde1..50318b0e7 100644 --- a/fastcrypto/src/groups/bls12381.rs +++ b/fastcrypto/src/groups/bls12381.rs @@ -241,7 +241,16 @@ impl Pairing for G1Element { { if points_g1.len() != points_g2.len() { return Err(FastCryptoError::InvalidInput); - } else if points_g1.is_empty() { + } + + let (points_g1, points_g2): (Vec<_>, Vec<_>) = points_g1 + .iter() + .zip(points_g2.iter()) + .filter(|(&g1, &g2)| g1 != G1Element::zero() && g2 != G2Element::zero()) + .map(|(&g1, &g2)| (g1, g2)) + .unzip(); + + if points_g1.is_empty() { return Ok(::Output::zero()); } diff --git a/fastcrypto/src/tests/bls12381_group_tests.rs b/fastcrypto/src/tests/bls12381_group_tests.rs index f80daa51f..e4f494c22 100644 --- a/fastcrypto/src/tests/bls12381_group_tests.rs +++ b/fastcrypto/src/tests/bls12381_group_tests.rs @@ -329,6 +329,25 @@ fn test_pairing_and_hash_to_curve() { let sig2 = e2 * sk2; assert_eq!(pk2.pairing(&e2), G1Element::generator().pairing(&sig2)); + assert_eq!( + G1Element::zero().pairing(&G2Element::zero()), + GTElement::zero() + ); + assert_eq!( + G1Element::zero().pairing(&G2Element::generator()), + GTElement::zero() + ); + assert_eq!( + G1Element::generator().pairing(&G2Element::zero()), + GTElement::zero() + ); + + // next should not fail + let _ = G1Element::hash_to_group_element(&[]); + let _ = G2Element::hash_to_group_element(&[]); + let _ = G1Element::hash_to_group_element(&[1]); + let _ = G2Element::hash_to_group_element(&[1]); + // Test multi-pairing assert!(G1Element::multi_pairing(&[], &[pk1]).is_err()); assert_eq!( @@ -343,25 +362,26 @@ fn test_pairing_and_hash_to_curve() { G1Element::multi_pairing(&[e1, pk2], &[pk1, e2]).unwrap(), e1.pairing(&pk1) + pk2.pairing(&e2) ); - assert_eq!( - G1Element::zero().pairing(&G2Element::zero()), + G1Element::multi_pairing(&[G1Element::zero()], &[G2Element::zero()]).unwrap(), GTElement::zero() ); assert_eq!( - G1Element::zero().pairing(&G2Element::generator()), + G1Element::multi_pairing( + &[G1Element::zero(), G1Element::zero()], + &[G2Element::zero(), G2Element::zero()] + ) + .unwrap(), GTElement::zero() ); assert_eq!( - G1Element::generator().pairing(&G2Element::zero()), + G1Element::multi_pairing(&[G1Element::generator()], &[G2Element::zero()]).unwrap(), + GTElement::zero() + ); + assert_eq!( + G1Element::multi_pairing(&[G1Element::zero()], &[G2Element::generator()]).unwrap(), GTElement::zero() ); - - // next should not fail - let _ = G1Element::hash_to_group_element(&[]); - let _ = G2Element::hash_to_group_element(&[]); - let _ = G1Element::hash_to_group_element(&[1]); - let _ = G2Element::hash_to_group_element(&[1]); } #[test]