libsignal_protocol/keys/
pre_key.rs

1use crate::{errors::FromInternalErrorCode, keys::KeyPair, raw_ptr::Raw};
2use failure::Error;
3use std::{
4    fmt::{self, Debug, Formatter},
5    ptr,
6};
7
8/// An unsigned pre-key.
9#[derive(Clone)]
10pub struct PreKey {
11    pub(crate) raw: Raw<sys::session_pre_key>,
12}
13
14impl PreKey {
15    /// Create a new pre-key based on an identity key-pair.
16    pub fn new(id: u32, key_pair: &KeyPair) -> Result<PreKey, Error> {
17        unsafe {
18            let mut raw = ptr::null_mut();
19            sys::session_pre_key_create(&mut raw, id, key_pair.raw.as_ptr())
20                .into_result()?;
21
22            Ok(PreKey {
23                raw: Raw::from_ptr(raw),
24            })
25        }
26    }
27
28    /// Get the pre-key ID.
29    pub fn id(&self) -> u32 {
30        unsafe { sys::session_pre_key_get_id(self.raw.as_const_ptr()) }
31    }
32
33    /// Get this pre-key's key pair.
34    pub fn key_pair(&self) -> KeyPair {
35        unsafe {
36            let raw =
37                sys::session_pre_key_get_key_pair(self.raw.as_const_ptr());
38            assert!(!raw.is_null());
39            KeyPair {
40                raw: Raw::copied_from(raw),
41            }
42        }
43    }
44}
45
46impl_serializable!(PreKey, session_pre_key_serialize, foo);
47
48impl Debug for PreKey {
49    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
50        f.debug_struct("PreKey")
51            .field("key_pair", &self.key_pair())
52            .field("id", &self.id())
53            .finish()
54    }
55}