libsignal_rust/
keyhelper.rs1use crate::curve::{generate_key_pair, calculate_signature, KeyPair};
2use rand::Rng;
3
4#[allow(dead_code)]
5fn is_non_negative_integer(n: i64) -> bool {
6 n >= 0
7}
8
9pub fn generate_identity_key_pair() -> KeyPair {
11 generate_key_pair()
12}
13
14pub fn generate_registration_id() -> u32 {
16 let mut rng = rand::thread_rng();
17 let registration_id: u16 = rng.gen();
18 (registration_id as u32) & 0x3fff
19}
20
21#[derive(Debug, Clone)]
22pub struct SignedPreKey {
23 pub key_id: u32,
24 pub key_pair: KeyPair,
25 pub signature: Vec<u8>,
26}
27
28pub fn generate_signed_pre_key(identity_key_pair: &KeyPair, signed_key_id: u32) -> Result<SignedPreKey, Box<dyn std::error::Error + Send + Sync>> {
30 if identity_key_pair.priv_key.len() != 32 {
31 return Err("Invalid argument for identityKeyPair private key".into());
32 }
33 if identity_key_pair.pub_key.len() != 33 {
34 return Err("Invalid argument for identityKeyPair public key".into());
35 }
36
37 let key_pair = generate_key_pair();
38 let signature = calculate_signature(&identity_key_pair.priv_key, &key_pair.pub_key)?;
39
40 Ok(SignedPreKey {
41 key_id: signed_key_id,
42 key_pair,
43 signature,
44 })
45}
46
47#[derive(Debug, Clone)]
48pub struct PreKey {
49 pub key_id: u32,
50 pub key_pair: KeyPair,
51}
52
53pub fn generate_pre_key(key_id: u32) -> PreKey {
55 let key_pair = generate_key_pair();
56 PreKey {
57 key_id,
58 key_pair,
59 }
60}