security/
secure_transport.rs1use serde::Deserialize;
2
3use crate::bridge;
4use crate::error::Result;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum ProtocolVersion {
8 Ssl2,
9 Ssl3,
10 Tls1_0,
11 Tls1_1,
12 Tls1_2,
13 Dtls1_0,
14 Tls1_3,
15}
16
17impl ProtocolVersion {
18 pub const fn as_str(self) -> &'static str {
19 match self {
20 Self::Ssl2 => "ssl2",
21 Self::Ssl3 => "ssl3",
22 Self::Tls1_0 => "tls1.0",
23 Self::Tls1_1 => "tls1.1",
24 Self::Tls1_2 => "tls1.2",
25 Self::Dtls1_0 => "dtls1.0",
26 Self::Tls1_3 => "tls1.3",
27 }
28 }
29}
30
31#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
32pub struct SecureTransportState {
33 pub side: String,
34 #[serde(rename = "sessionState")]
35 pub session_state: String,
36 #[serde(rename = "minimumProtocol")]
37 pub minimum_protocol: String,
38 #[serde(rename = "maximumProtocol")]
39 pub maximum_protocol: String,
40}
41
42#[derive(Debug)]
43pub struct SecureTransportContext {
44 handle: bridge::Handle,
45}
46
47impl SecureTransportContext {
48 pub fn client() -> Result<Self> {
49 create_context(bridge::security_secure_transport_create_client)
50 }
51
52 pub fn server() -> Result<Self> {
53 create_context(bridge::security_secure_transport_create_server)
54 }
55
56 pub fn set_protocol_min(&mut self, protocol: ProtocolVersion) -> Result<()> {
57 let protocol = bridge::cstring(protocol.as_str())?;
58 let mut error = std::ptr::null_mut();
59 let status = unsafe {
60 bridge::security_secure_transport_set_protocol_min(
61 self.handle.as_ptr(),
62 protocol.as_ptr(),
63 &mut error,
64 )
65 };
66 bridge::status_result("security_secure_transport_set_protocol_min", status, error)
67 }
68
69 pub fn set_protocol_max(&mut self, protocol: ProtocolVersion) -> Result<()> {
70 let protocol = bridge::cstring(protocol.as_str())?;
71 let mut error = std::ptr::null_mut();
72 let status = unsafe {
73 bridge::security_secure_transport_set_protocol_max(
74 self.handle.as_ptr(),
75 protocol.as_ptr(),
76 &mut error,
77 )
78 };
79 bridge::status_result("security_secure_transport_set_protocol_max", status, error)
80 }
81
82 pub fn state(&self) -> Result<SecureTransportState> {
83 let mut status = 0;
84 let mut error = std::ptr::null_mut();
85 let raw = unsafe {
86 bridge::security_secure_transport_copy_state(self.handle.as_ptr(), &mut status, &mut error)
87 };
88 bridge::required_json("security_secure_transport_copy_state", raw, status, error)
89 }
90}
91
92fn create_context(
93 create: unsafe extern "C" fn(*mut i32, *mut *mut std::ffi::c_void) -> *mut std::ffi::c_void,
94) -> Result<SecureTransportContext> {
95 let mut status = 0;
96 let mut error = std::ptr::null_mut();
97 let raw = unsafe { create(&mut status, &mut error) };
98 bridge::required_handle("security_secure_transport_create", raw, status, error).map(|handle| {
99 SecureTransportContext { handle }
100 })
101}