|
1 | | -from sympy import Poly, symbols, invert, ZZ, gcd, GF |
| 1 | +from sympy import Poly, symbols, invert, ZZ, gcd, GF, isprime |
2 | 2 | import numpy as np |
3 | 3 |
|
4 | 4 | x = symbols('x') |
|
7 | 7 | def invert_poly(polynomial_f, N, q): |
8 | 8 |
|
9 | 9 | #f = Poly(f_coeffs, x, domain=GF(q)) |
10 | | - mod_poly = Poly(x**N - 1, x, domain=GF(q)) |
| 10 | + if(isprime(q)): |
| 11 | + mod_poly = Poly(x**N - 1, x, domain=GF(q)) |
| 12 | + else: |
| 13 | + mod_poly = Poly(x ** N - 1, x, domain=ZZ).trunc(q) |
| 14 | + |
| 15 | + polynomial_f = polynomial_f.set_domain(mod_poly.domain) |
11 | 16 |
|
12 | 17 | if gcd(polynomial_f, mod_poly).degree() != 0: |
13 | 18 | return None |
@@ -70,8 +75,11 @@ def ntru_generate_keys(N : int, p: int, q : int, polynomial_g : Poly, polynomial |
70 | 75 | print("ERROR SMTH WRONG WITH p, q ") |
71 | 76 | return |
72 | 77 |
|
| 78 | + if(isprime(q)): |
| 79 | + poly_f_over_q = Poly(polynomial_f, x, domain=GF(q)) |
| 80 | + else: |
| 81 | + poly_f_over_q = Poly(polynomial_f, x, domain=ZZ).trunc(q) |
73 | 82 |
|
74 | | - poly_f_over_q = Poly(polynomial_f, x, domain=GF(q)) |
75 | 83 | poly_f_over_p = Poly(polynomial_f, x, domain=GF(p)) |
76 | 84 |
|
77 | 85 | Fp = invert_poly(poly_f_over_p, N, p) |
|
0 commit comments