Commit d136a6bb authored by Steven Fackler's avatar Steven Fackler
Browse files

Merge pull request #59 from jroesch/better-errors

Make errors human readable
parents b8fd300f a8cadc46
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -272,6 +272,12 @@ extern "C" {

    pub fn ERR_get_error() -> c_ulong;

    pub fn ERR_lib_error_string(err: c_ulong) -> *const c_char;
    pub fn ERR_func_error_string(err: c_ulong) -> *const c_char;
    pub fn ERR_reason_error_string(err: c_ulong) -> *const c_char;

    pub fn ERR_load_crypto_strings();

    pub fn EVP_md5() -> *const EVP_MD;
    pub fn EVP_ripemd160() -> *const EVP_MD;
    pub fn EVP_sha1() -> *const EVP_MD;
@@ -345,6 +351,8 @@ extern "C" {

    pub fn SSL_library_init() -> c_int;

    pub fn SSL_load_error_strings();

    #[cfg(feature = "sslv2")]
    pub fn SSLv2_method() -> *const SSL_METHOD;
    pub fn SSLv3_method() -> *const SSL_METHOD;
@@ -421,4 +429,3 @@ extern "C" {
    pub fn i2d_RSAPrivateKey(k: *mut RSA, buf: *const *mut u8) -> c_int;
    pub fn d2i_RSAPrivateKey(k: *const *mut RSA, buf: *const *const u8, len: c_uint) -> *mut RSA;
}
+22 −9
Original line number Diff line number Diff line
use libc::c_ulong;
use std::io::IoError;
use std::c_str::CString;

use ffi;

@@ -20,24 +21,36 @@ pub enum OpensslError {
    /// An unknown error
    UnknownError {
        /// The library reporting the error
        library: u8,
        library: String,
        /// The function reporting the error
        function: u16,
        function: String,
        /// The reason for the error
        reason: u16
        reason: String
    }
}

fn get_lib(err: c_ulong) -> u8 {
    ((err >> 24) & 0xff) as u8
fn get_lib(err: c_ulong) -> String {
    unsafe { CString::new(ffi::ERR_lib_error_string(err), false) }.to_string()
}

fn get_func(err: c_ulong) -> u16 {
    ((err >> 12) & 0xfff) as u16
fn get_func(err: c_ulong) -> String {
    unsafe { CString::new(ffi::ERR_func_error_string(err), false).to_string() }
}

fn get_reason(err: c_ulong) -> u16 {
    (err & 0xfff) as u16
fn get_reason(err: c_ulong) -> String {
    unsafe { CString::new(ffi::ERR_reason_error_string(err), false).to_string() }
}

#[test]
fn test_uknown_error_should_have_correct_messages() {
    let err = 336032784;
    let library = get_lib(err);
    let function = get_func(err);
    let reason = get_reason(err);

    assert_eq!(library.as_slice(),"SSL routines");
    assert_eq!(function.as_slice(), "SSL23_GET_SERVER_HELLO");
    assert_eq!(reason.as_slice(), "sslv3 alert handshake failure");
}

impl SslError {
+2 −0
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@ fn init() {
    unsafe {
        INIT.doit(|| {
            ffi::SSL_library_init();
            ffi::SSL_load_error_strings();
            ffi::ERR_load_crypto_strings();
            let verify_idx = ffi::SSL_CTX_get_ex_new_index(0, ptr::null(), None,
                                                           None, None);
            assert!(verify_idx >= 0);