def create_petition_checker(inputs, reference_inputs, parameters, outputs, returns, dependencies): try: # retrieve petition petition = loads(outputs[1]) num_options = len(petition['options']) print "CHECKING (create) - check format" if len(inputs) != 1 or len(reference_inputs) != 0 or len( outputs) != 2 or len(returns) != 0: return False if num_options < 1 or num_options != len(petition['scores']): return False print "CHECKING (create) - check tokens" if loads(inputs[0])['type'] != 'PetitionEncToken' or loads( outputs[0])['type'] != 'PetitionEncToken': return False if petition['type'] != 'PetitionEncObject': return False print "CHECKING (create) - check proof" params = setup() proof_init = unpack(parameters[0]) tally_pub = unpack(petition['tally_pub']) for value in petition['scores']: if not verifyzero(params, tally_pub, unpack(value), proof_init): return False # otherwise return True except (KeyError, Exception): return False
def tally_checker(inputs, reference_inputs, parameters, outputs, returns, dependencies): try: # retrieve vote vote = loads(inputs[0]) result = loads(outputs[0]) # check format if len(inputs) != 1 or len(reference_inputs) != 0 or len( outputs) != 1 or len(returns) != 0: return False if len(vote['options']) != len(result['outcome']): return False # check tokens if result['type'] != 'VoteResult': return False # generate params, retrieve tally's public key and the parameters params = setup() (G, _, (h0, _, _, _), _) = params tally_pub = unpack(vote['tally_pub']) sig = unpack(parameters['signature']) proof_dec = loads(parameters['proof_dec']) outcome = result['outcome'] # verify proof of correct decryption for i in range(0, len(vote['scores'])): a, b = unpack(vote['scores'][i]) ciphertext = (a, b - outcome[i] * h0) if not verifyzero(params, tally_pub, ciphertext, unpack(proof_dec[i])): return False # verify signature hasher = sha256() hasher.update(dumps(vote).encode('utf8')) hasher.update(dumps(result['outcome']).encode('utf8')) if not do_ecdsa_verify(G, tally_pub, sig, hasher.digest()): return False # otherwise return True except (KeyError, Exception): return False
def create_vote_checker(inputs, reference_inputs, parameters, outputs, returns, dependencies): try: # retrieve vote vote = loads(outputs[1]) num_votes = len(vote['options']) # check format if len(inputs) != 1 or len(reference_inputs) != 0 or len( outputs) != 2 or len(returns) != 0: return False if num_votes < 1 or num_votes != len(vote['scores']): return False if vote['participants'] == None: return False # check tokens if loads(inputs[0])['type'] != 'VoteToken' or loads( outputs[0])['type'] != 'VoteToken': return False if vote['type'] != 'VoteObject': return False # check proof params = setup() proof_init = unpack(parameters['proof_init']) tally_pub = unpack(vote['tally_pub']) for value in vote['scores']: if not verifyzero(params, tally_pub, unpack(value), proof_init): return False # otherwise return True except (KeyError, Exception): return False