Skip to main content

hash, hmac, RSA, ECC, X.509, TLS, DTLS, handshakes, and secrets with an mbed TLS back end

Project description

https://github.com/Synss/python-mbedtls/actions/workflows/main.yml/badge.svg?branch=master https://coveralls.io/repos/github/Synss/python-mbedtls/badge.svg?branch=master

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:

and therefore plays well with the cryptographic services from the Python standard library and many other cryptography libraries as well.

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.

API documentation

https://synss.github.io/python-mbedtls/

Installation

The bindings are tested with mbedTLS 2.28.1 for Python 3.7, 3.8, 3.9, and 3.10 on Linux, macOS, and Windows.

manylinux wheels are available for 64-bit Linux systems. Install with pip install python-mbedtls.

Usage and examples

Now, let us see examples using the various parts of the library.

Check which version of mbed TLS is being used by python-mbedtls

The mbedtls.version module shows the run-time version information to mbed TLS.

>>> from mbedtls import version
>>> _ = version.version  # "mbed TLS 2.28.1"
>>> _ = version.version_info  # (2, 28, 1)

Message digest

The mbedtls.hashlib module supports MD2, MD4, MD5, SHA-1, SHA-2 (in 224, 256, 384, and 512-bits), and RIPEMD-160 secure hashes and message digests. Note that MD2 and MD4 are not included by default and are only present if they are compiled in mbedtls.

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

>>> from mbedtls import 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

The mbedtls.hmac module computes HMAC.

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.

HMAC-based key derivation function (HKDF)

The mbedtls.hkdf module exposes extract-and-expand key derivation functions. The main function is hkdf() but extract() and expand() may be used as well.

Example:

>>> from mbedtls import hkdf
>>> hkdf.hkdf(
...     b"my secret key",
...     length=42,
...     info=b"my cool app",
...     salt=b"and pepper",
...     digestmod=hmac.sha256
... )
b'v,\xef\x90\xccU\x1d\x1b\xd7\\a\xaf\x92\xac\n\x90\xf9q\xf4)\xcd"\xf7\x1a\x94p\x03.\xa8e\x1e\xfb\x92\xe8l\x0cc\xf8e\rvj'

where info, salt, and digestmod are optional, although providing (at least) info is highly recommended.

Symmetric 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 other libraries.

python-mbedtls provides the following algorithms:

  • AES encryption/decryption (128, 192, and 256 bits) in ECB, CBC, CFB128, CTR, OFB, or XTS mode;

  • AES AEAD (128, 192, and 256 bits) in GCM or CCM mode;

  • ARC4 encryption/decryption;

  • ARIA encryption/decryption (128, 192, and 256 bits) in ECB, CBC, CTR, or GCM modes;

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

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

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

  • CHACHA20 and CHACHA20/POLY1305 encryption/decryption.

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\x19J\xf62h\xf4n\xca\xe8\xfe\xf5\xd7X'\xb1\x8c\xc9\x85"
>>> c.decrypt(enc)
b'This is a super-secret message!!'

RSA public key

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.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 using elliptic a 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.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:

>>> ecdh_key = pk.ECC()
>>> ecdh_key.generate()
>>> ecdh_srv = pk.ECDHServer(ecdh_key)
>>> ecdh_cli = pk.ECDHClient(ecdh_key)

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

>>> ske = ecdh_srv.generate()
>>> ecdh_cli.import_SKE(ske)

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

>>> cke = ecdh_cli.generate()
>>> ecdh_srv.import_CKE(cke)

Now, client and server may generate their shared secret:

>>> secret = ecdh_srv.generate_secret()
>>> ecdh_cli.generate_secret() == secret
True
>>> ecdh_srv.shared_secret == ecdh_cli.shared_secret
True

Diffie-Hellman-Merkle key exchange

The classes DHServer and DHClient may be used for DH Key exchange. The classes have the same API as ECDHServer and ECDHClient, respectively.

The key exchange is as follow:

>>> from mbedtls.mpi import MPI
>>> from mbedtls import pk
>>> dh_srv = pk.DHServer(MPI.prime(128), MPI.prime(96))
>>> dh_cli = pk.DHClient(MPI.prime(128), MPI.prime(96))

The 128-bytes prime and the 96-bytes prime are the modulus P and the generator G.

The server generates the ServerKeyExchange payload:

>>> ske = dh_srv.generate()
>>> dh_cli.import_SKE(ske)

The payload ends with G^X mod P where X is the secret value of the server.

>>> cke = dh_cli.generate()
>>> dh_srv.import_CKE(cke)

cke is G^Y mod P (with Y the secret value from the client) returned as its representation in bytes so that it can be readily transported over the network.

As in ECDH, client and server may now generate their shared secret:

>>> secret = dh_srv.generate_secret()
>>> dh_cli.generate_secret() == secret
True
>>> dh_srv.shared_secret == dh_cli.shared_secret
True

X.509 certificate writing and parsing

The mbedtls.x509 module can be used to parse X.509 certificates or create and verify a certificate chain.

Here, the trusted root is a self-signed CA certificate ca0_crt signed by ca0_key.

>>> import datetime as dt
>>>
>>> from mbedtls import hashlib
>>> from mbedtls import pk
>>> from mbedtls import x509
>>>
>>> now = dt.datetime.utcnow()
>>> ca0_key = pk.RSA()
>>> _ = ca0_key.generate()
>>> ca0_csr = x509.CSR.new(ca0_key, "CN=Trusted CA", hashlib.sha256())
>>> ca0_crt = x509.CRT.selfsign(
...     ca0_csr, ca0_key,
...     not_before=now, not_after=now + dt.timedelta(days=90),
...     serial_number=0x123456,
...     basic_constraints=x509.BasicConstraints(True, 1))
...

An intermediate then issues a Certificate Singing Request (CSR) that the root CA signs:

>>> ca1_key = pk.ECC()
>>> _ = ca1_key.generate()
>>> ca1_csr = x509.CSR.new(ca1_key, "CN=Intermediate CA", hashlib.sha256())
>>>
>>> ca1_crt = ca0_crt.sign(
...     ca1_csr, ca0_key, now, now + dt.timedelta(days=90), 0x123456,
...     basic_constraints=x509.BasicConstraints(ca=True, max_path_length=3))
...

And finally, the intermediate CA signs a certificate for the End Entity on the basis of a new CSR:

>>> ee0_key = pk.ECC()
>>> _ = ee0_key.generate()
>>> ee0_csr = x509.CSR.new(ee0_key, "CN=End Entity", hashlib.sha256())
>>>
>>> ee0_crt = ca1_crt.sign(
...     ee0_csr, ca1_key, now, now + dt.timedelta(days=90), 0x987654)
...

The emitting certificate can be used to verify the next certificate in the chain:

>>> ca1_crt.verify(ee0_crt)
True
>>> ca0_crt.verify(ca1_crt)
True

Note, however, that this verification is only one step in a private key infrastructure and does not take CRLs, path length, etc. into account.

TLS and DTLS client and server

The mbedtls.tls module provides TLS clients and servers. The API follows the recommendations of PEP 543. Note, however, that the Python standard SSL library does not follow the PEP so that this library may not be a drop-in replacement.

Connectionless DTLS is supported as well.

See examples in the programs/ directory of the repository and tests/test_tls.py.

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-2.4.0.tar.gz (103.4 kB view details)

Uploaded Source

Built Distributions

python_mbedtls-2.4.0-cp310-cp310-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.10 Windows x86-64

python_mbedtls-2.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.5 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

python_mbedtls-2.4.0-cp310-cp310-macosx_10_9_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

python_mbedtls-2.4.0-cp39-cp39-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.9 Windows x86-64

python_mbedtls-2.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.6 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

python_mbedtls-2.4.0-cp39-cp39-macosx_10_9_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

python_mbedtls-2.4.0-cp38-cp38-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.8 Windows x86-64

python_mbedtls-2.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.7 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

python_mbedtls-2.4.0-cp38-cp38-macosx_10_9_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

python_mbedtls-2.4.0-cp37-cp37m-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.7m Windows x86-64

python_mbedtls-2.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

python_mbedtls-2.4.0-cp37-cp37m-macosx_10_9_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: python-mbedtls-2.4.0.tar.gz
  • Upload date:
  • Size: 103.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for python-mbedtls-2.4.0.tar.gz
Algorithm Hash digest
SHA256 e4a0baa8bf9488073823ebbc21f54b1844e556988f9f0a2abf5920ce6e93ffe8
MD5 51094508da357ff3282c9014d19b58f7
BLAKE2b-256 1a4e2f695b0d60e1fc5fb64b06ca47d24c692c52862e2fbbfa12efd5f87d3ce9

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.4.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 689978aef157161e09be9799db90d4d319a7ce03a4c2aeec2aef6e07bfa75d0d
MD5 d0ee5e982d89654e37fc6579f1ee199c
BLAKE2b-256 1dfa36266d51f193a277b34360775d7bf8f298232a52e331a91e71dd982b5655

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 75680d4474fba9f110107ea55ed27e8882036cf13c8bd09abc36c4c52cd53e86
MD5 e816fc87b7b036bf71e0e7e3fb438b7b
BLAKE2b-256 3a31fb044f8d4a2d426dac4c9a2db474536f13233d89f9626bcbb1d36a475d1b

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.4.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.4.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1accee399aa9e40754fb0e0c3ef158bfcb580ea3a9c74dde0c9d07aa7bbe9ea7
MD5 cd6e2791ff671332a4fec874f7c7ea20
BLAKE2b-256 daaca6057e8c527ae56f03b2138a7ae0ff69d5dc354d982b2f076c24a7ef92bc

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.4.0-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.4.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 876feb34dc4aae6cd66941ca2096e3671afeb21895dac0048b80fdb1dcbc587c
MD5 7428000241729a6e0f7d57f8aab69ed3
BLAKE2b-256 1d80ac23b51e5af09d210474a254a462a40ac8fb996c682d400c2d320e812fae

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 84ecaac477a062e17d4ab66e725d79358f83c025f9acc8a2a20e61162b4911ad
MD5 264bc0d5c699d53a61a03d768132f462
BLAKE2b-256 af251dce9a846aac16f510906b322757fb1f95075cb90c9869dbebad496cfdd9

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.4.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.4.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d99a157ef34b5a830024643f0fb9d2df2cb619899e9a9a9d89a395eca11d7a5a
MD5 4e7ed155044f0bfe07eb865543073e35
BLAKE2b-256 8643cad993d6ab0b81b137d00d117aaad482d46fef21ba22365ec7bbec2c485f

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.4.0-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.4.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 d28a69c49659a7aba6a8ba17fcfee56c336d7e72303a40cb403cfbf54b86d7fb
MD5 f13046be905de8b036aa018319212641
BLAKE2b-256 061d2972d072e3d2d7ad744792d47d8566a875641e07ed6eda0556d0e7aa86be

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f42ae96645bb4dfa90ff0a258793edcfefc9812ce644f754ff1b989409e349db
MD5 8fae3ed36d2da42e2ea11bba49f0aa01
BLAKE2b-256 c8e32789f8f64b6ce2b992b0aa633cec595e349dd5c42eeeeeaabf4bc6cc28e1

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.4.0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.4.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3a1cbfaf63190dbdaf993752ebd369756343a540fa838af6cb35fb41ed34006c
MD5 295bd12dca16eeca3ffa73cf0133cde0
BLAKE2b-256 c486e393c2bfa3ec4c2c8e99b06ab46fd9a6813b1cda89d55e2cf914193f8b89

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.4.0-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.4.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 9d01b33f05bbfdf6267e101f8d6317db092f52d7a5925400af3fb184b886724b
MD5 08c1447343f6c58009cd6ade67933975
BLAKE2b-256 dc44be5df2f246b42a236906325b65258b0d138b1d71857f9c528ac084c0d30c

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 97615ae792eb3e5ba3d65e801983f9e15d6ca587340f2ecdeb08d2af86313a2a
MD5 9219af7529624195749078bb9e3f5479
BLAKE2b-256 e39e506dc5ce57f64b9e146bb2b86f10cb122048914371f1cda66afd09f4f1d7

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.4.0-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.4.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0275aad6d547e5363d9b0815ec3db864900780ea3f3a3a76a0d3915278979d64
MD5 9245d0f0dfa3c15664469dae0425d487
BLAKE2b-256 2d33f488f1d31c5e39cb130f0018019e09095e74bf1df11bc6c50bc076b57878

See more details on using hashes here.

Supported by

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