diff --git a/ecdsa/src/recovery.rs b/ecdsa/src/recovery.rs index 639045a8..d45b5b95 100644 --- a/ecdsa/src/recovery.rs +++ b/ecdsa/src/recovery.rs @@ -275,23 +275,23 @@ where let (r, s) = signature.split_scalars(); let z = as Reduce>::reduce_bytes(&bits2field::(prehash)?); - let mut r_bytes = r.to_repr(); - if recovery_id.is_x_reduced() { - match Option::::from( - C::Uint::decode_field_bytes(&r_bytes).checked_add(&C::ORDER), - ) { - Some(restored) => r_bytes = restored.encode_field_bytes(), - // No reduction should happen here if r was reduced - None => return Err(Error::new()), - }; - } - let R = AffinePoint::::decompress(&r_bytes, u8::from(recovery_id.is_y_odd()).into()); + let r_bytes = if recovery_id.is_x_reduced() { + Option::::from( + C::Uint::decode_field_bytes(&r.to_repr()).checked_add(&C::ORDER), + ) + .ok_or_else(Error::new)? + .encode_field_bytes() + } else { + r.to_repr() + }; - if R.is_none().into() { - return Err(Error::new()); - } + let R: ProjectivePoint = Option::>::from(AffinePoint::::decompress( + &r_bytes, + u8::from(recovery_id.is_y_odd()).into(), + )) + .ok_or_else(Error::new)? + .into(); - let R = ProjectivePoint::::from(R.unwrap()); let r_inv = *r.invert(); let u1 = -(r_inv * z); let u2 = r_inv * *s;