Beispiel #1
0
        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());
                }
            }
        }