History
=======

1.5.18 - August 2025, Ludovic Rousseau
  - add CKM_EXTRACT_KEY_FROM_KEY mechanism
  - add CKM_EDDSA and CK_EDDSA_PARAMS support
  - C_Initialize(): allow OS locking
  - PyKCS11.load() & .unload(): make the methods tread-safe
  - bugfix: store CKM_CONCATENATE_BASE_AND_KEY parameter in mechanism context
  - IsNum(): CKA_HW_FEATURE_TYPE is also a numeric value
  - improve support for multi-part encryption/decryption
  - fix some Python typing issues
  - Fix issue with vendor defined (CKM_VENDOR_DEFINED) mechanisms
  - fix/ignore all pylint warnings
  - use pytest for running tests
  - minor improvements

1.5.17 - October 2024, Ludovic Rousseau
  - Add AES in counter mode support (CKM_AES_CTR)
  - Add simple derivation mechanisms support (CMK_CONCATENATE_*)
  - Fix reference counting in PyKCS11Lib.load()
  - remove python 2 support from ckbytelist
  - minor improvements

1.5.16 - May 2024, Ludovic Rousseau
  - add support of CKA_MODIFIABLE and CKA_DESTROYABLE attributes
  - minor improvements

1.5.15 - April 2024, Ludovic Rousseau
  - fix problems when PYKCS11LIB has incorrect values
  - fix a problem with swig and "pip install ..."
  - minor improvements

1.5.14 - February 2024, Ludovic Rousseau
  - fix build using swig 4.2.0

1.5.13 - January 2024, Ludovic Rousseau
  - fix issue between Python 3.12 garbage collector and C_Finalize()
  - Modernize use of setup.py
  - Check swig is installed
  - remove unused files
  - minor improvements

1.5.12 - April 2023, Ludovic Rousseau
  - add setAttributeValue()
  - minor improvements

1.5.11 - Septembre 2022, Ludovic Rousseau
  - add deriveKey() with CKM_ECDH1_DERIVE and CK_ECDH1_DERIVE_PARAMS
  - support pSourceData in OAEP params
  - remove use of (deprecated) distutils
  - samples: port to Python 3
  - fix code coverage generation

1.5.10 - December 2020, Ludovic Rousseau
  - Add CKH_* constants
  - CKA_HW_FEATURE_TYPE attribute value is a number
  - Makefile: use python3 by default
  - minor improvements

1.5.9 - July 2020, Ludovic Rousseau
  - call C_GetSlotList() with a NULL parameter to correctly initialize
	some PKCS#11 lib conforming to PKCS#11 version 2.40.

1.5.8 - May 2020, Ludovic Rousseau
  - CKA_ALWAYS_AUTHENTICATE is boolean
  - CKM_VENDOR_DEFINED_...
   . Fix name: use CKM_ instead of CKR_ prefix
   . Use an explicit hex prefix: CKM_VENDOR_DEFINED_0x45
  - Add missing CKM_*, CKA_*, CKF_*, CKD_*, CKK_*, CKN_*, CKO_*, CKR_*
	from PKCS#11 v3.0
  - fix test_asymetric.py for RSA_PSS_Mechanism

1.5.7 - December 2019, Ludovic Rousseau
   - add missing files in the .tar.gz

1.5.6 - December 2019, Ludovic Rousseau
   - AppVeyor:
     . generate bdist_wheel
	 . add Python 3.7 and 3.8
   - Sample events.py: add a -f/--full argument
   - Add support of CKM_AES_GCM mechanism
   - CPKCS11Lib::Load(): return different error codes
   - minor improvements

1.5.5 - April 2019, Ludovic Rousseau
   - fix source package generation

1.5.4 - April 2019, Ludovic Rousseau
   - getTokenInfo: replace NUL char by ' ' in utcTime
   - dumpit:
    . print hardwareVersion and firmwareVersion
    . print slot flags
    . move to next slot if token not present
   - add support of CKA_WRAP_TEMPLATE/CKA_UNWRAP_TEMPLATE
   - add samples for ECC key generation and use
   - move from distutils to setuptools
   - upload of wheels to pypi on "make dist"

1.5.3 - October 2018, Ludovic Rousseau
   - Do not fail when converting a UTF-8 string
   - Documentation: convert from Epydoc to Sphinx
   - some minor improvements

1.5.2 - April 2018, Ludovic Rousseau
   - Fix initPin()
   - add tests for initPin(), setPin(), initToken()

1.5.1 - March 2018, Ludovic Rousseau
   - Fix "pip install"

1.5.0 - March 2018, Ludovic Rousseau
   - Python 3: use strings instead of binary buffers for CK_UTF8CHAR
	 PKCS#11 types. The behavior is now the same as with Python 2
   - allow non string PIN values (binary PIN) for login(), initToken(),
	 initPin(), setPin()
   - fix support of RSA PKCS PSS mechanism
	 The mechanism object now uses a parameter "mechanism" instead of hard
	 coding the mechanism value to CKM_RSA_PKCS_PSS.
   - add support of Python 2.7 on Windows
   - add AppVeyor configuration (automatic Windows builds)
   - ckbytelist: remove possibility to give a initial size
   - samples/getinfo: do not list the mechanisms by default
   - samples/events:
     . do not list the mechanisms by default
     . add support of pinpad readers
   - some minor improvements

1.4.4 - October 2017, Ludovic Rousseau
   - getAttributeValue(): handle CKR_ARGUMENTS_BAD error
   - seedRandom: fix the seed convertion
   - Add vendor errors support to PyKCS11Error
   - samples/getinfo & dumpit: list only slots with a token present by default
   - run_test: add support of OpenSC PKCS#11 spy
   - ckbytelist: update __repr__()
   - include tests files in the archive
   - dumpit: display the error if getAttributeValue() fails
   - some minor improvements

1.4.3 - June 2017, Ludovic Rousseau
   - Add support of CKM_RSA_PKCS_PSS mechanism
   - fix CKM_AES_CBC issue with Python 3
   - add Unitary Tests (make tests)
   - add tox support (automate and standardize testing in Python)
   - add coverage support (measuring code coverage of Python programs)
   - add Travis-CI configuration (automatic build and tests)
   - some minor improvements

1.4.2 - May 2017, Ludovic Rousseau
   - Moved the project from https://bitbucket.org/PyKCS11/pykcs11 to
     https://github.com/LudovicRousseau/PyKCS11
   - Makefile: use a better default value for PREFIX
   - Fix PyKCS11.__del__(): test that every module is accessible
   - getSlotList(): add optional tokenPresent parameter
     By default the method returns all the slots (like before the change).
   - Always call C_Initialize() in ::Load() to work with some bogus
     PKCS#11 library (like libCryptoki2 from Safenet Luna SA HSM)
   - LowLevel samples: use PYKCS11LIB environment variable
   - some minor improvements

1.4.1 - February 2017, Ludovic Rousseau
   - fix compilation under Python 3
   - add rsa encryption sample program

1.4.0 - February 2017, Ludovic Rousseau
   - fix closeAllSessions() and move it Session to PKCS11Lib
   - add RSAOAEPMechanism to support RSA Encryption
   - add DigestSession which enables multi-part digesting
   - add Elliptic curve keypair generating mechanism
   - fix bug in Templates using booleans CK_TRUE/CK_FALSE
     Templates are used by generateKey(), generateKeyPair(),
     findObjects() createObject(), unwrapKey()
   - fix dumpit.py sample for Python 3

1.3.3 - November 2016, Ludovic Rousseau
   - PKCS#11 definitions: sync with Cryptoki version 2.40
     . add missing CKM_* and CKP_* defines
   - Add generateKey() with default mechanism CKM_AES_KEY_GEN
   - Make sure the PyKCS11Lib is referenced as long as Session object is live
   - Fix OverflowError on Windows
   - Attribute CKA_WRAP_WITH_TRUSTED is bool
   - samples
    - dumpit: ask to enter the PIN on the pinpad if needed
    - getinfo & dumpit: add --slot= parameter
   - some minor improvements

1.3.2 - January 2016, Ludovic Rousseau
   - Add wrappers for C_Verify, C_WrapKey, C_UnwrapKey
   - PKCS#11 definitions: sync with Cryptoki version 2.30
   - Generate CKM[CKM_VENDOR_DEFINED+x] values on the fly
   - Fix use of a pinpad reader CKF_PROTECTED_AUTHENTICATION_PATH
   - dumpit.py: lots of small fixes
   - Setup call make to build pykcs11_wrap.cpp using SWIG
   - Fix build on Windows
   - Small bugs fixed

1.3.1 - October 2015, Ludovic Rousseau
   - PKCS#11 definitions: sync with Cryptoki version 2.30
   - Add user type CK_CONTEXT_SPECIFIC
   - Fixes #9, incorrect assignment of pParameter for CK_MECHANISMs.
   - CKA_DERIVE is a CK_BBOOL and not byte array
   - Add digest() and encrypt method to Session class
   - Add samples:
      - key-pair generation
      - key-pair generation + certificate import
      - printing public key modulus
      - computing signature
   - small bugs fixed

1.3.0 - July 2014, Ludovic Rousseau
   - add Python3 support

1.2.4 - April 2012, Ludovic Rousseau
   - improve epydoc documentation
   - add pinpad support in C_Login() using pin=None
   - add pinpad support in samples getinfo.py and dumpit.py
   - add createObject()

1.2.3 - December 2010, Ludovic Rousseau
   - Add new classes CK_SLOT_INFO, CK_INFO, CK_SESSION_INFO,
     CK_MECHANISM_INFO and CK_TOKEN_INFO instead of the low level ones
     to have a __repr__() method.  It is now possible to just print an
     object of these classes and have a human readable version.
   - Add a new class CK_OBJECT_HANDLE() to replace the low level one
     and have a __repr__() method for objects returned by findObjects()
   - Move initToken() from class Session to class PyKCS11Lib and add a
     slot parameter.
   - Add generateKeyPair and destoryObject support in high level
     interface

1.2.2 - June 2010, Ludovic Rousseau
   - Debug low level C_GenerateRandom
   - Add seedRandom() and generateRandom() in the high level API

1.2.1 - November 2008, Ludovic Rousseau
   - Use src/opensc/pkcs11.h instead of src/rsaref/* files since the
     files from RSA are not free enough (no right to distribute modified
     versions for example)
   - improve samples/getinfo.py script
   - bug fixes

1.2.0 - August 2008, Ludovic Rousseau
   - add getMechanismList() and getMechanismInfo()
   - add Session().getSessionInfo()
   - bug fixes

1.1.1 - December 2006, Giuseppe Amato (Midori)
   - bug fixes

1.1.0 - August 2006, Ludovic Rousseau
   - Introduce high level API

1.0.2 - July 2006, Ludovic Rousseau
   - port to Unix (tested on GNU/Linux only)
   - explicit call to SWIG to generate the wrapper

1.0.1 - 2004 Giuseppe Amato (Midori)
   - first version
   - Windows only
