aboutsummaryrefslogtreecommitdiff
path: root/openssl/src/asn1/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'openssl/src/asn1/mod.rs')
-rw-r--r--openssl/src/asn1/mod.rs41
1 files changed, 37 insertions, 4 deletions
diff --git a/openssl/src/asn1/mod.rs b/openssl/src/asn1/mod.rs
index 7d209775..1eab9f04 100644
--- a/openssl/src/asn1/mod.rs
+++ b/openssl/src/asn1/mod.rs
@@ -1,15 +1,19 @@
use libc::c_long;
-use std::ptr;
+use std::{ptr, fmt};
+use std::marker::PhantomData;
+use std::ops::Deref;
+use bio::MemBio;
use ffi;
use error::ErrorStack;
-pub struct Asn1Time(*mut ffi::ASN1_TIME);
+/// Corresponds to the ASN.1 structure Time defined in RFC5280
+pub struct Asn1Time(Asn1TimeRef<'static>);
impl Asn1Time {
/// Wraps existing ASN1_TIME and takes ownership
pub unsafe fn from_ptr(handle: *mut ffi::ASN1_TIME) -> Asn1Time {
- Asn1Time(handle)
+ Asn1Time(Asn1TimeRef::from_ptr(handle))
}
fn from_period(period: c_long) -> Result<Asn1Time, ErrorStack> {
@@ -25,6 +29,24 @@ impl Asn1Time {
pub fn days_from_now(days: u32) -> Result<Asn1Time, ErrorStack> {
Asn1Time::from_period(days as c_long * 60 * 60 * 24)
}
+}
+
+impl Deref for Asn1Time {
+ type Target = Asn1TimeRef<'static>;
+
+ fn deref(&self) -> &Asn1TimeRef<'static> {
+ &self.0
+ }
+}
+
+/// A borrowed Asn1Time
+pub struct Asn1TimeRef<'a>(*mut ffi::ASN1_TIME, PhantomData<&'a ()>);
+
+impl<'a> Asn1TimeRef<'a> {
+ /// Creates a new `Asn1TimeRef` wrapping the provided handle.
+ pub unsafe fn from_ptr(handle: *mut ffi::ASN1_TIME) -> Asn1TimeRef<'a> {
+ Asn1TimeRef(handle, PhantomData)
+ }
/// Returns the raw handle
pub fn as_ptr(&self) -> *mut ffi::ASN1_TIME {
@@ -32,8 +54,19 @@ impl Asn1Time {
}
}
+impl<'a> fmt::Display for Asn1TimeRef<'a> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ let mem_bio = try!(MemBio::new());
+ let as_str = unsafe {
+ try_ssl!(ffi::ASN1_TIME_print(mem_bio.as_ptr(), self.0));
+ String::from_utf8_unchecked(mem_bio.get_buf().to_owned())
+ };
+ write!(f, "{}", as_str)
+ }
+}
+
impl Drop for Asn1Time {
fn drop(&mut self) {
- unsafe { ffi::ASN1_TIME_free(self.0) };
+ unsafe { ffi::ASN1_TIME_free(self.as_ptr()) };
}
}