From 82ef2326e93d2a0b621dc44974af7279ee42dfb2 Mon Sep 17 00:00:00 2001 From: ben c Date: Wed, 30 Oct 2013 02:48:27 -0200 Subject: add python3 support --- .gitignore | 1 + debian/changelog | 6 ++ debian/control | 37 ++++++- debian/patches/py3_support | 241 +++++++++++++++++++++++++++++++++++++++++++++ debian/patches/series | 1 + debian/rules | 21 +++- 6 files changed, 303 insertions(+), 4 deletions(-) create mode 100644 debian/patches/py3_support create mode 100644 debian/patches/series diff --git a/.gitignore b/.gitignore index f470bdd..c9bfcb7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ debian/*.log debian/*.debhelper debian/*.substvars debian/python-srp/* +.pc diff --git a/debian/changelog b/debian/changelog index e726b0b..b1cfa22 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +python-srp (1.0.2-2) unstable; urgency=low + + * Python3 package. + + -- Ben Carrillo Wed, 30 Oct 2013 03:13:44 -0200 + python-srp (1.0.2-1) unstable; urgency=low * Initial release. Closes: 699122 diff --git a/debian/control b/debian/control index 7acbcd9..3ed60e9 100644 --- a/debian/control +++ b/debian/control @@ -4,10 +4,13 @@ Section: python Priority: optional Build-Depends: python-all-dev (>= 2.6.6-3), + python3-all-dev, debhelper (>= 9), python-sphinx (>= 1.0.7+dfsg), + libssl-dev Standards-Version: 3.9.4 X-Python-Version: >= 2.6 +X-Python3-Version: >= 3.0 Vcs-Hg: https://code.google.com/p/pysrp/ Vcs-Browser: http://code.google.com/p/pysrp/source/browse/ Homepage: http://code.google.com/p/pysrp/ @@ -18,7 +21,8 @@ Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends}, - ${sphinxdoc:Depends} + ${sphinxdoc:Depends}, + libssl1.0.0 Description: Secure Remote Password protocol implementation This package provides an implementation of the Secure Remote Password protocol (SRP). SRP is a cryptographically strong authentication @@ -41,3 +45,34 @@ Description: Secure Remote Password protocol implementation the authenticated connection. However, successful authentication does result in a cryptographically strong shared key that can be used for symmetric-key encryption. + +Package: python3-srp +Architecture: any +Depends: + ${misc:Depends}, + ${python:Depends}, + ${shlibs:Depends}, + ${sphinxdoc:Depends}, + libssl1.0.0 +Description: Secure Remote Password protocol implementation + This package provides an implementation of the Secure Remote Password + protocol (SRP). SRP is a cryptographically strong authentication + protocol for password-based, mutual authentication over an insecure + network connection. + . + Unlike other common challenge-response autentication protocols, such + as Kereros and SSL, SRP does not rely on an external infrastructure + of trusted key servers or certificate management. Instead, SRP server + applications use verification keys derived from each user's password + to determine the authenticity of a network connection. + . + SRP provides mutual-authentication in that successful authentication + requires both sides of the connection to have knowledge of the + user's password. If the client side lacks the user's password or the + server side lacks the proper verification key, the authentication will + fail. + . + Unlike SSL, SRP does not directly encrypt all data flowing through + the authenticated connection. However, successful authentication does + result in a cryptographically strong shared key that can be used + for symmetric-key encryption. This package contains the python3 version. diff --git a/debian/patches/py3_support b/debian/patches/py3_support new file mode 100644 index 0000000..88baca9 --- /dev/null +++ b/debian/patches/py3_support @@ -0,0 +1,241 @@ +--- a/srp/_srp.c ++++ b/srp/_srp.c +@@ -895,7 +895,7 @@ static void ver_dealloc( PyVerifier * se + if ( self->bytes_s != NULL ) + free( (char *)self->bytes_s ); + +- self->ob_type->tp_free( (PyObject *) self ); ++ Py_TYPE(self)->tp_free( (PyObject *) self ); + } + + +@@ -903,7 +903,7 @@ static void usr_dealloc( PyUser * self ) + { + if ( self->usr != NULL ) + srp_user_delete( self->usr ); +- self->ob_type->tp_free( (PyObject *) self ); ++ Py_TYPE(self)->tp_free( (PyObject *) self ); + } + + +--- a/srp/test_srp.py ++++ b/srp/test_srp.py +@@ -1,4 +1,5 @@ + #!/usr/bin/env python ++from __future__ import print_function + + import unittest + import os.path +@@ -7,18 +8,19 @@ import sys + import time + import thread + ++ + this_dir = os.path.dirname( os.path.abspath(__file__) ) +- ++ + build_dir = os.path.join( os.path.dirname(this_dir), 'build' ) + + if not os.path.exists( build_dir ): +- print 'Please run "python setup.py build" prior to running tests' ++ print('Please run "python setup.py build" prior to running tests') + sys.exit(1) +- ++ + plat_dirs = [ d for d in os.listdir('build') if d.startswith('lib') ] + + if not len(plat_dirs) == 1: +- print 'Unexpected build result... aborting' ++ print('Unexpected build result... aborting') + + plat_dir = os.path.join( build_dir, plat_dirs[0] ) + +@@ -33,7 +35,7 @@ import srp._ctsrp as _ctsrp + try: + import srp._srp as _srp + except ImportError: +- print 'Failed to import srp._srp. Aborting tests' ++ print('Failed to import srp._srp. Aborting tests') + sys.exit(1) + + +@@ -62,17 +64,17 @@ class SRPTests( unittest.TestCase ): + + usr = User( username, password, hash_alg, ng_type, n_hex, g_hex ) + uname, A = usr.start_authentication() +- ++ + # username, A => server + svr = Verifier( uname, _s, _v, A, hash_alg, ng_type, n_hex, g_hex ) + s,B = svr.get_challenge() +- ++ + # s,B => client + M = usr.process_challenge( s, B ) +- ++ + # M => server + HAMK = svr.verify_session( M ) +- ++ + # HAMK => client + usr.verify_session( HAMK ) + +@@ -143,24 +145,24 @@ password = 'testpassword' + NLEFT = 0 + + def do_auth( mod, hash_alg, ng_type, _s, _v ): +- ++ + usr = mod.User( username, password, hash_alg, ng_type) + uname, A = usr.start_authentication() +- ++ + # username, A => server + svr = mod.Verifier( uname, _s, _v, A, hash_alg, ng_type) + s,B = svr.get_challenge() +- ++ + # s,B => client + M = usr.process_challenge( s, B ) +- ++ + # M => server + HAMK = svr.verify_session( M ) +- ++ + # HAMK => client + usr.verify_session( HAMK ) +- +- if not svr.authenticated() or not usr.authenticated(): ++ ++ if not svr.authenticated() or not usr.authenticated(): + raise Exception('Authentication failed!') + + +@@ -169,7 +171,7 @@ def performance_test( mod, hash_alg, ng_ + _s, _v = srp.create_salted_verification_key( username, password, hash_alg, ng_type ) + + NLEFT = niter +- ++ + def test_thread(): + global NLEFT + while NLEFT > 0: +@@ -188,75 +190,78 @@ def performance_test( mod, hash_alg, ng_ + + + def get_param_str( mod, hash_alg, ng_type ): +- ++ + m = { 'srp._pysrp' : 'Python', + 'srp._ctsrp' : 'ctypes', + 'srp._srp' : 'C ' } +- ++ + cfg = '%s, %s, %d:' % (m[mod.__name__], hash_map[hash_alg], prime_map[ng_type]) + + return cfg + +- ++ + def param_test( mod, hash_alg, ng_type, niter=10 ): + duration = performance_test( mod, hash_alg, ng_type, niter ) + cfg = get_param_str( mod, hash_alg, ng_type ) +- print ' ', cfg.ljust(20), '%.6f' % (duration/niter) ++ print(' ', cfg.ljust(20), '%.6f' % (duration/niter)) + return duration/niter +- ++ + + def print_default_timings(): +- print '*'*60 +- print 'Default Parameter Timings:' ++ print('*'*60) ++ print('Default Parameter Timings:') + py_time = param_test( _pysrp, srp.SHA1, srp.NG_2048 ) + ct_time = param_test( _ctsrp, srp.SHA1, srp.NG_2048 ) + c_time = param_test( _srp, srp.SHA1, srp.NG_2048 ) +- print '' +- print 'Performance increases: ' +- print ' ctypes-module : ', py_time/ct_time +- print ' C-module : ', py_time/c_time ++ print('') ++ print('Performance increases: ') ++ print(' ctypes-module : ', py_time/ct_time) ++ print(' C-module : ', py_time/c_time) + + + def print_performance_table(): + ng_types = [ srp.NG_1024, srp.NG_2048, srp.NG_4096, srp.NG_8192 ] + hash_types = [ srp.SHA1, srp.SHA224, srp.SHA256, srp.SHA384, srp.SHA512 ] + +- print '*'*60 +- print 'Hash Algorithm vs Prime Number performance table' +- print '' +- print ' |', ++ print('*'*60) ++ print('Hash Algorithm vs Prime Number performance table') ++ print('') ++ print(' |') + for ng in ng_types: +- print ('NG_%d' % prime_map[ng]).rjust(12), +- print '' +- print '-'*60 ++ print ('NG_%d' % prime_map[ng]).rjust(12) ++ print('') ++ print('-'*60) + + for hash_alg in hash_types: + +- print '%s |' % hash_map[hash_alg], ++ print('%s |' % hash_map[hash_alg],) + for ng in ng_types: +- print '{0:>12f}'.format(performance_test(_srp, hash_alg, ng) / 10), +- print '' ++ print('{0:>12f}'.format( ++ performance_test(_srp, hash_alg, ng) / 10)) ++ print('') + + + def print_thread_performance(): +- print '*'*60 +- print 'Thread Performance Test:' ++ print('*'*60) ++ print('Thread Performance Test:') + niter = 100 + for nthreads in range(1,11): +- print ' Thread Count {0:>2}: {1:8f}'.format(nthreads, performance_test(_srp, srp.SHA1, srp.NG_2048, niter, nthreads)/niter) ++ print(' Thread Count {0:>2}: {1:8f}'.format( ++ nthreads, performance_test( ++ _srp, srp.SHA1, srp.NG_2048, niter, nthreads)/niter)) + + +-print '*'*60 +-print '*' +-print '* Testing Implementation' +-print '*' ++print('*'*60) ++print('*') ++print('* Testing Implementation') ++print('*') + suite = unittest.TestLoader().loadTestsFromTestCase(SRPTests) + unittest.TextTestRunner(verbosity=1).run(suite) + +-print '*'*60 +-print '*' +-print '* Performance Testing' +-print '*' ++print('*'*60) ++print('*') ++print('* Performance Testing') ++print('*') + print_thread_performance() + print_performance_table() + print_default_timings() +@@ -264,5 +269,3 @@ print_default_timings() + + # Pause briefly to ensure no background threads are still executing + time.sleep(0.1) +- +- diff --git a/debian/patches/series b/debian/patches/series new file mode 100644 index 0000000..433ac1f --- /dev/null +++ b/debian/patches/series @@ -0,0 +1 @@ +py3_support diff --git a/debian/rules b/debian/rules index 706fc3e..f701f6c 100755 --- a/debian/rules +++ b/debian/rules @@ -4,20 +4,25 @@ # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 -PYVERS := $(shell pyversions -r) +# Prevent setuptools/distribute from accessing the internet. +export http_proxy = http://127.0.0.1:9 export DEB_CFLAGS_MAINT_APPEND = -Wl,-z,relro +PYVERS := $(shell pyversions -r) +PY3VERS = $(shell py3versions -r) + package=python-srp +package3=python3-srp %: - dh $@ --with python2,sphinxdoc --buildsystem=python_distutils + dh $@ --with python2,python3,sphinxdoc --buildsystem=python_distutils override_dh_auto_build: sphinx-build $(CURDIR)/srp/doc $(CURDIR)/srp/doc/build set -ex; \ - for python in $(PYVERS); do \ + for python in $(PYVERS) $(PY3VERS); do \ $$python setup.py build; \ done @@ -28,13 +33,21 @@ override_dh_auto_install: --root debian/$(package)\ --install-layout deb; \ done + set -ex; \ + for python in $(PY3VERS); do \ + $$python setup.py install --skip-build \ + --root debian/$(package3)\ + --install-layout deb; \ + done override_dh_install: dh_install -Xsrp/doc/ override_dh_installdocs: mkdir -p debian/$(package)/usr/share/doc/$(package) + mkdir -p debian/$(package3)/usr/share/doc/$(package3) cp debian/copyright debian/$(package)/usr/share/doc/$(package)/ + cp debian/copyright debian/$(package3)/usr/share/doc/$(package3)/ override_dh_sphinxdoc: cp -r srp/doc/build/* debian/$(package)/usr/share/doc/$(package)/ @@ -44,3 +57,5 @@ override_dh_auto_clean: dh_auto_clean rm -rf srp/doc/build rm -rf build + rm -rf *.egg-info + find \( -name '._*' -o -name '*.pyc' \) -delete -- cgit v1.2.3