You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(10) |
Feb
(10) |
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
(17) |
Sep
(9) |
Oct
(10) |
Nov
(2) |
Dec
(5) |
2009 |
Jan
(17) |
Feb
(8) |
Mar
(10) |
Apr
(1) |
May
|
Jun
(11) |
Jul
(18) |
Aug
|
Sep
|
Oct
(10) |
Nov
(40) |
Dec
(4) |
2010 |
Jan
(2) |
Feb
(5) |
Mar
(13) |
Apr
(14) |
May
(27) |
Jun
(86) |
Jul
(1) |
Aug
(12) |
Sep
|
Oct
(2) |
Nov
(3) |
Dec
(5) |
2011 |
Jan
|
Feb
(2) |
Mar
|
Apr
(3) |
May
|
Jun
|
Jul
(11) |
Aug
(1) |
Sep
(3) |
Oct
(65) |
Nov
|
Dec
(1) |
2012 |
Jan
(1) |
Feb
(4) |
Mar
(6) |
Apr
(6) |
May
|
Jun
(4) |
Jul
|
Aug
|
Sep
(12) |
Oct
(3) |
Nov
(1) |
Dec
|
2013 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(3) |
Nov
|
Dec
(1) |
2014 |
Jan
(2) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
(4) |
Oct
(1) |
Nov
(24) |
Dec
(10) |
2015 |
Jan
(1) |
Feb
(10) |
Mar
|
Apr
|
May
(1) |
Jun
(15) |
Jul
(4) |
Aug
(2) |
Sep
(1) |
Oct
|
Nov
|
Dec
|
From: Ludovic R. <lud...@gm...> - 2015-09-21 12:18:55
|
Hello, I do not use Windows. I do not know Windows tools. So debugging Windows issues it nearly impossible for me. I need your help for 2 Windows issues: - Python 3.4, Windows OS, UnicodeDecodeError https://github.com/LudovicRousseau/pyscard/issues/11 I tried to reproduce the problem but it worked for me on Windows 7. - Exception ListReadersException raised after disconnecting PCSC reader https://github.com/LudovicRousseau/pyscard/issues/13 You can also have a look at the Windows bugs reported at https://sourceforge.net/p/pyscard/bugs/ Thanks -- Dr. Ludovic Rousseau |
From: Ludovic R. <lud...@gm...> - 2015-08-20 18:09:41
|
2015-08-20 13:18 GMT+02:00 Alex Willmer <al...@mo...>: > On 19 August 2015 at 21:11, Peter Fässberg <pf...@le...> wrote: >> Hi Alex! >> >> First I must say that I'm very impressed about all the work you and Ludovic are doing on Pyscard, Python etc. >> >> I've been using Pyscard under Python 2.7 for some time, and now it's time to convert to Python 3.4. >> >> It was easy to get it running under Linux, but I spent a few hours trying to get it to build under Windows with MS tools. After a few hours of downloading and installing different versions of MSVC. I did find a success story for Python 3.5 (another extension though) but I was forced to give up that track as well. Now I have only the cleaning of the installed program to take care of. :/ >> >> After a while I realized that there was already 64-bit MSIs prebuilt on AppVeyor. :) Unfortunately only for Python 2.7. >> >> Do you have any plans to build is for Python34 as well? >> >> If not, do you think it will be any special issues? Otherwise I can give it a try myself. > > Peter, > I'd forgotten Appveyor was only building Python 2.7. I've sent Ludovic > a pull request that fixes that > https://github.com/LudovicRousseau/pyscard/pull/9 Merged. Thanks Alex! > You should find a binary in the build for that PR. Needless to say > that build is not an official release > https://ci.appveyor.com/project/LudovicRousseau/pyscard/build/1.0.35 I don't know if I should push the AppVeyor builds to sourceforge.net and/or pypi.python.org since I do not test them at all. Maybe the project should make it clear that Windows binaries can be found at https://ci.appveyor.com/project/LudovicRousseau/pyscard Bye -- Dr. Ludovic Rousseau |
From: Alex W. <al...@mo...> - 2015-08-20 11:19:18
|
On 19 August 2015 at 21:11, Peter Fässberg <pf...@le...> wrote: > Hi Alex! > > First I must say that I'm very impressed about all the work you and Ludovic are doing on Pyscard, Python etc. > > I've been using Pyscard under Python 2.7 for some time, and now it's time to convert to Python 3.4. > > It was easy to get it running under Linux, but I spent a few hours trying to get it to build under Windows with MS tools. After a few hours of downloading and installing different versions of MSVC. I did find a success story for Python 3.5 (another extension though) but I was forced to give up that track as well. Now I have only the cleaning of the installed program to take care of. :/ > > After a while I realized that there was already 64-bit MSIs prebuilt on AppVeyor. :) Unfortunately only for Python 2.7. > > Do you have any plans to build is for Python34 as well? > > If not, do you think it will be any special issues? Otherwise I can give it a try myself. Peter, I'd forgotten Appveyor was only building Python 2.7. I've sent Ludovic a pull request that fixes that https://github.com/LudovicRousseau/pyscard/pull/9 You should find a binary in the build for that PR. Needless to say that build is not an official release https://ci.appveyor.com/project/LudovicRousseau/pyscard/build/1.0.35 Please note: In general it's better to open an issue, or send to the public mailing (cc'd) than to send private emails. -- Alex Willmer <al...@mo...> http://twitter.com/moreati |
From: Ludovic R. <lud...@gm...> - 2015-07-01 14:09:30
|
2015-07-01 15:39 GMT+02:00 Ludovic Rousseau <lud...@gm...>: > 2015-07-01 10:34 GMT+02:00 Ludovic Rousseau <lud...@gm...>: >> 2015-07-01 2:10 GMT+02:00 Alex Willmer <al...@mo...>: >>> Alternatively I also tried it as a rebase of your python3 branch on >>> your master, https://github.com/moreati/pyscard/tree/python3_rebase. >> >> I guess you had conflicts? > > I reused your python3_rebase branch to continue it and merge it in > master with no conflict. > > The Python3 code is now in master. Alex, Feel free to fix warnings reported by pylint and propose a pull request. Now that the Python 2 and 3 branches are merged we do not have to avoid conflicts. Bye -- Dr. Ludovic Rousseau |
From: Ludovic R. <lud...@gm...> - 2015-07-01 13:40:02
|
2015-07-01 10:34 GMT+02:00 Ludovic Rousseau <lud...@gm...>: > 2015-07-01 2:10 GMT+02:00 Alex Willmer <al...@mo...>: >> Alternatively I also tried it as a rebase of your python3 branch on >> your master, https://github.com/moreati/pyscard/tree/python3_rebase. > > I guess you had conflicts? I reused your python3_rebase branch to continue it and merge it in master with no conflict. The Python3 code is now in master. Python2 and Python3 should both work. If not then file a bug report. I get a segmentation fault when running the framework testsuite with Python3 (it is OK with Python2). I will have a look. Thanks -- Dr. Ludovic Rousseau |
From: Ludovic R. <lud...@gm...> - 2015-07-01 08:35:17
|
2015-07-01 2:10 GMT+02:00 Alex Willmer <al...@mo...>: > Ludovic, Hello, > I've merged your master branch and your python3 branch into > https://github.com/moreati/pyscard/tree/python3. The merge commit it > large (1000+ lines added/removed) but to my limited git-fu it seems > the least worst option. > > Do you want it as a pull request? If so, into master or back into python3? Good exercise. I will do the merge myself. > Alternatively I also tried it as a rebase of your python3 branch on > your master, https://github.com/moreati/pyscard/tree/python3_rebase. I guess you had conflicts? > Feel free to reject/ignore them both - I did them a learning exercise > as much as anything. OK Bye -- Dr. Ludovic Rousseau |
From: Alex W. <al...@mo...> - 2015-07-01 00:11:11
|
Ludovic, I've merged your master branch and your python3 branch into https://github.com/moreati/pyscard/tree/python3. The merge commit it large (1000+ lines added/removed) but to my limited git-fu it seems the least worst option. Do you want it as a pull request? If so, into master or back into python3? Alternatively I also tried it as a rebase of your python3 branch on your master, https://github.com/moreati/pyscard/tree/python3_rebase. Feel free to reject/ignore them both - I did them a learning exercise as much as anything. Regards, Alex -- Alex Willmer <al...@mo...> http://twitter.com/moreati |
From: Ludovic R. <lud...@gm...> - 2015-06-29 17:58:34
|
2015-06-29 9:20 GMT+02:00 Ludovic Rousseau <lud...@gm...>: > I will upload the wheel package once pypi is available again. Done https://pypi.python.org/pypi/pyscard -- Dr. Ludovic Rousseau |
From: Ludovic R. <lud...@gm...> - 2015-06-29 07:20:36
|
2015-06-29 8:24 GMT+02:00 Alex Willmer <al...@mo...>: > On 29 June 2015 at 07:08, Alex Willmer <al...@mo...> wrote: >> Ah, I wasn't expecting you to do that. Appveyor currently builds from >> HEAD of *my* Github fork. So these binary builds are not from the same >> source code in your source release (that I assume you made from *your* >> Github HEAD. > > Scratch that. I see you configured your own projects/builds on > Appveyor and Travis. Exact. I do not use your github master branch since it contains patches I do not have on my side. > Could you please also upload the source package and the win32 wheel to > PyPI? `pip install` still won't download anything from Sourceforge I uploaded the source package then removed it. I can't add it again now :-( Maybe I will create a 1.7.1 soon fix some bug fixes and upload that version. I will upload the wheel package once pypi is available again. Bye -- Dr. Ludovic Rousseau |
From: Alex W. <al...@mo...> - 2015-06-29 06:25:12
|
On 29 June 2015 at 07:08, Alex Willmer <al...@mo...> wrote: > Ah, I wasn't expecting you to do that. Appveyor currently builds from > HEAD of *my* Github fork. So these binary builds are not from the same > source code in your source release (that I assume you made from *your* > Github HEAD. Scratch that. I see you configured your own projects/builds on Appveyor and Travis. Could you please also upload the source package and the win32 wheel to PyPI? `pip install` still won't download anything from Sourceforge Many thanks, Alex -- Alex Willmer <al...@mo...> http://twitter.com/moreati |
From: Alex W. <al...@mo...> - 2015-06-29 06:08:31
|
On 28 June 2015 at 19:42, Ludovic Rousseau <lud...@gm...> wrote: >> The slightly trickier part is coordinating these with respect to >> development vs release builds, tagging and upload to Sourceforge >> and/or PyPI. > > Exact. I will do that by hand after each new release. > > I updated the pypi page with version 1.7.0 and also uploaded the > installers for Windows. > I also uploaded the windows installers on SourceForge.net Ah, I wasn't expecting you to do that. Appveyor currently builds from HEAD of *my* Github fork. So these binary builds are not from the same source code in your source release (that I assume you made from *your* Github HEAD. -- Alex Willmer <al...@mo...> http://twitter.com/moreati |
From: Ludovic R. <lud...@gm...> - 2015-06-28 18:43:21
|
2015-06-28 18:41 GMT+02:00 Alex Willmer <al...@mo...>: > On 26 June 2015 at 18:14, Ludovic Rousseau <lud...@gm...> wrote: >> Do you know how to create binary installer for Windows using appveyor? >> I know nothing about Windows. But some users of pyscard are using Windows. >> >> If appveyor can provide installers (.msi or .exe or whatever) that >> would be great. > > Appveyor can make .msi and .exe installers, I've committed support and > done a test build. Great. I cherry-picked your patch. > The slightly trickier part is coordinating these with respect to > development vs release builds, tagging and upload to Sourceforge > and/or PyPI. Exact. I will do that by hand after each new release. I updated the pypi page with version 1.7.0 and also uploaded the installers for Windows. I also uploaded the windows installers on SourceForge.net Bye, -- Dr. Ludovic Rousseau |
From: Alex W. <al...@mo...> - 2015-06-28 16:41:58
|
On 26 June 2015 at 18:14, Ludovic Rousseau <lud...@gm...> wrote: > Do you know how to create binary installer for Windows using appveyor? > I know nothing about Windows. But some users of pyscard are using Windows. > > If appveyor can provide installers (.msi or .exe or whatever) that > would be great. Appveyor can make .msi and .exe installers, I've committed support and done a test build. https://github.com/moreati/pyscard/commit/2d0018b3b0a8392357a3c8f80ff54c47814f2f25 https://ci.appveyor.com/project/moreati/pyscard/build/1.0.5/job/h9xvyba58plk54ib https://ci.appveyor.com/project/moreati/pyscard/build/job/h9xvyba58plk54ib/artifacts The slightly trickier part is coordinating these with respect to development vs release builds, tagging and upload to Sourceforge and/or PyPI. Sorry for replying directly to your last email, rather than to the list. I just noticed this list doesn't do reply-to munging. -- Alex Willmer <al...@mo...> http://twitter.com/moreati |
From: Ludovic R. <lud...@gm...> - 2015-06-20 11:24:36
|
2015-06-20 2:07 GMT+02:00 Alex Willmer <al...@mo...>: > Ludovic, Hello, > Thank you for merging my changes. I see also that you've started a > Python 3 branch. The C code is outside my expertise, but you should be > aware of one behaviour change that [1abd4d] introduced > > - print reader.name, ', uri: ', reader.uri > + print(reader.name, ', uri: ', reader.uri) > > In 2.x this will print the repr() of a tuple, not the string you intended. e.g. > [GCC 4.9.2] on linux2 > Type "help", "copyright", "credits" or "license" for more information. >>>> print 'a', 'b', 'c' > a b c >>>> print('a', 'b', 'c') > ('a', 'b', 'c') > > The fix is >>>> from __future__ import print_function >>>> print('a', 'b', 'c') > a b c I know. I don't know if the pyscard should move to Python3 only or continue to support Python2 as well. It is easy to support both Python 2 and Python 3? > One final thing, I'm experimenting with hosted builds and continuous > integration on Windows. It looks like we can get 32 and 64 bit Windows > binaries/installers for pyscard with very little trouble. > > Repo: https://github.com/moreati/pyscard * > 1st build: https://ci.appveyor.com/project/moreati/pyscard/build/1.0.4/job/7jeh37mcn85ey8tr Great. I did not know ci.appveyor.com, only https://travis-ci.org/ It looks like appveyor is for Windows only and travis is for Linux and Mac only. > * Github was just convenient, I've no intention of forking pyscard and > I will be sending patches to you. You should have cloned my github repository https://github.com/LudovicRousseau/pyscard. It would be easier to make pull requests. Bye -- Dr. Ludovic Rousseau |
From: Alex W. <al...@mo...> - 2015-06-20 00:33:49
|
Ludovic, Thank you for merging my changes. I see also that you've started a Python 3 branch. The C code is outside my expertise, but you should be aware of one behaviour change that [1abd4d] introduced - print reader.name, ', uri: ', reader.uri + print(reader.name, ', uri: ', reader.uri) In 2.x this will print the repr() of a tuple, not the string you intended. e.g. [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> print 'a', 'b', 'c' a b c >>> print('a', 'b', 'c') ('a', 'b', 'c') The fix is >>> from __future__ import print_function >>> print('a', 'b', 'c') a b c One final thing, I'm experimenting with hosted builds and continuous integration on Windows. It looks like we can get 32 and 64 bit Windows binaries/installers for pyscard with very little trouble. Repo: https://github.com/moreati/pyscard * 1st build: https://ci.appveyor.com/project/moreati/pyscard/build/1.0.4/job/7jeh37mcn85ey8tr * Github was just convenient, I've no intention of forking pyscard and I will be sending patches to you. Regards, Alex -- Alex Willmer <al...@mo...> http://twitter.com/moreati |
From: Alex W. <al...@mo...> - 2015-06-19 14:11:26
|
--- setup.py | 138 ++++----------------------------------------------------------- 1 file changed, 8 insertions(+), 130 deletions(-) diff --git a/setup.py b/setup.py index 8d2e404..4eb3d34 100755 --- a/setup.py +++ b/setup.py @@ -26,13 +26,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from distutils import core, dir_util, file_util from distutils.core import Extension from distutils.util import get_platform -from distutils.command.build_ext import build_ext -import glob -import os import sys -if sys.version[0:1] == '1': - raise RuntimeError("pyscard requires Python 2.x to build.") +if sys.version_info[0:2] < (2, 6): + raise RuntimeError("pyscard requires Python 2.6+ to build.") if 'win32' == get_platform(): platform__cc_defines = [('WIN32', '100')] @@ -62,27 +59,6 @@ elif 'cygwin-' in get_platform(): platform_extra_link_args = [] # -# Mac OS X Tiger has python 2.3 preinstalled -# get_platform() returns a string similar to 'darwin-8.11.1-i386' with -# python 2.3 -# if python 2.5 is installed, get_platform() returns a string similar to -# 'macosx-10.3-fat' -elif 'darwin' in get_platform() \ - or 'macosx-10.3' in get_platform() \ - or 'macosx-10.4' in get_platform(): - platform__cc_defines = [('PCSCLITE', '1'), - ('__APPLE__', '1'), - ('__TIGER__', '1')] - platform_swig_opts = ['-DPCSCLITE', '-D__APPLE__', '-D__TIGER__'] - platform_sources = [] - platform_libraries = [] - platform_include_dirs = [] - platform_extra_compile_args = ['-v', '-framework', 'PCSC', - '-arch', 'i386', '-arch', - 'ppc', '-ggdb', '-O0'] - platform_extra_link_args = ['-arch', 'i386', '-arch', 'ppc', '-ggdb'] - -# # Mac OS X Lion (and above), python 2.7 # PowerPC is no more supported, x86_64 is new # @@ -116,23 +92,6 @@ elif 'macosx-10.6' in get_platform(): '-arch', 'x86_64', '-ggdb'] platform_extra_link_args = ['-arch', 'i386', '-arch', 'x86_64', '-ggdb'] -# -# Mac OS X Leopard has python 2.5 preinstalled -# get_platform() returns a string similar to 'macosx-10.5-i386' -# -elif 'macosx-10.5' in get_platform(): - platform__cc_defines = [('PCSCLITE', '1'), - ('__APPLE__', '1'), - ('__LEOPARD__', '1')] - platform_swig_opts = ['-DPCSCLITE', '-D__APPLE__', '-D__LEOPARD__'] - platform_sources = [] - platform_libraries = [] - platform_include_dirs = [] - platform_extra_compile_args = ['-v', '-framework', 'PCSC', - '-arch', 'i386', - '-arch', 'ppc', '-ggdb', '-O0'] - platform_extra_link_args = ['-arch', 'i386', '-arch', 'ppc', '-ggdb'] -# # Other (GNU/Linux, etc.) # else: @@ -145,65 +104,6 @@ else: platform_extra_link_args = [] # ['-ggdb'] -class _pyscardBuildExt(build_ext): - '''Specialization of build_ext to enable swig_opts - for python 2.3 distutils''' -if sys.version_info < (2, 4): - - # This copy of swig_sources is from Python 2.3. - # This is to add support of swig_opts for Python 2.3 distutils - # (in particular for MacOS X darwin that comes with Python 2.3) - - def swig_sources(self, sources): - - """Walk the list of source files in 'sources', looking for SWIG - interface (.i) files. Run SWIG on all that are found, and - return a modified 'sources' list with SWIG source files replaced - by the generated C (or C++) files. - """ - - new_sources = [] - swig_sources = [] - swig_targets = {} - - # XXX this drops generated C/C++ files into the source tree, which - # is fine for developers who want to distribute the generated - # source -- but there should be an option to put SWIG output in - # the temp dir. - - if self.swig_cpp: - target_ext = '.cpp' - else: - target_ext = '.c' - - for source in sources: - (base, ext) = os.path.splitext(source) - if ext == ".i": # SWIG interface file - new_sources.append(base + target_ext) - swig_sources.append(source) - swig_targets[source] = new_sources[-1] - else: - new_sources.append(source) - - if not swig_sources: - return new_sources - - swig = self.find_swig() - swig_cmd = [swig, "-python"] - if self.swig_cpp: - swig_cmd.append("-c++") - - swig_cmd += platform_swig_opts - - for source in swig_sources: - target = swig_targets[source] - self.announce("swigging %s to %s" % (source, target)) - self.spawn(swig_cmd + ["-o", target, source]) - - return new_sources - - build_ext.swig_sources = swig_sources - kw = {'name': "pyscard", 'version': "1.6.16", 'description': "Smartcard module for Python.", @@ -248,13 +148,7 @@ kw = {'name': "pyscard", swig_opts=['-outdir', 'smartcard/scard'] \ + platform_swig_opts)], - 'cmdclass': {'build_ext': _pyscardBuildExt}, - } - -# If we're running >Python 2.3, add extra information -if hasattr(core, 'setup_keywords'): - if 'classifiers' in core.setup_keywords: - kw['classifiers'] = [ + 'classifiers': [ 'Development Status :: 1.6.16 - Release', 'License :: GNU LESSER GENERAL PUBLIC LICENSE', 'Intended Audience :: Developers', @@ -262,28 +156,12 @@ if hasattr(core, 'setup_keywords'): 'Operating System :: Microsoft :: Windows', 'Topic :: Security :: Smartcards', ] - if 'download_url' in core.setup_keywords: - kw['download_url'] = ('http://sourceforge.net/projects/pyscard/' - '%s-%s.zip' % (kw['name'], kw['version'])) + } +# FIXME Sourceforge downloads are unauthenticated, migrate to PyPI +kw['download_url'] = ('http://sourceforge.net/projects/%(name)s/files' + '/%(name)s/%(name)s%%20%(version)s' + '/%(name)s-%(version)s.tar.gz/download' % kw) pyscard_dist = core.setup(**kw) - -# Python 2.3 distutils does not support package_data -# copy manually package_data -if sys.version_info < (2, 4): - from distutils.util import convert_path - from glob import glob - if "install" in sys.argv: - targetdir = pyscard_dist.command_obj['install'].install_purelib - package_data = kw['package_data'] - files = [] - for directory in package_data: - for pattern in package_data[directory]: - filelist = glob(os.path.join(directory, convert_path(pattern))) - files.extend([fn for fn in filelist if fn not in files]) - for file in files: - newdir = os.path.dirname(file) - dir_util.mkpath(os.path.join(targetdir, newdir)) - file_util.copy_file(file, os.path.join(targetdir, file)) -- 2.1.4 |
From: Alex W. <al...@mo...> - 2015-06-19 14:09:11
|
As discussed, this patchset modernises pyscard's setup.py. Switching to setuptools is left to the last-but-one patch, so it's easier to revert. Using setuptools allows pyscard to be installed and uninstalled with pip, or as a development egg. I've also updated the download_url, to reflect Sourceforge's current scheme. Once the next release has been registered with PyPI then pip should be able to find pyscard-{version}.tgz on Sourceforge. That should mean that `pip install pyscard` works on machines with a compiler. I've gone for Python 2.6 as the cutoff because it wasn't hard to accomodate, and RHEL 6.x stragglers might appreciate it. I happy to change this to Python 2.7 if you prefer. Regards, Alex Alex Willmer (6): Remove support for Python releases older than 2.6 Consolidate build platform logic Standardise Trove classifiers, declare OS & Python support Correct package declarations, include smartcard.pyro Switch from distutils to setuptools Add gitignore for build artefacts .gitignore | 16 +++++ setup.py | 208 ++++++++++--------------------------------------------------- 2 files changed, 49 insertions(+), 175 deletions(-) create mode 100644 .gitignore -- 2.1.4 |
From: Alex W. <al...@mo...> - 2015-06-19 14:06:29
|
--- setup.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ea86fa1..c3d333e 100755 --- a/setup.py +++ b/setup.py @@ -122,11 +122,16 @@ kw = {'name': "pyscard", 'smartcard/scard'] \ + platform_swig_opts)], 'classifiers': [ - 'Development Status :: 1.6.16 - Release', - 'License :: GNU LESSER GENERAL PUBLIC LICENSE', + 'Development Status :: 5 - Release', + 'License :: OSI Approved :: GNU Lesser General Public License v2 ' + 'or later (LGPLv2+)', 'Intended Audience :: Developers', 'Operating System :: Unix', 'Operating System :: Microsoft :: Windows', + 'Operating System :: MacOS X', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 2 :: Only', 'Topic :: Security :: Smartcards', ] } -- 2.1.4 |
From: Alex W. <al...@mo...> - 2015-06-19 14:05:40
|
--- .gitignore | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fb32a71 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +*.pyc +*.pyo +*.pyd +*.so + +build/ +dist/ +env/ +sdist/ +*.egg-info/ + +MANIFEST + +# Generated by SWIG +smartcard/scard/scard.py +smartcard/scard/scard_wrap.c -- 2.1.4 |
From: Alex W. <al...@mo...> - 2015-06-19 14:05:23
|
--- setup.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index c3d333e..8a12875 100755 --- a/setup.py +++ b/setup.py @@ -87,12 +87,13 @@ kw = {'name': "pyscard", 'license': 'GNU LESSER GENERAL PUBLIC LICENSE', 'platforms': ['linux', 'win32'], 'packages': ["smartcard", - "smartcard/pcsc", - "smartcard/reader", - "smartcard/scard", - "smartcard/sw", - "smartcard/util", - "smartcard/wx", + "smartcard.pcsc", + "smartcard.pyro", + "smartcard.reader", + "smartcard.scard", + "smartcard.sw", + "smartcard.util", + "smartcard.wx", ], 'package_dir': {"": "."}, 'package_data': { -- 2.1.4 |
From: Alex W. <al...@mo...> - 2015-06-19 14:04:25
|
--- setup.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 8a12875..e2046d2 100755 --- a/setup.py +++ b/setup.py @@ -23,11 +23,12 @@ along with pyscard; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ -from distutils import core, dir_util, file_util -from distutils.core import Extension from distutils.util import get_platform import sys +from setuptools import setup, Extension + + if sys.version_info[0:2] < (2, 6): raise RuntimeError("pyscard requires Python 2.6+ to build.") @@ -142,5 +143,5 @@ kw['download_url'] = ('http://sourceforge.net/projects/%(name)s/files' '/%(name)s/%(name)s%%20%(version)s' '/%(name)s-%(version)s.tar.gz/download' % kw) -pyscard_dist = core.setup(**kw) +setup(**kw) -- 2.1.4 |
From: Alex W. <al...@mo...> - 2015-06-19 14:02:22
|
This also fixes Mac OS X Lion options being selected on Snow Leopard - due to misordered of elif blocks. --- setup.py | 41 +++++++---------------------------------- 1 file changed, 7 insertions(+), 34 deletions(-) diff --git a/setup.py b/setup.py index 4eb3d34..ea86fa1 100755 --- a/setup.py +++ b/setup.py @@ -31,7 +31,7 @@ import sys if sys.version_info[0:2] < (2, 6): raise RuntimeError("pyscard requires Python 2.6+ to build.") -if 'win32' == get_platform(): +if get_platform() in ('win32', 'win-amd64'): platform__cc_defines = [('WIN32', '100')] platform_swig_opts = ['-DWIN32'] platform_sources = ['smartcard/scard/scard.rc'] @@ -40,15 +40,6 @@ if 'win32' == get_platform(): platform_extra_compile_args = [] platform_extra_link_args = [] -elif 'win-amd64' == get_platform(): - platform__cc_defines = [('WIN32', '100')] - platform_swig_opts = ['-DWIN32'] - platform_sources = ['smartcard/scard/scard.rc'] - platform_libraries = ['winscard'] - platform_include_dirs = [] - platform_extra_compile_args = [] - platform_extra_link_args = [] - elif 'cygwin-' in get_platform(): platform__cc_defines = [('WIN32', '100')] platform_swig_opts = ['-DWIN32'] @@ -58,33 +49,15 @@ elif 'cygwin-' in get_platform(): platform_extra_compile_args = [] platform_extra_link_args = [] -# -# Mac OS X Lion (and above), python 2.7 -# PowerPC is no more supported, x86_64 is new -# -# x86_64 and i386 -# elif 'macosx-10.' in get_platform(): + if 'macosx-10.6' in get_platform(): + macosx_define = '__LEOPARD__' # Snow Leopard, Python 2.6 + else: + macosx_define = '__LION__' # Lion (and above), Python 2.7 platform__cc_defines = [('PCSCLITE', '1'), ('__APPLE__', '1'), - ('__LION__', '1')] - platform_swig_opts = ['-DPCSCLITE', '-D__APPLE__', '-D__LION__'] - platform_sources = [] - platform_libraries = [] - platform_include_dirs = [] - platform_extra_compile_args = ['-v', '-arch', 'i386', - '-arch', 'x86_64', '-ggdb'] - platform_extra_link_args = ['-arch', 'i386', '-arch', 'x86_64', '-ggdb'] - -# -# Mac OS X Snow Leopard, python 2.6 -# PowerPC is no more supported, x86_64 is new -# -elif 'macosx-10.6' in get_platform(): - platform__cc_defines = [('PCSCLITE', '1'), - ('__APPLE__', '1'), - ('__LEOPARD__', '1')] - platform_swig_opts = ['-DPCSCLITE', '-D__APPLE__', '-D__LEOPARD__'] + (macosx_define, '1')] + platform_swig_opts = ['-DPCSCLITE', '-D__APPLE__', '-D' + macosx_define] platform_sources = [] platform_libraries = [] platform_include_dirs = [] -- 2.1.4 |
From: <lu...@us...> - 2015-05-20 13:13:38
|
Revision: 670 http://sourceforge.net/p/pyscard/code/670 Author: ludov Date: 2015-05-20 13:13:37 +0000 (Wed, 20 May 2015) Log Message: ----------- Fix a problem with Windows Remote Desktop SCardGetStatusChange() fails to work if rgReaderStates[] is not cleared. See https://msdn.microsoft.com/en-us/library/aa379773.aspx " Important Each member of each structure in this array must be initialized to zero and then set to specific values as necessary. If this is not done, the function will fail in situations that involve remote card readers. " Thanks to Magnus Svensson for the bug report and patch http://sourceforge.net/p/pyscard/bugs/21/ Modified Paths: -------------- trunk/pyscard/src/smartcard/scard/helpers.c Modified: trunk/pyscard/src/smartcard/scard/helpers.c =================================================================== --- trunk/pyscard/src/smartcard/scard/helpers.c 2015-02-18 19:58:38 UTC (rev 669) +++ trunk/pyscard/src/smartcard/scard/helpers.c 2015-05-20 13:13:37 UTC (rev 670) @@ -611,6 +611,8 @@ mem_Free( prl ); return NULL; } + /* zeroise SCARD_READERSTATE to work with remote desktop */ + memset(prl->ars, 0, cRStates*sizeof(SCARD_READERSTATE) ); prl->aszReaderNames = mem_Malloc( cRStates*sizeof(char*) ); if (!prl->aszReaderNames) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lu...@us...> - 2015-02-18 19:58:45
|
Revision: 669 http://sourceforge.net/p/pyscard/code/669 Author: ludov Date: 2015-02-18 19:58:38 +0000 (Wed, 18 Feb 2015) Log Message: ----------- Add pydoc documentation Modified Paths: -------------- trunk/contrib/parseATR/parseATR.py Modified: trunk/contrib/parseATR/parseATR.py =================================================================== --- trunk/contrib/parseATR/parseATR.py 2015-02-18 17:47:21 UTC (rev 668) +++ trunk/contrib/parseATR/parseATR.py 2015-02-18 19:58:38 UTC (rev 669) @@ -40,12 +40,31 @@ def toHexString(bytes): - """ return a hex list """ + """Returns a hex list + + Args: + bytes: list of bytes (integers) + Returns: + string representing the bytes in hexadecimal + + >>> toHexString([1,2,3, 10, 255]) + '01 02 03 0A FF' + """ return " ".join(["%02X" % b for b in bytes]) def toASCIIString(bytes): - """ return a string """ + """Returns a string. + + Args: + bytes: list of bytes (integers) + Returns: + string representing the list of bytes in ASCII. Non ASCII + characters are replaced with . + + >>> toASCIIString([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33]) + 'Hello world!' + """ ascii = "" for b in bytes: if b > 31 and b < 127: @@ -56,10 +75,18 @@ def normalize(atr): - """ transform an ATR in list of integers + """Transform an ATR in list of integers. valid input formats are "3B A7 00 40 18 80 65 A2 08 01 01 52" "3B:A7:00:40:18:80:65:A2:08:01:01:52" + + Args: + atr: string + Returns: + list of bytes + + >>> normalize("3B:A7:00:40:18:80:65:A2:08:01:01:52") + [59, 167, 0, 64, 24, 128, 101, 162, 8, 1, 1, 82] """ atr = atr.replace(":", "") atr = atr.replace(" ", "") @@ -76,7 +103,19 @@ def int2bin(i, padding=8): - """ convert an integer into its binary representation """ + """Converts an integer into its binary representation + + Args: + i: integer value + padding: minimum number of digits (default value 8) + Returns: + string representation of i in binary + + >>> int2bin(2015) + '11111011111' + >>> int2bin(42) + '00101010' + """ b = "" while i > 0: b = str(i % 2) + b @@ -86,6 +125,18 @@ def parseATR(atr_txt): + """Parses an ATR + + Args: + atr_txt: ATR as a hex bytes string + Returns: + dictionary of field and values + + >>> parseATR("3B A7 00 40 18 80 65 A2 08 01 01 52") + {'hbn': 7, 'TB1': 0, 'TC2': 24, 'TS': 59, 'T0': 167, + 'atr': [59, 167, 0, 64, 24, 128, 101, 162, 8, 1, 1, 82], + 'hb': [128, 101, 162, 8, 1, 1, 82], 'TD1': 64, 'pn': 2} + """ atr_txt = normalize(atr_txt) atr = {} @@ -160,6 +211,16 @@ def TA1(v): + """Parse TA1 value + + Args: + v: TA1 + Returns: + value according to ISO 7816-4 + + >>> TA1(0x11) + ['Fi=%s, Di=%s, %g cycles/ETU (%d bits/s at 4.00 MHz, %d bits/s for fMax=%d MHz)', (372, 1, 372, 10752, 13440, 5)] + """ Fi = (372, 372, 558, 744, 1116, 1488, 1860, "RFU", "RFU", 512, 768, 1024, 1536, 2048, "RFU", "RFU") Di = ("RFU", 1, 2, 4, 8, 16, 32, 64, 12, 20, "RFU", "RFU", "RFU", "RFU", @@ -182,6 +243,16 @@ def TA2(v): + """Parse TA2 value + + Args: + v: TA2 + Returns: + value according to ISO 7816-4 + + >>> TA2(1) + 'Protocol to be used in spec mode: T=1 - Capable to change - defined by interface bytes' + """ F = v >> 4 D = v & 0xF text = ["Protocol to be used in spec mode: T=%s" % (D)] @@ -199,18 +270,47 @@ def TA3(v): + """Parse TA3 value + + Args: + v: TA3 + Returns: + value according to ISO 7816-4 + """ return TAn(3, v) def TA4(v): + """Parse TA4 value + + Args: + v: TA4 + Returns: + value according to ISO 7816-4 + """ return TAn(4, v) def TA5(v): + """Parse TA5 value + + Args: + v: TA5 + Returns: + value according to ISO 7816-4 + """ return TAn(5, v) def TAn(i, v): + """Parse TAi (3 <= i <= 5) + + Args: + i: i + v: value of TAi + Returns: + value according to ISO 7816-4 + """ XI = ("not supported", "state L", "state H", "no preference") if (T == 1): text = "IFSC: %s" @@ -237,6 +337,13 @@ def TB1(v): + """Parse TB1 value + + Args: + v: TB1 + Returns: + value according to ISO 7816-4 + """ I = v >> 5 PI = v & 0x1F if (PI == 0): @@ -247,6 +354,13 @@ def TB2(v): + """Parse TB2 value + + Args: + v: TB2 + Returns: + value according to ISO 7816-4 + """ text = ["Programming param PI2 (PI1 should be ignored): %d" % v, ] if ((v > 49) or (v < 251)): text.append(" (dV)") @@ -256,18 +370,47 @@ def TB3(v): + """Parse TB3 value + + Args: + v: TB3 + Returns: + value according to ISO 7816-4 + """ return TBn(3, v) def TB4(v): + """Parse TB4 value + + Args: + v: TB4 + Returns: + value according to ISO 7816-4 + """ return TBn(4, v) def TB5(v): + """Parse TB5 value + + Args: + v: TB5 + Returns: + value according to ISO 7816-4 + """ return TBn(5, v) def TBn(i, v): + """Parse TBi (3 <= i <= 5) + + Args: + i: i + v: value of TBi + Returns: + value according to ISO 7816-4 + """ text = "Undocumented" args = list() if (T == 1): @@ -292,6 +435,13 @@ def TC1(v): + """Parse TC1 value + + Args: + v: TC1 + Returns: + value according to ISO 7816-4 + """ text = "Extra guard time: %d" args = v if (v == 255): @@ -300,22 +450,58 @@ def TC2(v): + """Parse TC2 value + + Args: + v: TC2 + Returns: + value according to ISO 7816-4 + """ return "Work waiting time: 960 x %d x (Fi/F)" % v def TC3(v): + """Parse TC3 value + + Args: + v: TC3 + Returns: + value according to ISO 7816-4 + """ return TCn(3, v) def TC4(v): + """Parse TC4 value + + Args: + v: TC4 + Returns: + value according to ISO 7816-4 + """ return TCn(4, v) def TC5(v): + """Parse TC5 value + + Args: + v: TC5 + Returns: + value according to ISO 7816-4 + """ return TCn(5, v) def TCn(i, v): + """Parse TCi (3 <= i <= 5) + + Args: + i: i + v: value of TCi + Returns: + value according to ISO 7816-4 + """ text = list() args = list() if (T == 1): @@ -331,26 +517,69 @@ def TD1(v): + """Parse TD1 value + + Args: + v: TD1 + Returns: + value according to ISO 7816-4 + """ return TDn(1, v) def TD2(v): + """Parse TD2 value + + Args: + v: TD2 + Returns: + value according to ISO 7816-4 + """ return TDn(2, v) def TD3(v): + """Parse TD3 value + + Args: + v: TD3 + Returns: + value according to ISO 7816-4 + """ return TDn(3, v) def TD4(v): + """Parse TD4 value + + Args: + v: TD4 + Returns: + value according to ISO 7816-4 + """ return TDn(4, v) def TD5(v): + """Parse TD5 value + + Args: + v: TD5 + Returns: + value according to ISO 7816-4 + """ return TDn(5, v) def TDn(i, v): + """Parse TDi (1 <= i <= 5) + + Args: + i: i + v: value of TDi + Returns: + value according to ISO 7816-4 + """ global T Y = v >> 4 T = v & 0xF @@ -361,8 +590,19 @@ def life_cycle_status(lcs): + """Life Cycle Status # Table 13 - Life cycle status byte # ISO 7816-4:2004, page 21 + + Args: + lcs: Life Cycle Status + + Returns: + Text value + + >>> life_cycle_status(5) + 'Operational state (activated)' + """ text = "Unknown" if lcs > 15: @@ -385,8 +625,18 @@ def data_coding(dc): + """Data Coding + # Table 87 - Second software function table (data coding byte) # ISO 7816-4:2004, page 60 + + Args: + dc: data coding + + Returns: + Text value + + """ text = list() if dc & 128: @@ -409,8 +659,17 @@ def selection_methods(sm): + """Selection Methods + # Table 86 - First software function table (selection methods) # ISO 7816-4:2004, page 60 + + Args: + sm: Selection Methods + + Returns: + Text value + """ text = list() if sm & 1: @@ -441,8 +700,17 @@ def selection_mode(sm): + """Selection Mode + # Table 87 - Second software function table (data coding byte) # ISO 7816-4:2004, page 60 + + Args: + sm: Selection Mode + + Returns: + Text value + """ text = list() if sm & 1: @@ -473,9 +741,18 @@ def command_chaining(cc): + """Command Chaining + # Table 88 - Third software function table (command chaining, # length fields and logical channels) # ISO 7816-4:2004, page 61 + + Args: + cc: Command Chaining + + Returns: + Text value + """ text = list() if cc & 128: @@ -498,8 +775,17 @@ def card_service(cs): + """Card Service + # Table 85 - Card service data byte # ISO 7816-4:2004, page 59 + + Args: + ccs Card Service + + Returns: + Text value + """ text = list() if cs & 128: @@ -534,6 +820,17 @@ def compact_tlv(historical_bytes): + """Compact TLV + + Args: + historical_bytes + + Returns: + list of text values + + >>> compact_tlv([101, 162, 8, 1, 1, 82]) + [' Tag: 6, Len: 5 (%s)\\n Data: %s "%s"\\n', ('pre-issuing data', 'A2 08 01 01 52', '....R')] + """ text = "" tlv = historical_bytes.pop(0) @@ -665,6 +962,17 @@ def analyse_histrorical_bytes(historical_bytes): + """Analyse Historical Bytes + + Args: + historical_bytes: list of bytes + + Returns: + list + + >>> analyse_histrorical_bytes([128, 101, 162, 8, 1, 1, 82]) + [' Category indicator byte: 0x80', [' (compact TLV data object)\\n Tag: 6, Len: 5 (%s)\\n Data: %s "%s"\\n', ('pre-issuing data', 'A2 08 01 01 52', '....R')]] + """ text = list() args = list() @@ -725,6 +1033,14 @@ def compute_tck(atr): + """Computes TCK (ATR checksum) + + Args: + atr: list of bytes + + Returns: + TCK value + """ # do not include TS byte s = atr["atr"][0] for e in atr["atr"]: @@ -735,7 +1051,21 @@ def colorize_line(line, left, right): - # colorize data from the format: foo: data, ... + """Colorize a line + + Args: + line: a tuple of 2 elements with + - a line with substitution strings (%s, %d, %g) + - the values of substitution + left: string to add before the substitution + right: string to add after the substitution + + Returns: + Text + + >>> colorize_line(['foo%sbar', 1], 'a', 'b') + 'fooa1bbar' + """ if isinstance(line, StringTypes): return line @@ -747,6 +1077,14 @@ def colorize_txt(l): + """Colorize a text line using ANSI colors + + args: + l: line or 2 elements tuple + + Returns: + colorized line + """ magenta = "\033[35m" normal = "\033[0m" blue = "\033[34m" @@ -761,6 +1099,14 @@ def atr_display_txt(atr): + """Parse an ATR for a text display + + Args: + atr: ATR + + Returns: + Text + """ return atr_display(atr, colorize_txt) html_escape_table = { @@ -773,7 +1119,17 @@ def html_escape(text): - """Produce entities within text.""" + """Produce entities within text. + + Args: + text: text containing special HTML characters + + Returns: + same text with HTML character replaced by their HTML equivalent + + >>> html_escape("&") + '&' + """ L = list() for c in text: L.append(html_escape_table.get(c, c)) @@ -781,6 +1137,14 @@ def colorize_html(l): + """Colorize a text line using HTML colors + + args: + l: line or 2 elements tuple + + Returns: + colorized line + """ left = '<span class="data">' right = '</span>' @@ -798,10 +1162,27 @@ def atr_display_html(atr): + """Parse an ATR for a text display + + Args: + atr: ATR + + Returns: + Text in HTML format + """ return atr_display(atr, colorize_html) def atr_display(atr, colorize): + """Parse an ATR for a given output + + Args: + atr: ATR + colorize: colorization function + + Returns: + Text + """ text = list() TS = {0x3B: "Direct Convention", 0x3F: "Inverse Convention"} text.append(["TS = 0x%02X" % atr["TS"], TS.get(atr["TS"], "Invalid")]) @@ -850,7 +1231,19 @@ def match_atr(atr, atr_file=None): - """ try to find card description for a given ATR """ + """Try to find card description for a given ATR. + + Args: + atr: ATR + atr_file: file containing a list of known ATRs + + Returns: + list of card descriptions + + >>> match_atr('3B A7 00 40 18 80 65 A2 08 01 01 52') + Using: /Users/rousseau/.cache/smartcard_list.txt + ['3B A7 00 40 .. 80 65 A2 08 .. .. ..', 'Gemplus GemSAFE Smart Card (8K)', 'Gemplus GPK8000', 'GemSAFE Smart Card (8K)'] + """ card = list() atr = toHexString(normalize(atr)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lu...@us...> - 2015-02-18 17:53:14
|
Revision: 667 http://sourceforge.net/p/pyscard/code/667 Author: ludov Date: 2015-02-18 17:42:05 +0000 (Wed, 18 Feb 2015) Log Message: ----------- Fix PEP8: E501 line too long Modified Paths: -------------- trunk/contrib/parseATR/parseATR.py Modified: trunk/contrib/parseATR/parseATR.py =================================================================== --- trunk/contrib/parseATR/parseATR.py 2015-02-18 17:37:41 UTC (rev 666) +++ trunk/contrib/parseATR/parseATR.py 2015-02-18 17:42:05 UTC (rev 667) @@ -153,15 +153,19 @@ (t1, t2) = ("s", "are") else: (t1, t2) = ("", "is") - raise ParseAtrException("ERROR! ATR is truncated: %d byte%s %s missing" % (missing, t1, t2)) + raise ParseAtrException("ERROR! ATR is truncated: %d byte%s %s missing" + % (missing, t1, t2)) return atr def TA1(v): - Fi = (372, 372, 558, 744, 1116, 1488, 1860, "RFU", "RFU", 512, 768, 1024, 1536, 2048, "RFU", "RFU") - Di = ("RFU", 1, 2, 4, 8, 16, 32, 64, 12, 20, "RFU", "RFU", "RFU", "RFU", "RFU", "RFU") - FMax = (4, 5, 6, 8, 12, 16, 20, "RFU", "RFU", 5, 7.5, 10, 15, 20, "RFU", "RFU") + Fi = (372, 372, 558, 744, 1116, 1488, 1860, "RFU", "RFU", 512, 768, 1024, + 1536, 2048, "RFU", "RFU") + Di = ("RFU", 1, 2, 4, 8, 16, 32, 64, 12, 20, "RFU", "RFU", "RFU", "RFU", + "RFU", "RFU") + FMax = (4, 5, 6, 8, 12, 16, 20, "RFU", "RFU", 5, 7.5, 10, 15, 20, "RFU", + "RFU") F = v >> 4 D = v & 0xF @@ -469,7 +473,8 @@ def command_chaining(cc): - # Table 88 - Third software function table (command chaining, length fields and logical channels) + # Table 88 - Third software function table (command chaining, + # length fields and logical channels) # ISO 7816-4:2004, page 61 text = list() @@ -483,7 +488,8 @@ text.append(" - RFU (should not happen)\n") v = (cc >> 3) & 3 - t = ["No logical channel\n", "by the interface device\n", "by the card\n", "by the interface device and card\n"] + t = ["No logical channel\n", "by the interface device\n", "by the card\n", + "by the interface device and card\n"] text.append(" - Logical channel number assignment: " + t[v]) text.append(" - Maximum number of logical channels: %d\n" % (1 + cc & 7)) @@ -707,7 +713,8 @@ text.append(" DIR data reference: %d") args.append(data_ref) - elif hb_category in (0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F): + elif hb_category in (0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, + 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F): text.append(" (Reserved for future use)") else: @@ -801,7 +808,9 @@ Y1 = atr["T0"] >> 4 K = atr["T0"] & 0xF - text.append(["T0 = 0x%02X" % atr["T0"], ["Y(1): b%s, K: %d (historical bytes)", (int2bin(Y1, padding=4), K)]]) + text.append(["T0 = 0x%02X" % atr["T0"], + ["Y(1): b%s, K: %d (historical bytes)", + (int2bin(Y1, padding=4), K)]]) for i in (1, 2, 3, 4, 5): separator = False This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |