Skip to main content

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

Project description

https://circleci.com/gh/Synss/python-mbedtls/tree/master.svg?style=svg 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:

  • PEP 272 – API for Block Encryption Algorithms v1.0

  • PEP 452 – API for Cryptographic Hash Functions v2.0

  • PEP 506 – Adding a Secret Module to the Standard Library

  • PEP 543 – A Unified TLS API for Python

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.0 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.0"
>>> _ = version.version_info  # (2, 28, 0)

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_srv = pk.ECDHServer()
>>> ecdh_cli = pk.ECDHClient()

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 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.

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

DTLS client and server

The mbedtls.tls module further provides DTLS (encrypted UDP traffic). Client and server must be bound and connected for the handshake so that DTLS should use recv() and send() 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.0.1.tar.gz (121.3 kB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.9 Windows x86-64

python_mbedtls-2.0.1-cp39-cp39-manylinux2010_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

python_mbedtls-2.0.1-cp39-cp39-manylinux1_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.9

python_mbedtls-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

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

Uploaded CPython 3.8 Windows x86-64

python_mbedtls-2.0.1-cp38-cp38-manylinux2010_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

python_mbedtls-2.0.1-cp38-cp38-manylinux1_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.8

python_mbedtls-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

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

Uploaded CPython 3.7m Windows x86-64

python_mbedtls-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl (5.5 MB view details)

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

python_mbedtls-2.0.1-cp37-cp37m-manylinux1_x86_64.whl (5.5 MB view details)

Uploaded CPython 3.7m

python_mbedtls-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: python-mbedtls-2.0.1.tar.gz
  • Upload date:
  • Size: 121.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.12

File hashes

Hashes for python-mbedtls-2.0.1.tar.gz
Algorithm Hash digest
SHA256 c4f079625d17ef3e2f44b69cd171be334541da758842e99ee96c4c1fca964f31
MD5 4d89f40589ae811eb318a3e634e34573
BLAKE2b-256 a5a761289b0db100489d691e18cde702fd06ed802d103eb5b017bdaebeadc196

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.0.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 ba5a29e4414a2d608718890715d58cb8fd675682a7059ae3dadbbc56d850004a
MD5 4d28e9056029337df6dbda46bc7913f9
BLAKE2b-256 a18263f3cf96843e7d2b11e87722c128d0a6181ca5387c9cfd5b94ebfaafdc4a

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.0.1-cp39-cp39-manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.0.1-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 ae3c58f906a84b2822ee5b1c672bf09b2a21e1e006f2346f8a0fb17106bf682d
MD5 d96289a17287a4a73d511b39ee6f3b1b
BLAKE2b-256 2a5128a57cfe1d63f7bfa37b9adcde2b7f448b6634de26bb37d62591f189c721

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.0.1-cp39-cp39-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.0.1-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d12184b5942939a8b4a346c41e5462731189c14b7ff329414e85c9ee462ec24a
MD5 44e3a5f4cf69dbbc6e96b805ade61e16
BLAKE2b-256 46206168554d383425b098603b41fda2ebdcaff1daa11bab0e56093b4c7ef33d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 36dde550ca08186e8a9b395d44a9a3867d3d3805905428e8a1c6e40e2137ff3d
MD5 b80673861aae2a9333759f0db30ac760
BLAKE2b-256 bb45bb77f9f77dc1fe20bf232edd6795e1b19ac359696b237361bdf2cfe9f369

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.0.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 1ed23add50e44664f664b3ddc5fdf1e36fd1958ac27b08d0c526443579c13b20
MD5 e44ce17d680b81323769a8a8d6f5bc84
BLAKE2b-256 52b18b90753830de949c1c732b9f705b817b5ed51f2980894268707b02e69cee

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.0.1-cp38-cp38-manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.0.1-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 be3891e743004538d5fa5710e873cd52ce14f00c7c5161cdc3e08ecf1d3b2d3f
MD5 e3bca10d5c5b78ff55f984de994e837f
BLAKE2b-256 909dabcf2225197f6e26eb8589ac878d082f818eb7ada0634e3f34be295af45d

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.0.1-cp38-cp38-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.0.1-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f883553394447b3f225667253b4da72a20ae972dddfa15e595f3a8f88b005147
MD5 1e5fef8e3876edb873354e53c0727d7c
BLAKE2b-256 7f4bf0f434071c9a8125852905594b479c4c0345d5c5a1f7b22e1b80c6604c3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 82584767f86ef43a23889d18904b50837610e3f4921d0a62ba0f089f630233a2
MD5 e67613babba628e00e4da227bb06c8a6
BLAKE2b-256 0090dd50d0676ebd8849003686f2e5d3457d2cbffdda4e68b271b501c1448f16

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.0.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 a5cb8cea238d133946f16551ff1cd0989eccf7dbabaa28dedf8c3336d68599b2
MD5 18ede2e3218074787bccd04b9d759bc1
BLAKE2b-256 1e677eb119f72971ce3d24728891e6ac914a9df4e069e093fba3bfea0cd22688

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 e6b6d338b5c99242a4c13f36c760682afbcf44b6a6f1590b51ac9759abce0fd8
MD5 f2341ccbb6efebe9ef1d3c782e2ee832
BLAKE2b-256 7531b6cf2f3f3e6d288c4c8d8d7c28ef49f0b5ca65e36d00faf261de1a80de80

See more details on using hashes here.

File details

Details for the file python_mbedtls-2.0.1-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for python_mbedtls-2.0.1-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c39e3efc20062500464a39a2b8216152e9ff2d27692fb7780611a66adb37aace
MD5 22e61aecce93f9460524a6114d9fb73d
BLAKE2b-256 36b373046304309210f616875f6f9e4168485e41fda0a0daabc70863499f20df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7034db2b3006ace130478d9b36a897b1821f12e1c49acce4b4d461fed8e4495f
MD5 657fbcf47add567ad1140ee5bf3e71e2
BLAKE2b-256 47c50f63ea88ffe362e40c10dc6a12c5768d3b60bd63e3c6d0b2a3f47a8a18ad

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