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.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_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.2.0.tar.gz (98.6 kB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.10 Windows x86-64

python_mbedtls-2.2.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.2.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.2.0-cp39-cp39-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.9 Windows x86-64

python_mbedtls-2.2.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.2.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.2.0-cp38-cp38-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.8 Windows x86-64

python_mbedtls-2.2.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.2.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.2.0-cp37-cp37m-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.7m Windows x86-64

python_mbedtls-2.2.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.2.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.2.0.tar.gz.

File metadata

  • Download URL: python-mbedtls-2.2.0.tar.gz
  • Upload date:
  • Size: 98.6 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.2.0.tar.gz
Algorithm Hash digest
SHA256 ecd748045d191ba804776edee0c25799e6696ab88f2229087d057d5aa38678fa
MD5 b7586adb887088dee4900e857e0b63b3
BLAKE2b-256 cc40f859e128399014774e46e7ac83866882f4d2541ade345992d1ff73bce7a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2faf40df514999519c5667cfe54e4d92dc3da433564618b5d9625d5366b8d616
MD5 efda027fcb7b82dcfc933f45436d451e
BLAKE2b-256 93c9cdb20c9b3781bfe2242183f40546ad666ff34c1d3fb995567d7a270b4bc9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 12b47410fd41de58ac63d2b8c15f5e92005911fc8c3094b92d034162fbf1c10d
MD5 a2a0ed8d505bcba6032689ed9602f365
BLAKE2b-256 fed454a499b2d4d78dd10992b7c23c632d8a0d941b6bf620773146e54c4e8cba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 08da2f4e08865d53213d0f1153efa02adaa6cd730d81af7e27e68d0fc061a6dd
MD5 98c505c7b385f33beb513eb3b35d9be4
BLAKE2b-256 ddcf22aef808b8d469a81df0d716df4cf20983435933b37124abdbd619f0a513

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.2.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 6ddbd912cb82c1b771696a5bf094b8e1377cfb3cac3df044e541d396180a7766
MD5 5f2c4490cb7bf5abfe3844216fc36f75
BLAKE2b-256 95e626669575d29ba4a8e33f41c5072134e6968fd1d045e57835e4bd8ae3a016

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 28bd7b56083a5982eb301366ac96855d02966a45c2d438dcecd733b8f6576100
MD5 aea7250025d553f9310d7a74bd2a9e4c
BLAKE2b-256 3ff61655113ddccefd2f157875daf00da47e7618960fb3970bc5284d36c94a1b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 741401c69bf909da74e1cb9159c8cb2c9c2841ab4780d4fbc1a29e43bf651f7e
MD5 4e59cb6593d2f24f89aa0432e379acd6
BLAKE2b-256 fbc70d475a589ecf790058eb20f4b18260c9b259738bf13503a66df3c2ca6a33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.2.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 443f6f6e25943abf1c038b6f3735edc9792204ee83e606d1d92bba6c81f071b3
MD5 7fe3cfd500dd87ddd4a249a24d92e95f
BLAKE2b-256 d75a79d20d002620e7d2e48a48874ce284eba0b60237a8f78d43bacdbe2b108e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f7fe9d4818a99e46714b30a14537d107e6137d6688a7d5df7fe253dd25d3e0cd
MD5 f1ef67ceca4ce7740bd97803ccf73aaf
BLAKE2b-256 e80ff512636995d1c9c7f6eb4c8919869f51a4d179fad31c9d6f3a7fe339dd30

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.2.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 47ea2ce594ba26388b454678745c0ff4da3ab4873c52b337b7ed5099647e96ee
MD5 e38ca9286f7a748cd23eb38b7f9f175c
BLAKE2b-256 1e80bc48071438d02f9bdefbad4751ab5e84816911a08e88c5ca509f1c04696a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.2.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 92f9202bcab4e3f69eff6a0785ace4f2e338057b0ebad7e950e9a794e268cea5
MD5 9db122147b611a402527a2cee108c685
BLAKE2b-256 6b1a66ede2af054732022697571c3bd8c17e4cb5553a9f2c055129c3510cbab0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f30adb80130912186737099ca5a174c79980b5d65435b679876caf313ae25a51
MD5 2d5ad415b1112fb7c41443b7b7ede909
BLAKE2b-256 d234aa07d5ea1d37c8d221f360750fcfa68a04859cdce6a4c35fbfd9a424241c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-2.2.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6f401783f96d8354b3851fa9f2aaeebfe750aca3113512210cda6c9ac0a4ce78
MD5 8d0dc4ccb9512c2f9f81b94b05334712
BLAKE2b-256 2d597c4180db477f2e64a2a191f2f7a9e7aeba9a0c992502e495c41c6b0cc093

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