Skip to content

Commit c38bc2f

Browse files
authored
Merge pull request #2257 from bdbai/quic
Add some OpenSSL 3 QUIC raw bindings
2 parents 1b4c9b0 + d15df66 commit c38bc2f

27 files changed

+336
-43
lines changed

openssl-sys/build/cfgs.rs

+3
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ pub fn get(openssl_version: Option<u64>, libressl_version: Option<u64>) -> Vec<&
7171
} else {
7272
let openssl_version = openssl_version.unwrap();
7373

74+
if openssl_version >= 0x3_03_00_00_0 {
75+
cfgs.push("ossl330");
76+
}
7477
if openssl_version >= 0x3_02_00_00_0 {
7578
cfgs.push("ossl320");
7679
}

openssl-sys/build/main.rs

+1
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ fn main() {
119119
println!("cargo:rustc-check-cfg=cfg(ossl300)");
120120
println!("cargo:rustc-check-cfg=cfg(ossl310)");
121121
println!("cargo:rustc-check-cfg=cfg(ossl320)");
122+
println!("cargo:rustc-check-cfg=cfg(ossl330)");
122123

123124
check_ssl_kind();
124125

openssl-sys/build/run_bindgen.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ const INCLUDES: &str = "
5656
#include <openssl/provider.h>
5757
#endif
5858
59+
#if OPENSSL_VERSION_NUMBER >= 0x30200000
60+
#include <openssl/quic.h>
61+
#endif
62+
5963
#if defined(LIBRESSL_VERSION_NUMBER) || defined(OPENSSL_IS_BORINGSSL)
6064
#include <openssl/poly1305.h>
6165
#endif
@@ -70,8 +74,9 @@ pub fn run(include_dirs: &[PathBuf]) {
7074
.rust_target(RustTarget::Stable_1_47)
7175
.ctypes_prefix("::libc")
7276
.raw_line("use libc::*;")
77+
.raw_line("#[cfg(windows)] use std::os::windows::raw::HANDLE;")
7378
.raw_line("type evp_pkey_st = EVP_PKEY;")
74-
.allowlist_file(".*/openssl/[^/]+\\.h")
79+
.allowlist_file(".*[/\\\\]openssl/[^/\\\\]+\\.h")
7580
.allowlist_recursively(false)
7681
// libc is missing pthread_once_t on macOS
7782
.blocklist_type("CRYPTO_ONCE")
@@ -85,6 +90,8 @@ pub fn run(include_dirs: &[PathBuf]) {
8590
.blocklist_type("OSSL_FUNC_core_vset_error_fn")
8691
.blocklist_type("OSSL_FUNC_BIO_vprintf_fn")
8792
.blocklist_type("OSSL_FUNC_BIO_vsnprintf_fn")
93+
// struct hostent * does not exist on Windows
94+
.blocklist_function("BIO_gethostbyname")
8895
// Maintain compatibility for existing enum definitions
8996
.rustified_enum("point_conversion_form_t")
9097
// Maintain compatibility for pre-union definitions

openssl-sys/src/bio.rs

+44
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,47 @@ extern "C" {
7070
destroy: unsafe extern "C" fn(*mut BIO) -> c_int,
7171
) -> c_int;
7272
}
73+
74+
cfg_if! {
75+
if #[cfg(ossl320)] {
76+
use std::ptr;
77+
78+
pub const BIO_CTRL_DGRAM_GET_MTU: c_int = 41;
79+
pub const BIO_CTRL_DGRAM_SET_MTU: c_int = 42;
80+
pub const BIO_CTRL_DGRAM_GET_LOCAL_ADDR_CAP: c_int = 82;
81+
pub const BIO_CTRL_DGRAM_GET_LOCAL_ADDR_ENABLE: c_int = 83;
82+
pub const BIO_CTRL_DGRAM_SET_LOCAL_ADDR_ENABLE: c_int = 84;
83+
pub const BIO_CTRL_DGRAM_GET_CAPS: c_int = 86;
84+
pub const BIO_CTRL_DGRAM_SET_CAPS: c_int = 87;
85+
pub const BIO_CTRL_DGRAM_GET_NO_TRUNC: c_int = 88;
86+
pub const BIO_CTRL_DGRAM_SET_NO_TRUNC: c_int = 89;
87+
88+
pub unsafe fn BIO_dgram_get_no_trunc(bio: *mut BIO) -> c_int {
89+
BIO_ctrl(bio, BIO_CTRL_DGRAM_GET_NO_TRUNC, 0, ptr::null_mut()) as c_int
90+
}
91+
pub unsafe fn BIO_dgram_set_no_trunc(bio: *mut BIO, enable: c_int) -> c_int {
92+
BIO_ctrl(bio, BIO_CTRL_DGRAM_SET_NO_TRUNC, enable as c_long, ptr::null_mut()) as c_int
93+
}
94+
pub unsafe fn BIO_dgram_get_cap(bio: *mut BIO) -> u32 {
95+
BIO_ctrl(bio, BIO_CTRL_DGRAM_GET_CAPS, 0, ptr::null_mut()) as u32
96+
}
97+
pub unsafe fn BIO_dgram_set_cap(bio: *mut BIO, cap: u32) -> c_int {
98+
BIO_ctrl(bio, BIO_CTRL_DGRAM_SET_CAPS, cap as c_long, ptr::null_mut()) as c_int
99+
}
100+
pub unsafe fn BIO_dgram_get_local_addr_cap(bio: *mut BIO) -> c_int {
101+
BIO_ctrl(bio, BIO_CTRL_DGRAM_GET_LOCAL_ADDR_CAP, 0, ptr::null_mut()) as c_int
102+
}
103+
pub unsafe fn BIO_dgram_get_local_addr_enable(bio: *mut BIO, enable: *mut c_int) -> c_int {
104+
BIO_ctrl(bio, BIO_CTRL_DGRAM_GET_LOCAL_ADDR_ENABLE, 0, enable as *mut c_void) as c_int
105+
}
106+
pub unsafe fn BIO_dgram_set_local_addr_enable(bio: *mut BIO, enable: c_int) -> c_int {
107+
BIO_ctrl(bio, BIO_CTRL_DGRAM_SET_LOCAL_ADDR_ENABLE, enable as c_long, ptr::null_mut()) as c_int
108+
}
109+
pub unsafe fn BIO_dgram_get_mtu(bio: *mut BIO) -> c_uint {
110+
BIO_ctrl(bio, BIO_CTRL_DGRAM_GET_MTU, 0, ptr::null_mut()) as c_uint
111+
}
112+
pub unsafe fn BIO_dgram_set_mtu(bio: *mut BIO, mtu: c_uint) -> c_int {
113+
BIO_ctrl(bio, BIO_CTRL_DGRAM_SET_MTU, mtu as c_long, ptr::null_mut()) as c_int
114+
}
115+
}
116+
}

openssl-sys/src/err.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ pub const ERR_LIB_ASN1: c_int = 13;
99

1010
cfg_if! {
1111
if #[cfg(ossl300)] {
12-
pub const ERR_SYSTEM_FLAG: c_ulong = c_int::max_value() as c_ulong + 1;
13-
pub const ERR_SYSTEM_MASK: c_ulong = c_int::max_value() as c_ulong;
12+
pub const ERR_SYSTEM_FLAG: c_ulong = c_int::MAX as c_ulong + 1;
13+
pub const ERR_SYSTEM_MASK: c_ulong = c_int::MAX as c_ulong;
1414

1515
pub const ERR_LIB_OFFSET: c_ulong = 23;
1616
pub const ERR_LIB_MASK: c_ulong = 0xff;

openssl-sys/src/handwritten/bio.rs

+57
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,60 @@ extern "C" {
106106
destroy: Option<unsafe extern "C" fn(*mut BIO) -> c_int>,
107107
) -> c_int;
108108
}
109+
110+
#[cfg(ossl320)]
111+
extern "C" {
112+
pub fn BIO_meth_set_sendmmsg(
113+
biom: *mut BIO_METHOD,
114+
f: Option<
115+
unsafe extern "C" fn(
116+
arg1: *mut BIO,
117+
arg2: *mut BIO_MSG,
118+
arg3: usize,
119+
arg4: usize,
120+
arg5: u64,
121+
arg6: *mut usize,
122+
) -> c_int,
123+
>,
124+
) -> c_int;
125+
pub fn BIO_meth_set_recvmmsg(
126+
biom: *mut BIO_METHOD,
127+
f: Option<
128+
unsafe extern "C" fn(
129+
arg1: *mut BIO,
130+
arg2: *mut BIO_MSG,
131+
arg3: usize,
132+
arg4: usize,
133+
arg5: u64,
134+
arg6: *mut usize,
135+
) -> c_int,
136+
>,
137+
) -> c_int;
138+
pub fn BIO_new_bio_dgram_pair(
139+
bio1: *mut *mut BIO,
140+
writebuf1: usize,
141+
bio2: *mut *mut BIO,
142+
writebuf2: usize,
143+
) -> c_int;
144+
pub fn BIO_s_dgram_pair() -> *const BIO_METHOD;
145+
pub fn BIO_s_datagram() -> *const BIO_METHOD;
146+
pub fn BIO_get_rpoll_descriptor(b: *mut BIO, desc: *mut BIO_POLL_DESCRIPTOR) -> c_int;
147+
pub fn BIO_get_wpoll_descriptor(b: *mut BIO, desc: *mut BIO_POLL_DESCRIPTOR) -> c_int;
148+
pub fn BIO_sendmmsg(
149+
b: *mut BIO,
150+
msg: *mut BIO_MSG,
151+
stride: usize,
152+
num_msg: usize,
153+
flags: u64,
154+
msgs_processed: *mut usize,
155+
) -> c_int;
156+
pub fn BIO_recvmmsg(
157+
b: *mut BIO,
158+
msg: *mut BIO_MSG,
159+
stride: usize,
160+
num_msg: usize,
161+
flags: u64,
162+
msgs_processed: *mut usize,
163+
) -> c_int;
164+
pub fn BIO_err_is_non_fatal(errcode: c_uint) -> c_int;
165+
}

openssl-sys/src/handwritten/ssl.rs

+56
Original file line numberDiff line numberDiff line change
@@ -951,3 +951,59 @@ extern "C" {
951951
#[cfg(any(ossl110, libressl360))]
952952
pub fn SSL_get_security_level(s: *const SSL) -> c_int;
953953
}
954+
955+
#[cfg(ossl320)]
956+
extern "C" {
957+
pub fn OSSL_QUIC_client_method() -> *const SSL_METHOD;
958+
pub fn OSSL_QUIC_client_thread_method() -> *const SSL_METHOD;
959+
pub fn SSL_get_event_timeout(s: *mut SSL, tv: *mut timeval, is_infinite: *mut c_int) -> c_int;
960+
pub fn SSL_handle_events(s: *mut SSL) -> c_int;
961+
pub fn SSL_get_blocking_mode(s: *mut SSL) -> c_int;
962+
pub fn SSL_set_blocking_mode(s: *mut SSL, blocking: c_int) -> c_int;
963+
pub fn SSL_get_rpoll_descriptor(s: *mut SSL, desc: *mut BIO_POLL_DESCRIPTOR) -> c_int;
964+
pub fn SSL_get_wpoll_descriptor(s: *mut SSL, desc: *mut BIO_POLL_DESCRIPTOR) -> c_int;
965+
pub fn SSL_net_read_desired(s: *mut SSL) -> c_int;
966+
pub fn SSL_net_write_desired(s: *mut SSL) -> c_int;
967+
pub fn SSL_set1_initial_peer_addr(s: *mut SSL, peer_addr: *const BIO_ADDR) -> c_int;
968+
pub fn SSL_shutdown_ex(
969+
ssl: *mut SSL,
970+
flags: u64,
971+
args: *const SSL_SHUTDOWN_EX_ARGS,
972+
args_len: usize,
973+
) -> c_int;
974+
pub fn SSL_stream_conclude(ssl: *mut SSL, flags: u64) -> c_int;
975+
pub fn SSL_stream_reset(
976+
ssl: *mut SSL,
977+
args: *const SSL_STREAM_RESET_ARGS,
978+
args_len: usize,
979+
) -> c_int;
980+
pub fn SSL_get_stream_read_state(ssl: *mut SSL) -> c_int;
981+
pub fn SSL_get_stream_write_state(ssl: *mut SSL) -> c_int;
982+
pub fn SSL_get_conn_close_info(
983+
ssl: *mut SSL,
984+
info: *mut SSL_CONN_CLOSE_INFO,
985+
info_len: usize,
986+
) -> c_int;
987+
pub fn SSL_get0_connection(s: *mut SSL) -> *mut SSL;
988+
pub fn SSL_is_connection(s: *mut SSL) -> c_int;
989+
pub fn SSL_get_stream_type(s: *mut SSL) -> c_int;
990+
pub fn SSL_get_stream_id(s: *mut SSL) -> u64;
991+
pub fn SSL_new_stream(s: *mut SSL, flags: u64) -> *mut SSL;
992+
pub fn SSL_accept_stream(s: *mut SSL, flags: u64) -> *mut SSL;
993+
pub fn SSL_set_incoming_stream_policy(s: *mut SSL, policy: c_int, aec: u64) -> c_int;
994+
pub fn SSL_get_accept_stream_queue_len(s: *mut SSL) -> usize;
995+
pub fn SSL_set_default_stream_mode(s: *mut SSL, mode: u32) -> c_int;
996+
}
997+
998+
#[cfg(ossl330)]
999+
extern "C" {
1000+
pub fn SSL_write_ex2(
1001+
s: *mut SSL,
1002+
buf: *const c_void,
1003+
num: usize,
1004+
flags: u64,
1005+
written: *mut usize,
1006+
) -> c_int;
1007+
pub fn SSL_get_value_uint(s: *mut SSL, class_: u32, id: u32, v: *mut u64) -> c_int;
1008+
pub fn SSL_set_value_uint(s: *mut SSL, class_: u32, id: u32, v: u64) -> c_int;
1009+
}

openssl-sys/src/handwritten/types.rs

+35
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,20 @@ cfg_if! {
5252
}
5353
}
5454
}
55+
cfg_if! {
56+
if #[cfg(ossl320)] {
57+
pub enum BIO_ADDR {}
58+
pub enum BIO_POLL_DESCRIPTOR {}
59+
#[repr(C)]
60+
pub struct BIO_MSG {
61+
pub data: *mut c_void,
62+
pub data_len: usize,
63+
pub peer: *mut BIO_ADDR,
64+
pub local: *mut BIO_ADDR,
65+
pub flags: u64,
66+
}
67+
}
68+
}
5569
cfg_if! {
5670
if #[cfg(any(ossl110, libressl350))] {
5771
pub enum BIGNUM {}
@@ -1032,6 +1046,27 @@ cfg_if! {
10321046
}
10331047
}
10341048
}
1049+
cfg_if! {
1050+
if #[cfg(ossl320)] {
1051+
#[repr(C)]
1052+
pub struct SSL_CONN_CLOSE_INFO {
1053+
pub error_code: u64,
1054+
pub frame_type: u64,
1055+
pub reason: *const ::libc::c_char,
1056+
pub reason_len: usize,
1057+
pub flags: u32,
1058+
}
1059+
#[repr(C)]
1060+
pub struct SSL_SHUTDOWN_EX_ARGS {
1061+
pub quic_error_code: u64,
1062+
pub quic_reason: *const c_char,
1063+
}
1064+
#[repr(C)]
1065+
pub struct SSL_STREAM_RESET_ARGS {
1066+
pub quic_error_code: u64,
1067+
}
1068+
}
1069+
}
10351070

10361071
pub enum COMP_CTX {}
10371072

openssl-sys/src/ssl.rs

+70
Original file line numberDiff line numberDiff line change
@@ -644,3 +644,73 @@ pub unsafe fn SSL_session_reused(ssl: *mut SSL) -> c_int {
644644
pub const OPENSSL_INIT_LOAD_SSL_STRINGS: u64 = 0x00200000;
645645
#[cfg(ossl111b)]
646646
pub const OPENSSL_INIT_NO_ATEXIT: u64 = 0x00080000;
647+
648+
cfg_if! {
649+
if #[cfg(ossl330)] {
650+
pub const SSL_VALUE_CLASS_GENERIC: c_uint = 0;
651+
pub const SSL_VALUE_CLASS_FEATURE_REQUEST: c_uint = 1;
652+
pub const SSL_VALUE_CLASS_FEATURE_PEER_REQUEST: c_uint = 2;
653+
pub const SSL_VALUE_CLASS_FEATURE_NEGOTIATED: c_uint = 3;
654+
655+
pub const SSL_VALUE_NONE: c_uint = 0;
656+
pub const SSL_VALUE_QUIC_STREAM_BIDI_LOCAL_AVAIL: c_uint = 1;
657+
pub const SSL_VALUE_QUIC_STREAM_BIDI_REMOTE_AVAIL: c_uint = 2;
658+
pub const SSL_VALUE_QUIC_STREAM_UNI_LOCAL_AVAIL: c_uint = 3;
659+
pub const SSL_VALUE_QUIC_STREAM_UNI_REMOTE_AVAIL: c_uint = 4;
660+
pub const SSL_VALUE_QUIC_IDLE_TIMEOUT: c_uint = 5;
661+
pub const SSL_VALUE_EVENT_HANDLING_MODE: c_uint = 6;
662+
pub const SSL_VALUE_STREAM_WRITE_BUF_SIZE: c_uint = 7;
663+
pub const SSL_VALUE_STREAM_WRITE_BUF_USED: c_uint = 8;
664+
pub const SSL_VALUE_STREAM_WRITE_BUF_AVAIL: c_uint = 9;
665+
666+
pub const SSL_VALUE_EVENT_HANDLING_MODE_INHERIT: c_uint = 0;
667+
pub const SSL_VALUE_EVENT_HANDLING_MODE_IMPLICIT: c_uint = 1;
668+
pub const SSL_VALUE_EVENT_HANDLING_MODE_EXPLICIT: c_uint = 2;
669+
670+
pub unsafe fn SSL_get_generic_value_uint(ssl: *mut SSL, id: u32, value: *mut u64) -> c_int {
671+
SSL_get_value_uint(ssl, SSL_VALUE_CLASS_GENERIC, id, value)
672+
}
673+
pub unsafe fn SSL_set_generic_value_uint(ssl: *mut SSL, id: u32, value: u64) -> c_int {
674+
SSL_set_value_uint(ssl, SSL_VALUE_CLASS_GENERIC, id, value)
675+
}
676+
pub unsafe fn SSL_get_feature_request_uint(ssl: *mut SSL, id: u32, value: *mut u64) -> c_int {
677+
SSL_get_value_uint(ssl, SSL_VALUE_CLASS_FEATURE_REQUEST, id, value)
678+
}
679+
pub unsafe fn SSL_set_feature_request_uint(ssl: *mut SSL, id: u32, value: u64) -> c_int {
680+
SSL_set_value_uint(ssl, SSL_VALUE_CLASS_FEATURE_REQUEST, id, value)
681+
}
682+
pub unsafe fn SSL_get_feature_peer_request_uint(ssl: *mut SSL, id: u32, value: *mut u64) -> c_int {
683+
SSL_get_value_uint(ssl, SSL_VALUE_CLASS_FEATURE_PEER_REQUEST, id, value)
684+
}
685+
pub unsafe fn SSL_get_feature_negotiated_uint(ssl: *mut SSL, id: u32, value: *mut u64) -> c_int {
686+
SSL_get_value_uint(ssl, SSL_VALUE_CLASS_FEATURE_NEGOTIATED, id, value)
687+
}
688+
pub unsafe fn SSL_get_quic_stream_bidi_local_avail(ssl: *mut SSL, value: *mut u64) -> c_int {
689+
SSL_get_generic_value_uint(ssl, SSL_VALUE_QUIC_STREAM_BIDI_LOCAL_AVAIL, value)
690+
}
691+
pub unsafe fn SSL_get_quic_stream_bidi_remote_avail(ssl: *mut SSL, value: *mut u64) -> c_int {
692+
SSL_get_generic_value_uint(ssl, SSL_VALUE_QUIC_STREAM_BIDI_REMOTE_AVAIL, value)
693+
}
694+
pub unsafe fn SSL_get_quic_stream_uni_local_avail(ssl: *mut SSL, value: *mut u64) -> c_int {
695+
SSL_get_generic_value_uint(ssl, SSL_VALUE_QUIC_STREAM_UNI_LOCAL_AVAIL, value)
696+
}
697+
pub unsafe fn SSL_get_quic_stream_uni_remote_avail(ssl: *mut SSL, value: *mut u64) -> c_int {
698+
SSL_get_generic_value_uint(ssl, SSL_VALUE_QUIC_STREAM_UNI_REMOTE_AVAIL, value)
699+
}
700+
pub unsafe fn SSL_get_event_handling_mode(ssl: *mut SSL, value: *mut u64) -> c_int {
701+
SSL_get_generic_value_uint(ssl, SSL_VALUE_EVENT_HANDLING_MODE, value)
702+
}
703+
pub unsafe fn SSL_set_event_handling_mode(ssl: *mut SSL, value: u64) -> c_int {
704+
SSL_set_generic_value_uint(ssl, SSL_VALUE_EVENT_HANDLING_MODE, value)
705+
}
706+
pub unsafe fn SSL_get_stream_write_buf_size(ssl: *mut SSL, value: *mut u64) -> c_int {
707+
SSL_get_generic_value_uint(ssl, SSL_VALUE_STREAM_WRITE_BUF_SIZE, value)
708+
}
709+
pub unsafe fn SSL_get_stream_write_buf_avail(ssl: *mut SSL, value: *mut u64) -> c_int {
710+
SSL_get_generic_value_uint(ssl, SSL_VALUE_STREAM_WRITE_BUF_AVAIL, value)
711+
}
712+
pub unsafe fn SSL_get_stream_write_buf_used(ssl: *mut SSL, value: *mut u64) -> c_int {
713+
SSL_get_generic_value_uint(ssl, SSL_VALUE_STREAM_WRITE_BUF_USED, value)
714+
}
715+
}
716+
}

openssl-sys/src/tls1.rs

+18-2
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,16 @@ pub unsafe fn SSL_CTX_set_tlsext_servername_callback__fixed_rust(
7474
ctx: *mut SSL_CTX,
7575
cb: Option<unsafe extern "C" fn(*mut SSL, *mut c_int, *mut c_void) -> c_int>,
7676
) -> c_long {
77-
SSL_CTX_callback_ctrl__fixed_rust(ctx, SSL_CTRL_SET_TLSEXT_SERVERNAME_CB, mem::transmute(cb))
77+
SSL_CTX_callback_ctrl__fixed_rust(
78+
ctx,
79+
SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,
80+
mem::transmute::<
81+
std::option::Option<
82+
unsafe extern "C" fn(*mut SSL, *mut c_int, *mut libc::c_void) -> i32,
83+
>,
84+
std::option::Option<unsafe extern "C" fn()>,
85+
>(cb),
86+
)
7887
}
7988

8089
pub const SSL_TLSEXT_ERR_OK: c_int = 0;
@@ -90,7 +99,14 @@ pub unsafe fn SSL_CTX_set_tlsext_status_cb(
9099
ctx: *mut SSL_CTX,
91100
cb: Option<unsafe extern "C" fn(*mut SSL, *mut c_void) -> c_int>,
92101
) -> c_long {
93-
SSL_CTX_callback_ctrl__fixed_rust(ctx, SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB, mem::transmute(cb))
102+
SSL_CTX_callback_ctrl__fixed_rust(
103+
ctx,
104+
SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB,
105+
mem::transmute::<
106+
std::option::Option<unsafe extern "C" fn(*mut SSL, *mut c_void) -> i32>,
107+
std::option::Option<unsafe extern "C" fn()>,
108+
>(cb),
109+
)
94110
}
95111

96112
pub unsafe fn SSL_CTX_set_tlsext_status_arg(ctx: *mut SSL_CTX, arg: *mut c_void) -> c_long {

0 commit comments

Comments
 (0)