security/
key_agreement.rs1use 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}