Commit aea5f2e8 authored by Stephane Glondu's avatar Stephane Glondu
Browse files

Checking election parameters

parent 07408321
open Util
open Serializable_t
(** Helper functions *)
......@@ -22,35 +23,42 @@ let map_and_concat_with_commas f xs =
(** Finite field arithmetic *)
let check_finite_field ~p ~q ~g =
Z.probab_prime p 10 > 0 &&
Z.probab_prime q 10 > 0 &&
check_modulo p g &&
check_modulo p q &&
Z.(powm g q p =% one)
let finite_field ~p ~q ~g =
if
Z.probab_prime p 10 > 0 &&
Z.probab_prime q 10 > 0 &&
check_modulo p g &&
check_modulo p q &&
Z.(powm g q p =% one)
then
let module G = struct
open Z
type t = Z.t
let q = q
let one = Z.one
let g = g
let ( *~ ) a b = a * b mod p
let ( **~ ) a b = powm a b p
let invert x = invert x p
let ( =~ ) = equal
let check x = check_modulo p x && x **~ q =~ one
let hash xs = hashZ (map_and_concat_with_commas Z.to_string xs)
let compare = Z.compare
end in (module G : Crypto_sigs.GROUP with type t = Z.t)
else
invalid_arg "Invalid parameters for a multiplicative subgroup of finite field"
let module G = struct
open Z
type t = Z.t
let q = q
let one = Z.one
let g = g
let ( *~ ) a b = a * b mod p
let ( **~ ) a b = powm a b p
let invert x = Z.invert x p
let ( =~ ) = Z.equal
let check x = check_modulo p x && x **~ q =~ one
let hash xs = hashZ (map_and_concat_with_commas Z.to_string xs)
let compare = Z.compare
end in (module G : Crypto_sigs.GROUP with type t = Z.t)
(** Parameters *)
let check_election p =
let module P = (val p : Crypto_sigs.ELECTION_PARAMS) in
let open P in
let open G in
(* check public key *)
let computed = Array.fold_left ( *~ ) G.one public_keys in
computed =~ params.e_public_key
(** Homomorphic elections *)
module MakeElection (P : Crypto_sigs.ELECTION_PARAMS) = struct
open Serializable_t
open P
open G
type elt = G.t
......
......@@ -3,9 +3,13 @@
val finite_field : p:Z.t -> q:Z.t -> g:Z.t ->
(module Crypto_sigs.GROUP with type t = Z.t)
(** [finite_field p q g] builds the multiplicative subgroup of F[p],
generated by [g], of order [q]. It performs basic consistency
checks on [p], [q] and [g] and raises [Invalid_argument] in caise
of failure. *)
generated by [g], of order [q]. *)
val check_finite_field : p:Z.t -> q:Z.t -> g:Z.t -> bool
(** Check consistency of finite field parameters. *)
val check_election : (module Crypto_sigs.ELECTION_PARAMS) -> bool
(** Check consistency of election parameters. *)
module MakeElection (P : Crypto_sigs.ELECTION_PARAMS) :
Crypto_sigs.ELECTION with type elt = P.G.t
......@@ -78,6 +78,9 @@ let verbose_assert msg it =
let verbose_verify_election_test_data (e, ballots, signatures, private_data) =
Printf.eprintf "Verifying election %S:\n%!" e.election.e_short_name;
let {g; p; q; y} = e.election.e_public_key in
verbose_assert "group parameters" (lazy (
Crypto.check_finite_field ~p ~q ~g
));
let module P = struct
module G = (val Crypto.finite_field ~p ~q ~g : Crypto_sigs.GROUP with type t = Z.t)
let public_keys =
......@@ -87,14 +90,10 @@ let verbose_verify_election_test_data (e, ballots, signatures, private_data) =
let params = Serializable_compat.of_election e.election
let fingerprint = e.fingerprint
end in
let module Election = Crypto.MakeElection(P) in
(*
verbose_assert "election key" (lazy (
Crypto.check_election_key
e.election.e_public_key.y
e.public_data.public_keys
Crypto.check_election (module P : Crypto_sigs.ELECTION_PARAMS)
));
*)
let module Election = Crypto.MakeElection(P) in
if Array.length ballots = 0 then (
Printf.eprintf " no ballots available\n%!"
) else (
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment