public void _LL_33_02_ImportCertificateTest() { Helpers.CheckPlatform(); CKR rv = CKR.CKR_OK; using (var pkcs11 = new RutokenPkcs11Library(Settings.Pkcs11LibraryPath)) { // Инициализация библиотеки rv = pkcs11.C_Initialize(Settings.InitArgs41); if ((rv != CKR.CKR_OK) && (rv != CKR.CKR_CRYPTOKI_ALREADY_INITIALIZED)) { Assert.Fail(rv.ToString()); } // Установление соединения с Рутокен в первом доступном слоте NativeULong slotId = Helpers.GetUsableSlot(pkcs11); // Открытие RW сессии NativeULong session = CK.CK_INVALID_HANDLE; rv = pkcs11.C_OpenSession(slotId, (CKF.CKF_SERIAL_SESSION | CKF.CKF_RW_SESSION), IntPtr.Zero, IntPtr.Zero, ref session); if (rv != CKR.CKR_OK) { Assert.Fail(rv.ToString()); } // Выполнение аутентификации пользователя rv = pkcs11.C_Login(session, CKU.CKU_USER, Settings.NormalUserPinArray, Convert.ToUInt32(Settings.NormalUserPinArray.Length)); if (rv != CKR.CKR_OK && rv != CKR.CKR_USER_ALREADY_LOGGED_IN) { Assert.Fail(rv.ToString()); } // Получение сохраненного тестового сертификата в формате base64 string certificateBase64 = TestData.PKI_Certificate; // Перекодирование в DER byte[] certificateDer = PKIHelpers.GetDerFromBase64(certificateBase64); // Импорт сертификата NativeULong certificateId = CK.CK_INVALID_HANDLE; Helpers.PKI_ImportCertificate(pkcs11, session, certificateDer, ref certificateId); // Получение информации о сертификате IntPtr certificateInfo; NativeULong certificateInfoLen; rv = pkcs11.C_EX_GetCertificateInfoText(session, certificateId, out certificateInfo, out certificateInfoLen); if (rv != CKR.CKR_OK) { Assert.Fail(rv.ToString()); } Assert.IsTrue(certificateInfoLen > 0); // Получение массива символов // Далее нужно воспользоваться функцией ConvertUtils.BytesToUtf8String(), // чтобы получить строку byte[] certificateInfoArray = new byte[certificateInfoLen]; Marshal.Copy(certificateInfo, certificateInfoArray, 0, (int)certificateInfoLen); // Очистка памяти токена rv = pkcs11.C_EX_FreeBuffer(certificateInfo); if (rv != CKR.CKR_OK) { Assert.Fail(rv.ToString()); } // Удаление созданного сертификата rv = pkcs11.C_DestroyObject(session, certificateId); if (rv != CKR.CKR_OK) { Assert.Fail(rv.ToString()); } // Завершение сессии работы с токеном rv = pkcs11.C_Logout(session); if (rv != CKR.CKR_OK) { Assert.Fail(rv.ToString()); } rv = pkcs11.C_CloseSession(session); if (rv != CKR.CKR_OK) { Assert.Fail(rv.ToString()); } rv = pkcs11.C_Finalize(IntPtr.Zero); if (rv != CKR.CKR_OK) { Assert.Fail(rv.ToString()); } } }