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