192f3ab15Sopenharmony_ciuse cfg_if::cfg_if; 292f3ab15Sopenharmony_ciuse libc::c_int; 392f3ab15Sopenharmony_ciuse std::marker::PhantomData; 492f3ab15Sopenharmony_ciuse std::ptr; 592f3ab15Sopenharmony_ciuse std::slice; 692f3ab15Sopenharmony_ci 792f3ab15Sopenharmony_ciuse crate::cvt_p; 892f3ab15Sopenharmony_ciuse crate::error::ErrorStack; 992f3ab15Sopenharmony_ci 1092f3ab15Sopenharmony_cipub struct MemBioSlice<'a>(*mut ffi::BIO, PhantomData<&'a [u8]>); 1192f3ab15Sopenharmony_ci 1292f3ab15Sopenharmony_ciimpl<'a> Drop for MemBioSlice<'a> { 1392f3ab15Sopenharmony_ci fn drop(&mut self) { 1492f3ab15Sopenharmony_ci unsafe { 1592f3ab15Sopenharmony_ci ffi::BIO_free_all(self.0); 1692f3ab15Sopenharmony_ci } 1792f3ab15Sopenharmony_ci } 1892f3ab15Sopenharmony_ci} 1992f3ab15Sopenharmony_ci 2092f3ab15Sopenharmony_ciimpl<'a> MemBioSlice<'a> { 2192f3ab15Sopenharmony_ci pub fn new(buf: &'a [u8]) -> Result<MemBioSlice<'a>, ErrorStack> { 2292f3ab15Sopenharmony_ci ffi::init(); 2392f3ab15Sopenharmony_ci 2492f3ab15Sopenharmony_ci assert!(buf.len() <= c_int::max_value() as usize); 2592f3ab15Sopenharmony_ci let bio = unsafe { 2692f3ab15Sopenharmony_ci cvt_p(BIO_new_mem_buf( 2792f3ab15Sopenharmony_ci buf.as_ptr() as *const _, 2892f3ab15Sopenharmony_ci buf.len() as crate::SLenType, 2992f3ab15Sopenharmony_ci ))? 3092f3ab15Sopenharmony_ci }; 3192f3ab15Sopenharmony_ci 3292f3ab15Sopenharmony_ci Ok(MemBioSlice(bio, PhantomData)) 3392f3ab15Sopenharmony_ci } 3492f3ab15Sopenharmony_ci 3592f3ab15Sopenharmony_ci pub fn as_ptr(&self) -> *mut ffi::BIO { 3692f3ab15Sopenharmony_ci self.0 3792f3ab15Sopenharmony_ci } 3892f3ab15Sopenharmony_ci} 3992f3ab15Sopenharmony_ci 4092f3ab15Sopenharmony_cipub struct MemBio(*mut ffi::BIO); 4192f3ab15Sopenharmony_ci 4292f3ab15Sopenharmony_ciimpl Drop for MemBio { 4392f3ab15Sopenharmony_ci fn drop(&mut self) { 4492f3ab15Sopenharmony_ci unsafe { 4592f3ab15Sopenharmony_ci ffi::BIO_free_all(self.0); 4692f3ab15Sopenharmony_ci } 4792f3ab15Sopenharmony_ci } 4892f3ab15Sopenharmony_ci} 4992f3ab15Sopenharmony_ci 5092f3ab15Sopenharmony_ciimpl MemBio { 5192f3ab15Sopenharmony_ci pub fn new() -> Result<MemBio, ErrorStack> { 5292f3ab15Sopenharmony_ci ffi::init(); 5392f3ab15Sopenharmony_ci 5492f3ab15Sopenharmony_ci let bio = unsafe { cvt_p(ffi::BIO_new(ffi::BIO_s_mem()))? }; 5592f3ab15Sopenharmony_ci Ok(MemBio(bio)) 5692f3ab15Sopenharmony_ci } 5792f3ab15Sopenharmony_ci 5892f3ab15Sopenharmony_ci pub fn as_ptr(&self) -> *mut ffi::BIO { 5992f3ab15Sopenharmony_ci self.0 6092f3ab15Sopenharmony_ci } 6192f3ab15Sopenharmony_ci 6292f3ab15Sopenharmony_ci pub fn get_buf(&self) -> &[u8] { 6392f3ab15Sopenharmony_ci unsafe { 6492f3ab15Sopenharmony_ci let mut ptr = ptr::null_mut(); 6592f3ab15Sopenharmony_ci let len = ffi::BIO_get_mem_data(self.0, &mut ptr); 6692f3ab15Sopenharmony_ci slice::from_raw_parts(ptr as *const _ as *const _, len as usize) 6792f3ab15Sopenharmony_ci } 6892f3ab15Sopenharmony_ci } 6992f3ab15Sopenharmony_ci 7092f3ab15Sopenharmony_ci #[cfg(not(boringssl))] 7192f3ab15Sopenharmony_ci pub unsafe fn from_ptr(bio: *mut ffi::BIO) -> MemBio { 7292f3ab15Sopenharmony_ci MemBio(bio) 7392f3ab15Sopenharmony_ci } 7492f3ab15Sopenharmony_ci} 7592f3ab15Sopenharmony_ci 7692f3ab15Sopenharmony_cicfg_if! { 7792f3ab15Sopenharmony_ci if #[cfg(any(ossl102, boringssl))] { 7892f3ab15Sopenharmony_ci use ffi::BIO_new_mem_buf; 7992f3ab15Sopenharmony_ci } else { 8092f3ab15Sopenharmony_ci #[allow(bad_style)] 8192f3ab15Sopenharmony_ci unsafe fn BIO_new_mem_buf(buf: *const ::libc::c_void, len: ::libc::c_int) -> *mut ffi::BIO { 8292f3ab15Sopenharmony_ci ffi::BIO_new_mem_buf(buf as *mut _, len) 8392f3ab15Sopenharmony_ci } 8492f3ab15Sopenharmony_ci } 8592f3ab15Sopenharmony_ci} 86