| 
									
										
										
										
											2002-04-03 18:45:09 -07:00
										 |  |  | #! /usr/bin/env python | 
					
						
							| 
									
										
										
										
											2009-08-03 15:14:44 -04:00
										 |  |  | # | 
					
						
							|  |  |  | #  setup.py : Distutils setup script | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # =================================================================== | 
					
						
							| 
									
										
										
										
											2014-06-14 22:00:00 +02:00
										 |  |  | # The contents of this file are dedicated to the public domain.  To | 
					
						
							|  |  |  | # the extent that dedication to the public domain is not available, | 
					
						
							| 
									
										
										
										
											2009-08-03 15:14:44 -04:00
										 |  |  | # everyone is granted a worldwide, perpetual, royalty-free, | 
					
						
							|  |  |  | # non-exclusive license to exercise all rights associated with the | 
					
						
							| 
									
										
										
										
											2014-06-14 22:00:00 +02:00
										 |  |  | # contents of this file for any purpose whatsoever. | 
					
						
							|  |  |  | # No rights are reserved. | 
					
						
							| 
									
										
										
										
											2009-08-03 15:14:44 -04:00
										 |  |  | # | 
					
						
							|  |  |  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 
					
						
							|  |  |  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 
					
						
							|  |  |  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 
					
						
							|  |  |  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | 
					
						
							|  |  |  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | 
					
						
							|  |  |  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | 
					
						
							|  |  |  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | 
					
						
							|  |  |  | # SOFTWARE. | 
					
						
							|  |  |  | # =================================================================== | 
					
						
							| 
									
										
										
										
											2002-07-11 14:31:19 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-25 22:29:47 +02:00
										 |  |  | try: | 
					
						
							|  |  |  |     from setuptools import Extension, Command, setup | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     from distutils.core import Extension, Command, setup | 
					
						
							| 
									
										
										
										
											2003-02-28 17:38:29 -07:00
										 |  |  | from distutils.command.build_ext import build_ext | 
					
						
							| 
									
										
										
										
											2016-02-16 23:50:20 +01:00
										 |  |  | from distutils.command.build import build | 
					
						
							| 
									
										
										
										
											2014-05-22 16:29:52 +02:00
										 |  |  | from distutils.errors import CCompilerError | 
					
						
							| 
									
										
										
										
											2018-03-01 09:01:26 +01:00
										 |  |  | from distutils import ccompiler | 
					
						
							| 
									
										
										
										
											2014-05-22 16:29:52 +02:00
										 |  |  | import distutils | 
					
						
							| 
									
										
										
										
											2018-01-20 23:50:08 +01:00
										 |  |  | import platform | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  | import re | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import shutil | 
					
						
							|  |  |  | import struct | 
					
						
							| 
									
										
										
										
											2018-06-04 23:18:59 +02:00
										 |  |  | if sys.version_info[0:2] == (2, 6): | 
					
						
							|  |  |  |     from distutils import sysconfig | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     import sysconfig | 
					
						
							| 
									
										
										
										
											2016-02-16 23:50:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | use_separate_namespace = os.path.isfile(".separate_namespace") | 
					
						
							| 
									
										
										
										
											2002-04-03 18:45:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-20 22:16:50 +01:00
										 |  |  | project_name = "pycryptodome" | 
					
						
							|  |  |  | package_root = "Crypto" | 
					
						
							|  |  |  | other_project = "pycryptodomex" | 
					
						
							|  |  |  | other_root = "Cryptodome" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if use_separate_namespace: | 
					
						
							|  |  |  |     project_name, other_project = other_project, project_name | 
					
						
							|  |  |  |     package_root, other_root = other_root, package_root | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | longdesc = """
 | 
					
						
							|  |  |  | PyCryptodome | 
					
						
							|  |  |  | ============ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyCryptodome is a self-contained Python package of low-level | 
					
						
							|  |  |  | cryptographic primitives. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | It supports Python 2.4 or newer, all Python 3 versions and PyPy. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | You can install it with:: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pip install THIS_PROJECT | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | All modules are installed under the ``THIS_ROOT`` package. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Check the OTHER_PROJECT_ project for the equivalent library that | 
					
						
							|  |  |  | works under the ``OTHER_ROOT`` package. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyCryptodome is a fork of PyCrypto. It brings several enhancements | 
					
						
							|  |  |  | with respect to the last official version of PyCrypto (2.6.1), | 
					
						
							|  |  |  | for instance: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * Authenticated encryption modes (GCM, CCM, EAX, SIV, OCB) | 
					
						
							|  |  |  | * Accelerated AES on Intel platforms via AES-NI | 
					
						
							|  |  |  | * First class support for PyPy | 
					
						
							|  |  |  | * Elliptic curves cryptography (NIST P-256 curve only) | 
					
						
							|  |  |  | * Better and more compact API (`nonce` and `iv` attributes for ciphers, | 
					
						
							|  |  |  |   automatic generation of random nonces and IVs, simplified CTR cipher mode, | 
					
						
							|  |  |  |   and more) | 
					
						
							|  |  |  | * SHA-3 (including SHAKE XOFs) and BLAKE2 hash algorithms | 
					
						
							|  |  |  | * Salsa20 and ChaCha20 stream ciphers | 
					
						
							|  |  |  | * scrypt and HKDF | 
					
						
							|  |  |  | * Deterministic (EC)DSA | 
					
						
							|  |  |  | * Password-protected PKCS#8 key containers | 
					
						
							|  |  |  | * Shamir's Secret Sharing scheme | 
					
						
							|  |  |  | * Random numbers get sourced directly from the OS (and not from a CSPRNG in userspace) | 
					
						
							|  |  |  | * Simplified install process, including better support for Windows | 
					
						
							|  |  |  | * Cleaner RSA and DSA key generation (largely based on FIPS 186-4) | 
					
						
							|  |  |  | * Major clean ups and simplification of the code base | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyCryptodome is not a wrapper to a separate C library like *OpenSSL*. | 
					
						
							|  |  |  | To the largest possible extent, algorithms are implemented in pure Python. | 
					
						
							|  |  |  | Only the pieces that are extremely critical to performance (e.g. block ciphers) | 
					
						
							|  |  |  | are implemented as C extensions. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For more information, see the `homepage`_. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | All the code can be downloaded from `GitHub`_. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. _OTHER_PROJECT: https://pypi.python.org/pypi/OTHER_PROJECT | 
					
						
							|  |  |  | .. _`homepage`: http://www.pycryptodome.org | 
					
						
							|  |  |  | .. _GitHub: https://github.com/Legrandin/pycryptodome | 
					
						
							|  |  |  | """.replace("THIS_PROJECT", project_name).\
 | 
					
						
							|  |  |  |     replace("THIS_ROOT", package_root).\ | 
					
						
							|  |  |  |     replace("OTHER_PROJECT", other_project).\ | 
					
						
							|  |  |  |     replace("OTHER_ROOT", other_root) | 
					
						
							| 
									
										
										
										
											2014-06-08 21:31:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-28 16:26:52 -05:00
										 |  |  | try: | 
					
						
							|  |  |  |     # Python 3 | 
					
						
							|  |  |  |     from distutils.command.build_py import build_py_2to3 as build_py | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     # Python 2 | 
					
						
							|  |  |  |     from distutils.command.build_py import build_py | 
					
						
							| 
									
										
										
										
											2011-10-18 23:20:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-29 13:21:05 -05:00
										 |  |  | # Work around the print / print() issue with Python 2.x and 3.x. We only need | 
					
						
							|  |  |  | # to print at one point of the code, which makes this easy | 
					
						
							| 
									
										
										
										
											2010-12-28 16:26:52 -05:00
										 |  |  | def PrintErr(*args, **kwd): | 
					
						
							|  |  |  |     fout = kwd.get("file", sys.stderr) | 
					
						
							|  |  |  |     w = fout.write | 
					
						
							|  |  |  |     if args: | 
					
						
							|  |  |  |         w(str(args[0])) | 
					
						
							|  |  |  |         sep = kwd.get("sep", " ") | 
					
						
							|  |  |  |         for a in args[1:]: | 
					
						
							|  |  |  |             w(sep) | 
					
						
							|  |  |  |             w(str(a)) | 
					
						
							|  |  |  |         w(kwd.get("end", "\n")) | 
					
						
							| 
									
										
										
										
											2008-08-13 23:11:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-07 00:10:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-29 12:42:57 +01:00
										 |  |  | def test_compilation(program, extra_cc_options=None, extra_libraries=None, msg=''): | 
					
						
							| 
									
										
										
										
											2014-05-22 16:29:52 +02:00
										 |  |  |     """Test if a certain C program can be compiled.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Create a temporary file with the C program | 
					
						
							| 
									
										
										
										
											2017-01-14 21:54:48 -02:00
										 |  |  |     if not os.path.exists("build"): | 
					
						
							|  |  |  |         os.makedirs("build") | 
					
						
							| 
									
										
										
										
											2015-09-08 09:18:04 -04:00
										 |  |  |     fname = os.path.join("build", "test1.c") | 
					
						
							| 
									
										
										
										
											2014-05-22 16:29:52 +02:00
										 |  |  |     f = open(fname, 'w') | 
					
						
							|  |  |  |     f.write(program) | 
					
						
							|  |  |  |     f.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Name for the temporary executable | 
					
						
							| 
									
										
										
										
											2015-09-08 09:18:04 -04:00
										 |  |  |     oname = os.path.join("build", "test1.out") | 
					
						
							| 
									
										
										
										
											2014-05-22 16:29:52 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-02 08:53:49 +02:00
										 |  |  |     debug = False | 
					
						
							| 
									
										
										
										
											2014-05-22 16:29:52 +02:00
										 |  |  |     # Mute the compiler and the linker | 
					
						
							| 
									
										
										
										
											2017-12-29 12:42:57 +01:00
										 |  |  |     if msg: | 
					
						
							|  |  |  |         PrintErr("Testing support for %s" % msg) | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  |     if not (debug or os.name == 'nt'): | 
					
						
							| 
									
										
										
										
											2014-06-02 08:53:49 +02:00
										 |  |  |         old_stdout = os.dup(sys.stdout.fileno()) | 
					
						
							|  |  |  |         old_stderr = os.dup(sys.stderr.fileno()) | 
					
						
							|  |  |  |         dev_null = open(os.devnull, "w") | 
					
						
							|  |  |  |         os.dup2(dev_null.fileno(), sys.stdout.fileno()) | 
					
						
							|  |  |  |         os.dup2(dev_null.fileno(), sys.stderr.fileno()) | 
					
						
							| 
									
										
										
										
											2014-05-22 16:29:52 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     objects = [] | 
					
						
							|  |  |  |     try: | 
					
						
							| 
									
										
										
										
											2018-03-01 09:01:26 +01:00
										 |  |  |         compiler = ccompiler.new_compiler() | 
					
						
							| 
									
										
										
										
											2014-07-02 15:52:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if compiler.compiler_type in [ 'msvc' ]: | 
					
						
							|  |  |  |             # Force creation of the manifest file (http://bugs.python.org/issue16296) | 
					
						
							|  |  |  |             # as needed by VS2010 | 
					
						
							|  |  |  |             extra_linker_options = [ "/MANIFEST" ] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             extra_linker_options = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-22 16:29:52 +02:00
										 |  |  |         distutils.sysconfig.customize_compiler(compiler) | 
					
						
							|  |  |  |         objects = compiler.compile([fname], extra_postargs=extra_cc_options) | 
					
						
							| 
									
										
										
										
											2014-07-02 15:52:44 +02:00
										 |  |  |         compiler.link_executable(objects, oname, libraries=extra_libraries, extra_preargs=extra_linker_options) | 
					
						
							| 
									
										
										
										
											2014-05-22 16:29:52 +02:00
										 |  |  |         result = True | 
					
						
							|  |  |  |     except CCompilerError: | 
					
						
							|  |  |  |         result = False | 
					
						
							|  |  |  |     for f in objects + [fname, oname]: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             os.remove(f) | 
					
						
							|  |  |  |         except OSError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Restore stdout and stderr | 
					
						
							| 
									
										
										
										
											2017-12-29 12:42:57 +01:00
										 |  |  |     if not (debug or os.name=='nt'): | 
					
						
							| 
									
										
										
										
											2014-06-02 08:53:49 +02:00
										 |  |  |         if old_stdout is not None: | 
					
						
							|  |  |  |             os.dup2(old_stdout, sys.stdout.fileno()) | 
					
						
							|  |  |  |         if old_stderr is not None: | 
					
						
							|  |  |  |             os.dup2(old_stderr, sys.stderr.fileno()) | 
					
						
							|  |  |  |         if dev_null is not None: | 
					
						
							|  |  |  |             dev_null.close() | 
					
						
							| 
									
										
										
										
											2017-12-29 12:42:57 +01:00
										 |  |  |     if msg: | 
					
						
							|  |  |  |         if result: | 
					
						
							|  |  |  |             x = "" | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             x = " not" | 
					
						
							|  |  |  |         PrintErr("Target does%s support %s" % (x, msg)) | 
					
						
							| 
									
										
										
										
											2014-05-22 16:29:52 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return result | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-07 00:10:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-28 17:38:29 -07:00
										 |  |  | class PCTBuildExt (build_ext): | 
					
						
							| 
									
										
										
										
											2014-12-16 07:50:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-24 23:21:15 +01:00
										 |  |  |     # Avoid linking Python's dynamic library | 
					
						
							|  |  |  |     def get_libraries(self, ext): | 
					
						
							|  |  |  |         return [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-28 17:38:29 -07:00
										 |  |  |     def build_extensions(self): | 
					
						
							| 
									
										
										
										
											2015-08-05 07:44:11 +02:00
										 |  |  |         # Disable any assembly in libtomcrypt files | 
					
						
							|  |  |  |         self.compiler.define_macro("LTC_NO_ASM") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-28 17:38:29 -07:00
										 |  |  |         # Detect which modules should be compiled | 
					
						
							|  |  |  |         self.detect_modules() | 
					
						
							| 
									
										
										
										
											2009-03-10 23:40:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-27 07:28:15 +02:00
										 |  |  |         # Call the superclass's build_extensions method | 
					
						
							| 
									
										
										
										
											2003-02-28 17:38:29 -07:00
										 |  |  |         build_ext.build_extensions(self) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |     def compiler_supports_uint128(self): | 
					
						
							| 
									
										
										
										
											2014-06-02 08:53:49 +02:00
										 |  |  |         source = """
 | 
					
						
							|  |  |  |         int main(void) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |             __uint128_t x; | 
					
						
							| 
									
										
										
										
											2014-06-02 08:53:49 +02:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |         return test_compilation(source, msg="128-bit integer") | 
					
						
							| 
									
										
										
										
											2014-06-02 08:53:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |     def compiler_has_intrin_h(self): | 
					
						
							| 
									
										
										
										
											2014-06-02 08:53:49 +02:00
										 |  |  |         # Windows | 
					
						
							|  |  |  |         source = """
 | 
					
						
							|  |  |  |         #include <intrin.h> | 
					
						
							|  |  |  |         int main(void) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             int a, b[4]; | 
					
						
							|  |  |  |             __cpuid(b, a); | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |         return test_compilation(source, msg="intrin.h header") | 
					
						
							| 
									
										
										
										
											2014-06-02 08:53:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |     def compiler_has_cpuid_h(self): | 
					
						
							|  |  |  |         # UNIX | 
					
						
							|  |  |  |         source = """
 | 
					
						
							|  |  |  |         #include <cpuid.h> | 
					
						
							|  |  |  |         int main(void) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             unsigned int eax, ebx, ecx, edx; | 
					
						
							|  |  |  |             __get_cpuid(1, &eax, &ebx, &ecx, &edx); | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         return test_compilation(source, msg="cpuid.h header") | 
					
						
							| 
									
										
										
										
											2014-06-02 08:53:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |     def compiler_supports_aesni(self): | 
					
						
							| 
									
										
										
										
											2014-06-02 08:53:49 +02:00
										 |  |  |         source = """
 | 
					
						
							|  |  |  |         #include <wmmintrin.h> | 
					
						
							|  |  |  |         __m128i f(__m128i x, __m128i y) { | 
					
						
							|  |  |  |             return _mm_aesenc_si128(x, y); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         int main(void) { | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2014-12-16 07:50:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |         if test_compilation(source): | 
					
						
							|  |  |  |             return {'extra_options':[]} | 
					
						
							| 
									
										
										
										
											2014-06-02 08:53:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |         if test_compilation(source, extra_cc_options=['-maes'], msg='AESNI intrinsics'): | 
					
						
							|  |  |  |             return {'extra_options':['-maes']} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def compiler_supports_clmul(self): | 
					
						
							| 
									
										
										
										
											2018-01-02 07:59:34 +01:00
										 |  |  |         source = """
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |         #include <wmmintrin.h> | 
					
						
							|  |  |  |         __m128i f(__m128i x, __m128i y) { | 
					
						
							|  |  |  |             return _mm_clmulepi64_si128(x, y, 0x00); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         int main(void) { | 
					
						
							| 
									
										
										
										
											2018-01-02 07:59:34 +01:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if test_compilation(source): | 
					
						
							|  |  |  |             return {'extra_options':[]} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if test_compilation(source, extra_cc_options=['-mpclmul','-mssse3'], msg='CLMUL intrinsics'): | 
					
						
							|  |  |  |             return {'extra_options':['-mpclmul', '-mssse3']} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return False | 
					
						
							| 
									
										
										
										
											2018-01-02 07:59:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 23:21:53 +02:00
										 |  |  |     def compiler_has_posix_memalign(self): | 
					
						
							|  |  |  |         source = """
 | 
					
						
							|  |  |  |         #include <stdlib.h> | 
					
						
							|  |  |  |         int main(void) { | 
					
						
							|  |  |  |             void *new_mem; | 
					
						
							|  |  |  |             posix_memalign((void**)&new_mem, 16, 101); | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         return test_compilation(source, msg="posix_memalign") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 22:47:47 +02:00
										 |  |  |     def compiler_has_memalign(self): | 
					
						
							|  |  |  |         source = """
 | 
					
						
							|  |  |  |         #include <malloc.h> | 
					
						
							|  |  |  |         int main(void) { | 
					
						
							|  |  |  |             void *p; | 
					
						
							|  |  |  |             p = memalign(16, 101); | 
					
						
							| 
									
										
										
										
											2018-07-05 23:21:53 +02:00
										 |  |  |             return 0; | 
					
						
							| 
									
										
										
										
											2018-07-05 22:47:47 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         return test_compilation(source, msg="memalign") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-28 17:38:29 -07:00
										 |  |  |     def detect_modules (self): | 
					
						
							| 
									
										
										
										
											2014-06-02 08:53:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |         if self.compiler_supports_uint128(): | 
					
						
							|  |  |  |             self.compiler.define_macro("HAVE_UINT128") | 
					
						
							| 
									
										
										
										
											2018-01-02 07:59:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |         intrin_h_present = self.compiler_has_intrin_h() | 
					
						
							|  |  |  |         if intrin_h_present: | 
					
						
							|  |  |  |             self.compiler.define_macro("HAVE_INTRIN_H") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cpuid_h_present = self.compiler_has_cpuid_h() | 
					
						
							|  |  |  |         if cpuid_h_present: | 
					
						
							|  |  |  |             self.compiler.define_macro("HAVE_CPUID_H") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 23:21:53 +02:00
										 |  |  |         if self.compiler_has_posix_memalign(): | 
					
						
							|  |  |  |             self.compiler.define_macro("HAVE_POSIX_MEMALIGN") | 
					
						
							|  |  |  |         elif self.compiler_has_memalign(): | 
					
						
							| 
									
										
										
										
											2018-07-05 22:47:47 +02:00
										 |  |  |             self.compiler.define_macro("HAVE_MEMALIGN") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |         # AESNI | 
					
						
							| 
									
										
										
										
											2018-06-03 14:08:10 +02:00
										 |  |  |         aesni_result = (cpuid_h_present or intrin_h_present) and self.compiler_supports_aesni() | 
					
						
							|  |  |  |         aesni_mod_name = package_root + ".Cipher._raw_aesni" | 
					
						
							|  |  |  |         if aesni_result: | 
					
						
							|  |  |  |             PrintErr("Compiling support for AESNI instructions") | 
					
						
							|  |  |  |             aes_mods = [ x for x in self.extensions if x.name == aesni_mod_name ] | 
					
						
							|  |  |  |             for x in aes_mods: | 
					
						
							|  |  |  |                 x.extra_compile_args += aesni_result['extra_options'] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             PrintErr ("Warning: compiler does not support AESNI instructions") | 
					
						
							| 
									
										
										
										
											2018-06-10 21:55:44 +02:00
										 |  |  |             self.remove_extension(aesni_mod_name) | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # CLMUL | 
					
						
							| 
									
										
										
										
											2018-06-03 14:08:10 +02:00
										 |  |  |         clmul_result = (cpuid_h_present or intrin_h_present) and self.compiler_supports_clmul() | 
					
						
							|  |  |  |         clmul_mod_name = package_root + ".Hash._ghash_clmul" | 
					
						
							|  |  |  |         if clmul_result: | 
					
						
							|  |  |  |             PrintErr("Compiling support for CLMUL instructions") | 
					
						
							|  |  |  |             clmul_mods = [ x for x in self.extensions if x.name == clmul_mod_name ] | 
					
						
							|  |  |  |             for x in clmul_mods: | 
					
						
							|  |  |  |                 x.extra_compile_args += clmul_result['extra_options'] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             PrintErr ("Warning: compiler does not support CLMUL instructions") | 
					
						
							| 
									
										
										
										
											2018-06-10 21:55:44 +02:00
										 |  |  |             self.remove_extension(clmul_mod_name) | 
					
						
							| 
									
										
										
										
											2009-08-18 19:57:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-10 21:55:44 +02:00
										 |  |  |     def remove_extension(self, name): | 
					
						
							| 
									
										
										
										
											2014-05-22 16:29:52 +02:00
										 |  |  |         """Remove the specified extension from the list of extensions
 | 
					
						
							|  |  |  |         to build"""
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-10 21:55:44 +02:00
										 |  |  |         self.extensions = [ x for x in self.extensions if x.name != name ] | 
					
						
							| 
									
										
										
										
											2003-02-28 17:38:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-07 00:10:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-13 23:11:05 -04:00
										 |  |  | class PCTBuildPy(build_py): | 
					
						
							|  |  |  |     def find_package_modules(self, package, package_dir, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2010-12-29 13:21:05 -05:00
										 |  |  |         modules = build_py.find_package_modules(self, package, package_dir, | 
					
						
							|  |  |  |             *args, **kwargs) | 
					
						
							| 
									
										
										
										
											2008-08-13 23:11:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Exclude certain modules | 
					
						
							| 
									
										
										
										
											2008-09-15 18:16:11 -04:00
										 |  |  |         retval = [] | 
					
						
							|  |  |  |         for item in modules: | 
					
						
							|  |  |  |             pkg, module = item[:2] | 
					
						
							|  |  |  |             retval.append(item) | 
					
						
							|  |  |  |         return retval | 
					
						
							| 
									
										
										
										
											2008-08-13 23:11:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-16 23:50:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-21 13:04:18 -05:00
										 |  |  | class TestCommand(Command): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     description = "Run self-test" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-10 18:52:40 +01:00
										 |  |  |     # Long option name, short option name, description | 
					
						
							| 
									
										
										
										
											2008-11-21 13:04:18 -05:00
										 |  |  |     user_options = [ | 
					
						
							| 
									
										
										
										
											2018-04-10 13:19:30 +02:00
										 |  |  |         ('skip-slow-tests', None, 'Skip slow tests'), | 
					
						
							|  |  |  |         ('wycheproof-warnings', None, 'Show warnings from wycheproof tests'), | 
					
						
							|  |  |  |         ('module=', 'm', 'Test a single module (e.g. Cipher, PublicKey)'), | 
					
						
							| 
									
										
										
										
											2008-11-21 13:04:18 -05:00
										 |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def initialize_options(self): | 
					
						
							|  |  |  |         self.build_dir = None | 
					
						
							|  |  |  |         self.skip_slow_tests = None | 
					
						
							| 
									
										
										
										
											2018-04-10 13:19:30 +02:00
										 |  |  |         self.wycheproof_warnings = None | 
					
						
							| 
									
										
										
										
											2011-01-10 18:52:40 +01:00
										 |  |  |         self.module = None | 
					
						
							| 
									
										
										
										
											2008-11-21 13:04:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def finalize_options(self): | 
					
						
							|  |  |  |         self.set_undefined_options('install', ('build_lib', 'build_dir')) | 
					
						
							| 
									
										
										
										
											2018-04-10 13:19:30 +02:00
										 |  |  |         self.config = { 'slow_tests': not self.skip_slow_tests, | 
					
						
							|  |  |  |                         'wycheproof_warnings': self.wycheproof_warnings } | 
					
						
							| 
									
										
										
										
											2008-11-21 13:04:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def run(self): | 
					
						
							| 
									
										
										
										
											2012-10-14 12:59:59 +02:00
										 |  |  |         # Run sub commands | 
					
						
							|  |  |  |         for cmd_name in self.get_sub_commands(): | 
					
						
							|  |  |  |             self.run_command(cmd_name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-21 13:04:18 -05:00
										 |  |  |         # Run SelfTest | 
					
						
							|  |  |  |         old_path = sys.path[:] | 
					
						
							| 
									
										
										
										
											2016-02-16 23:50:20 +01:00
										 |  |  |         self.announce("running self-tests on " + package_root) | 
					
						
							| 
									
										
										
										
											2008-11-21 13:04:18 -05:00
										 |  |  |         try: | 
					
						
							|  |  |  |             sys.path.insert(0, self.build_dir) | 
					
						
							| 
									
										
										
										
											2016-02-16 23:50:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if use_separate_namespace: | 
					
						
							|  |  |  |                 from Cryptodome import SelfTest | 
					
						
							|  |  |  |                 from Cryptodome.Math import Numbers | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 from Crypto import SelfTest | 
					
						
							|  |  |  |                 from Crypto.Math import Numbers | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-10 18:52:40 +01:00
										 |  |  |             moduleObj = None | 
					
						
							|  |  |  |             if self.module: | 
					
						
							|  |  |  |                 if self.module.count('.')==0: | 
					
						
							|  |  |  |                     # Test a whole a sub-package | 
					
						
							| 
									
										
										
										
											2016-02-16 23:50:20 +01:00
										 |  |  |                     full_module = package_root + ".SelfTest." + self.module | 
					
						
							| 
									
										
										
										
											2011-01-10 18:52:40 +01:00
										 |  |  |                     module_name = self.module | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     # Test only a module | 
					
						
							|  |  |  |                     # Assume only one dot is present | 
					
						
							|  |  |  |                     comps = self.module.split('.') | 
					
						
							|  |  |  |                     module_name = "test_" + comps[1] | 
					
						
							| 
									
										
										
										
											2016-02-16 23:50:20 +01:00
										 |  |  |                     full_module = package_root + ".SelfTest." + comps[0] + "." + module_name | 
					
						
							| 
									
										
										
										
											2011-01-10 18:52:40 +01:00
										 |  |  |                 # Import sub-package or module | 
					
						
							|  |  |  |                 moduleObj = __import__( full_module, globals(), locals(), module_name ) | 
					
						
							| 
									
										
										
										
											2015-02-12 21:54:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-16 23:50:20 +01:00
										 |  |  |             PrintErr(package_root + ".Math implementation:", | 
					
						
							| 
									
										
										
										
											2015-02-12 21:54:38 +01:00
										 |  |  |                      str(Numbers._implementation)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-10 18:52:40 +01:00
										 |  |  |             SelfTest.run(module=moduleObj, verbosity=self.verbose, stream=sys.stdout, config=self.config) | 
					
						
							| 
									
										
										
										
											2008-11-21 13:04:18 -05:00
										 |  |  |         finally: | 
					
						
							|  |  |  |             # Restore sys.path | 
					
						
							|  |  |  |             sys.path[:] = old_path | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Run slower self-tests | 
					
						
							|  |  |  |         self.announce("running extended self-tests") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-14 12:59:59 +02:00
										 |  |  |     sub_commands = [ ('build', None) ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-26 23:08:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-04 21:00:22 +01:00
										 |  |  | def create_cryptodome_lib(): | 
					
						
							|  |  |  |     assert os.path.isdir("lib/Crypto") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         shutil.rmtree("lib/Cryptodome") | 
					
						
							|  |  |  |     except OSError: | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  |     for root_src, dirs, files in os.walk("lib/Crypto"): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         root_dst, nr_repl = re.subn('Crypto', 'Cryptodome', root_src) | 
					
						
							|  |  |  |         assert nr_repl == 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for dir_name in dirs: | 
					
						
							|  |  |  |             full_dir_name_dst = os.path.join(root_dst, dir_name) | 
					
						
							|  |  |  |             if not os.path.exists(full_dir_name_dst): | 
					
						
							|  |  |  |                 os.makedirs(full_dir_name_dst) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for file_name in files: | 
					
						
							|  |  |  |             full_file_name_src = os.path.join(root_src, file_name) | 
					
						
							|  |  |  |             full_file_name_dst = os.path.join(root_dst, file_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             PrintErr("Copying file %s to %s" % (full_file_name_src, full_file_name_dst)) | 
					
						
							|  |  |  |             shutil.copy2(full_file_name_src, full_file_name_dst) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if not full_file_name_dst.endswith(".py"): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             fd = open(full_file_name_dst, "rt") | 
					
						
							|  |  |  |             content = (fd.read(). | 
					
						
							|  |  |  |                replace("Crypto.", "Cryptodome."). | 
					
						
							|  |  |  |                replace("Crypto ", "Cryptodome "). | 
					
						
							|  |  |  |                replace("'Crypto'", "'Cryptodome'"). | 
					
						
							|  |  |  |                replace('"Crypto"', '"Cryptodome"')) | 
					
						
							|  |  |  |             fd.close() | 
					
						
							|  |  |  |             os.remove(full_file_name_dst) | 
					
						
							|  |  |  |             fd = open(full_file_name_dst, "wt") | 
					
						
							|  |  |  |             fd.write(content) | 
					
						
							|  |  |  |             fd.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-04 23:18:59 +02:00
										 |  |  | def compiler_supports_sse2(): | 
					
						
							| 
									
										
										
										
											2018-02-26 21:21:22 +01:00
										 |  |  |     source = """
 | 
					
						
							|  |  |  |     #include <x86intrin.h> | 
					
						
							|  |  |  |     int main(void) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         __m128i r0; | 
					
						
							|  |  |  |         r0 = _mm_set1_epi32(0); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2018-06-04 23:18:59 +02:00
										 |  |  |     return test_compilation(source, extra_cc_options=['-msse2'], msg="x86intrin.h header") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def enable_compiler_specific_options(extensions): | 
					
						
							| 
									
										
										
										
											2018-02-26 21:21:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-04 23:18:59 +02:00
										 |  |  |     def check_compiler(compiler): | 
					
						
							|  |  |  |         result = compiler in os.environ.get('CC', '') | 
					
						
							|  |  |  |         builtin = sysconfig.get_config_vars('CC')[0] | 
					
						
							|  |  |  |         result = result or (builtin and compiler in builtin) | 
					
						
							|  |  |  |         return result | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     clang = check_compiler("clang") | 
					
						
							|  |  |  |     gcc = check_compiler("gcc") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if clang or gcc: | 
					
						
							|  |  |  |         sse2 = compiler_supports_sse2() | 
					
						
							|  |  |  |         for x in extensions: | 
					
						
							|  |  |  |             x.extra_compile_args += ['-O3'] | 
					
						
							|  |  |  |             if sse2: | 
					
						
							|  |  |  |                 x.extra_compile_args += ['-msse2'] | 
					
						
							|  |  |  |                 x.define_macros += [ ("HAVE_X86INTRIN_H", None) ] | 
					
						
							| 
									
										
										
										
											2018-02-26 21:21:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  | # Parameters for setup | 
					
						
							|  |  |  | packages =  [ | 
					
						
							|  |  |  |     "Crypto", | 
					
						
							|  |  |  |     "Crypto.Cipher", | 
					
						
							|  |  |  |     "Crypto.Hash", | 
					
						
							|  |  |  |     "Crypto.IO", | 
					
						
							|  |  |  |     "Crypto.PublicKey", | 
					
						
							|  |  |  |     "Crypto.Protocol", | 
					
						
							|  |  |  |     "Crypto.Random", | 
					
						
							|  |  |  |     "Crypto.Signature", | 
					
						
							|  |  |  |     "Crypto.Util", | 
					
						
							|  |  |  |     "Crypto.Math", | 
					
						
							|  |  |  |     "Crypto.SelfTest", | 
					
						
							|  |  |  |     "Crypto.SelfTest.Cipher", | 
					
						
							|  |  |  |     "Crypto.SelfTest.Hash", | 
					
						
							|  |  |  |     "Crypto.SelfTest.IO", | 
					
						
							|  |  |  |     "Crypto.SelfTest.Protocol", | 
					
						
							|  |  |  |     "Crypto.SelfTest.PublicKey", | 
					
						
							|  |  |  |     "Crypto.SelfTest.Random", | 
					
						
							|  |  |  |     "Crypto.SelfTest.Signature", | 
					
						
							|  |  |  |     "Crypto.SelfTest.Util", | 
					
						
							|  |  |  |     "Crypto.SelfTest.Math", | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | package_dir = { "Crypto": "lib/Crypto" } | 
					
						
							|  |  |  | package_data = { | 
					
						
							|  |  |  |     "Crypto.SelfTest.Cipher" : [ | 
					
						
							|  |  |  |         "test_vectors/AES/*.rsp", | 
					
						
							|  |  |  |         "test_vectors/TDES/*.rsp", | 
					
						
							| 
									
										
										
										
											2018-04-09 23:02:50 +02:00
										 |  |  |         "test_vectors/wycheproof/*.json", | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  |     ], | 
					
						
							|  |  |  |     "Crypto.SelfTest.Hash" : [ | 
					
						
							| 
									
										
										
										
											2018-02-23 22:23:02 +01:00
										 |  |  |         "test_vectors/SHA1/*.rsp", | 
					
						
							| 
									
										
										
										
											2018-04-05 22:00:55 +02:00
										 |  |  |         "test_vectors/SHA2/*.rsp", | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  |         "test_vectors/SHA3/*.txt", | 
					
						
							|  |  |  |         "test_vectors/keccak/*.txt", | 
					
						
							|  |  |  |         "test_vectors/BLAKE2s/*.txt", | 
					
						
							| 
									
										
										
										
											2018-04-10 20:34:45 +02:00
										 |  |  |         "test_vectors/BLAKE2b/*.txt", | 
					
						
							|  |  |  |         "test_vectors/wycheproof/*.json", | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  |     ], | 
					
						
							|  |  |  |     "Crypto.SelfTest.Signature" : [ | 
					
						
							|  |  |  |         "test_vectors/DSA/*.*", | 
					
						
							|  |  |  |         "test_vectors/ECDSA/*.*", | 
					
						
							|  |  |  |         "test_vectors/PKCS1-v1.5/*.*", | 
					
						
							| 
									
										
										
										
											2018-04-12 14:13:12 +02:00
										 |  |  |         "test_vectors/PKCS1-PSS/*.*", | 
					
						
							|  |  |  |         "test_vectors/wycheproof/*.json", | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  |     ], | 
					
						
							|  |  |  |     "Crypto.SelfTest.PublicKey" : [ | 
					
						
							|  |  |  |         "test_vectors/ECC/*.*", | 
					
						
							|  |  |  |     ], | 
					
						
							|  |  |  |     "Crypto.Math" : [ "mpir.dll" ], | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-01-26 23:08:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  | system_bits = 8 * struct.calcsize("P") | 
					
						
							|  |  |  | if system_bits == 32: | 
					
						
							|  |  |  |     multiply_cmod = [ 'src/multiply_32.c' ] | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     multiply_cmod = [ 'src/multiply_64.c' ] | 
					
						
							| 
									
										
										
										
											2018-01-26 23:08:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  | ext_modules = [ | 
					
						
							|  |  |  |     # Hash functions | 
					
						
							|  |  |  |     Extension("Crypto.Hash._MD2", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/MD2.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Hash._MD4", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/MD4.c"]), | 
					
						
							| 
									
										
										
										
											2018-02-24 16:54:02 +01:00
										 |  |  |     Extension("Crypto.Hash._MD5", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/MD5.c"]), | 
					
						
							| 
									
										
										
										
											2018-02-20 14:13:29 +01:00
										 |  |  |     Extension("Crypto.Hash._SHA1", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/SHA1.c"]), | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  |     Extension("Crypto.Hash._SHA256", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/SHA256.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Hash._SHA224", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/SHA224.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Hash._SHA384", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/SHA384.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Hash._SHA512", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/SHA512.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Hash._RIPEMD160", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/RIPEMD160.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Hash._keccak", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/keccak.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Hash._BLAKE2b", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/blake2b.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Hash._BLAKE2s", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/blake2s.c"]), | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |     Extension("Crypto.Hash._ghash_portable", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=['src/ghash_portable.c']), | 
					
						
							|  |  |  |     Extension("Crypto.Hash._ghash_clmul", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=['src/ghash_clmul.c']), | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Block encryption algorithms | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_aes", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/AES.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_aesni", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/AESNI.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_arc2", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/ARC2.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_blowfish", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/Blowfish.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_cast", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/CAST.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_des", | 
					
						
							|  |  |  |         include_dirs=['src/', 'src/libtom/'], | 
					
						
							|  |  |  |         sources=["src/DES.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_des3", | 
					
						
							|  |  |  |         include_dirs=['src/', 'src/libtom/'], | 
					
						
							|  |  |  |         sources=["src/DES3.c"]), | 
					
						
							| 
									
										
										
										
											2018-05-31 22:41:26 +02:00
										 |  |  |     Extension("Crypto.Util._cpuid_c", | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=['src/cpuid.c']), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Chaining modes | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_ecb", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/raw_ecb.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_cbc", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/raw_cbc.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_cfb", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/raw_cfb.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_ofb", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/raw_ofb.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_ctr", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/raw_ctr.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._raw_ocb", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/raw_ocb.c"]), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Stream ciphers | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._ARC4", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/ARC4.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._Salsa20", | 
					
						
							|  |  |  |         include_dirs=['src/', 'src/libtom/'], | 
					
						
							|  |  |  |         sources=["src/Salsa20.c"]), | 
					
						
							|  |  |  |     Extension("Crypto.Cipher._chacha20", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/chacha20.c"]), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Others | 
					
						
							|  |  |  |     Extension("Crypto.Protocol._scrypt", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=["src/scrypt.c"]), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Utility modules | 
					
						
							|  |  |  |     Extension("Crypto.Util._strxor", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=['src/strxor.c']), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Math | 
					
						
							|  |  |  |     Extension("Crypto.Math._montgomery", | 
					
						
							|  |  |  |         include_dirs=['src/'], | 
					
						
							|  |  |  |         sources=['src/montgomery.c', 'src/siphash.c', 'src/montgomery_utils.c'] + multiply_cmod, | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  | ] | 
					
						
							| 
									
										
										
										
											2018-01-26 23:08:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-04 23:18:59 +02:00
										 |  |  | # Enable some optimization if we know the compiler | 
					
						
							|  |  |  | enable_compiler_specific_options(ext_modules) | 
					
						
							| 
									
										
										
										
											2018-01-31 23:38:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 07:40:58 +01:00
										 |  |  | # Define big/little endian flag | 
					
						
							|  |  |  | for x in ext_modules: | 
					
						
							| 
									
										
										
										
											2018-05-03 16:57:33 +02:00
										 |  |  |     x.define_macros += [ ("PYCRYPTO_" + sys.byteorder.upper() + "_ENDIAN", None) ] | 
					
						
							| 
									
										
										
										
											2018-03-02 07:40:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  | if use_separate_namespace: | 
					
						
							| 
									
										
										
										
											2018-01-31 23:38:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  |     # Fix-up setup information | 
					
						
							|  |  |  |     for i in range(len(packages)): | 
					
						
							|  |  |  |         packages[i] = packages[i].replace("Crypto", "Cryptodome") | 
					
						
							|  |  |  |     package_dir = { "Cryptodome": "lib/Cryptodome" } | 
					
						
							|  |  |  |     new_package_data = {} | 
					
						
							|  |  |  |     for k,v in package_data.items(): | 
					
						
							|  |  |  |         new_package_data[k.replace("Crypto", "Cryptodome")] = v | 
					
						
							|  |  |  |     package_data = new_package_data | 
					
						
							|  |  |  |     for ext in ext_modules: | 
					
						
							|  |  |  |         ext.name = ext.name.replace("Crypto", "Cryptodome") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-04 21:00:22 +01:00
										 |  |  |     # Recreate lib/Cryptodome from scratch, unless it is the only | 
					
						
							|  |  |  |     # directory available | 
					
						
							|  |  |  |     if os.path.isdir("lib/Crypto"): | 
					
						
							|  |  |  |         create_cryptodome_lib() | 
					
						
							| 
									
										
										
										
											2018-01-26 23:08:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-04 21:00:22 +01:00
										 |  |  | # By doing this we neeed to change version information in a single file | 
					
						
							|  |  |  | for line in open(os.path.join("lib", package_root, "__init__.py")): | 
					
						
							|  |  |  |     if line.startswith("version_info"): | 
					
						
							|  |  |  |         version_tuple = eval(line.split("=")[1]) | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-18 14:25:08 +01:00
										 |  |  | version_string = ".".join([str(x) for x in version_tuple]) | 
					
						
							| 
									
										
										
										
											2018-01-20 23:50:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-25 11:03:35 +02:00
										 |  |  | setup( | 
					
						
							| 
									
										
										
										
											2016-02-20 22:16:50 +01:00
										 |  |  |     name = project_name, | 
					
						
							| 
									
										
										
										
											2014-06-17 20:44:27 +02:00
										 |  |  |     version = version_string, | 
					
						
							| 
									
										
										
										
											2014-05-25 11:03:35 +02:00
										 |  |  |     description = "Cryptographic library for Python", | 
					
						
							|  |  |  |     long_description = longdesc, | 
					
						
							| 
									
										
										
										
											2016-02-20 22:16:50 +01:00
										 |  |  |     author = "Helder Eijs", | 
					
						
							| 
									
										
										
										
											2014-05-25 11:03:35 +02:00
										 |  |  |     author_email = "helderijs@gmail.com", | 
					
						
							| 
									
										
										
										
											2014-05-27 13:40:37 +02:00
										 |  |  |     url = "http://www.pycryptodome.org", | 
					
						
							| 
									
										
										
										
											2014-05-25 11:03:35 +02:00
										 |  |  |     platforms = 'Posix; MacOS X; Windows', | 
					
						
							| 
									
										
										
										
											2018-01-08 11:15:41 +01:00
										 |  |  |     zip_safe = False, | 
					
						
							| 
									
										
										
										
											2014-05-25 11:03:35 +02:00
										 |  |  |     classifiers = [ | 
					
						
							| 
									
										
										
										
											2014-05-25 14:33:34 +02:00
										 |  |  |         'Development Status :: 4 - Beta', | 
					
						
							| 
									
										
										
										
											2014-06-24 07:38:05 +02:00
										 |  |  |         'License :: OSI Approved :: BSD License', | 
					
						
							| 
									
										
										
										
											2015-03-15 21:32:10 +01:00
										 |  |  |         'License :: Public Domain', | 
					
						
							| 
									
										
										
										
											2014-05-25 11:03:35 +02:00
										 |  |  |         'Intended Audience :: Developers', | 
					
						
							|  |  |  |         'Operating System :: Unix', | 
					
						
							|  |  |  |         'Operating System :: Microsoft :: Windows', | 
					
						
							|  |  |  |         'Operating System :: MacOS :: MacOS X', | 
					
						
							|  |  |  |         'Topic :: Security :: Cryptography', | 
					
						
							|  |  |  |         'Programming Language :: Python :: 2', | 
					
						
							| 
									
										
										
										
											2015-11-01 06:22:21 -05:00
										 |  |  |         'Programming Language :: Python :: 2.6', | 
					
						
							|  |  |  |         'Programming Language :: Python :: 2.7', | 
					
						
							| 
									
										
										
										
											2014-05-25 11:03:35 +02:00
										 |  |  |         'Programming Language :: Python :: 3', | 
					
						
							|  |  |  |     ], | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  |     packages = packages, | 
					
						
							|  |  |  |     package_dir = package_dir, | 
					
						
							|  |  |  |     package_data = package_data, | 
					
						
							| 
									
										
										
										
											2014-05-25 11:03:35 +02:00
										 |  |  |     cmdclass = { | 
					
						
							|  |  |  |         'build_ext':PCTBuildExt, | 
					
						
							|  |  |  |         'build_py': PCTBuildPy, | 
					
						
							| 
									
										
										
										
											2018-01-26 23:08:10 +01:00
										 |  |  |         'test': TestCommand, | 
					
						
							| 
									
										
										
										
											2014-05-25 11:03:35 +02:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2018-02-03 22:33:01 +01:00
										 |  |  |     ext_modules = ext_modules, | 
					
						
							| 
									
										
										
										
											2014-05-25 11:03:35 +02:00
										 |  |  | ) |