Skip to main content

hash, hmac, RSA, and X.509 with an mbed TLS back end

Project description

https://circleci.com/gh/Synss/python-mbedtls/tree/develop.svg?style=svg https://coveralls.io/repos/github/Synss/python-mbedtls/badge.svg?branch=develop

python-mbedtls is a free cryptographic library for Python that uses mbed TLS for back end.

mbed TLS (formerly known as PolarSSL) makes it trivially easy for developers to include cryptographic and SSL/TLS capabilities in their (embedded) products, facilitating this functionality with a minimal coding footprint.

python-mbedtls API follows the recommendations from PEP 452: API for Cryptographic Hash Functions v2.0 and PEP 272 API for Block Encryption Algorithms v1.0 and can therefore be used as a drop-in replacements to PyCrypto or Python’s hashlib and hmac

License

python-mbedtls is licensed under the MIT License (see LICENSE.txt). This enables the use of python-mbedtls in both open source and closed source projects. The MIT License is compatible with both GPL and Apache 2.0 license under which mbed TLS is distributed.

Installation

The bindings are tested with Python 2.7, 3.4, 3.5, and 3.6.

mbedtls is available on Debian. Install with:

# apt-get install libmbedtls-dev
# apt-get install libpython-dev   # for Python 2, or
# apt-get install libpython3-dev  # for Python 3

and pyton-mbedtls:

$ python -m pip install python-mbedtls

Message digest with mbedtls.hash

The mbedtls.hash module provides MD5, SHA-1, SHA-2, and RIPEMD-160 secure hashes and message digests. The API follows the recommendations from PEP 452 so that it can be used as a drop-in replacement to e.g. hashlib or PyCrypto.

Here are the examples from hashlib ported to python-mbedtls:

>>> from mbedtls import hash as hashlib
>>> m = hashlib.md5()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
>>> m.digest_size
16
>>> m.block_size
64

More condensed:

>>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'

Using new():

>>> h = hashlib.new('ripemd160')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'

HMAC algorithm with mbedtls.hmac

The mbedtls.hmac module computes HMAC. The API follows the recommendations from PEP 452 as well.

Example:

>>> from mbedtls import hmac
>>> m = hmac.new(b"This is my secret key", digestmod="md5")
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\x9d-/rj\\\x98\x80\xb1rG\x87\x0f\xe9\xe4\xeb'

Warning:

The message is cleared after calculation of the digest. Only call mbedtls.hmac.Hmac.digest() or mbedtls.hmac.Hmac.hexdigest() once per message.

Symmetric cipher with mbedtls.cipher

The mbedtls.cipher module provides symmetric encryption. The API follows the recommendations from PEP 272 so that it can be used as a drop-in replacement to e.g. PyCrypto.

mbedtls provides the following algorithms:

  • Aes encryption/decryption (128, 192, and 256 bits) in ECB, CBC, CFB128, CTR, GCM, or CCM mode;

  • Arc4 encryption/decryption;

  • Blowfish encryption/decryption in ECB, CBC, CFB64, or CTR mode;

  • Camellia encryption/decryption (128, 192, and 256 bits) in ECB, CBC, CFB128, CTR, GCM, or CCM mode;

  • DES encryption/decryption in ECB, or CBC mode;

Notes:
  • Tagging and padding are not wrapped.

  • The counter in CTR mode cannot be explicitly provided.

Example:

>>> from mbedtls import cipher
>>> c = cipher.AES.new(b"My 16-bytes key.", cipher.MODE_CBC, b"CBC needs an IV.")
>>> enc = c.encrypt(b"This is a super-secret message!")
>>> enc
b'*`k6\x98\x97=[\xdf\x7f\x88\x96\xf5\t\x19J7\x93\xb5\xe0~\t\x9e\x968m\xcd\x9c3\x04o\xe6'
>>> c.decrypt(enc)
b'This is a super-secret message!'

RSA public key with mbedtls.pk

The mbedtls.pk module provides the RSA cryptosystem. This includes:

  • Public-private key generation and key import/export in PEM and DER formats;

  • Asymmetric encryption and decryption;

  • Message signature and verification.

Key generation, the default size is 2048 bits:

>>> from mbedtls import pk
>>> rsa = pk.RSA()
>>> prv = rsa.generate()
>>> rsa.key_size
256

Message encryption and decryption:

>>> enc = rsa.encrypt(b"secret message")
>>> rsa.decrypt(enc)
b'secret message'

Message signature and verification:

>>> sig = rsa.sign(b"Please sign here.")
>>> rsa.verify(b"Please sign here.", sig)
True
>>> rsa.verify(b"Sorry, wrong message.", sig)
False
>>> pub = rsa.export_public_key(format="DER")
>>> other = pk.RSA()
>>> other.from_buffer(pub)
>>> other.verify(b"Please sign here.", sig)
True

Static and ephemeral Elliptic curve Diffie-Hellman

The mbedtls.pk module provides the ECC cryptosystem. This includes:

  • Public-private key generation and key import/export in the PEM and DER formats;

  • Asymmetric encrypt and decryption;

  • Message signature and verification;

  • Ephemeral ECDH key exchange.

get_supported_curves() returns the list of supported curves.

The API of the ECC class is the same as the API of the RSA class but ciphering (encrypt() and decrypt() is not supported by MBED TLS).

Message signature and verification—elliptic curve digital signature algorithm (ECDSA):

>>> from mbedtls import pk
>>> ecdsa = pk.ECC()
>>> prv = ecdsa.generate()
>>> sig = ecdsa.sign(b"Please sign here.")
>>> ecdsa.verify(b"Please sign here.", sig)
True
>>> ecdsa.verify(b"Sorry, wrong message.", sig)
False
>>> pub = ecdsa.export_public_key(format="DER")
>>> other = pk.ECC()
>>> other.from_buffer(pub)
>>> other.verify(b"Please sign here.", sig)
True

The classes ECDHServer and ECDHClient may be used for ephemeral ECDH. The key exchange is as follows:

>>> srv = pk.ECDHServer()
>>> cli = pk.ECDHClient()

The server generates the ServerKeyExchange encrypted payload and passes it to the client:

>>> ske = srv.generate()
>>> cli.import_SKE(ske)

then the client generates the ClientKeyExchange encrypted payload and passes it back to the server:

>>> cke = cli.generate()
>>> srv.import_CKE(cke)

Now, client and server may generate their shared secret:

>>> secret = srv.generate_secret()
>>> cli.generate_secret() == secret
True
>>> srv.shared_secret == cli.shared_secret
True

X.509 Certificate writing and parsing with mbedtls.x509

Create new X.509 certificates:

>>> import datetime as dt
>>> from pathlib import Path
>>>
>>> from mbedtls import hash as hashlib
>>> from mbedtls.pk import RSA
>>> from mbedtls.x509 import Certificate, CSR, CRL
>>>
>>> now = dt.datetime.utcnow()
>>> issuer_key = RSA()
>>> _ = issuer_key.generate()
>>> subject_key = RSA()
>>> prv = subject_key.generate()
>>>
>>> crt = Certificate.new(
...     start=now, end=now + dt.timedelta(days=90),
...     issuer="C=NL,O=PolarSSL,CN=PolarSSL Test CA", issuer_key=issuer_key,
...     subject=None, subject_key=subject_key,
...     md_alg=hashlib.sha1(), serial=None)
...
>>> csr = CSR.new(subject_key, hashlib.sha1(),
...               "C=NL,O=PolarSSL,CN=PolarSSL Server 1")
>>>

Call next(crt) to obtain the next certificate in a chain. The call raises StopIteration if there is no further certificate.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python-mbedtls-0.10.0.tar.gz (27.9 kB view details)

Uploaded Source

Built Distributions

File details

Details for the file python-mbedtls-0.10.0.tar.gz.

File metadata

File hashes

Hashes for python-mbedtls-0.10.0.tar.gz
Algorithm Hash digest
SHA256 40a60750bc86b7dd0e71b953a1f04744a8e562f585b77ecd2a490d3aa42992d5
MD5 76d1506da8f1894a7fb510937b42a02d
BLAKE2b-256 8202628ab64a72ae92ec8fabae53dab4810adf2933113d3a7751c6a9a5a3c756

See more details on using hashes here.

File details

Details for the file python_mbedtls-0.10.0-py3.6-linux-x86_64.egg.

File metadata

File hashes

Hashes for python_mbedtls-0.10.0-py3.6-linux-x86_64.egg
Algorithm Hash digest
SHA256 91901fb39f1317570754d01e7a5d25380440ce867a420707c84084da8aef72a5
MD5 c3ac3c123540269aabaf0e3daddae667
BLAKE2b-256 23f6c5a1c158ea006c27c781fa9d755665abf6fdd5cbcc08036a080ea02af8e2

See more details on using hashes here.

File details

Details for the file python_mbedtls-0.10.0-py3.5-linux-x86_64.egg.

File metadata

File hashes

Hashes for python_mbedtls-0.10.0-py3.5-linux-x86_64.egg
Algorithm Hash digest
SHA256 f69ebb0518d904d793d3f18d0e88c91d0cfb14a490727b766d62fe1533f5b516
MD5 b1ee246b6d83a24f68f34f576a11b351
BLAKE2b-256 d4afea4a07ba6cc049dda70283138081d2774f6a5b69959d2eebefc0018529ee

See more details on using hashes here.

File details

Details for the file python_mbedtls-0.10.0-py3.4-linux-x86_64.egg.

File metadata

File hashes

Hashes for python_mbedtls-0.10.0-py3.4-linux-x86_64.egg
Algorithm Hash digest
SHA256 2daa22e7d00252356b02f36db7f09859f8a44b88f48007f940d9d84bf0aa7c6d
MD5 cf5e0f57174ce8c265ec64af85e0ced3
BLAKE2b-256 248b060c0e54e148517450d03663204dd9feb3619d25ebee9701985474f8cfec

See more details on using hashes here.

File details

Details for the file python_mbedtls-0.10.0-py2.7-linux-x86_64.egg.

File metadata

File hashes

Hashes for python_mbedtls-0.10.0-py2.7-linux-x86_64.egg
Algorithm Hash digest
SHA256 248024fdae86b6ec022722003b000c52a004d170d3d9626bb91901db4e7060c6
MD5 b8d7824ab987426a20fb4d57f89ab451
BLAKE2b-256 96cb3c368e929f7a28754463b3b7880788307521ea527cb601c80c71494aeb74

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page