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:

  • 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.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 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.3.0.tar.gz (100.1 kB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.10 Windows x86-64

python_mbedtls-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.6 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

python_mbedtls-2.3.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.3.0-cp39-cp39-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.9 Windows x86-64

python_mbedtls-2.3.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.3.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.3.0-cp38-cp38-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.8 Windows x86-64

python_mbedtls-2.3.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.3.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.3.0-cp37-cp37m-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.7m Windows x86-64

python_mbedtls-2.3.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.3.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.3.0.tar.gz.

File metadata

  • Download URL: python-mbedtls-2.3.0.tar.gz
  • Upload date:
  • Size: 100.1 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.3.0.tar.gz
Algorithm Hash digest
SHA256 fc1102ae740c6f1afeaeef1e45b273733e52ee2489f32f5f6c64967193d97478
MD5 775fc7a8302a19fbb966485b9168b80b
BLAKE2b-256 50e77b327762192170ce78a4a37d4e4856e8d4e3ef4ad3c5e2a5540ba1735088

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.3.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 0b6b4a54068c53f207c076f64f6172249e23940d0bd072562e224277db350f15
MD5 9f8ef4918096a808565a9a37d5e4a817
BLAKE2b-256 bed34dc8bcddfe758ee4fb1db9556ce044c12978134431254eb4133bb2e76468

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e2a04c751631219d2a4952a20da0e39ae62d3df7a07320a71beb55be7c243405
MD5 36ac0d22a10e67653efd084ff15631c0
BLAKE2b-256 915da4f2ebffb2e880bf85fb5b70def1634b78a0ba1897473a866ffd3c32491d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.3.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5996832ac1600846c4211c6a2fa490588875f1a2fb3859775de383f81038f3f5
MD5 c6c53ff6e1418d702863d7e692edf77b
BLAKE2b-256 63aaa0cec36510374725954383c9ffb146ec0d4e4067e4ced453fd746a6520e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.3.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 bfddabe2af2021d938309def1d0e6b163d4bf87420636cccf9408e3b1e396623
MD5 4a9074233bab885ba92b4a8624549583
BLAKE2b-256 acb84eb6e4d4ae1e07fc0da0c852be271f82d7947a585c5c6d7cbcb8f464380b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2e1f3f4f75670021131f5277a5d8aec0c7770748d290b436b24544e54d3975e7
MD5 ec8dd311948534ee8f32caaa0c442bda
BLAKE2b-256 76521635e03c2c8cd84c2525ac90cefc2ccd1a1d549d73a86082fabaeb975869

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.3.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8bccddc6fe4215a7e9b6140713757588aff26d1755762d9569263d0ec9bffcc6
MD5 9f0934304b72485e1c8335e82b073662
BLAKE2b-256 aac87b14d544f2615763f909ebbfaf084360509df1f2138a4bdc4e3d24c5854e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.3.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 287642405c67ab3c90dce3e1a1f653e76d7dda7b51c1b7f76318905f9e97e840
MD5 65d982a79ad3d7449be571e5028afc2d
BLAKE2b-256 777395c8015ef4ebe3985504b812f937bf74205107e97f50babd84c353f2ad1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f256f132275bf45af8c2118a800220e1da9ceab1e6eeaf3782e0eba71963fc90
MD5 237d9248dfa7a3655d813a241c31749d
BLAKE2b-256 bda1f4866e5be902241754d6048092ce7337e74c3cddad80b30a31d128d46e42

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.3.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 13cc042c3f03c21f3aaa85005cfa096ca030983ac6c922d4d1c5aa383c9cc1bc
MD5 213e0b0fc729e499a4e98dcc1551be30
BLAKE2b-256 bdfb8b4c23cb0b6a9406d0d66ab3e53ab93792e9ceaf59eed060b682e61d34e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.3.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 a6f4457c1ff583e1aa6f7d0475ed3413a926fdf026f95479e47d90e4d4f60d80
MD5 bda4e18f582bb84be57b470b4acba063
BLAKE2b-256 a6c25082046ffc016e5255fefbea72caa9cc1953bf377891a5314f60818c3948

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6de98b110586e47e29ad03da0f5cf9e4e76495597df9ff292677326dd209ba7e
MD5 16a87fe4b0cb36c28e9350e3eb6ff2e4
BLAKE2b-256 26739489551c875499e591c5aaffb7118af6f60ec8d19691ed05b768563aca48

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.3.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 88876f1f163d83d8aab3a6b82d88d3a5611b33355f7decc4d71e13c7824a1a09
MD5 2f818351e7ab4c0db8aaeb24a3d6138c
BLAKE2b-256 2fcdae404561832a17f7987532290b3e7b904554b3a0ca59b5056912d7ed9d62

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