summaryrefslogtreecommitdiffstats
path: root/vendor/schannel/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/schannel/src/lib.rs')
-rw-r--r--vendor/schannel/src/lib.rs114
1 files changed, 114 insertions, 0 deletions
diff --git a/vendor/schannel/src/lib.rs b/vendor/schannel/src/lib.rs
new file mode 100644
index 0000000..d071a69
--- /dev/null
+++ b/vendor/schannel/src/lib.rs
@@ -0,0 +1,114 @@
+//! Bindings to the Windows SChannel APIs.
+#![cfg(windows)]
+#![warn(missing_docs)]
+#![allow(non_upper_case_globals)]
+
+use std::ffi::c_void;
+use std::ptr;
+
+use windows_sys::Win32::Security::Authentication::Identity;
+
+macro_rules! inner {
+ ($t:path, $raw:ty) => {
+ impl crate::Inner<$raw> for $t {
+ unsafe fn from_inner(t: $raw) -> Self {
+ $t(t)
+ }
+
+ fn as_inner(&self) -> $raw {
+ self.0
+ }
+
+ fn get_mut(&mut self) -> &mut $raw {
+ &mut self.0
+ }
+ }
+
+ impl crate::RawPointer for $t {
+ unsafe fn from_ptr(t: *mut ::std::os::raw::c_void) -> $t {
+ $t(t as _)
+ }
+
+ unsafe fn as_ptr(&self) -> *mut ::std::os::raw::c_void {
+ self.0 as *mut _
+ }
+ }
+ };
+}
+
+/// Allows access to the underlying schannel API representation of a wrapped data type
+///
+/// Performing actions with internal handles might lead to the violation of internal assumptions
+/// and therefore is inherently unsafe.
+pub trait RawPointer {
+ /// Constructs an instance of this type from its handle / pointer.
+ /// # Safety
+ /// This function is unsafe
+ unsafe fn from_ptr(t: *mut ::std::os::raw::c_void) -> Self;
+
+ /// Get a raw pointer from the underlying handle / pointer.
+ /// # Safety
+ /// This function is unsafe
+ unsafe fn as_ptr(&self) -> *mut ::std::os::raw::c_void;
+}
+
+pub mod cert_chain;
+pub mod cert_context;
+pub mod cert_store;
+pub mod crypt_key;
+pub mod crypt_prov;
+/* pub */ mod ctl_context;
+pub mod key_handle;
+pub mod ncrypt_key;
+pub mod schannel_cred;
+pub mod tls_stream;
+
+mod alpn_list;
+mod context_buffer;
+mod security_context;
+
+#[cfg(test)]
+mod test;
+
+const ACCEPT_REQUESTS: u32 = Identity::ASC_REQ_ALLOCATE_MEMORY
+ | Identity::ASC_REQ_CONFIDENTIALITY
+ | Identity::ASC_REQ_SEQUENCE_DETECT
+ | Identity::ASC_REQ_STREAM
+ | Identity::ASC_REQ_REPLAY_DETECT;
+
+const INIT_REQUESTS: u32 = Identity::ISC_REQ_CONFIDENTIALITY
+ | Identity::ISC_REQ_INTEGRITY
+ | Identity::ISC_REQ_REPLAY_DETECT
+ | Identity::ISC_REQ_SEQUENCE_DETECT
+ | Identity::ISC_REQ_MANUAL_CRED_VALIDATION
+ | Identity::ISC_REQ_ALLOCATE_MEMORY
+ | Identity::ISC_REQ_STREAM
+ | Identity::ISC_REQ_USE_SUPPLIED_CREDS;
+
+trait Inner<T> {
+ unsafe fn from_inner(t: T) -> Self;
+
+ fn as_inner(&self) -> T;
+
+ fn get_mut(&mut self) -> &mut T;
+}
+
+unsafe fn secbuf(buftype: u32, bytes: Option<&mut [u8]>) -> Identity::SecBuffer {
+ let (ptr, len) = match bytes {
+ Some(bytes) => (bytes.as_mut_ptr(), bytes.len() as u32),
+ None => (ptr::null_mut(), 0),
+ };
+ Identity::SecBuffer {
+ BufferType: buftype,
+ cbBuffer: len,
+ pvBuffer: ptr as *mut c_void,
+ }
+}
+
+unsafe fn secbuf_desc(bufs: &mut [Identity::SecBuffer]) -> Identity::SecBufferDesc {
+ Identity::SecBufferDesc {
+ ulVersion: Identity::SECBUFFER_VERSION,
+ cBuffers: bufs.len() as u32,
+ pBuffers: bufs.as_mut_ptr(),
+ }
+}