Skip to main content

security/
key_agreement.rs

1use serde_json::Value;
2
3use crate::bridge;
4use crate::error::Result;
5
6#[derive(Debug)]
7pub struct AgreementPublicKey {
8    handle: bridge::Handle,
9}
10
11impl AgreementPublicKey {
12    pub fn type_id() -> usize {
13        crate::key::key_type_id()
14    }
15
16    fn from_handle(handle: bridge::Handle) -> Self {
17        Self { handle }
18    }
19
20    pub fn attributes(&self) -> Result<Value> {
21        let mut status = 0;
22        let mut error = std::ptr::null_mut();
23        let raw = unsafe {
24            bridge::security_key_copy_attributes(self.handle.as_ptr(), &mut status, &mut error)
25        };
26        bridge::required_json("security_key_copy_attributes", raw, status, error)
27    }
28}
29
30#[derive(Debug)]
31pub struct AgreementPrivateKey {
32    handle: bridge::Handle,
33}
34
35impl AgreementPrivateKey {
36    pub fn type_id() -> usize {
37        crate::key::key_type_id()
38    }
39
40    pub fn generate_p256() -> Result<Self> {
41        let mut status = 0;
42        let mut error = std::ptr::null_mut();
43        let raw = unsafe {
44            bridge::security_key_agreement_generate_p256_private_key(&mut status, &mut error)
45        };
46        bridge::required_handle(
47            "security_key_agreement_generate_p256_private_key",
48            raw,
49            status,
50            error,
51        )
52        .map(|handle| Self { handle })
53    }
54
55    pub fn public_key(&self) -> Result<AgreementPublicKey> {
56        let mut status = 0;
57        let mut error = std::ptr::null_mut();
58        let raw = unsafe {
59            bridge::security_key_copy_public_key(self.handle.as_ptr(), &mut status, &mut error)
60        };
61        bridge::required_handle("security_key_copy_public_key", raw, status, error)
62            .map(AgreementPublicKey::from_handle)
63    }
64
65    pub fn is_supported(&self) -> bool {
66        unsafe { bridge::security_key_agreement_is_supported(self.handle.as_ptr()) }
67    }
68
69    pub fn shared_secret(
70        &self,
71        peer_public_key: &AgreementPublicKey,
72        requested_size: usize,
73        shared_info: &[u8],
74    ) -> Result<Vec<u8>> {
75        let mut status = 0;
76        let mut error = std::ptr::null_mut();
77        let raw = unsafe {
78            bridge::security_key_agreement_compute_shared_secret(
79                self.handle.as_ptr(),
80                peer_public_key.handle.as_ptr(),
81                bridge::len_to_isize(requested_size)?,
82                shared_info.as_ptr().cast(),
83                bridge::len_to_isize(shared_info.len())?,
84                &mut status,
85                &mut error,
86            )
87        };
88        bridge::required_data(
89            "security_key_agreement_compute_shared_secret",
90            raw,
91            status,
92            error,
93        )
94    }
95}