summaryrefslogtreecommitdiffstats
path: root/vendor/primeorder/src/dev.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/primeorder/src/dev.rs')
-rw-r--r--vendor/primeorder/src/dev.rs152
1 files changed, 152 insertions, 0 deletions
diff --git a/vendor/primeorder/src/dev.rs b/vendor/primeorder/src/dev.rs
new file mode 100644
index 000000000..67877aa74
--- /dev/null
+++ b/vendor/primeorder/src/dev.rs
@@ -0,0 +1,152 @@
+//! Development-related functionality.
+
+/// Implement projective arithmetic tests.
+#[macro_export]
+macro_rules! impl_projective_arithmetic_tests {
+ (
+ $affine:tt,
+ $projective:tt,
+ $scalar:ty,
+ $add_vectors:expr,
+ $mul_vectors:expr
+ ) => {
+ /// Assert that the provided projective point matches the given test vector.
+ // TODO(tarcieri): use coordinate APIs. See zkcrypto/group#30
+ macro_rules! assert_point_eq {
+ ($actual:expr, $expected:expr) => {
+ let (expected_x, expected_y) = $expected;
+
+ let point = $actual.to_affine().to_encoded_point(false);
+ let (actual_x, actual_y) = match point.coordinates() {
+ sec1::Coordinates::Uncompressed { x, y } => (x, y),
+ _ => unreachable!(),
+ };
+
+ assert_eq!(&expected_x, actual_x.as_slice());
+ assert_eq!(&expected_y, actual_y.as_slice());
+ };
+ }
+
+ #[test]
+ fn affine_to_projective() {
+ let basepoint_affine = $affine::GENERATOR;
+ let basepoint_projective = $projective::GENERATOR;
+
+ assert_eq!($projective::from(basepoint_affine), basepoint_projective,);
+ assert_eq!(basepoint_projective.to_affine(), basepoint_affine);
+ assert!(!bool::from(basepoint_projective.to_affine().is_identity()));
+
+ assert!(bool::from($projective::IDENTITY.to_affine().is_identity()));
+ }
+
+ #[test]
+ fn projective_identity_addition() {
+ let identity = $projective::IDENTITY;
+ let generator = $projective::GENERATOR;
+
+ assert_eq!(identity + &generator, generator);
+ assert_eq!(generator + &identity, generator);
+ }
+
+ #[test]
+ fn projective_mixed_addition() {
+ let identity = $projective::IDENTITY;
+ let basepoint_affine = $affine::GENERATOR;
+ let basepoint_projective = $projective::GENERATOR;
+
+ assert_eq!(identity + &basepoint_affine, basepoint_projective);
+ assert_eq!(
+ basepoint_projective + &basepoint_affine,
+ basepoint_projective + &basepoint_projective
+ );
+ }
+
+ #[test]
+ fn test_vector_repeated_add() {
+ let generator = $projective::GENERATOR;
+ let mut p = generator;
+
+ for i in 0..$add_vectors.len() {
+ assert_point_eq!(p, $add_vectors[i]);
+ p += &generator;
+ }
+ }
+
+ #[test]
+ fn test_vector_repeated_add_mixed() {
+ let generator = $affine::GENERATOR;
+ let mut p = $projective::GENERATOR;
+
+ for i in 0..$add_vectors.len() {
+ assert_point_eq!(p, $add_vectors[i]);
+ p += &generator;
+ }
+ }
+
+ #[test]
+ fn test_vector_add_mixed_identity() {
+ let generator = $projective::GENERATOR;
+ let p0 = generator + $projective::IDENTITY;
+ let p1 = generator + $affine::IDENTITY;
+ assert_eq!(p0, p1);
+ }
+
+ #[test]
+ fn test_vector_double_generator() {
+ let generator = $projective::GENERATOR;
+ let mut p = generator;
+
+ for i in 0..2 {
+ assert_point_eq!(p, $add_vectors[i]);
+ p = p.double();
+ }
+ }
+
+ #[test]
+ fn projective_add_vs_double() {
+ let generator = $projective::GENERATOR;
+ assert_eq!(generator + &generator, generator.double());
+ }
+
+ #[test]
+ fn projective_add_and_sub() {
+ let basepoint_affine = $affine::GENERATOR;
+ let basepoint_projective = $projective::GENERATOR;
+
+ assert_eq!(
+ (basepoint_projective + &basepoint_projective) - &basepoint_projective,
+ basepoint_projective
+ );
+ assert_eq!(
+ (basepoint_projective + &basepoint_affine) - &basepoint_affine,
+ basepoint_projective
+ );
+ }
+
+ #[test]
+ fn projective_double_and_sub() {
+ let generator = $projective::GENERATOR;
+ assert_eq!(generator.double() - &generator, generator);
+ }
+
+ #[test]
+ fn test_vector_scalar_mult() {
+ let generator = $projective::GENERATOR;
+
+ for (k, coords) in $add_vectors
+ .iter()
+ .enumerate()
+ .map(|(k, coords)| (<$scalar>::from(k as u64 + 1), *coords))
+ .chain(
+ $mul_vectors
+ .iter()
+ .cloned()
+ .map(|(k, x, y)| (<$scalar>::from_repr(k.into()).unwrap(), (x, y))),
+ )
+ {
+ let p = generator * &k;
+ assert_point_eq!(p, coords);
+ }
+ }
+ };
+}