The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use warnings;
use strict;

use Test::More tests => 11 + 1;
use Test::NoWarnings;

use Math::BigInt try => 'GMP';
use Math::EllipticCurve::Prime;
use Math::EllipticCurve::Prime::Point;

{
	my $point = Math::EllipticCurve::Prime::Point->new;

	isa_ok($point, "Math::EllipticCurve::Prime::Point");
	ok($point->infinity, "point without coordinates is point at infinity");
	ok(!defined $point->x, "point at infinity has no x coordinate");
	ok(!defined $point->y, "point at infinity has no y coordinate");

	$point->bdbl;
	ok($point->infinity, "doubled point at infinity is point at infinity");
	ok(!defined $point->x, "doubled point at infinity has no x coordinate");
	ok(!defined $point->y, "doubled point at infinity has no y coordinate");
}

{
	my $curve = Math::EllipticCurve::Prime->new(name => "secp256r1");
	die unless $curve;
	
	my $g = $curve->g->copy;
	is($g->x->as_hex,
		"0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
		"initial point x coordinate matches");
	is($g->y->as_hex,
		"0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
		"initial point y coordinate matches");

	$g->bdbl;
	is($g->x->as_hex,
		"0x7cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978",
		"doubled point x coordinate matches");
	is($g->y->as_hex,
		"0x7775510db8ed040293d9ac69f7430dbba7dade63ce982299e04b79d227873d1",
		"doubled point y coordinate matches");
}