Rust扩展,提供Python对信号协议的绑定
项目描述
signal-protocol
实验性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_address
的 recipient_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的散列
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e5b38a85a96aad71006c291ceea37ccab205d2c0d3c5ff09afdd0e542d73d08e |
|
MD5 | d51b77d24e20026ab4514a0d34320adb |
|
BLAKE2b-256 | 5816379859158b5fe638f1fe878494ad5e0a545495bb576988f567ea87bec641 |
signal_protocol-0.2.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 182b25441ec91ea36e562dbfe87aa29fadf271bb044b886bf4787ed3092a6041 |
|
MD5 | 18233c78a5b9d50a44580b015a2bf581 |
|
BLAKE2b-256 | 5ae33264113d0bec543eefd86d0b4be21cccbc78d772eddec26c51a09c47466f |
signal_protocol-0.2.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 92b705197f89e90a2e874eebe2ead30563a36e2df682a0dc07a17cb596e1be55 |
|
MD5 | dc687c870fe35f9545bdeffb930d0411 |
|
BLAKE2b-256 | b5d651c2ea57bf12df3fd4179eaf69a8f8fa6619cb7784cab7a24aa07d8e5f98 |
signal_protocol-0.2.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9620866d7db4fb130e304fc82163bf6cc6044f9cde92cfc6e4d157525e809413 |
|
MD5 | 45cf4ab99ab7252123d08434c02190d7 |
|
BLAKE2b-256 | 3f4fbc70ccdb50a84290e5fdf03a03e082ae4d51e0aa65b1ade301d2dd7cf512 |