Skip to content
python bindings for the Olm C library
Branch: master
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
contrib/archlinux/pkgbuild
docs
include/olm olm: Add initial PK bindings. Oct 3, 2018
olm olm: Bump the version. Apr 10, 2019
tests utility: Use a bytearray for the signature buffer. Jan 22, 2019
.gitignore Add tox configuration. Mar 5, 2018
.travis.yml
LICENSE Initial commit. Mar 2, 2018
MANIFEST.in MANIFEST: add the pk.h file to the manifest. Oct 14, 2018
Makefile Makefile: Install the arch packages after the build is complete. Apr 10, 2019
README.md olm: Documentation and style fixes. Jul 8, 2018
olm_build.py olm: Add initial PK bindings. Oct 3, 2018
requirements.txt setup.py: Make the typing module a requirement only for old python ve… Jan 15, 2019
setup.cfg
setup.py setup.py: Add a dev sufix to the package name. Apr 10, 2019
test-requirements.txt
tox.ini Travis: Add python 3.7 as a target. Oct 3, 2018

README.md

python-olm

Travis Build Status Codecov Coverage Status

Python bindings for Olm.

This is a fork of the official python bindings for the Olm C library found here. The bindings were rewritten using CFFI for python.

The specification of the Olm cryptographic ratchet which is used for peer to peer sessions of this library can be found here.

The specification of the Megolm cryptographic ratchet which is used for group sessions of this library can be found here.

An example of the implementation of the Olm and Megolm cryptographic protocol can be found in the Matrix protocol for which the implementation guide can be found here.

The full API reference can be found here.

Accounts

Accounts create and hold the central identity of the Olm protocol, they consist of a fingerprint and identity key pair. They also produce one time keys that are used to start peer to peer encrypted communication channels.

Account Creation

A new account is created with the Account class, it creates a new Olm key pair. The public parts of the key pair are available using the identity_keys property of the class.

>>> alice = Account()
>>> alice.identity_keys
{'curve25519': '2PytGagXercwHjzQETLcMa3JOsaU2qkPIESaqoi59zE',
 'ed25519': 'HHpOuFYdHwoa54GxSttz9YmaTmbuVU3js92UTUjYJgM'}

One Time keys

One time keys need to be generated before people can start an encrypted peer to peer channel to an account.

>>> alice.generate_one_time_keys(1)
>>> alice.one_time_keys
{'curve25519': {'AAAAAQ': 'KiHoW6CIy905UC4V1Frmwr3VW8bTWkBL4uWtWFFllxM'}}

After the one time keys are published they should be marked as such so they aren't reused.

>>> alice.mark_keys_as_published()
>>> alice.one_time_keys
{'curve25519': {}}

Pickling

Accounts should be stored for later reuse, storing an account is done with the pickle method while the restoring step is done with the from_pickle class method.

>>> pickle = alice.pickle()
>>> restored = Account.from_pickle(pickle)

Sessions

Sessions are used to create an encrypted peer to peer communication channel between two accounts.

Session Creation

>>> alice = Account()
>>> bob = Account()
>>> bob.generate_one_time_keys(1)
>>> id_key = bob.identity_keys["curve25519"]
>>> one_time = list(bob.one_time_keys["curve25519"].values())[0]
>>> alice_session = OutboundSession(alice, id_key, one_time)

Encryption

After an outbound session is created an encrypted message can be exchanged:

>>> message = alice_session.encrypt("It's a secret to everybody")
>>> message.ciphertext
'AwogkL7RoakT9gnjcZMra+y39WXKRmnxBPEaEp6OSueIA0cSIJxGpBoP8YZ+CGweXQ10LujbXMgK88
xG/JZMQJ5ulK9ZGiC8TYrezNYr3qyIBLlecXr/9wnegvJaSFDmWDVOcf4XfyI/AwogqIZfAklRXGC5b
ZJcZxVxQGgJ8Dz4OQII8k0Dp8msUXwQACIQvagY1dO55Qvnk5PZ2GF+wdKnvj6Zxl2g'
>>> message.message_type
0

After the message is transfered, bob can create an InboundSession to decrypt the message.

>>> bob_session = InboundSession(bob, message)
>>> bob_session.decrypt(message)
"It's a secret to everybody"

Pickling

Sessions like accounts can be stored for later use the API is the same as for accounts.

>>> pickle = session.pickle()
>>> restored = Session.from_pickle(pickle)

Group Sessions

Group Sessions are used to create a one-to-many encrypted communication channel. The group session key needs to be shared with all participants that should be able to decrypt the group messages. Another thing to notice is that, since the group session key is ratcheted every time a message is encrypted, the session key should be shared before any messages are encrypted.

Group Session Creation

Group sessions aren't bound to an account like peer-to-peer sessions so their creation is straightforward.

>>> alice_group = OutboundGroupSession()
>>> bob_inbound_group = InboundGroupSession(alice_group.session_key)

Group Encryption

Group encryption is pretty simple. The important part is to share the session key with all participants over a secure channel (e.g. peer-to-peer Olm sessions).

>>> message = alice_group.encrypt("It's a secret to everybody")
>>> bob_inbound_group.decrypt(message)
("It's a secret to everybody", 0)

Pickling

Pickling works the same way as for peer-to-peer Olm sessions.

>>> pickle = session.pickle()
>>> restored = InboundGroupSession.from_pickle(pickle)
You can’t perform that action at this time.