in pkcs11/pkcs11/src/context.rs [530:558]
fn open_session_inner(
self: std::sync::Arc<Self>,
slot_id: pkcs11_sys::CK_SLOT_ID,
pin: Option<String>,
) -> Result<crate::Session, OpenSessionError> {
unsafe {
let mut handle = pkcs11_sys::CK_INVALID_SESSION_HANDLE;
let result = (self.C_OpenSession)(
slot_id,
pkcs11_sys::CKF_SERIAL_SESSION | pkcs11_sys::CKF_RW_SESSION,
std::ptr::null_mut(),
None,
&mut handle,
);
if result != pkcs11_sys::CKR_OK {
return Err(OpenSessionError::OpenSessionFailed(
format!("C_OpenSession failed with {result}").into(),
));
}
if handle == pkcs11_sys::CK_INVALID_SESSION_HANDLE {
return Err(OpenSessionError::OpenSessionFailed(
"C_OpenSession succeeded but session handle is still CK_INVALID_HANDLE".into(),
));
}
let session = crate::Session::new(self, handle, pin);
Ok(session)
}
}