# gdanezis/petlib

Switch branches/tags
Nothing to show
Fetching contributors…
Cannot retrieve contributors at this time
91 lines (73 sloc) 2.03 KB
 ## An implementation of an additivelly homomorphic ## ECC El-Gamal scheme, used in Privex. from petlib.ec import EcGroup import pytest def params_gen(nid=713): """Generates the AHEG for an EC group nid""" G = EcGroup(nid) g = G.generator() o = G.order() return (G, g, o) def key_gen(params): """Generates a fresh key pair""" _, g, o = params priv = o.random() pub = priv * g return (pub, priv) def enc(params, pub, counter): """Encrypts the values of a small counter""" assert -2**8 < counter < 2**8 G, g, o = params k = o.random() a = k * g b = k * pub + counter * g return (a, b) def enc_side(params, pub, counter): """Encrypts the values of a small counter""" assert -2**8 < counter < 2**8 G, g, o = params k = o.random() a = k * g b = k * pub + counter * g return (a, b, k) def add(c1, c2): """Add two encrypted counters""" a1, b1 = c1 a2, b2 = c2 return (a1 + a2, b1 + b2) def mul(c1, val): """Multiplies an encrypted counter by a public value""" a1, b1 = c1 return (val*a1, val*b1) def randomize(params, pub, c1): """Rerandomize an encrypted counter""" zero = enc(params, pub, 0) return add(c1, zero) def make_table(params): """Make a decryption table""" _, g, o = params table = {} for i in range(-1000, 1000): table[i * g] = i return table def dec(params, table, priv, c1): """Decrypt an encrypted counter""" _, g, o = params a, b = c1 plain = b + (-priv * a) return table[plain] def test_AHEG(): params = params_gen() (pub, priv) = key_gen(params) table = make_table(params) # Check encryption and decryption one = enc(params, pub, 1) assert dec(params, table, priv, one) == 1 # Check addition tmp = add(one, one) two = randomize(params, pub, tmp) assert dec(params, table, priv, two) == 2 # Check multiplication tmp1 = mul(two, 2) four = randomize(params, pub, tmp1) assert dec(params, table, priv, four) == 4