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 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}