Some documentation
This commit is contained in:
parent
f2f62be414
commit
59c05483da
11
error.rs
11
error.rs
|
|
@ -2,18 +2,27 @@ use std::libc::c_ulong;
|
||||||
|
|
||||||
use super::ffi;
|
use super::ffi;
|
||||||
|
|
||||||
|
/// An SSL error
|
||||||
#[deriving(ToStr)]
|
#[deriving(ToStr)]
|
||||||
pub enum SslError {
|
pub enum SslError {
|
||||||
|
/// The underlying stream has reported an EOF
|
||||||
StreamEof,
|
StreamEof,
|
||||||
|
/// The SSL session has been closed by the other end
|
||||||
SslSessionClosed,
|
SslSessionClosed,
|
||||||
|
/// An error in the OpenSSL library
|
||||||
OpenSslErrors(~[OpensslError])
|
OpenSslErrors(~[OpensslError])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// An error from the OpenSSL library
|
||||||
#[deriving(ToStr)]
|
#[deriving(ToStr)]
|
||||||
pub enum OpensslError {
|
pub enum OpensslError {
|
||||||
|
/// An unknown error
|
||||||
UnknownError {
|
UnknownError {
|
||||||
|
/// The library reporting the error
|
||||||
library: u8,
|
library: u8,
|
||||||
|
/// The function reporting the error
|
||||||
function: u16,
|
function: u16,
|
||||||
|
/// The reason for the error
|
||||||
reason: u16
|
reason: u16
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -31,6 +40,8 @@ fn get_reason(err: c_ulong) -> u16 {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SslError {
|
impl SslError {
|
||||||
|
/// Creates a new `OpenSslErrors` with the current contents of the error
|
||||||
|
/// stack.
|
||||||
pub fn get() -> SslError {
|
pub fn get() -> SslError {
|
||||||
let mut errs = ~[];
|
let mut errs = ~[];
|
||||||
loop {
|
loop {
|
||||||
|
|
|
||||||
21
lib.rs
21
lib.rs
|
|
@ -20,6 +20,10 @@ static mut FINISHED_INIT: AtomicBool = INIT_ATOMIC_BOOL;
|
||||||
|
|
||||||
static mut VERIFY_IDX: AtomicInt = INIT_ATOMIC_INT;
|
static mut VERIFY_IDX: AtomicInt = INIT_ATOMIC_INT;
|
||||||
|
|
||||||
|
/// Initializes the library.
|
||||||
|
///
|
||||||
|
/// This does not need to be manually called. It will automatically be called
|
||||||
|
/// when needed. Can be safely called multiple times on different threads.
|
||||||
pub fn init() {
|
pub fn init() {
|
||||||
unsafe {
|
unsafe {
|
||||||
if STARTED_INIT.swap(true, Acquire) {
|
if STARTED_INIT.swap(true, Acquire) {
|
||||||
|
|
@ -39,9 +43,13 @@ pub fn init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Determines the SSL method supported
|
||||||
pub enum SslMethod {
|
pub enum SslMethod {
|
||||||
|
/// Only support the SSLv3 protocol
|
||||||
Sslv3,
|
Sslv3,
|
||||||
|
/// Only support the TLSv1 protocol
|
||||||
Tlsv1,
|
Tlsv1,
|
||||||
|
/// Support the SSLv2, SSLv3 and TLSv1 protocols
|
||||||
Sslv23
|
Sslv23
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -55,8 +63,11 @@ impl SslMethod {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Determines the type of certificate verification used
|
||||||
pub enum SslVerifyMode {
|
pub enum SslVerifyMode {
|
||||||
|
/// Verify that the server's certificate is trusted
|
||||||
SslVerifyPeer = ffi::SSL_VERIFY_PEER,
|
SslVerifyPeer = ffi::SSL_VERIFY_PEER,
|
||||||
|
/// Do not verify the server's certificate
|
||||||
SslVerifyNone = ffi::SSL_VERIFY_NONE
|
SslVerifyNone = ffi::SSL_VERIFY_NONE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -77,8 +88,10 @@ extern "C" fn raw_verify(preverify_ok: c_int, x509_ctx: *ffi::X509_STORE_CTX)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The signature of functions that can be used to manually verify certificates
|
||||||
pub type VerifyCallback = extern "Rust" fn(preverify_ok: bool) -> bool;
|
pub type VerifyCallback = extern "Rust" fn(preverify_ok: bool) -> bool;
|
||||||
|
|
||||||
|
/// An SSL context object
|
||||||
pub struct SslContext {
|
pub struct SslContext {
|
||||||
priv ctx: *ffi::SSL_CTX
|
priv ctx: *ffi::SSL_CTX
|
||||||
}
|
}
|
||||||
|
|
@ -90,6 +103,7 @@ impl Drop for SslContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SslContext {
|
impl SslContext {
|
||||||
|
/// Attempts to create a new SSL context.
|
||||||
pub fn try_new(method: SslMethod) -> Result<SslContext, SslError> {
|
pub fn try_new(method: SslMethod) -> Result<SslContext, SslError> {
|
||||||
init();
|
init();
|
||||||
|
|
||||||
|
|
@ -101,6 +115,7 @@ impl SslContext {
|
||||||
Ok(SslContext { ctx: ctx })
|
Ok(SslContext { ctx: ctx })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A convenience wrapper around `try_new`.
|
||||||
pub fn new(method: SslMethod) -> SslContext {
|
pub fn new(method: SslMethod) -> SslContext {
|
||||||
match SslContext::try_new(method) {
|
match SslContext::try_new(method) {
|
||||||
Ok(ctx) => ctx,
|
Ok(ctx) => ctx,
|
||||||
|
|
@ -108,7 +123,7 @@ impl SslContext {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: support callback (see SSL_CTX_set_ex_data)
|
/// Configures the certificate verification method for new connections.
|
||||||
pub fn set_verify(&mut self, mode: SslVerifyMode,
|
pub fn set_verify(&mut self, mode: SslVerifyMode,
|
||||||
verify: Option<VerifyCallback>) {
|
verify: Option<VerifyCallback>) {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
@ -119,6 +134,7 @@ impl SslContext {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Specifies the file that contains trusted CA certificates.
|
||||||
pub fn set_CA_file(&mut self, file: &str) -> Option<SslError> {
|
pub fn set_CA_file(&mut self, file: &str) -> Option<SslError> {
|
||||||
let ret = do file.with_c_str |file| {
|
let ret = do file.with_c_str |file| {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
@ -251,6 +267,7 @@ impl<'self> MemBio<'self> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A stream wrapper which handles SSL encryption for an underlying stream.
|
||||||
pub struct SslStream<S> {
|
pub struct SslStream<S> {
|
||||||
priv stream: S,
|
priv stream: S,
|
||||||
priv ssl: Ssl,
|
priv ssl: Ssl,
|
||||||
|
|
@ -258,6 +275,7 @@ pub struct SslStream<S> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S: Stream> SslStream<S> {
|
impl<S: Stream> SslStream<S> {
|
||||||
|
/// Attempts to create a new SSL stream
|
||||||
pub fn try_new(ctx: &SslContext, stream: S) -> Result<SslStream<S>,
|
pub fn try_new(ctx: &SslContext, stream: S) -> Result<SslStream<S>,
|
||||||
SslError> {
|
SslError> {
|
||||||
let ssl = match Ssl::try_new(ctx) {
|
let ssl = match Ssl::try_new(ctx) {
|
||||||
|
|
@ -278,6 +296,7 @@ impl<S: Stream> SslStream<S> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A convenience wrapper around `try_new`.
|
||||||
pub fn new(ctx: &SslContext, stream: S) -> SslStream<S> {
|
pub fn new(ctx: &SslContext, stream: S) -> SslStream<S> {
|
||||||
match SslStream::try_new(ctx, stream) {
|
match SslStream::try_new(ctx, stream) {
|
||||||
Ok(stream) => stream,
|
Ok(stream) => stream,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue