use bao_boringssl_bridge::{PeerCertInfo, ssl_cipher_bits, ssl_cipher_name, ssl_cipher_version,
ssl_peer_cert_info, ssl_peer_certificates_der, ssl_protocol_version};
use bun_boringssl_sys::SSL;
#[derive(Clone, Debug, Default)]
pub struct BunTlsInfo {
pub protocol_version: Option<String>,
pub cipher_suite: Option<String>,
pub cipher_version: Option<String>,
pub cipher_bits: Option<i32>,
pub cipher_alg_bits: Option<i32>,
pub mac: Option<String>,
pub alpn: Option<Vec<u8>>,
pub peer_certificate: Option<PeerCertInfo>,
pub peer_certificates_der: Vec<Vec<u8>>,
}
impl BunTlsInfo {
pub unsafe fn from_ssl(ssl: *const SSL) -> Self {
let (cipher_bits, cipher_alg_bits) = match ssl_cipher_bits(ssl) {
Some((bits, alg_bits)) => (Some(bits), Some(alg_bits)),
None => (None, None),
};
let mut alpn_len: core::ffi::c_uint = 0;
let mut alpn_ptr: *const u8 = core::ptr::null();
unsafe { bun_boringssl_sys::SSL_get0_alpn_selected(ssl, &raw mut alpn_ptr, &raw mut alpn_len) };
let alpn = if alpn_ptr.is_null() || alpn_len == 0 {
None
} else {
Some(unsafe { core::slice::from_raw_parts(alpn_ptr, alpn_len as usize) }.to_vec())
};
Self {
protocol_version: ssl_protocol_version(ssl),
cipher_suite: ssl_cipher_name(ssl),
cipher_version: ssl_cipher_version(ssl),
cipher_bits,
cipher_alg_bits,
mac: None,
alpn,
peer_certificate: ssl_peer_cert_info(ssl),
peer_certificates_der: ssl_peer_certificates_der(ssl),
}
}
}