Skip to content
Snippets Groups Projects
Commit 5eec06c3 authored by Donald Stufft's avatar Donald Stufft
Browse files

Refactor the embedded libsodium to ease maintenance

parent ee4fa278
No related branches found
No related tags found
No related merge requests found
...@@ -2,29 +2,19 @@ include tox.ini ...@@ -2,29 +2,19 @@ include tox.ini
include LICENSE include LICENSE
# libsodium files # libsodium files
include src/libsodium/AUTHORS recursive-include src/libsodium *
include src/libsodium/ChangeLog recursive-include src/libsodium *.S
include src/libsodium/LICENSE recursive-include src/libsodium *.ac
include src/libsodium/README recursive-include src/libsodium *.am
include src/libsodium/THANKS recursive-include src/libsodium *.c
include src/libsodium/compile recursive-include src/libsodium *.exp
include src/libsodium/configure recursive-include src/libsodium *.guess
include src/libsodium/depcomp recursive-include src/libsodium *.h
include src/libsodium/install-sh recursive-include src/libsodium *.in
include src/libsodium/missing recursive-include src/libsodium *.m4
include src/libsodium/test-driver recursive-include src/libsodium *.markdown
recursive-include src *.S recursive-include src/libsodium *.sh
recursive-include src *.ac recursive-include src/libsodium *.sub
recursive-include src *.am
recursive-include src *.c
recursive-include src *.exp
recursive-include src *.guess
recursive-include src *.h
recursive-include src *.in
recursive-include src *.m4
recursive-include src *.markdown
recursive-include src *.sh
recursive-include src *.sub
# test files # test files
recursive-include docs *.png recursive-include docs *.png
...@@ -35,4 +25,4 @@ recursive-include tests *.py ...@@ -35,4 +25,4 @@ recursive-include tests *.py
recursive-include tests/data * recursive-include tests/data *
# Remove CFFI files # Remove CFFI files
recursive-exclude nacl *.c global-exclude __pycache__/*
...@@ -16,13 +16,12 @@ import functools ...@@ -16,13 +16,12 @@ import functools
import glob import glob
import os import os
import os.path import os.path
import shlex
import subprocess import subprocess
import sys import sys
from distutils.command.build_clib import build_clib as _build_clib from distutils.command.build_clib import build_clib as _build_clib
from setuptools import setup from setuptools import Distribution, setup
def here(*paths): def here(*paths):
...@@ -37,9 +36,6 @@ sys.path.append(here("src")) ...@@ -37,9 +36,6 @@ sys.path.append(here("src"))
import nacl import nacl
SODIUM_VERSION = "0.4.3"
def which(name, flags=os.X_OK): # Taken from twisted def which(name, flags=os.X_OK): # Taken from twisted
result = [] result = []
exts = filter(None, os.environ.get('PATHEXT', '').split(os.pathsep)) exts = filter(None, os.environ.get('PATHEXT', '').split(os.pathsep))
...@@ -60,7 +56,6 @@ def which(name, flags=os.X_OK): # Taken from twisted ...@@ -60,7 +56,6 @@ def which(name, flags=os.X_OK): # Taken from twisted
# This hack exists so that we can import nacl here # This hack exists so that we can import nacl here
sys.path += glob.glob("*.egg") sys.path += glob.glob("*.egg")
try: try:
import nacl.nacl import nacl.nacl
except ImportError: except ImportError:
...@@ -72,99 +67,59 @@ else: ...@@ -72,99 +67,59 @@ else:
ext_modules[0].include_dirs.append(sodium("include")) ext_modules[0].include_dirs.append(sodium("include"))
class Distribution(Distribution):
def has_c_libraries(self):
return True
class build_clib(_build_clib): class build_clib(_build_clib):
def run(self): def get_source_files(self):
# Run ./configure files = glob.glob(here("src/libsodium/*"))
subprocess.check_call( files += glob.glob(here("src/libsodium/*/*"))
"./configure --disable-debug --disable-dependency-tracking", files += glob.glob(here("src/libsodium/*/*/*"))
cwd=here("src/libsodium"), files += glob.glob(here("src/libsodium/*/*/*/*"))
shell=True, files += glob.glob(here("src/libsodium/*/*/*/*/*"))
) files += glob.glob(here("src/libsodium/*/*/*/*/*/*"))
# Parse the Makefile to determine what macros to define return files
with open(here("src/libsodium/Makefile")) as makefile:
for line in makefile:
if line.startswith("DEFS"):
defines = [
tuple(shlex.split(i)[0][2:].split("=", 1))
for i in shlex.split(line)
if i.startswith("-D")
]
# Configure libsodium using the Makefile defines
libraries = []
for libname, build_info in self.libraries:
if libname == "sodium":
# Store the define macros inside the build info
macros = dict(build_info.get("macros", []))
macros.update(dict(defines))
build_info["macros"] = list(macros.items())
sources = build_info["sources"]
# Dynamically modify the implementation based on if we have
# TIMODE or not
if "HAVE_TI_MODE" in macros:
sources.extend([
sodium("crypto_scalarmult/curve25519/donna_c64/base_curve25519_donna_c64.c"),
sodium("crypto_scalarmult/curve25519/donna_c64/smult_curve25519_donna_c64.c"),
])
else:
sources.extend([
sodium("crypto_scalarmult/curve25519/ref/base_curve25519_ref.c"),
sodium("crypto_scalarmult/curve25519/ref/smult_curve25519_ref.c"),
])
# Dynamically modify the implementation based on if we have
# AMD64 ASM or not.
if "HAVE_AMD64_ASM" in macros:
sources.extend([
sodium("crypto_stream/salsa20/amd64_xmm6/stream_salsa20_amd64_xmm6.S"),
])
self._include_asm = True
else:
sources.extend([
sodium("crypto_stream/salsa20/ref/stream_salsa20_ref.c"),
sodium("crypto_stream/salsa20/ref/xor_salsa20_ref.c"),
])
self._include_asm = False
build_info["sources"] = sources
libraries.append((libname, build_info))
self.libraries = libraries
# Call our normal run
return _build_clib.run(self)
def build_libraries(self, libraries): def build_libraries(self, libraries):
# This is a convenient place to modify the compiler so that we can add raise Exception("build_libraries")
# the .S extension
if self._include_asm and not ".S" in self.compiler.src_extensions:
self.compiler.src_extensions.append(".S")
# If we have a unix compiler see if it's gcc so we can enable certain def check_library_list(self, libraries):
# flags for it. raise Exception("check_library_list")
if self.compiler.compiler_type == "unix":
cc = which(self.compiler.executables["compiler"][0])[0]
cc = os.path.realpath(cc)
if "gcc" in os.path.basename(cc): def get_library_names(self):
real_compile = self.compiler._compile return ["sodium"]
def _compile(obj, src, ext, cc_args, extra_postargs, pp_opts): def run(self):
if "-std=c99" not in cc_args: # Ensure our temporary build directory exists
cc_args += ["-std=c99"] try:
return real_compile( os.makedirs(os.path.abspath(self.build_temp))
obj, src, ext, cc_args, extra_postargs, pp_opts) except IOError:
pass
self.compiler._compile = _compile # Locate our configure script
configure = here("src/libsodium/configure")
return _build_clib.build_libraries(self, libraries) # Run ./configure
subprocess.check_call(
[
configure, "--disable-shared", "--enable-static",
"--disable-debug", "--disable-dependency-tracking",
"--prefix", os.path.abspath(self.build_clib),
"--libdir", os.path.abspath(self.build_clib),
],
cwd=os.path.abspath(self.build_temp),
)
# Build the library
subprocess.check_call(
["make", "install"],
cwd=os.path.abspath(self.build_temp),
)
setup( setup(
...@@ -199,146 +154,11 @@ setup( ...@@ -199,146 +154,11 @@ setup(
ext_package="nacl", ext_package="nacl",
ext_modules=ext_modules, ext_modules=ext_modules,
libraries=[
("sodium", {
"include_dirs": [
sodium("include/sodium"),
],
"sources": [sodium(s) for s in [
"crypto_auth/crypto_auth.c",
"crypto_auth/hmacsha256/auth_hmacsha256_api.c",
"crypto_auth/hmacsha256/ref/hmac_hmacsha256.c",
"crypto_auth/hmacsha256/ref/verify_hmacsha256.c",
"crypto_auth/hmacsha512256/auth_hmacsha512256_api.c",
"crypto_auth/hmacsha512256/ref/hmac_hmacsha512256.c",
"crypto_auth/hmacsha512256/ref/verify_hmacsha512256.c",
"crypto_box/crypto_box.c",
"crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305_api.c",
"crypto_box/curve25519xsalsa20poly1305/ref/after_curve25519xsalsa20poly1305.c",
"crypto_box/curve25519xsalsa20poly1305/ref/before_curve25519xsalsa20poly1305.c",
"crypto_box/curve25519xsalsa20poly1305/ref/box_curve25519xsalsa20poly1305.c",
"crypto_box/curve25519xsalsa20poly1305/ref/keypair_curve25519xsalsa20poly1305.c",
"crypto_core/hsalsa20/ref2/core_hsalsa20.c",
"crypto_core/hsalsa20/core_hsalsa20_api.c",
"crypto_core/salsa20/ref/core_salsa20.c",
"crypto_core/salsa20/core_salsa20_api.c",
"crypto_core/salsa2012/ref/core_salsa2012.c",
"crypto_core/salsa2012/core_salsa2012_api.c",
"crypto_core/salsa208/ref/core_salsa208.c",
"crypto_core/salsa208/core_salsa208_api.c",
"crypto_generichash/crypto_generichash.c",
"crypto_generichash/blake2/generichash_blake2_api.c",
"crypto_generichash/blake2/ref/blake2b-ref.c",
"crypto_generichash/blake2/ref/generichash_blake2b.c",
"crypto_hash/crypto_hash.c",
"crypto_hash/sha256/hash_sha256_api.c",
"crypto_hash/sha256/ref/hash_sha256.c",
"crypto_hash/sha512/hash_sha512_api.c",
"crypto_hash/sha512/ref/hash_sha512.c",
"crypto_hashblocks/sha256/ref/blocks_sha256.c",
"crypto_hashblocks/sha256/hashblocks_sha256_api.c",
"crypto_hashblocks/sha512/ref/blocks_sha512.c",
"crypto_hashblocks/sha512/hashblocks_sha512_api.c",
"crypto_onetimeauth/crypto_onetimeauth.c",
"crypto_onetimeauth/poly1305/onetimeauth_poly1305.c",
"crypto_onetimeauth/poly1305/onetimeauth_poly1305_api.c",
"crypto_onetimeauth/poly1305/onetimeauth_poly1305_try.c",
"crypto_onetimeauth/poly1305/53/auth_poly1305_53.c",
"crypto_onetimeauth/poly1305/53/verify_poly1305_53.c",
"crypto_onetimeauth/poly1305/donna/auth_poly1305_donna.c",
"crypto_onetimeauth/poly1305/donna/verify_poly1305_donna.c",
"crypto_scalarmult/crypto_scalarmult.c",
"crypto_secretbox/crypto_secretbox.c",
"crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305_api.c",
"crypto_secretbox/xsalsa20poly1305/ref/box_xsalsa20poly1305.c",
"crypto_shorthash/crypto_shorthash.c",
"crypto_shorthash/siphash24/shorthash_siphash24_api.c",
"crypto_shorthash/siphash24/ref/shorthash_siphash24.c",
"crypto_sign/crypto_sign.c",
"crypto_sign/ed25519/sign_ed25519_api.c",
"crypto_sign/ed25519/ref10/fe_0.c",
"crypto_sign/ed25519/ref10/fe_1.c",
"crypto_sign/ed25519/ref10/fe_add.c",
"crypto_sign/ed25519/ref10/fe_cmov.c",
"crypto_sign/ed25519/ref10/fe_copy.c",
"crypto_sign/ed25519/ref10/fe_frombytes.c",
"crypto_sign/ed25519/ref10/fe_invert.c",
"crypto_sign/ed25519/ref10/fe_isnegative.c",
"crypto_sign/ed25519/ref10/fe_isnonzero.c",
"crypto_sign/ed25519/ref10/fe_mul.c",
"crypto_sign/ed25519/ref10/fe_neg.c",
"crypto_sign/ed25519/ref10/fe_pow22523.c",
"crypto_sign/ed25519/ref10/fe_sq.c",
"crypto_sign/ed25519/ref10/fe_sq2.c",
"crypto_sign/ed25519/ref10/fe_sub.c",
"crypto_sign/ed25519/ref10/fe_tobytes.c",
"crypto_sign/ed25519/ref10/ge_add.c",
"crypto_sign/ed25519/ref10/ge_double_scalarmult.c",
"crypto_sign/ed25519/ref10/ge_frombytes.c",
"crypto_sign/ed25519/ref10/ge_madd.c",
"crypto_sign/ed25519/ref10/ge_msub.c",
"crypto_sign/ed25519/ref10/ge_p1p1_to_p2.c",
"crypto_sign/ed25519/ref10/ge_p1p1_to_p3.c",
"crypto_sign/ed25519/ref10/ge_p2_0.c",
"crypto_sign/ed25519/ref10/ge_p2_dbl.c",
"crypto_sign/ed25519/ref10/ge_p3_0.c",
"crypto_sign/ed25519/ref10/ge_p3_dbl.c",
"crypto_sign/ed25519/ref10/ge_p3_to_cached.c",
"crypto_sign/ed25519/ref10/ge_p3_to_p2.c",
"crypto_sign/ed25519/ref10/ge_p3_tobytes.c",
"crypto_sign/ed25519/ref10/ge_precomp_0.c",
"crypto_sign/ed25519/ref10/ge_scalarmult_base.c",
"crypto_sign/ed25519/ref10/ge_sub.c",
"crypto_sign/ed25519/ref10/ge_tobytes.c",
"crypto_sign/ed25519/ref10/keypair.c",
"crypto_sign/ed25519/ref10/open.c",
"crypto_sign/ed25519/ref10/sc_muladd.c",
"crypto_sign/ed25519/ref10/sc_reduce.c",
"crypto_sign/ed25519/ref10/sign.c",
"crypto_sign/edwards25519sha512batch/sign_edwards25519sha512batch_api.c",
"crypto_sign/edwards25519sha512batch/ref/fe25519_edwards25519sha512batch.c",
"crypto_sign/edwards25519sha512batch/ref/ge25519_edwards25519sha512batch.c",
"crypto_sign/edwards25519sha512batch/ref/sc25519_edwards25519sha512batch.c",
"crypto_sign/edwards25519sha512batch/ref/sign_edwards25519sha512batch.c",
"crypto_stream/crypto_stream.c",
"crypto_stream/aes128ctr/portable/afternm_aes128ctr.c",
"crypto_stream/aes128ctr/stream_aes128ctr_api.c",
"crypto_stream/aes128ctr/portable/beforenm_aes128ctr.c",
"crypto_stream/aes128ctr/portable/common_aes128ctr.c",
"crypto_stream/aes128ctr/portable/consts_aes128ctr.c",
"crypto_stream/aes128ctr/portable/int128_aes128ctr.c",
"crypto_stream/aes128ctr/portable/stream_aes128ctr.c",
"crypto_stream/aes128ctr/portable/xor_afternm_aes128ctr.c",
"crypto_stream/aes256estream/hongjun/aes256-ctr.c",
"crypto_stream/aes256estream/stream_aes256estream_api.c",
"crypto_stream/salsa2012/stream_salsa2012_api.c",
"crypto_stream/salsa2012/ref/stream_salsa2012.c",
"crypto_stream/salsa2012/ref/xor_salsa2012.c",
"crypto_stream/salsa208/stream_salsa208_api.c",
"crypto_stream/salsa208/ref/stream_salsa208.c",
"crypto_stream/salsa208/ref/xor_salsa208.c",
"crypto_stream/xsalsa20/stream_xsalsa20_api.c",
"crypto_stream/xsalsa20/ref/stream_xsalsa20.c",
"crypto_stream/xsalsa20/ref/xor_xsalsa20.c",
"crypto_verify/16/verify_16_api.c",
"crypto_verify/16/ref/verify_16.c",
"crypto_verify/32/verify_32_api.c",
"crypto_verify/32/ref/verify_32.c",
"randombytes/randombytes.c",
"randombytes/salsa20/randombytes_salsa20_random.c",
"randombytes/sysrandom/randombytes_sysrandom.c",
"sodium/compat.c",
"sodium/core.c",
"sodium/utils.c",
"sodium/version.c",
]],
}),
],
zip_safe=False,
cmdclass={ cmdclass={
"build_clib": build_clib, "build_clib": build_clib,
}, },
distclass=Distribution,
zip_safe=False,
classifiers=[ classifiers=[
"Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: CPython",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment