跳转到主要内容

Rust扩展,提供Python对信号协议的绑定

项目描述

signal-protocol

CircleCI PyPI version

实验性Python绑定到Rust信号协议实现 libsignal-client。此项目使用PyO3定义一个signal_protocol Python模块。有关在Python分配的内存中存储秘密的基本限制,请参阅此处

⚠️自行承担风险!⚠️

安装

要使用轮分布,您不需要安装Rust工具链。只需运行

pip install signal-protocol

使用方法

初始客户端设置

以下演示了如何使用此库初始化新的Signal客户端。这是在协议开始之前必须完成的第一个步骤。

有关Signal协议的概述,请参阅此博客文章。详细的规范可在Signal处获取。

首先,导入这些模块

from signal_protocol import curve, identity_key, state, storage

每个客户端都必须生成一个长期身份密钥对。这应该存储在安全且持久的地方。

identity_key_pair = identity_key.IdentityKeyPair.generate()

客户端必须生成预密钥。示例生成了一个预密钥。在实际操作中,客户端将生成许多预密钥,因为它们是一次性使用,并且在发送来自新聊天参与者的消息时被消耗。

pre_key_pair = curve.KeyPair.generate()

客户端必须生成一个注册ID并将其存储在安全且持久的地方。

registration_id = 12  # TODO generate (not yet supported in upstream crate)

InMemSignalProtocolStore是一个单对象,提供所需的四个存储接口:IdentityKeyStore(用于自己的身份密钥状态和(公共)其他聊天参与者的身份密钥)、PreKeyStore(用于自己的预密钥状态)、SignedPreKeyStore(用于自己的签名预密钥)和SessionStore(用于与聊天参与者的已建立会话)。

store = storage.InMemSignalProtocolStore(identity_key_pair, registration_id)

客户端还应生成一个签名预密钥。

signed_pre_key_pair = curve.KeyPair.generate()
serialized_signed_pre_pub_key = signed_pre_key_pair.public_key().serialize()
signed_pre_key_signature = (
    store.get_identity_key_pair()
    .private_key()
    .calculate_signature(serialized_signed_pre_pub_key)
)

客户端应将其预密钥(一次性使用和签名)存储在协议存储中,并存储可以用于以后检索它们的ID。

pre_key_id = 10
pre_key_record = state.PreKeyRecord(pre_key_id, pre_key_pair)
store.save_pre_key(pre_key_id, pre_key_record)

signed_pre_key_id = 33
signed_prekey = state.SignedPreKeyRecord(
            signed_pre_key_id,
            42, # This is a timestamp since this key should be periodically rotated
            signed_pre_key_pair,
            signed_pre_key_signature,
        )
store.save_signed_pre_key(signed_pre_key_id, signed_prekey)

向新参与者发送消息

客户端初始化后,您可以创建会话并发送消息。

要创建会话,您必须从服务器获取接收者的预密钥包。这里的预密钥包是针对参与者 recipient_addressrecipient_bundle

from signal_protocol import session, session_cipher

session.process_prekey_bundle(
    recipient_address,
    store,
    recipient_bundle,
)

一旦处理完预密钥包(在本地协议存储中存储接收者的数据),您就可以加密消息了

ciphertext = session_cipher.message_encrypt(store, recipient_address, b"hello")

开发者入门指南

您需要在您的系统上安装 Rust 和 Python 3.7+。要将项目安装到您的虚拟环境中

pip install -r requirements.txt
python setup.py develop

然后运行测试 pytest -v tests/ 以确认一切正常。测试已从上游crate移植到Python。您可以使用这些测试作为如何使用库的参考。

在开发过程中,只需在修改时运行 python setup.py develop 重新构建库。此脚本将处理Rust端的编译。

构建轮子

请参阅此处的说明。简要来说

docker pull quay.io/pypa/manylinux2014_x86_64
docker run --rm -v `pwd`:/io quay.io/pypa/manylinux2014_x86_64 /io/build-wheels.sh

项目详细信息


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

此版本没有提供源分发文件。请参阅生成分发存档的教程。

构建分发

signal_protocol-0.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.6 MB 查看散列)

上传时间 CPython 3.9 manylinux: glibc 2.17+ x86-64

signal_protocol-0.2.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB 查看散列)

上传时间 CPython 3.8 manylinux: glibc 2.17+ x86-64

signal_protocol-0.2.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.8 MB 查看散列)

上传时间 CPython 3.7m manylinux: glibc 2.17+ x86-64

signal_protocol-0.2.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB 查看散列)

上传时间 CPython 3.6m manylinux: glibc 2.17+ x86-64

由以下支持