diff --git a/openssl/src/asn1/mod.rs b/openssl/src/asn1/mod.rs index 40b6e0f7..4fb4c7cf 100644 --- a/openssl/src/asn1/mod.rs +++ b/openssl/src/asn1/mod.rs @@ -1,17 +1,19 @@ use libc::c_long; -use std::ptr; -use std::fmt; +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); -use bio::MemBio; +/// 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 { @@ -27,6 +29,24 @@ impl Asn1Time { pub fn days_from_now(days: u32) -> Result { 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 { @@ -34,11 +54,11 @@ impl Asn1Time { } } -impl fmt::Display for 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 { - ffi::ASN1_TIME_print(mem_bio.handle(), self.handle); + ffi::ASN1_TIME_print(mem_bio.as_ptr(), self.0); String::from_utf8_unchecked(mem_bio.get_buf().to_owned()) }; write!(f, "{}", as_str) @@ -47,6 +67,6 @@ impl fmt::Display for Asn1Time { impl Drop for Asn1Time { fn drop(&mut self) { - unsafe { ffi::ASN1_TIME_free(self.0) }; + unsafe { ffi::ASN1_TIME_free(self.as_ptr()) }; } } diff --git a/openssl/src/x509/mod.rs b/openssl/src/x509/mod.rs index 851dd881..dc649f18 100644 --- a/openssl/src/x509/mod.rs +++ b/openssl/src/x509/mod.rs @@ -10,7 +10,7 @@ use std::collections::HashMap; use std::marker::PhantomData; use HashTypeInternals; -use asn1::Asn1Time; +use asn1::{Asn1Time, Asn1TimeRef}; use bio::{MemBio, MemBioSlice}; use crypto::hash; use crypto::hash::Type as HashType; @@ -434,18 +434,18 @@ impl<'a> X509Ref<'a> { } /// Returns Issuer validity notAfter - pub fn not_after(&self) -> Asn1Time { + pub fn not_after(&self) -> Asn1TimeRef { unsafe { - let date = ffi_extras::X509_get_notAfter(self.handle()); - Asn1Time::from_raw(date) + let date = ::c_helpers::rust_0_8_X509_get_notAfter(self.0); + Asn1TimeRef::from_ptr(date) } } /// Returns Issuer validity notBefore - pub fn not_before(&self) -> Asn1Time { + pub fn not_before(&self) -> Asn1TimeRef { unsafe { - let date = ffi_extras::X509_get_notBefore(self.handle()); - Asn1Time::from_raw(date) + let date = ::c_helpers::rust_0_8_X509_get_notBefore(self.0); + Asn1TimeRef::from_ptr(date) } }