use wolfssl_sys as ffi;
use std::net::TcpStream;
use std::os::raw::c_int;
#[cfg(unix)]
use std::os::unix::io::AsRawFd;
#[cfg(windows)]
use std::os::windows::io::AsRawSocket;
use std::ffi::CStr;
use std::ffi::CString;
fn main() {
let site = "test.openquantumsafe.org";
let site_len = site.len() as u16;
let sitec = CString::new(site)
.expect("Couldn't convert URL to a c string")
.as_c_str()
.as_ptr() as *mut ::std::os::raw::c_void;
let port = 6067;
let pq_osa_ca = include_bytes!("test_certs/pq-osa-ca.crt");
let pq_osa_ca_size = pq_osa_ca.len() as std::os::raw::c_long;
let pq_osa_ca = pq_osa_ca as *const u8;
unsafe {
ffi::wolfSSL_Init();
let method = ffi::wolfTLSv1_3_client_method();
let context = ffi::wolfSSL_CTX_new(method);
ffi::wolfSSL_CTX_load_verify_buffer(
context,
pq_osa_ca,
pq_osa_ca_size,
ffi::WOLFSSL_FILETYPE_PEM as c_int,
);
ffi::wolfSSL_CTX_UseSNI(context, ffi::WOLFSSL_SNI_HOST_NAME as u8, sitec, site_len);
let ssl = ffi::wolfSSL_new(context);
let res = ffi::wolfSSL_UseKeyShare(ssl, ffi::WOLFSSL_SECP521R1MLKEM1024 as u16);
assert_eq!(res, ffi::WOLFSSL_SUCCESS as c_int);
let stream =
TcpStream::connect(format!("{site}:{port}")).expect("Couldn't connect to test site");
#[cfg(unix)]
ffi::wolfSSL_set_fd(ssl, stream.as_raw_fd());
#[cfg(windows)]
ffi::wolfSSL_set_fd(ssl, stream.as_raw_socket() as i32);
let res = ffi::wolfSSL_connect(ssl);
if res != ffi::WOLFSSL_SUCCESS as c_int {
println!(
"Connection failed with error: {}",
ffi::wolfSSL_get_error(ssl, res)
);
std::process::exit(-1);
}
println!("Connected to {site}");
println!(
"Key Exchange: {:?}",
CStr::from_ptr(ffi::wolfSSL_get_curve_name(ssl))
);
println!(
"Cipher: {:?}",
CStr::from_ptr(ffi::wolfSSL_get_cipher_name(ssl))
);
}
}