Commit a462f537af43fe136e28a5a75a7128697904b4ef

FEATURE: added get_random, which selects an int from a given range randomly

Also made minor progress on KSW
KSW.py
(11 / 0)
  
5252
5353 def __init__(self, i) -> "(PK, SK)":
5454 # select p, q, r
55 p = get_random_prime(200)
56 q = get_random_prime(200)
57 r = get_random_prime(200)
5558 # make n
59 n = p*q*r
5660 # build the params
61 self.params = Parameters(n=n)
5762 # build the pairing
63 self.pairing = Pairing(params)
5864 # find the generators for the G_p, G_q, and G_r subgroups
65 self.g_G = Element.random(pairing, G1)**n
66 self.g_G_p = Element.random(pairing, G1)**(q*r)
67 self.g_G_r = Element.random(pairing, G1)**(p*q)
68 self.g_G_q = Element.random(pairing, G1)**(p*r)
5969 # choose R0
70 self.R0 = self.g_G_r ** get_random(r)
6071 # choose the random R's
6172 # choose the random H's
6273 # calculate Q
pypbc.c
(48 / 11)
  
2020 mpz_init_set_str(new_n, n_char, 10);
2121}
2222
23PyObject *mpz_to_pynum(mpz_t n) {
24 // get the mpz as a string
25 char *s = mpz_get_str(NULL, 10, n);
26
27 // convert the string to a python long
28 PyObject *l = PyLong_FromString(s, NULL, 10);
29
30 // clean up
31 free(s);
32
33 // return it
34 return l;
35}
36
2337PyObject *get_random_prime(PyObject *self, PyObject *args) {
2438 // gets the number of bits from the args
2539 int num_bits;
4343 }
4444
4545 // create the storage number
46 mpz_t c, p;
47 mpz_init(c);
46 mpz_t p;
4847 mpz_init(p);
4948
5049 // get a random n-bit number
51 pbc_mpz_randomb(c, num_bits);
50 pbc_mpz_randomb(p, num_bits);
5251
5352 // get the next prime
54 mpz_nextprime(p, c);
53 mpz_nextprime(p, p);
5554
5655 // get the mpz as a string
57 char *str_prime = mpz_get_str(NULL, 10, p);
56 PyObject *rand_prime = mpz_to_pynum(p);
5857
59 // convert the string to a python long
60 PyObject *rand_prime = PyLong_FromString(str_prime, NULL, 10);
61
6258 // clean up the mpz's
63 mpz_clear(c);
6459 mpz_clear(p);
6560
66 // clean up the str
67 free(str_prime);
6861 return rand_prime;
6962}
7063
64PyObject *get_random(PyObject *self, PyObject *args) {
65 // gets the number of bits from the args
66 PyObject *max;
67 if (!PyArg_ParseTuple(args, "O", &max)) {
68 PyErr_SetString(PyExc_TypeError, "could not parse arguments");
69 return NULL;
70 }
71
72 // create the storage number
73 mpz_t a, b;
74 mpz_init(a);
75 mpz_init(b);
76
77 // cast it to an mpz
78 pynum_to_mpz(max, a);
79
80 // get a value
81 pbc_mpz_random(b, a);
82
83 // cast it back to a pylong
84 PyObject *lng = mpz_to_pynum(b);
85
86 // clean up
87 mpz_clear(a);
88 mpz_clear(b);
89
90 // return it
91 return lng;
92}
7193
7294/*******************************************************************************
7395* Params *
10641064
10651065PyMethodDef pypbc_methods[] = {
10661066 {"get_random_prime", get_random_prime, METH_VARARGS, "get a random n-bit prime"},
1067 {"get_random", get_random, METH_VARARGS, "get a random value less than n"},
10671068 {NULL, NULL, 0, NULL}
10681069};
10691070