Пример #1
0
        /// <summary>
        /// Opens a session between an application and a token in a particular slot
        /// </summary>
        /// <param name="sessionType">Type of session to be opened</param>
        /// <returns>Session</returns>
        public ISession OpenSession(SessionType sessionType)
        {
            _logger.Debug("Slot({0})::OpenSession", _slotId);

            NativeULong flags = CKF.CKF_SERIAL_SESSION;

            if (sessionType == SessionType.ReadWrite)
            {
                flags = flags | CKF.CKF_RW_SESSION;
            }

            NativeULong sessionId = CK.CK_INVALID_HANDLE;
            CKR         rv        = _pkcs11Library.C_OpenSession(_slotId, flags, IntPtr.Zero, IntPtr.Zero, ref sessionId);

            if (rv != CKR.CKR_OK)
            {
                throw new Pkcs11Exception("C_OpenSession", rv);
            }

            if (_logger.IsEnabled(Pkcs11InteropLogLevel.Info))
            {
                _logger.Info("Opened {0} session {1} with token in slot {2}", Pkcs11InteropLogUtils.ToString(sessionType), sessionId, _slotId);
            }

            return(_factories.SessionFactory.Create(_factories, _pkcs11Library, sessionId));
        }