libsignal_rust/
keyhelper.rs

1use 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
9/// Generate identity key pair (same as generate_key_pair)
10pub fn generate_identity_key_pair() -> KeyPair {
11    generate_key_pair()
12}
13
14/// Generate registration ID (14-bit random number)
15pub 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
28/// Generate signed pre-key
29pub 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
53/// Generate pre-key
54pub 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}