forked from sfackler/rust-openssl
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request sfackler#53 from vhbit/cert-gen
Certificate/PKey generation & PEM export
- Loading branch information
Showing
9 changed files
with
782 additions
and
313 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
pub mod ffi { | ||
#![allow(dead_code)] | ||
#![allow(non_camel_case_types)] | ||
use libc::{c_int, c_long, c_void}; | ||
|
||
pub type ASN1_INTEGER = c_void; | ||
pub type ASN1_TIME = c_void; | ||
pub type ASN1_STRING = c_void; | ||
|
||
pub static MBSTRING_FLAG: c_int = 0x1000; | ||
pub static MBSTRING_UTF8: c_int = MBSTRING_FLAG; | ||
pub static MBSTRING_ASC: c_int = MBSTRING_FLAG | 1; | ||
pub static MBSTRING_BMP: c_int = MBSTRING_FLAG | 2; | ||
pub static MBSTRING_UNIV: c_int = MBSTRING_FLAG | 4; | ||
|
||
pub static V_ASN1_UTCTIME: c_int = 23; | ||
pub static V_ASN1_GENERALIZEDTIME: c_int = 24; | ||
|
||
extern "C" { | ||
pub fn ASN1_STRING_type_new(ty: c_int) -> *mut ASN1_STRING; | ||
pub fn ASN1_INTEGER_set(dest: *mut ASN1_INTEGER, value: c_long) -> c_int; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
use libc::{c_void, c_int}; | ||
use std::io::{IoResult, IoError, OtherIoError}; | ||
use std::io::{Reader, Writer}; | ||
use std::ptr; | ||
|
||
use ssl::error::{SslError}; | ||
|
||
pub struct MemBio { | ||
bio: *mut ffi::BIO, | ||
owned: bool | ||
} | ||
|
||
impl Drop for MemBio { | ||
fn drop(&mut self) { | ||
if self.owned { | ||
unsafe { | ||
ffi::BIO_free_all(self.bio); | ||
} | ||
} | ||
} | ||
} | ||
|
||
impl MemBio { | ||
/// Creates a new owned memory based BIO | ||
pub fn new() -> Result<MemBio, SslError> { | ||
let bio = unsafe { ffi::BIO_new(ffi::BIO_s_mem()) }; | ||
try_ssl_null!(bio); | ||
|
||
Ok(MemBio { | ||
bio: bio, | ||
owned: true | ||
}) | ||
} | ||
|
||
/// Returns a "borrow", i.e. it has no ownership | ||
pub fn borrowed(bio: *mut ffi::BIO) -> MemBio { | ||
MemBio { | ||
bio: bio, | ||
owned: false | ||
} | ||
} | ||
|
||
/// Consumes current bio and returns wrapped value | ||
/// Note that data ownership is lost and | ||
/// should be handled manually | ||
pub unsafe fn unwrap(mut self) -> *mut ffi::BIO { | ||
self.owned = false; | ||
self.bio | ||
} | ||
|
||
/// Temporarily gets wrapped value | ||
pub unsafe fn get_handle(&self) -> *mut ffi::BIO { | ||
self.bio | ||
} | ||
} | ||
|
||
impl Reader for MemBio { | ||
fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> { | ||
let ret = unsafe { | ||
ffi::BIO_read(self.bio, buf.as_ptr() as *mut c_void, | ||
buf.len() as c_int) | ||
}; | ||
|
||
if ret < 0 { | ||
// FIXME: provide details from OpenSSL | ||
Err(IoError{kind: OtherIoError, desc: "mem bio read error", detail: None}) | ||
} else { | ||
Ok(ret as uint) | ||
} | ||
} | ||
} | ||
|
||
impl Writer for MemBio { | ||
fn write(&mut self, buf: &[u8]) -> IoResult<()> { | ||
let ret = unsafe { | ||
ffi::BIO_write(self.bio, buf.as_ptr() as *const c_void, | ||
buf.len() as c_int) | ||
}; | ||
if buf.len() != ret as uint { | ||
// FIXME: provide details from OpenSSL | ||
Err(IoError{kind: OtherIoError, desc: "mem bio write error", detail: None}) | ||
} else { | ||
Ok(()) | ||
} | ||
} | ||
} | ||
|
||
pub mod ffi { | ||
#![allow(non_camel_case_types)] | ||
|
||
use libc::{c_int, c_void}; | ||
|
||
pub type BIO = c_void; | ||
pub type BIO_METHOD = c_void; | ||
|
||
extern "C" { | ||
pub fn BIO_s_mem() -> *const BIO_METHOD; | ||
pub fn BIO_new(type_: *const BIO_METHOD) -> *mut BIO; | ||
pub fn BIO_free_all(a: *mut BIO); | ||
pub fn BIO_read(b: *mut BIO, buf: *mut c_void, len: c_int) -> c_int; | ||
pub fn BIO_write(b: *mut BIO, buf: *const c_void, len: c_int) -> c_int; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
#![macro_escape] | ||
|
||
macro_rules! try_ssl_stream { | ||
($e:expr) => ( | ||
match $e { | ||
Ok(ok) => ok, | ||
Err(err) => return Err(StreamError(err)) | ||
} | ||
) | ||
} | ||
|
||
/// Shortcut return with SSL error if something went wrong | ||
macro_rules! try_ssl_if { | ||
($e:expr) => ( | ||
if $e { | ||
return Err(SslError::get()) | ||
} | ||
) | ||
} | ||
|
||
/// Shortcut return with SSL error if last error result is 0 | ||
/// (default) | ||
macro_rules! try_ssl{ | ||
($e:expr) => (try_ssl_if!($e == 0)) | ||
} | ||
|
||
/// Shortcut return with SSL if got a null result | ||
macro_rules! try_ssl_null{ | ||
($e:expr) => (try_ssl_if!($e == ptr::null_mut())) | ||
} | ||
|
||
|
||
/// Lifts current SSL error code into Result<(), Error> | ||
/// if expression is true | ||
/// Lifting is actually a shortcut of the following form: | ||
/// | ||
/// ```ignore | ||
/// let _ = try!(something) | ||
/// Ok(()) | ||
/// ``` | ||
macro_rules! lift_ssl_if{ | ||
($e:expr) => ( { | ||
if $e { | ||
Err(SslError::get()) | ||
} else { | ||
Ok(()) | ||
} | ||
}) | ||
} | ||
|
||
/// Lifts current SSL error code into Result<(), Error> | ||
/// if SSL returned 0 (default error indication) | ||
macro_rules! lift_ssl { | ||
($e:expr) => (lift_ssl_if!($e == 0)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.