Commit a462f537af43fe136e28a5a75a7128697904b4ef
- Diff rendering mode:
- inline
- side by side
KSW.py
(11 / 0)
|   | |||
| 52 | 52 | ||
| 53 | 53 | def __init__(self, i) -> "(PK, SK)": | |
| 54 | 54 | # select p, q, r | |
| 55 | p = get_random_prime(200) | ||
| 56 | q = get_random_prime(200) | ||
| 57 | r = get_random_prime(200) | ||
| 55 | 58 | # make n | |
| 59 | n = p*q*r | ||
| 56 | 60 | # build the params | |
| 61 | self.params = Parameters(n=n) | ||
| 57 | 62 | # build the pairing | |
| 63 | self.pairing = Pairing(params) | ||
| 58 | 64 | # 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) | ||
| 59 | 69 | # choose R0 | |
| 70 | self.R0 = self.g_G_r ** get_random(r) | ||
| 60 | 71 | # choose the random R's | |
| 61 | 72 | # choose the random H's | |
| 62 | 73 | # calculate Q |
pypbc.c
(48 / 11)
|   | |||
| 20 | 20 | mpz_init_set_str(new_n, n_char, 10); | |
| 21 | 21 | } | |
| 22 | 22 | ||
| 23 | PyObject *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 | |||
| 23 | 37 | PyObject *get_random_prime(PyObject *self, PyObject *args) { | |
| 24 | 38 | // gets the number of bits from the args | |
| 25 | 39 | int num_bits; | |
| … | … | ||
| 43 | 43 | } | |
| 44 | 44 | ||
| 45 | 45 | // create the storage number | |
| 46 | mpz_t c, p; | ||
| 47 | mpz_init(c); | ||
| 46 | mpz_t p; | ||
| 48 | 47 | mpz_init(p); | |
| 49 | 48 | ||
| 50 | 49 | // get a random n-bit number | |
| 51 | pbc_mpz_randomb(c, num_bits); | ||
| 50 | pbc_mpz_randomb(p, num_bits); | ||
| 52 | 51 | ||
| 53 | 52 | // get the next prime | |
| 54 | mpz_nextprime(p, c); | ||
| 53 | mpz_nextprime(p, p); | ||
| 55 | 54 | ||
| 56 | 55 | // get the mpz as a string | |
| 57 | char *str_prime = mpz_get_str(NULL, 10, p); | ||
| 56 | PyObject *rand_prime = mpz_to_pynum(p); | ||
| 58 | 57 | ||
| 59 | // convert the string to a python long | ||
| 60 | PyObject *rand_prime = PyLong_FromString(str_prime, NULL, 10); | ||
| 61 | |||
| 62 | 58 | // clean up the mpz's | |
| 63 | mpz_clear(c); | ||
| 64 | 59 | mpz_clear(p); | |
| 65 | 60 | ||
| 66 | // clean up the str | ||
| 67 | free(str_prime); | ||
| 68 | 61 | return rand_prime; | |
| 69 | 62 | } | |
| 70 | 63 | ||
| 64 | PyObject *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 | } | ||
| 71 | 93 | ||
| 72 | 94 | /******************************************************************************* | |
| 73 | 95 | * Params * | |
| … | … | ||
| 1064 | 1064 | ||
| 1065 | 1065 | PyMethodDef pypbc_methods[] = { | |
| 1066 | 1066 | {"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"}, | ||
| 1067 | 1068 | {NULL, NULL, 0, NULL} | |
| 1068 | 1069 | }; | |
| 1069 | 1070 |

