#!/usr/bin/env perl
use warnings;
use strict;
use Math::BigInt try=>"GMP,Pari";
use Math::Prime::Util qw/:all/;
use Data::Dump qw/dump/;

# Takes the output of one of the Sage functions:
#     goldwasser_kilian(n)
#     atkin_morain(n)
#     ecpp(n)
# and run it through MPU's verifier.
#
# Example:
#   perl verify-sage-ecpp-cert.pl <<EOP
#   [100000000000000000039, 0, 100000000000000000038, 99999999982060129348, 964019216509,
#   (19568017359532265472 : 20079688430965599468 : 1), 964019216509, 0, 858481324253L, 964020818668, 241005204667,
#   (799886189130 : 601302851255 : 1), 241005204667, 0, 11167880189, 241006096857, 626011,
#   (140197349256 : 38879868868 : 1)]
#   EOP

my @input;
while (<>) {
  chomp;
  push @input, split(/\s*,\s*/, $_);
}
my $N;
my ($n, $a, $b, $m, $q, $Px, $Py);
my @cert;
while (@input) {
  $_ = shift @input;
  $_ =~ s/L\s*$//;
  if (!defined $N) {
    die "Need brackets around certificate\n" unless s/^\s*\[//;
    $N = $_;
    $n = $_;
    @cert = ($N, "AGKM");
  }
  elsif (!defined $n) { $n = $_; }
  elsif (!defined $a) { $a = $_; }
  elsif (!defined $b) { $b = $_; }
  elsif (!defined $m) { $m = $_; }
  elsif (!defined $q) { $q = $_; }
  elsif (!defined $Px) {
    die "Can't parse point" unless /\(\s*(\d+)\s*:\s*(\d+)\s*:\s*(\d+)\s*\)/;
    $Px = $1;
    $Py = $2;
    die "Bad input\n"
        unless defined $n && defined $a && defined $b && defined $m
            && defined $q && defined $Px && defined $Py;
    push @cert, [$n, $a, $b, $m, $q, [$Px,$Py]];
    undef $n;
    undef $a;
    undef $b;
    undef $m;
    undef $q;
    undef $Px;
    undef $Py;
  }
}

print dump(\@cert), "\n";
print verify_prime(@cert) ? "SUCCESS\n" : "FAILURE\n";