mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-02 16:21:42 +00:00
fix(bls): fix is_infinity when aggregating onto empty AggregateSignature (#8496)
Co-Authored-By: figtracer <1gusredo@gmail.com> Co-Authored-By: Michael Sproul <michaelsproul@users.noreply.github.com>
This commit is contained in:
@@ -124,13 +124,15 @@ where
|
|||||||
/// Aggregates a signature onto `self`.
|
/// Aggregates a signature onto `self`.
|
||||||
pub fn add_assign(&mut self, other: &GenericSignature<Pub, Sig>) {
|
pub fn add_assign(&mut self, other: &GenericSignature<Pub, Sig>) {
|
||||||
if let Some(other_point) = other.point() {
|
if let Some(other_point) = other.point() {
|
||||||
self.is_infinity = self.is_infinity && other.is_infinity;
|
|
||||||
if let Some(self_point) = &mut self.point {
|
if let Some(self_point) = &mut self.point {
|
||||||
self_point.add_assign(other_point)
|
self_point.add_assign(other_point);
|
||||||
|
self.is_infinity = self.is_infinity && other.is_infinity;
|
||||||
} else {
|
} else {
|
||||||
let mut self_point = AggSig::infinity();
|
let mut self_point = AggSig::infinity();
|
||||||
self_point.add_assign(other_point);
|
self_point.add_assign(other_point);
|
||||||
self.point = Some(self_point)
|
self.point = Some(self_point);
|
||||||
|
// the result is infinity, if `other` is
|
||||||
|
self.is_infinity = other.is_infinity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -138,13 +140,15 @@ where
|
|||||||
/// Aggregates an aggregate signature onto `self`.
|
/// Aggregates an aggregate signature onto `self`.
|
||||||
pub fn add_assign_aggregate(&mut self, other: &Self) {
|
pub fn add_assign_aggregate(&mut self, other: &Self) {
|
||||||
if let Some(other_point) = other.point() {
|
if let Some(other_point) = other.point() {
|
||||||
self.is_infinity = self.is_infinity && other.is_infinity;
|
|
||||||
if let Some(self_point) = &mut self.point {
|
if let Some(self_point) = &mut self.point {
|
||||||
self_point.add_assign_aggregate(other_point)
|
self_point.add_assign_aggregate(other_point);
|
||||||
|
self.is_infinity = self.is_infinity && other.is_infinity;
|
||||||
} else {
|
} else {
|
||||||
let mut self_point = AggSig::infinity();
|
let mut self_point = AggSig::infinity();
|
||||||
self_point.add_assign_aggregate(other_point);
|
self_point.add_assign_aggregate(other_point);
|
||||||
self.point = Some(self_point)
|
self.point = Some(self_point);
|
||||||
|
// the result is infinity, if `other` is
|
||||||
|
self.is_infinity = other.is_infinity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -356,6 +356,17 @@ macro_rules! test_suite {
|
|||||||
.assert_single_message_verify(true)
|
.assert_single_message_verify(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn empty_aggregate_plus_infinity_should_be_infinity() {
|
||||||
|
let mut agg = AggregateSignature::empty();
|
||||||
|
let infinity_sig = Signature::deserialize(&INFINITY_SIGNATURE).unwrap();
|
||||||
|
agg.add_assign(&infinity_sig);
|
||||||
|
assert!(
|
||||||
|
agg.is_infinity(),
|
||||||
|
"is_infinity flag should be true after adding infinity to empty"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn deserialize_infinity_public_key() {
|
fn deserialize_infinity_public_key() {
|
||||||
PublicKey::deserialize(&bls::INFINITY_PUBLIC_KEY).unwrap_err();
|
PublicKey::deserialize(&bls::INFINITY_PUBLIC_KEY).unwrap_err();
|
||||||
|
|||||||
Reference in New Issue
Block a user