Skip to main content

security/
secure_transport.rs

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