From c618240c91aeb4ca950d947af90566a65e580ee7 Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Sun, 16 Jul 2017 20:52:00 -0600 Subject: [PATCH] Implements and documents serialization, closes #11. --- src/bls12_381/README.md | 14 + src/bls12_381/ec.rs | 486 +++++++++++------- .../tests/g1_compressed_test_vectors.dat | Bin 48000 -> 0 bytes .../g1_compressed_valid_test_vectors.dat | Bin 0 -> 48000 bytes .../g1_uncompressed_invalid_test_vectors.dat | 0 ...=> g1_uncompressed_valid_test_vectors.dat} | Bin 96000 -> 96000 bytes ...t => g2_compressed_valid_test_vectors.dat} | Bin 96000 -> 96000 bytes ...=> g2_uncompressed_valid_test_vectors.dat} | Bin 192000 -> 192000 bytes src/bls12_381/tests/mod.rs | 20 +- src/lib.rs | 6 +- src/tests/curve.rs | 19 +- 11 files changed, 326 insertions(+), 219 deletions(-) delete mode 100644 src/bls12_381/tests/g1_compressed_test_vectors.dat create mode 100644 src/bls12_381/tests/g1_compressed_valid_test_vectors.dat create mode 100644 src/bls12_381/tests/g1_uncompressed_invalid_test_vectors.dat rename src/bls12_381/tests/{g1_uncompressed_test_vectors.dat => g1_uncompressed_valid_test_vectors.dat} (99%) rename src/bls12_381/tests/{g2_compressed_test_vectors.dat => g2_compressed_valid_test_vectors.dat} (66%) rename src/bls12_381/tests/{g2_uncompressed_test_vectors.dat => g2_uncompressed_valid_test_vectors.dat} (99%) diff --git a/src/bls12_381/README.md b/src/bls12_381/README.md index ae968cee0..d3811a142 100644 --- a/src/bls12_381/README.md +++ b/src/bls12_381/README.md @@ -55,3 +55,17 @@ y = 1339506544944476473020471379941921221584933875938349620426543736416511423956 x = 3059144344244213709971259814753781636986470325476647558659373206291635324768958432433509563104347017837885763365758*u + 352701069587466618187139116011060144890029952792775240219908644239793785735715026873347600343865175952761926303160 y = 927553665492332455747201965776037880757740193453592970025027978793976877002675564980949289727957565575433344219582*u + 1985150602287291935568054521177171638300868978215655730859378665066344726373823718423869104263333984641494340347905 ``` + +### Serialization + +* Fq elements are encoded in big-endian form. They occupy 48 bytes in this form. +* Fq2 elements are encoded in big-endian form, meaning that the Fq element c0 + c1 * u is represented by the Fq element c1 followed by the Fq element c0. This means Fq2 elements occupy 96 bytes in this form. +* The group G1 uses Fq elements for coordinates. The group G2 uses Fq2 elements for coordinates. +* G1 and G2 elements can be encoded in uncompressed form (the x-coordinate followed by the y-coordinate) or in compressed form (just the x-coordinate). G1 elements occupy 96 bytes in uncompressed form, and 48 bytes in compressed form. G2 elements occupy 192 bytes in uncompressed form, and 96 bytes in compressed form. + +The most-significant three bits of a G1 or G2 encoding should be masked away before the coordinate(s) are interpreted. These bits are used to unambiguously represent the underlying element: + +* The most significant bit, when set, indicates that the point is in compressed form. Otherwise, the point is in uncompressed form. +* The second-most significant bit indicates that the point is at infinity. If this bit is set, the remaining bits of the group element's encoding should be set to zero. +* The third-most significant bit is set if (and only if) this point is in compressed form _and_ it is not the point at infinity _and_ its y-coordinate is the lexicographically largest of the two associated with the encoded x-coordinate. + diff --git a/src/bls12_381/ec.rs b/src/bls12_381/ec.rs index 4350b12e9..09824c686 100644 --- a/src/bls12_381/ec.rs +++ b/src/bls12_381/ec.rs @@ -586,37 +586,67 @@ pub mod g1 { fn into_affine_unchecked(&self) -> Result { use byteorder::{ReadBytesExt, BigEndian}; - let mut x = FqRepr([0; 6]); - let mut y = FqRepr([0; 6]); + // Create a copy of this representation. + let mut copy = self.0; - { - let mut reader = &self.0[..]; - - for b in x.0.iter_mut().rev() { - *b = reader.read_u64::().unwrap(); - } - - for b in y.0.iter_mut().rev() { - *b = reader.read_u64::().unwrap(); - } - } - - Ok(G1Affine { - x: Fq::from_repr(x)?, - y: Fq::from_repr(y)?, - infinity: false - }) - } - fn from_affine(affine: G1Affine) -> Result { - use byteorder::{WriteBytesExt, BigEndian}; - - if affine.is_zero() { + if copy[0] & (1 << 7) != 0 { + // Distinguisher bit is set, but this should be uncompressed! return Err(()) } + if copy[0] & (1 << 6) != 0 { + // This is the point at infinity, which means that if we mask away + // the first two bits, the entire representation should consist + // of zeroes. + copy[0] &= 0x3f; + + if copy.iter().all(|b| *b == 0) { + Ok(G1Affine::zero()) + } else { + Err(()) + } + } else { + if copy[0] & (1 << 5) != 0 { + // The bit indicating the y-coordinate should be lexicographically + // largest is set, but this is an uncompressed element. + return Err(()) + } + + // Unset the three most significant bits. + copy[0] &= 0x1f; + + let mut x = FqRepr([0; 6]); + let mut y = FqRepr([0; 6]); + + { + let mut reader = ©[..]; + + for b in x.0.iter_mut().rev() { + *b = reader.read_u64::().unwrap(); + } + + for b in y.0.iter_mut().rev() { + *b = reader.read_u64::().unwrap(); + } + } + + Ok(G1Affine { + x: Fq::from_repr(x)?, + y: Fq::from_repr(y)?, + infinity: false + }) + } + } + fn from_affine(affine: G1Affine) -> Self { + use byteorder::{WriteBytesExt, BigEndian}; + let mut res = Self::empty(); - { + if affine.is_zero() { + // Set the second-most significant bit to indicate this point + // is at infinity. + res.0[0] |= 1 << 6; + } else { let mut writer = &mut res.0[..]; for digit in affine.x.into_repr().as_ref().iter().rev() { @@ -628,7 +658,7 @@ pub mod g1 { } } - Ok(res) + res } } @@ -662,85 +692,98 @@ pub mod g1 { return Err(()) } - // Determine if the intended y coordinate must be greater - // lexicographically. - let greatest = copy[0] & (1 << 6) != 0; + if copy[0] & (1 << 6) != 0 { + // This is the point at infinity, which means that if we mask away + // the first two bits, the entire representation should consist + // of zeroes. + copy[0] &= 0x3f; - // Unset the two most significant bits. - copy[0] &= 0x3f; - - let mut x = FqRepr([0; 6]); - - { - let mut reader = ©[..]; - - for b in x.0.iter_mut().rev() { - *b = reader.read_u64::().unwrap(); - } - } - - // Interpret as Fq element. - let x = Fq::from_repr(x)?; - - // Compute x^3 + b - let mut x3b = x; - x3b.square(); - x3b.mul_assign(&x); - x3b.add_assign(&G1Affine::get_coeff_b()); - - // Attempt to compute y - match x3b.sqrt() { - Some(y) => { - let mut negy = y; - negy.negate(); - - // Get the parity of the sqrt we found. - let parity = y > negy; - - Ok(G1Affine { - x: x, - y: if parity == greatest { y } else { negy }, - infinity: false - }) - }, - None => { - // Point must not be on the curve. + if copy.iter().all(|b| *b == 0) { + Ok(G1Affine::zero()) + } else { Err(()) } + } else { + // Determine if the intended y coordinate must be greater + // lexicographically. + let greatest = copy[0] & (1 << 5) != 0; + + // Unset the three most significant bits. + copy[0] &= 0x1f; + + let mut x = FqRepr([0; 6]); + + { + let mut reader = ©[..]; + + for b in x.0.iter_mut().rev() { + *b = reader.read_u64::().unwrap(); + } + } + + // Interpret as Fq element. + let x = Fq::from_repr(x)?; + + // Compute x^3 + b + let mut x3b = x; + x3b.square(); + x3b.mul_assign(&x); + x3b.add_assign(&G1Affine::get_coeff_b()); + + // Attempt to compute y + match x3b.sqrt() { + Some(y) => { + let mut negy = y; + negy.negate(); + + // Get the parity of the sqrt we found. + let parity = y > negy; + + Ok(G1Affine { + x: x, + y: if parity == greatest { y } else { negy }, + infinity: false + }) + }, + None => { + // Point must not be on the curve. + Err(()) + } + } } } - fn from_affine(affine: G1Affine) -> Result { + fn from_affine(affine: G1Affine) -> Self { use byteorder::{WriteBytesExt, BigEndian}; - if affine.is_zero() { - return Err(()) - } - let mut res = Self::empty(); - { - let mut writer = &mut res.0[..]; + if affine.is_zero() { + // Set the second-most significant bit to indicate this point + // is at infinity. + res.0[0] |= 1 << 6; + } else { + { + let mut writer = &mut res.0[..]; - for digit in affine.x.into_repr().as_ref().iter().rev() { - writer.write_u64::(*digit).unwrap(); + for digit in affine.x.into_repr().as_ref().iter().rev() { + writer.write_u64::(*digit).unwrap(); + } } - } - // Distinguish this from an uncompressed element. - res.0[0] |= 1 << 7; // Set highest bit. - - { let mut negy = affine.y; negy.negate(); - // If the correct y coordinate is the largest (lexicographically), - // the bit should be set. + // Set the third most significant bit if the correct y-coordinate + // is lexicographically largest. if affine.y > negy { - res.0[0] |= 1 << 6; // Set second highest bit. + res.0[0] |= 1 << 5; } } - Ok(res) + // Set highest bit to distinguish this as a compressed element. + res.0[0] |= 1 << 7; + + res } } @@ -1080,53 +1123,83 @@ pub mod g2 { fn into_affine_unchecked(&self) -> Result { use byteorder::{ReadBytesExt, BigEndian}; - let mut x_c1 = FqRepr([0; 6]); - let mut x_c0 = FqRepr([0; 6]); - let mut y_c1 = FqRepr([0; 6]); - let mut y_c0 = FqRepr([0; 6]); + // Create a copy of this representation. + let mut copy = self.0; - { - let mut reader = &self.0[..]; - - for b in x_c1.0.iter_mut().rev() { - *b = reader.read_u64::().unwrap(); - } - - for b in x_c0.0.iter_mut().rev() { - *b = reader.read_u64::().unwrap(); - } - - for b in y_c1.0.iter_mut().rev() { - *b = reader.read_u64::().unwrap(); - } - - for b in y_c0.0.iter_mut().rev() { - *b = reader.read_u64::().unwrap(); - } - } - - Ok(G2Affine { - x: Fq2 { - c0: Fq::from_repr(x_c0)?, - c1: Fq::from_repr(x_c1)? - }, - y: Fq2 { - c0: Fq::from_repr(y_c0)?, - c1: Fq::from_repr(y_c1)? - }, - infinity: false - }) - } - fn from_affine(affine: G2Affine) -> Result { - use byteorder::{WriteBytesExt, BigEndian}; - - if affine.is_zero() { + if copy[0] & (1 << 7) != 0 { + // Distinguisher bit is set, but this should be uncompressed! return Err(()) } + if copy[0] & (1 << 6) != 0 { + // This is the point at infinity, which means that if we mask away + // the first two bits, the entire representation should consist + // of zeroes. + copy[0] &= 0x3f; + + if copy.iter().all(|b| *b == 0) { + Ok(G2Affine::zero()) + } else { + Err(()) + } + } else { + if copy[0] & (1 << 5) != 0 { + // The bit indicating the y-coordinate should be lexicographically + // largest is set, but this is an uncompressed element. + return Err(()) + } + + // Unset the three most significant bits. + copy[0] &= 0x1f; + + let mut x_c0 = FqRepr([0; 6]); + let mut x_c1 = FqRepr([0; 6]); + let mut y_c0 = FqRepr([0; 6]); + let mut y_c1 = FqRepr([0; 6]); + + { + let mut reader = ©[..]; + + for b in x_c1.0.iter_mut().rev() { + *b = reader.read_u64::().unwrap(); + } + + for b in x_c0.0.iter_mut().rev() { + *b = reader.read_u64::().unwrap(); + } + + for b in y_c1.0.iter_mut().rev() { + *b = reader.read_u64::().unwrap(); + } + + for b in y_c0.0.iter_mut().rev() { + *b = reader.read_u64::().unwrap(); + } + } + + Ok(G2Affine { + x: Fq2 { + c0: Fq::from_repr(x_c0)?, + c1: Fq::from_repr(x_c1)? + }, + y: Fq2 { + c0: Fq::from_repr(y_c0)?, + c1: Fq::from_repr(y_c1)? + }, + infinity: false + }) + } + } + fn from_affine(affine: G2Affine) -> Self { + use byteorder::{WriteBytesExt, BigEndian}; + let mut res = Self::empty(); - { + if affine.is_zero() { + // Set the second-most significant bit to indicate this point + // is at infinity. + res.0[0] |= 1 << 6; + } else { let mut writer = &mut res.0[..]; for digit in affine.x.c1.into_repr().as_ref().iter().rev() { @@ -1146,7 +1219,7 @@ pub mod g2 { } } - Ok(res) + res } } @@ -1180,97 +1253,110 @@ pub mod g2 { return Err(()) } - // Determine if the intended y coordinate must be greater - // lexicographically. - let greatest = copy[0] & (1 << 6) != 0; + if copy[0] & (1 << 6) != 0 { + // This is the point at infinity, which means that if we mask away + // the first two bits, the entire representation should consist + // of zeroes. + copy[0] &= 0x3f; - // Unset the two most significant bits. - copy[0] &= 0x3f; - - let mut x_c1 = FqRepr([0; 6]); - let mut x_c0 = FqRepr([0; 6]); - - { - let mut reader = ©[..]; - - for b in x_c1.0.iter_mut().rev() { - *b = reader.read_u64::().unwrap(); - } - - for b in x_c0.0.iter_mut().rev() { - *b = reader.read_u64::().unwrap(); - } - } - - // Interpret as Fq element. - let x = Fq2 { - c0: Fq::from_repr(x_c0)?, - c1: Fq::from_repr(x_c1)? - }; - - // Compute x^3 + b - let mut x3b = x; - x3b.square(); - x3b.mul_assign(&x); - x3b.add_assign(&G2Affine::get_coeff_b()); - - // Attempt to compute y - match x3b.sqrt() { - Some(y) => { - let mut negy = y; - negy.negate(); - - // Get the parity of the sqrt we found. - let parity = y > negy; - - Ok(G2Affine { - x: x, - y: if parity == greatest { y } else { negy }, - infinity: false - }) - }, - None => { - // Point must not be on the curve. + if copy.iter().all(|b| *b == 0) { + Ok(G2Affine::zero()) + } else { Err(()) } + } else { + // Determine if the intended y coordinate must be greater + // lexicographically. + let greatest = copy[0] & (1 << 5) != 0; + + // Unset the three most significant bits. + copy[0] &= 0x1f; + + let mut x_c1 = FqRepr([0; 6]); + let mut x_c0 = FqRepr([0; 6]); + + { + let mut reader = ©[..]; + + for b in x_c1.0.iter_mut().rev() { + *b = reader.read_u64::().unwrap(); + } + + for b in x_c0.0.iter_mut().rev() { + *b = reader.read_u64::().unwrap(); + } + } + + // Interpret as Fq element. + let x = Fq2 { + c0: Fq::from_repr(x_c0)?, + c1: Fq::from_repr(x_c1)? + }; + + // Compute x^3 + b + let mut x3b = x; + x3b.square(); + x3b.mul_assign(&x); + x3b.add_assign(&G2Affine::get_coeff_b()); + + // Attempt to compute y + match x3b.sqrt() { + Some(y) => { + let mut negy = y; + negy.negate(); + + // Get the parity of the sqrt we found. + let parity = y > negy; + + Ok(G2Affine { + x: x, + y: if parity == greatest { y } else { negy }, + infinity: false + }) + }, + None => { + // Point must not be on the curve. + Err(()) + } + } } } - fn from_affine(affine: G2Affine) -> Result { + fn from_affine(affine: G2Affine) -> Self { use byteorder::{WriteBytesExt, BigEndian}; - if affine.is_zero() { - return Err(()) - } - let mut res = Self::empty(); - { - let mut writer = &mut res.0[..]; + if affine.is_zero() { + // Set the second-most significant bit to indicate this point + // is at infinity. + res.0[0] |= 1 << 6; + } else { + { + let mut writer = &mut res.0[..]; - for digit in affine.x.c1.into_repr().as_ref().iter().rev() { - writer.write_u64::(*digit).unwrap(); + for digit in affine.x.c1.into_repr().as_ref().iter().rev() { + writer.write_u64::(*digit).unwrap(); + } + + for digit in affine.x.c0.into_repr().as_ref().iter().rev() { + writer.write_u64::(*digit).unwrap(); + } } - for digit in affine.x.c0.into_repr().as_ref().iter().rev() { - writer.write_u64::(*digit).unwrap(); - } - } - - // Distinguish this from an uncompressed element. - res.0[0] |= 1 << 7; // Set highest bit. - - { let mut negy = affine.y; negy.negate(); - // If the correct y coordinate is the largest (lexicographically), - // the bit should be set. + // Set the third most significant bit if the correct y-coordinate + // is lexicographically largest. if affine.y > negy { - res.0[0] |= 1 << 6; // Set second highest bit. + res.0[0] |= 1 << 5; } } - Ok(res) + // Set highest bit to distinguish this as a compressed element. + res.0[0] |= 1 << 7; + + res } } diff --git a/src/bls12_381/tests/g1_compressed_test_vectors.dat b/src/bls12_381/tests/g1_compressed_test_vectors.dat deleted file mode 100644 index 36bf17d9d2fe50c0fcbf8b8b118b1c0288f6410a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48000 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%0DmNB)mjpnkUN?(=);js1H*V>?GsILXcg}D!` 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 YwSDhi*gK>PbmdTG@GCW{9Z*a_OD8;B=>Px# diff --git a/src/bls12_381/tests/g1_compressed_valid_test_vectors.dat b/src/bls12_381/tests/g1_compressed_valid_test_vectors.dat new file mode 100644 index 0000000000000000000000000000000000000000..ea8cd67652d133010e79df8488452450b6f5cb17 GIT binary patch literal 48000 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 Rm?nepfGSPSF*XppvfIk?3d#Tg literal 0 HcmV?d00001 diff --git a/src/bls12_381/tests/g1_uncompressed_invalid_test_vectors.dat b/src/bls12_381/tests/g1_uncompressed_invalid_test_vectors.dat new file mode 100644 index 000000000..e69de29bb diff --git a/src/bls12_381/tests/g1_uncompressed_test_vectors.dat b/src/bls12_381/tests/g1_uncompressed_valid_test_vectors.dat similarity index 99% rename from src/bls12_381/tests/g1_uncompressed_test_vectors.dat rename to src/bls12_381/tests/g1_uncompressed_valid_test_vectors.dat index 5194b62b60cc57a469de0e89de252a393fe0eaa5..86abfba945c7b701750d637bffe6701330e10e88 100644 GIT binary patch delta 108 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 diff --git a/src/bls12_381/tests/g2_uncompressed_test_vectors.dat b/src/bls12_381/tests/g2_uncompressed_valid_test_vectors.dat similarity index 99% rename from src/bls12_381/tests/g2_uncompressed_test_vectors.dat rename to src/bls12_381/tests/g2_uncompressed_valid_test_vectors.dat index 7fcbcc9649d5d25489b29ae1ee99db6677147118..92e4bc528e8937a311b502e4940e5e363a1f7c57 100644 GIT binary patch delta 207 dcmZp;!`*O)yWW9eK!GF0wl}meZeenG3jp$l2DbnJ delta 210 zcmV;@04@K3+zWu*3xU9ezyYc*Qp|YJMANR0w&hrK@SIx#5bDNxUONT(UIpyXtKX7)+y<9lj`}z zyFt9_?>+W~6x&Z9Le$4De01=zbDpoX^P^O#O?&&2Ob@AxSwJ2^se(f5 z;L6V7LwKOwruEA5u?@Fd-7F*3ieeh?vxRtzs=RD{#K8{ntpsZe$_$io>UJ>@Ip&UW M((_fqPlYz*S?hake*gdg diff --git a/src/bls12_381/tests/mod.rs b/src/bls12_381/tests/mod.rs index 6baef49f2..41a54d7c3 100644 --- a/src/bls12_381/tests/mod.rs +++ b/src/bls12_381/tests/mod.rs @@ -3,14 +3,14 @@ use ::*; fn test_vectors>(expected: &[u8]) { - let mut e = G::one(); + let mut e = G::zero(); let mut v = vec![]; { let mut expected = expected; for _ in 0..1000 { let e_affine = e.into_affine(); - let encoded = E::from_affine(e_affine).unwrap(); + let encoded = E::from_affine(e_affine); v.extend_from_slice(encoded.as_ref()); let mut decoded = E::empty(); @@ -27,22 +27,22 @@ fn test_vectors>(expected: } #[test] -fn test_g1_uncompressed_vectors() { - test_vectors::(include_bytes!("g1_uncompressed_test_vectors.dat")); +fn test_g1_uncompressed_valid_vectors() { + test_vectors::(include_bytes!("g1_uncompressed_valid_test_vectors.dat")); } #[test] -fn test_g1_compressed_vectors() { - test_vectors::(include_bytes!("g1_compressed_test_vectors.dat")); +fn test_g1_compressed_valid_vectors() { + test_vectors::(include_bytes!("g1_compressed_valid_test_vectors.dat")); } #[test] -fn test_g2_uncompressed_vectors() { - test_vectors::(include_bytes!("g2_uncompressed_test_vectors.dat")); +fn test_g2_uncompressed_valid_vectors() { + test_vectors::(include_bytes!("g2_uncompressed_valid_test_vectors.dat")); } #[test] -fn test_g2_compressed_vectors() { - test_vectors::(include_bytes!("g2_compressed_test_vectors.dat")); +fn test_g2_compressed_valid_vectors() { + test_vectors::(include_bytes!("g2_compressed_valid_test_vectors.dat")); } diff --git a/src/lib.rs b/src/lib.rs index 2d600d930..210da0166 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -184,13 +184,13 @@ pub trait CurveAffine: Copy + /// Converts this element into its compressed encoding, so long as it's not /// the point at infinity. - fn into_compressed(&self) -> Result { + fn into_compressed(&self) -> Self::Compressed { ::from_affine(*self) } /// Converts this element into its uncompressed encoding, so long as it's not /// the point at infinity. - fn into_uncompressed(&self) -> Result { + fn into_uncompressed(&self) -> Self::Uncompressed { ::from_affine(*self) } } @@ -230,7 +230,7 @@ pub trait EncodedPoint: Sized + /// Creates an `EncodedPoint` from an affine point, as long as the /// point is not the point at infinity. - fn from_affine(affine: Self::Affine) -> Result; + fn from_affine(affine: Self::Affine) -> Self; } /// This trait represents an element of a field. diff --git a/src/tests/curve.rs b/src/tests/curve.rs index ea21f9024..e3eb0dc67 100644 --- a/src/tests/curve.rs +++ b/src/tests/curve.rs @@ -299,25 +299,32 @@ fn random_transformation_tests() { fn random_encoding_tests() { - assert!(G::zero().into_compressed().is_err()); - assert!(G::zero().into_uncompressed().is_err()); - let mut rng = XorShiftRng::from_seed([0x5dbe6259, 0x8d313d76, 0x3237db17, 0xe5bc0654]); + assert_eq!( + G::zero().into_uncompressed().into_affine().unwrap(), + G::zero() + ); + + assert_eq!( + G::zero().into_compressed().into_affine().unwrap(), + G::zero() + ); + for _ in 0..1000 { let mut r = G::Projective::rand(&mut rng).into_affine(); - let uncompressed = r.into_uncompressed().unwrap(); + let uncompressed = r.into_uncompressed(); let de_uncompressed = uncompressed.into_affine().unwrap(); assert_eq!(de_uncompressed, r); - let compressed = r.into_compressed().unwrap(); + let compressed = r.into_compressed(); let de_compressed = compressed.into_affine().unwrap(); assert_eq!(de_compressed, r); r.negate(); - let compressed = r.into_compressed().unwrap(); + let compressed = r.into_compressed(); let de_compressed = compressed.into_affine().unwrap(); assert_eq!(de_compressed, r); }