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\x
>>> 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()
>>> rsa.has_private()
False
>>> rsa.generate()
>>> rsa.key_size
256
>>> rsa.has_private() and rsa.has_public()
True

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
>>> prv, pub = rsa.to_DER()
>>> other = pk.RSA()
>>> other.from_DER(pub)
>>> other.has_private()
False
>>> other.verify(b"Please sign here.", sig)
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.x509 import Certificate, CSR, CRL
>>> now = dt.datetime.utcnow()
>>> crt = Certificate(
...     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=hash.sha1(), serial=None)
...
>>> csr = CSR.new(subject_key, hash.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.

and load existing certificates from file:

>>> crl = CRL.from_file("ca/wp_crl.pem")

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

Uploaded Source

Built Distributions

File details

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

File metadata

File hashes

Hashes for python-mbedtls-0.9.0.tar.gz
Algorithm Hash digest
SHA256 eaa35e773fca37b954b803bb17df8022fe88f28a53f7e9e292ffe9514a989caa
MD5 f06ac05bb5af18d4cd06eeff071d9f82
BLAKE2b-256 d5e4b61f7dabcae1d77936789f6861476f6a4b903536d867501260a90a341832

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-0.9.0-py3.6-linux-x86_64.egg
Algorithm Hash digest
SHA256 0fb739ee1b144af8691759f5e4da6fd434c5ba152c47c4c40f20e2df32807a36
MD5 d4943bef5390f46e5b008e730099b988
BLAKE2b-256 633d90937c20d0bbc76a2fed9d00703b9f680232649009c10ae83169df6ce6c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-0.9.0-py3.5-linux-x86_64.egg
Algorithm Hash digest
SHA256 ee17e137e6de19ff07122e4ca0953164815ed055ce877d7319c6a8198403aebd
MD5 47f8a15a83e426d95b2a5845aeff0414
BLAKE2b-256 f1c59d9320551bc65cb3917add73495f046119b0253559ca4cce9878a1831bfa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-0.9.0-py3.4-linux-x86_64.egg
Algorithm Hash digest
SHA256 e445f52c532c05332d1f3aae329c4ab5815f4964f409f39e605d5bb38d44d235
MD5 30840f5b8ddbd22967c4d0d9b62da8b6
BLAKE2b-256 aa63664429a11496f77c2a178db8a11b2ceb66e8a30a5859752fa2e5d1300163

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-0.9.0-py2.7-linux-x86_64.egg
Algorithm Hash digest
SHA256 e7f2af99ce08fd7ced6d5f969dc52045588b0bfd64a83dbf1628ca644bc43f03
MD5 2243cc19f483578a99c32d9d819b4534
BLAKE2b-256 bd7e88397ff5c09cad261e11d74a0079403dc71972165a63173a1c02af3af683

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-0.9-py3.6-linux-x86_64.egg
Algorithm Hash digest
SHA256 fc499c6b8c85b48e7362c051b7ba224a79ae07fae5dabc1644f9df02490a015a
MD5 cf9342975098845d1b6b441a4611b1b6
BLAKE2b-256 a223a9cc9578135443783a6085ddeef1e8584416239fdc423cf5c066160b9f23

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-0.9-py3.5-linux-x86_64.egg
Algorithm Hash digest
SHA256 764c85af81183741f3486b2e15aae3ce7ab59201a7f404cdba47a01097d22ac3
MD5 84c80f12dacdabe18ac95ffd5579ff05
BLAKE2b-256 68e5e4bd30d48c6ed9a94571d7a377ac81f75fc0615a23ca0795c0cc617b9807

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-0.9-py3.4-linux-x86_64.egg
Algorithm Hash digest
SHA256 72a8c825aff0750f9d4be7760f89dd038640ee5ad1aa59ae79be62b8184ee7ac
MD5 168f5123258acf99312fc4d754877620
BLAKE2b-256 53d9e8bcf70051517d224d2427751b069404b1bcdd5573e5db9a5316a6771d9c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_mbedtls-0.9-py2.7-linux-x86_64.egg
Algorithm Hash digest
SHA256 21d1272853b2655d52bba81d514205e1a9e0d4baa6dcb5e4f276a565f9b8fe7d
MD5 5e2d1cecf8bfecc44c52c5c313ae3fbc
BLAKE2b-256 116a4aa0b02cdf17fffb0cd64ecd652d9a9854e13bdc64f297c0e2ce00c7bc8a

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