Skip to main content
Join the official 2020 Python Developers SurveyStart the survey!

Python port of libsignal-protocol-java

Project description

Signal encryption library for Python.


This is a python port of [libsignal-protocol-java](
originally written by [Moxie Marlinspike](

Compare with
forked from
which is a php port.

Overview from original author's:

> This is a ratcheting forward secrecy protocol that works in synchronous
> and asynchronous messaging environments. The protocol overview is available
> [here](, and the details of the wire
> format are available [here](

Read rest of of details [here](

The library has some dependencies which are automatically pulled and installed
if you use the instructions below for your OS

- [protobuf 3.6+](
- [cryptography](
- [python-axolotl-curve25519](

## Linux

You need to have python headers installed, usually through installing a package called `python-dev`, then as superuser run:
python install

## Mac

I don't have mac to test. Send me instructions or a MacBook.

## Windows

- Install [mingw]( compiler
- Add mingw to your PATH
- In PYTHONPATH\Lib\distutils create a file called distutils.cfg and add these lines:


- Install gcc: ```mingw-get.exe install gcc```
- Install [zlib](
- ```python install```

This python port is done in an almost 1:1 mapping to the original java code.
Therefore any original documentation for the java code can be easily mapped
and used with this python port.

## Install time

At install time, a libaxolotl client needs to generate its identity keys, registration id, and

identityKeyPair = KeyHelper.generateIdentityKeyPair()
registrationId = KeyHelper.generateRegistrationId()
preKeys = KeyHelper.generatePreKeys(startId, 100)
lastResortKey = KeyHelper.generateLastResortKey()
signedPreKey = KeyHelper.generateSignedPreKey(identityKeyPair, 5)

#Store identityKeyPair somewhere durable and safe.
#Store registrationId somewhere durable and safe.

#Store preKeys in PreKeyStore.
#Store signed prekey in SignedPreKeyStore.

## Building a session

A libaxolotl client needs to implement four interfaces: IdentityKeyStore, PreKeyStore,
SignedPreKeyStore, and SessionStore. These will manage loading and storing of identity,
prekeys, signed prekeys, and session state.

Once those are implemented, building a session is fairly straightforward:

sessionStore = MySessionStore()
preKeyStore = MyPreKeyStore()
signedPreKeyStore = MySignedPreKeyStore()
identityStore = MyIdentityKeyStore()

# Instantiate a SessionBuilder for a remote recipientId + deviceId tuple.
sessionBuilder = SessionBuilder(sessionStore, preKeyStore, signedPreKeyStore,
identityStore, recipientId, deviceId)

# Build a session with a PreKey retrieved from the server.

sessionCipher = SessionCipher(sessionStore, recipientId, deviceId)
message = sessionCipher.encrypt("Hello world!")


python-axolotl is actively used in [yowsup]( to
support the new end to end encryption in WhatsApp

Licensed under the GPLv3:

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for libsignal, version 0.0.4
Filename, size File type Python version Upload date Hashes
Filename, size libsignal-0.0.4.tar.gz (40.3 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page