Commit 664600ea authored by Manuel Schölling's avatar Manuel Schölling
Browse files

Add DTLSv1 and DTLSv1.2 support

parent 5408b641
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ build = "build.rs"
tlsv1_2 = []
tlsv1_1 = []
dtlsv1 = []
dtlsv1_2 = []
sslv2 = []
aes_xts = []
npn = []
+4 −0
Original line number Diff line number Diff line
@@ -134,6 +134,7 @@ pub const SSL_CTRL_CLEAR_OPTIONS: c_int = 77;
pub const SSL_CTRL_SET_TLSEXT_HOSTNAME: c_int = 55;
pub const SSL_CTRL_EXTRA_CHAIN_CERT: c_int = 14;

pub const SSL_CTRL_SET_READ_AHEAD: c_int = 41;
pub const SSL_ERROR_NONE: c_int = 0;
pub const SSL_ERROR_SSL: c_int = 1;
pub const SSL_ERROR_SYSCALL: c_int = 5;
@@ -484,6 +485,8 @@ extern "C" {
    pub fn TLSv1_2_method() -> *const SSL_METHOD;
    #[cfg(feature = "dtlsv1")]
    pub fn DTLSv1_method() -> *const SSL_METHOD;
    #[cfg(feature = "dtlsv1_2")]
    pub fn DTLSv1_2_method() -> *const SSL_METHOD;
    pub fn SSLv23_method() -> *const SSL_METHOD;

    pub fn SSL_new(ctx: *mut SSL_CTX) -> *mut SSL;
@@ -507,6 +510,7 @@ extern "C" {

    pub fn SSL_CTX_new(method: *const SSL_METHOD) -> *mut SSL_CTX;
    pub fn SSL_CTX_free(ctx: *mut SSL_CTX);
    pub fn SSL_CTX_ctrl(ctx: *mut SSL_CTX, cmd: c_int, mode: c_long, parg: *mut c_void) -> c_long;
    pub fn SSL_CTX_set_verify(ctx: *mut SSL_CTX, mode: c_int,
                              verify_callback: Option<extern fn(c_int, *mut X509_STORE_CTX) -> c_int>);
    pub fn SSL_CTX_set_verify_depth(ctx: *mut SSL_CTX, depth: c_int);
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ keywords = ["crypto", "tls", "ssl", "dtls"]
tlsv1_2 = ["openssl-sys/tlsv1_2"]
tlsv1_1 = ["openssl-sys/tlsv1_1"]
dtlsv1 = ["openssl-sys/dtlsv1"]
dtlsv1_2 = ["openssl-sys/dtlsv1_2"]
sslv2 = ["openssl-sys/sslv2"]
aes_xts = ["openssl-sys/aes_xts"]
npn = ["openssl-sys/npn"]
+2 −0
Original line number Diff line number Diff line
@@ -18,3 +18,5 @@ pub mod bio;
pub mod crypto;
pub mod ssl;
pub mod x509;
#[macro_use]
extern crate log;
+7 −12
Original line number Diff line number Diff line
@@ -81,7 +81,6 @@ impl IntoSockaddrIn for SocketAddr {
				if res == 1 {
					Ok(SockaddrIn::V4(addr))
				} else {
					warn!("inet_pton() failed for IPv4: {}", ip);
					Err(Error::new(ErrorKind::Other,
						"calling inet_pton() for ipv4", None))
				}
@@ -158,12 +157,10 @@ impl<S: AsRawFd+?Sized> Read for ConnectedSocket<S> {
		let flags = 0;
		let ptr = buf.as_mut_ptr() as *mut c_void;

		debug!("recv'ing...");
		let len = unsafe {
			recv(self.as_raw_fd(), ptr, buf.len() as u64, flags)
		};

		debug!("recv'ed len={:?}", len);
		match len {
			-1 => {
				match errno() {
@@ -184,14 +181,12 @@ impl<S: AsRawFd+?Sized> Write for ConnectedSocket<S> {
		let flags = 0;
		let ptr = buf.as_ptr() as *const c_void;

		debug!("sending {:?}", buf.len());
		let res = unsafe {
			send(self.as_raw_fd(), ptr, buf.len() as u64, flags)
		};
		if res == (buf.len() as i64) {
			Ok(res as usize)
		} else {
			warn!("send() found {}, expected {}", res, buf.len());
			Err(Error::new(ErrorKind::Other, "send() failed", Some(os::error_string(os::errno() as i32))))
		}
	}
@@ -223,8 +218,8 @@ impl<S:AsRawFd> SetTimeout for S {
fn connect4_works() {
	let socket1 = UdpSocket::bind("127.0.0.1:34200").unwrap();
	let socket2 = UdpSocket::bind("127.0.0.1:34201").unwrap();
	let conn1 = socket1.connect("127.0.0.1:34200").unwrap();
	let conn2 = socket2.connect("127.0.0.1:34201").unwrap();
	socket1.connect("127.0.0.1:34200").unwrap();
	socket2.connect("127.0.0.1:34201").unwrap();
}

#[test]
@@ -273,26 +268,26 @@ fn sendrecv_respects_packet_borders() {
fn connect6_works() {
	let socket1 = UdpSocket::bind("::1:34200").unwrap();
	let socket2 = UdpSocket::bind("::1:34201").unwrap();
	let conn1 = socket1.connect("::1:34200").unwrap();
	let conn2 = socket2.connect("::1:34201").unwrap();
	socket1.connect("::1:34200").unwrap();
	socket2.connect("::1:34201").unwrap();
}

#[test]
#[should_fail]
#[should_panic]
fn detect_invalid_ipv4() {
	let s = UdpSocket::bind("127.0.0.1:34300").unwrap();
	s.connect("254.254.254.254:34200").unwrap();
}

#[test]
#[should_fail]
#[should_panic]
fn detect_invalid_ipv6() {
	let s = UdpSocket::bind("::1:34300").unwrap();
	s.connect("1200::AB00:1234::2552:7777:1313:34300").unwrap();
}

#[test]
#[should_fail]
#[should_panic]
fn double_bind() {
	let socket1 = UdpSocket::bind("127.0.0.1:34301").unwrap();
	let socket2 = UdpSocket::bind("127.0.0.1:34301").unwrap();
Loading