def create_vote(inputs, reference_inputs, parameters, options, participants, tally_priv, tally_pub): # genrate param params = setup() pub = unpack(tally_pub) # encrypt initial score (a, b, k) = binencrypt(params, pub, 0) # encryption of a zero c = (a, b) scores = [pack(c) for _ in loads(options)] # new vote object new_vote = { 'type': 'VoteObject', 'options': loads(options), 'scores': scores, 'participants': loads(participants), 'tally_pub': tally_pub } # proof that all init values are zero proof_init = provezero(params, pub, c, unpack(tally_priv)) # return return { 'outputs': (inputs[0], dumps(new_vote)), 'extra_parameters': { 'proof_init': pack(proof_init) } }
def tally(inputs, reference_inputs, parameters, tally_priv, tally_pub): # retrieve last vote vote = loads(inputs[0]) # generate params & retrieve tally's public key params = setup() table = make_table(params) (G, _, (h0, _, _, _), _) = params # decrypt aggregated results outcome = [] for item in vote['scores']: outcome.append(dec(params, table, unpack(tally_priv), unpack(item))) # proof of decryption proof_dec = [] for i in range(0, len(vote['scores'])): a, b = unpack(vote['scores'][i]) ciphertext = (a, b - outcome[i] * h0) tmp = provezero(params, unpack(tally_pub), ciphertext, unpack(tally_priv)) proof_dec.append(pack(tmp)) # signature hasher = sha256() hasher.update(dumps(vote).encode('utf8')) hasher.update(dumps(outcome).encode('utf8')) sig = do_ecdsa_sign(G, unpack(tally_priv), hasher.digest()) # pack result result = {'type': 'VoteResult', 'outcome': outcome} # return return { 'outputs': (dumps(result), ), 'extra_parameters': { 'proof_dec': dumps(proof_dec), 'signature': pack(sig) } }