Esempio n. 1
0
def read_n_voters(sbb_dict, db):
    """ Read setup:voters item and save n_voters into db. """
    n_voters = sbb_dict['setup:voters']['n_voters']
    assert isinstance(n_voters, int) and n_voters > 0
    db['n_voters'] = n_voters
    db['p_list'] = sv.p_list(n_voters)
    ballot_id_len = sbb_dict['setup:voters']['ballot_id_len']
    assert isinstance(ballot_id_len, int)
    assert ballot_id_len > 0
    print('read_n_voters: successful.')
def read_n_voters(sbb_dict, db):
    """ Read setup:voters item and save n_voters into db. """
    n_voters = sbb_dict['setup:voters']['n_voters']
    assert isinstance(n_voters, int) and n_voters > 0
    db['n_voters'] = n_voters
    db['p_list'] = sv.p_list(n_voters)
    ballot_id_len = sbb_dict['setup:voters']['ballot_id_len']
    assert isinstance(ballot_id_len, int)
    assert ballot_id_len > 0
    print('read_n_voters: successful.')
    def __init__(self, election_parameters):
        """ Initialize election object.

        Initialize election, where election_parameters is a dict
        with at least the following key/values:
            "election_id" is a string
            "ballot_style" is a list of (race_id, choices) pairs,
               in which
                   race_id is a string
                   choices is list consisting of
                       one string for each allowable candidate/choice name, or
                       a string "******************" of stars
                           of the maximum allowable length of a write-in
                           if write-ins are allowed.

                Example:
                  ballot_style = [("President", ("Smith", "Jones", "********"))]
                defines a ballot style with one race (for President), and
                for this race the voter may vote for Smith, for Jones, or
                may cast a write-in vote of length at most 8 characters.
            "n_voters" is the number of simulated voters
            "n_reps" is the parameter for the cut-and-choose step
                     (n_reps replicas are made)
                     (in our paper, n_reps is called "2m")
            "n_fail" is the number of servers that may fail
            "n_leak" is the number of servers that may leak
        """

        self.election_parameters = election_parameters

        # manadatory parameters
        election_id = election_parameters["election_id"]
        ballot_style = election_parameters["ballot_style"]
        n_voters = election_parameters["n_voters"]
        n_reps = election_parameters["n_reps"]
        n_fail = election_parameters["n_fail"]
        n_leak = election_parameters["n_leak"]
        # optional parameters (with defaults)
        ballot_id_len = election_parameters.get("ballot_id_len", 32)
        json_indent = election_parameters.get("json_indent", 0)
        self.json_indent = json_indent
        sv.set_json_indent(json_indent)

        # check and save parameters
        assert isinstance(election_id, str) and len(election_id) > 0
        self.election_id = election_id

        assert isinstance(ballot_style, list) and len(ballot_style) > 0
        self.ballot_style = ballot_style

        assert isinstance(n_voters, int) and n_voters > 0
        self.n_voters = n_voters
        # p-list is list ["p0", "p1", ..., "p(n-1)"]
        # these name the positions in a list of objects, one per voter.
        # they are not voter ids, they are really names of positions
        # used for clarity and greater compatibility with json
        # keep all the same length (use leading zeros) so that
        # json "sort by keys" options works.
        # the following list is in sorted order!
        self.p_list = sv.p_list(n_voters)

        assert isinstance(n_reps, int) and \
            0 < n_reps <= 26 and n_reps % 2 == 0
        self.n_reps = n_reps
        # Each copy will be identified by an upper-case ascii letter
        self.k_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[:n_reps]

        assert isinstance(n_fail, int) and n_fail >= 0
        assert isinstance(n_leak, int) and n_leak >= 0
        self.n_fail = n_fail
        self.n_leak = n_leak

        assert ballot_id_len > 0
        self.ballot_id_len = ballot_id_len

        about_text = \
        ["Secure Bulletin Board for Split-Value Voting Method Demo.",
         "by Michael O. Rabin and Ronald L. Rivest",
         "For paper: see http://people.csail.mit.edu/rivest/pubs.html#RR14a",
         "For code: see https://github.com/ron-rivest/split-value-voting",
        ]
        legend_text = \
        ["Indices between 0 and n_voters-1 indicated by p0, p1, ...",
         "Rows of server array indicated by a, b, c, d, ...",
         "Copies (n_reps = 2m passes) indicated by A, B, C, D, ...",
         "'********' in ballot style indicates a write-in option",
         "           (number of stars is max write-in length)",
         "Values represented are represented modulo race_modulus.",
         "'x' (or 'y') equals u+v (mod race_modulus),",
         "             and is a (Shamir-)share of the vote.",
         "'cu' and 'cv' are commitments to u and v, respectively.",
         "'ru' and 'rv' are randomization values for cu and cv.",
         "'icl' stands for 'input comparison list',",
         "'opl' for 'output production list';",
         "      these are the 'cut-and-choose' results",
         "      dividing up the lists into two sub-lists.",
         "'time' is time in ISO 8601 format."
        ]
        # start secure bulletin board
        self.sbb = sv_sbb.SBB(election_id)
        self.sbb.post("setup:start",
                      {"about": about_text,
                       "election_id": election_id,
                       "legend": legend_text
                      }
                     )

        self.races = []
        self.race_ids = [race_id for (race_id, choices) in ballot_style]
        self.setup_races(ballot_style)
        self.voters = []
        self.voter_ids = []
        self.setup_voters(self, n_voters)
        self.cast_votes = dict()
        self.server = sv_server.Server(self, n_fail, n_leak)
        self.output_commitments = dict()
        self.setup_keys()
        self.sbb.post("setup:finished")
    def __init__(self, election_parameters):
        """ Initialize election object.

        Initialize election, where election_parameters is a dict
        with at least the following key/values:
            "election_id" is a string
            "ballot_style" is a list of (race_id, choices) pairs,
               in which
                   race_id is a string
                   choices is list consisting of
                       one string for each allowable candidate/choice name, or
                       a string "******************" of stars
                           of the maximum allowable length of a write-in
                           if write-ins are allowed.

                Example:
                  ballot_style = [("President", ("Smith", "Jones", "********"))]
                defines a ballot style with one race (for President), and
                for this race the voter may vote for Smith, for Jones, or
                may cast a write-in vote of length at most 8 characters.
            "n_voters" is the number of simulated voters
            "n_reps" is the parameter for the cut-and-choose step
                     (n_reps replicas are made)
                     (in our paper, n_reps is called "2m")
            "n_fail" is the number of servers that may fail
            "n_leak" is the number of servers that may leak
        """

        self.election_parameters = election_parameters

        # mandatory parameters
        election_id = election_parameters["election_id"]
        ballot_style = election_parameters["ballot_style"]
        n_voters = election_parameters["n_voters"]
        n_reps = election_parameters["n_reps"]
        n_fail = election_parameters["n_fail"]
        n_leak = election_parameters["n_leak"]
        # optional parameters (with defaults)
        ballot_id_len = election_parameters.get("ballot_id_len", 32)
        json_indent = election_parameters.get("json_indent", 0)
        self.json_indent = json_indent
        sv.set_json_indent(json_indent)

        # check and save parameters
        assert isinstance(election_id, str) and len(election_id) > 0
        self.election_id = election_id

        assert isinstance(ballot_style, list) and len(ballot_style) > 0
        self.ballot_style = ballot_style

        assert isinstance(n_voters, int) and n_voters > 0
        self.n_voters = n_voters
        # p-list is list ["p0", "p1", ..., "p(n-1)"]
        # these name the positions in a list of objects, one per voter.
        # they are not voter ids, they are really names of positions
        # used for clarity and greater compatibility with json
        # keep all the same length (use leading zeros) so that
        # json "sort by keys" options works.
        # the following list is in sorted order!
        self.p_list = sv.p_list(n_voters)

        assert isinstance(n_reps, int) and \
            0 < n_reps <= 26 and n_reps % 2 == 0
        self.n_reps = n_reps
        # Each copy will be identified by an upper-case ascii letter
        self.k_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[:n_reps]

        assert isinstance(n_fail, int) and n_fail >= 0
        assert isinstance(n_leak, int) and n_leak >= 0
        self.n_fail = n_fail
        self.n_leak = n_leak

        assert ballot_id_len > 0
        self.ballot_id_len = ballot_id_len

        self.about_text = \
        ["Secure Bulletin Board for Split-Value Voting Method Demo.",
         "by Michael O. Rabin and Ronald L. Rivest",
         "For paper: see http://people.csail.mit.edu/rivest/pubs.html#RR14a",
         "For code: see https://github.com/ron-rivest/split-value-voting",
        ]
        self.legend_text = \
        ["Indices between 0 and n_voters-1 indicated by p0, p1, ...",
         "Rows of server array indicated by a, b, c, d, ...",
         "Copies (n_reps = 2m passes) indicated by A, B, C, D, ...",
         "'********' in ballot style indicates a write-in option",
         "           (number of stars is max write-in length)",
         "Values represented are represented modulo race_modulus.",
         "'x' (or 'y') equals u+v (mod race_modulus),",
         "             and is a (Shamir-)share of the vote.",
         "'cu' and 'cv' are commitments to u and v, respectively.",
         "'ru' and 'rv' are randomization values for cu and cv.",
         "'icl' stands for 'input comparison list',",
         "'opl' for 'output production list';",
         "      these are the 'cut-and-choose' results",
         "      dividing up the lists into two sub-lists.",
         "'time' is time in ISO 8601 format."
        ]
        self.legend_text = ["TODO:"]
        #TODO fix legend_text I was getting some out of bounds error, most likely due to the encoding
        

        self.races = []
        self.race_ids = [race_id for (race_id, choices) in ballot_style]
        self.setup_races(ballot_style)
        self.voters = []
        self.voter_ids = []
        self.setup_voters(self, self.n_voters)
        self.cast_votes = dict()
        self.initialize_cast_votes()
        self.output_commitments = dict()
        self.server = sv_server.Server(self, n_fail, n_leak)