void __gmpz_tdiv_q_2exp (mpz_t q, const mpz_t n, mp_bitcnt_t b); void __gmpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d); void __gmpz_mul_2exp (mpz_t rop, const mpz_t op1, mp_bitcnt_t op2); int __gmpz_tstbit (const mpz_t op, mp_bitcnt_t bit_index); int __gmpz_perfect_square_p (const mpz_t op); int __gmpz_jacobi (const mpz_t a, const mpz_t b); void __gmpz_gcd (mpz_t rop, const mpz_t op1, const mpz_t op2); UNIX_ULONG __gmpz_gcd_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); void __gmpz_lcm (mpz_t rop, const mpz_t op1, const mpz_t op2); int __gmpz_invert (mpz_t rop, const mpz_t op1, const mpz_t op2); int __gmpz_divisible_p (const mpz_t n, const mpz_t d); int __gmpz_divisible_ui_p (const mpz_t n, UNIX_ULONG d); """ lib = load_lib("gmp", gmp_defs) implementation = {"library": "gmp", "api": backend} if hasattr(lib, "__mpir_version"): raise ImportError("MPIR library detected") if sys.platform == "win32": raise ImportError("Not using GMP on Windows") # In order to create a function that returns a pointer to # a new MPZ structure, we need to break the abstraction # and know exactly what ffi backend we have if implementation["api"] == "ctypes": from ctypes import Structure, c_int, c_void_p, byref class _MPZ(Structure):
void __gmpz_mul_2exp (mpz_t rop, const mpz_t op1, mp_bitcnt_t op2); int __gmpz_tstbit (const mpz_t op, mp_bitcnt_t bit_index); int __gmpz_perfect_square_p (const mpz_t op); int __gmpz_jacobi (const mpz_t a, const mpz_t b); void __gmpz_gcd (mpz_t rop, const mpz_t op1, const mpz_t op2); UNIX_ULONG __gmpz_gcd_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); void __gmpz_lcm (mpz_t rop, const mpz_t op1, const mpz_t op2); int __gmpz_invert (mpz_t rop, const mpz_t op1, const mpz_t op2); int __gmpz_divisible_p (const mpz_t n, const mpz_t d); int __gmpz_divisible_ui_p (const mpz_t n, UNIX_ULONG d); """ try: gmp_defs = "typedef unsigned long UNIX_ULONG;" + gmp_defs_common lib = load_lib("gmp", gmp_defs) implementation = {"library": "gmp", "api": backend} except OSError: import platform bits, linkage = platform.architecture() if bits.startswith("64") and linkage.startswith("Win"): # MPIR uses unsigned long long where GMP uses unsigned long # (LLP64 vs LP64) gmp_defs = "typedef unsigned long long UNIX_ULONG;" + gmp_defs_common c_ulong = c_ulonglong # Try to load private MPIR lib first (wheel) try: from Cryptodome.Util._file_system import pycryptodome_filename mpir_dll = pycryptodome_filename(("Cryptodome", "Math"), "mpir.dll") lib = load_lib(mpir_dll, gmp_defs)
void __gmpz_tdiv_q_2exp (mpz_t q, const mpz_t n, mp_bitcnt_t b); void __gmpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d); void __gmpz_mul_2exp (mpz_t rop, const mpz_t op1, mp_bitcnt_t op2); int __gmpz_tstbit (const mpz_t op, mp_bitcnt_t bit_index); int __gmpz_perfect_square_p (const mpz_t op); int __gmpz_jacobi (const mpz_t a, const mpz_t b); void __gmpz_gcd (mpz_t rop, const mpz_t op1, const mpz_t op2); UNIX_ULONG __gmpz_gcd_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); void __gmpz_lcm (mpz_t rop, const mpz_t op1, const mpz_t op2); int __gmpz_invert (mpz_t rop, const mpz_t op1, const mpz_t op2); int __gmpz_divisible_p (const mpz_t n, const mpz_t d); int __gmpz_divisible_ui_p (const mpz_t n, UNIX_ULONG d); """ lib = load_lib("gmp", gmp_defs) implementation = { "library":"gmp", "api":backend } if hasattr(lib, "__mpir_version"): raise ImportError("MPIR library detected") if sys.platform == "win32": raise ImportError("Not using GMP on Windows") # In order to create a function that returns a pointer to # a new MPZ structure, we need to break the abstraction # and know exactly what ffi backend we have if implementation["api"] == "ctypes": from ctypes import Structure, c_int, c_void_p, byref class _MPZ(Structure):
void __gmpz_mul_2exp (mpz_t rop, const mpz_t op1, mp_bitcnt_t op2); int __gmpz_tstbit (const mpz_t op, mp_bitcnt_t bit_index); int __gmpz_perfect_square_p (const mpz_t op); int __gmpz_jacobi (const mpz_t a, const mpz_t b); void __gmpz_gcd (mpz_t rop, const mpz_t op1, const mpz_t op2); UNIX_ULONG __gmpz_gcd_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); void __gmpz_lcm (mpz_t rop, const mpz_t op1, const mpz_t op2); int __gmpz_invert (mpz_t rop, const mpz_t op1, const mpz_t op2); int __gmpz_divisible_p (const mpz_t n, const mpz_t d); int __gmpz_divisible_ui_p (const mpz_t n, UNIX_ULONG d); """ try: gmp_defs = "typedef unsigned long UNIX_ULONG;" + gmp_defs_common lib = load_lib("gmp", gmp_defs) implementation = { "library":"gmp", "api":backend } except OSError: import platform bits, linkage = platform.architecture() if bits.startswith("64") and linkage.startswith("Win"): # MPIR uses unsigned long long where GMP uses unsigned long # (LLP64 vs LP64) gmp_defs = "typedef unsigned long long UNIX_ULONG;" + gmp_defs_common c_ulong = c_ulonglong # Try to load private MPIR lib first (wheel) try: from Cryptodome.Util._file_system import pycryptodome_filename mpir_dll = pycryptodome_filename(("Cryptodome", "Math"), "mpir.dll") lib = load_lib(mpir_dll, gmp_defs)