http://code.google.com/p/ctypescrypto/
-It is aimed to provide Python interface to OpenSSL libcrypto function
-
-Now supported:
-
-bio.py - interfase to OpenSSL stream abstraction BIO. Now supports
- memory BIOs this module intended to use for parsing/serializing
- various ASN.1 based formats like private keys or certificates
- Status: bare minimum functionality is implemented and covered by
- rests
-
-oid.py - interface to OpenSSL ASN.1 Object Identifier databsase.
- Allows to convert numeric identifier (NIDs) returned by various
- OpenSSL function to readable names or dotted-decimal OIDs and back
- Status: Fully implemented and covered by tests.
-
-engine.py - interface to loadable modules with alternate implementations
- of cryptoalgorithms.
- Status: Bare minumum, neccessary to use GOST algorithms is
- implemented.
-
-rand.py - interface to pseudo-random number generator.
- Status: Implemented. Tests now only ensure that no segfault occurs
- if arugments are passed correctly
-
-digests.py - Interface to EVP\_Digest\* family of functions.
- Really does almost same as hashlib, which even is able to take
- advantage of loaded engines if compiled against dynamic libcrypto
- Status: fully implemented and covered by tests
-
-ciphers.py - Interface to EVP\_Cipher family of function.
- Status: Needs test coverage
-
-pkey.py - Low-level private key operations (like pkey, genpkey and p
- keyutl command line ops), all via algorithm-agnostic EVP interface.
- Status: Designed and started to implement but most functionality
- not yet covered by tests
-
-exception.py OpenSSL error stack to python exception conversion
- Implemented.
-
-x509 X509 certificates. Support parsing of X509 certificates,
- verification and extracting of field values. Possible extnesion -
- support creattion of PKCS10 certificate requests.
- Status: Interface designed and partially implemented
+most recent version can be checked out from
+
+https://github.com/vbwagner/ctypescrypto.git
+
+It is aimed to provide Python interface to OpenSSL libcrypto functions.
+All the objects in this library are just wrappers around some OpenSSL
+data structures and groups of functions.
+
+
+
+Digest calculation
+------------------
+
+Module *ctypescrypto.digest* contain *new()* function which produces
+objects simular to python *hashlib* module objects.
+
+On the systems where hashlib is linked with libcrypto dynamically,
+hashlib even able to make use of digest types, provided by loadable
+engines.
+
+This module would utilize same copy of libcrypto library as other
+ctypescrypto modules, so it would work with engine-provided digests.
+
+Symmetric ciphers
+-----------------
+
+Module *ctypescrypto.cipher* contain *new()* function which provides
+way to create cipher objects. Cipher padding can be configure later.
+This object provides methods *update* and *finish* which allows to
+encrypt/decrypt data. All ciphers, supported by your version of OpenSSL
+and its loadable engines are supported.
+
+Public key operations
+---------------------
+
+Module *ctypescrypto.pkey* provides *PKey* object, which represents
+public/private key pair or just public key. With this object you can
+sign data, derive shared key and verify signatures.
+
+This is quite low-level object, which can be used to implement some
+non-standard protocols and operations.
+
+X509 certificates
+-----------------
+
+Module *ctypescrypto.x509* contains objects *X509* which represents
+certificate (and can be constructed from string, contained PEM
+or DER certificate) and object *X509Store* which is a store of trusted
+CA certificates which can be used to high-level signature verifications
+(i.e. in PKCS7/CMS messages).
+
+Certificate has properties corresponding to its subject and issuer
+names, public key (of course it is PKey object described above) and
+serial number. Subject and issuer names can be indexed by OIDs or by
+position of field. Unicode in the names is supported.
+
+There is no support for certificate validity time yet.
+
+OID database
+------------
+
+OpenSSL conteins internal object identifiers (OID) database. Each OID
+have apart from dotted-decimal representation long name, short name and
+numeric identifer. Module *ctypescrypto.oid* provides interface to the
+database. *Oid* objects store numeric identifier internally and can
+return both long and short name and dotted-decimal representation.
+
+BIO library
+-----------
+
+OpenSSL contain BIO (basic input-output) abstraction. And all object
+serialization/deserialization use this library. Also human-readble
+representation of ASN.1 structures use this library extensively. So,
+we've to develop python object which allow to read from python string
+via BIO abstraction or write to buffer, which can be returned as python
+string or unicode object.
+
+Exceptions
+----------
+
+Exceptions, used in the *ctypescrypto* to report problems are tied
+closely with OpenSSL error-reporting functions, so if such an exception
+occurs, as much as possibly information from inside libcrypto would be
+available in the Python
+
+Engine support
+--------------
+
+There is just one function *ctypescrypt.engine.set_default*. which loads
+specified engine by id and makes it default for all algorithms,
+supported by it. It is enough for me to use Russian national
+cryptographic algoritms, provided by *gost* engine.
--- /dev/null
+"""
+Support for EC keypair operation missing form public libcrypto API
+"""
+
+
+def create(curve,num):
+ """
+ Creates EC keypair from the just secret key and curve name
+
+ @param curve - name of elliptic curve
+ @param num - long number representing key
+ """
+ p=libcrypto.EVP_PKEY_new()
+ ec=libcrypto.EC_KEY_new_by_curvename(curve.nid)
+ group=libcrypto.EC_KEY_get0_group(ec)
+ EC_KEY_set_private_key(ec,bn)
+ priv_key=libcrypt.BN_new()
+ ctx=BN_CTX_new()
+ h="%x"%(num)
+ libcrypto.BN_hex2bn(byref(priv_key),h)
+ libcrypto.EC_KEY_set_private_key(ec,priv_key)
+ pub_key=libcrypto.EC_POINT_new(group)
+ libcrypto.EC_POINT_mul(group,pub_key,priv_key,None,None,ctx)
+ libcrypto.BN_free(a)
+ libcrypto.EVP_PKEY_set1_EC_KEY(p,ec)
+ libcrypto.EC_KEY_free(ec)
+ return PKey(ptr=p,cansign=True)
+
+
+libcrypto.EVP_PKEY_new.restype=c_void_p
+libcrypto.BN_new.restype=c_void_p
+libcrypto.BN_hex2bn.argtypes(POINTER(c_void_p),c_char_p)
+libcrypto.EC_KEY_set_private_key
+"""
+low-level private/public keypair operation
+
+PKey object of this module is wrapper around OpenSSL EVP_PKEY object.
+"""
+
+This module provides interface for
+
from ctypes import c_char_p,c_void_p,byref,c_int,c_long, c_longlong, create_string_buffer,CFUNCTYPE,POINTER
from ctypescrypto import libcrypto
from ctypescrypto.exception import LibCryptoError,clear_err_stack
CALLBACK_FUNC=CFUNCTYPE(c_int,c_char_p,c_int,c_int,c_char_p)
def password_callback(buf,length,rwflag,u):
+"""
+Example password callback for private key. Assumes that
+password is store in the userdata parameter, so allows to pass password
+from constructor arguments to the libcrypto keyloading functions
+"""
cnt=len(u)
if length<cnt:
cnt=length