Пример #1
0
        public void _HL_33_02_ImportCertificateTest()
        {
            using (var pkcs11 = Settings.Factories.RutokenPkcs11LibraryFactory.LoadRutokenPkcs11Library(Settings.Factories, Settings.Pkcs11LibraryPath, Settings.AppType))
            {
                // Установление соединения с Рутокен в первом доступном слоте
                var slot = Helpers.GetUsableSlot(pkcs11);

                // Открытие RW сессии
                using (var session = slot.OpenRutokenSession(SessionType.ReadWrite))
                {
                    // Выполнение аутентификации пользователя
                    session.Login(CKU.CKU_USER, Settings.NormalUserPin);

                    // Получение сохраненного тестового сертификата в формате base64
                    string certificateBase64 = TestData.PKI_Certificate;

                    // Перекодирование в DER
                    byte[] certificateDer = PKIHelpers.GetDerFromBase64(certificateBase64);

                    // Импорт сертификата
                    IObjectHandle certificateHandle;
                    Helpers.PKI_ImportCertificate(session, certificateDer, out certificateHandle, Settings.GostKeyPairId1);

                    // Получение информации о сертификате
                    string certificateInfo = session.GetCertificateInfoText(certificateHandle);
                    Assert.IsTrue(!string.IsNullOrEmpty(certificateInfo));

                    // Удаление созданного сертификата
                    session.DestroyObject(certificateHandle);

                    session.Logout();
                }
            }
        }
        static void Main(string[] args)
        {
            try
            {
                // Инициализировать библиотеку
                Console.WriteLine("Library initialization");
                using (var pkcs11 = new Pkcs11(Settings.RutokenEcpDllDefaultPath, Settings.OsLockingDefault))
                {
                    // Получить доступный слот
                    Console.WriteLine("Checking tokens available");
                    Slot slot = Helpers.GetUsableSlot(pkcs11);

                    // Открыть RW сессию в первом доступном слоте
                    Console.WriteLine("Opening RW session");
                    using (Session session = slot.OpenSession(false))
                    {
                        // Выполнить аутентификацию Пользователя
                        Console.WriteLine("User authentication");
                        session.Login(CKU.CKU_USER, SampleConstants.NormalUserPin);

                        try
                        {
                            // Импорт сертификата
                            Console.WriteLine("Import certificate...");
                            // Ввод сертификата в формате base64 и перекодирование в DER
                            Console.WriteLine(" Enter certificate in base64 format:");
                            var    certificateBase64 = new StringBuilder();
                            string line;
                            while ((line = Console.ReadLine()) != null && line != "")
                            {
                                certificateBase64.Append(line);
                            }
                            byte[] certificateDer = PKIHelpers.GetDerFromBase64(certificateBase64.ToString());

                            CertificateAttributes.Add(new ObjectAttribute(CKA.CKA_VALUE, certificateDer));
                            ObjectHandle certificateHandle = session.CreateObject(CertificateAttributes);
                            Errors.Check("Invalid certificate handle", certificateHandle != null);

                            Console.WriteLine("Certificate has been created successfully");
                        }
                        finally
                        {
                            // Сбросить права доступа как в случае исключения,
                            // так и в случае успеха.
                            // Сессия закрывается автоматически.
                            session.Logout();
                        }
                    }
                }
            }
            catch (Pkcs11Exception ex)
            {
                Console.WriteLine($"Operation failed [Method: {ex.Method}, RV: {ex.RV}]");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Operation failed [Message: {ex.Message}]");
            }
        }
Пример #3
0
        public string CreateCSR(IObjectHandle publicKey,
                                string[] dn, IObjectHandle privateKey, string[] attributes, string[] extensions)
        {
            if (this._disposed)
            {
                throw new ObjectDisposedException(this.GetType().FullName);
            }

            IntPtr[] dnPtr   = StringArrayHelpers.ConvertStringArrayToIntPtrArray(dn);
            IntPtr[] extsPtr = StringArrayHelpers.ConvertStringArrayToIntPtrArray(extensions);

            IntPtr      csr;
            NativeULong csrLength;

            CKR rv = ((LowLevelAPI81.RutokenPkcs11Library)_pkcs11Library).C_EX_CreateCSR(_sessionId, (NativeULong)(publicKey.ObjectId),
                                                                                         dnPtr, (NativeULong)dnPtr.Length,
                                                                                         out csr, out csrLength,
                                                                                         (NativeULong)(privateKey.ObjectId),
                                                                                         null, 0,
                                                                                         extsPtr, (NativeULong)extsPtr.Length);

            StringArrayHelpers.FreeUnmanagedIntPtrArray(dnPtr);
            StringArrayHelpers.FreeUnmanagedIntPtrArray(extsPtr);

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

            try
            {
                var csrString = PKIHelpers.GetBase64CSR(csr, (int)csrLength);
                if (csrString.Length == 0)
                {
                    throw new InvalidOperationException("C_EX_CreateCSR: invalid csr length");
                }

                return(csrString);
            }
            finally
            {
                rv = ((LowLevelAPI81.RutokenPkcs11Library)_pkcs11Library).C_EX_FreeBuffer(csr);
                if (rv != CKR.CKR_OK)
                {
                    throw new Pkcs11Exception("C_EX_FreeBuffer", rv);
                }
            }
        }
Пример #4
0
        public void _LL_33_01_CreateCSR_PKCS10Test()
        {
            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());
                }

                // Генерация ключевой пары ГОСТ Р 34.10-2001
                NativeULong pubKeyId  = CK.CK_INVALID_HANDLE;
                NativeULong privKeyId = CK.CK_INVALID_HANDLE;
                Helpers.GenerateGostKeyPair(pkcs11, session, ref pubKeyId, ref privKeyId, Settings.GostKeyPairId1);

                // Создание запроса на сертификат
                string[] dn =
                {
                    "CN",
                    "UTF8String:Иванов",
                    "C",
                    "RU",
                    "2.5.4.5",
                    "12312312312",
                    "1.2.840.113549.1.9.1",
                    "*****@*****.**",
                    "ST",
                    "UTF8String:Москва",
                };

                string[] exts =
                {
                    "keyUsage",
                    "digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment",
                    "extendedKeyUsage",
                    "1.2.643.2.2.34.6,1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.4",
                    "2.5.29.14",
                    "ASN1:FORMAT:HEX,OCTETSTRING:FE117B93CEC6B5065E1613E155D3A9CA597C0F81",
                    "1.2.643.100.111",
                    "ASN1:UTF8String:СКЗИ \\\"Рутокен ЭЦП 2.0\\\""
                };

                IntPtr[] dnPtr   = StringArrayHelpers.ConvertStringArrayToIntPtrArray(dn);
                IntPtr[] extsPtr = StringArrayHelpers.ConvertStringArrayToIntPtrArray(exts);

                IntPtr      csr;
                NativeULong csrLength;

                rv = pkcs11.C_EX_CreateCSR(session, pubKeyId,
                                           dnPtr, (NativeULong)dnPtr.Length,
                                           out csr, out csrLength,
                                           privKeyId,
                                           null, 0,
                                           extsPtr, (NativeULong)extsPtr.Length);

                StringArrayHelpers.FreeUnmanagedIntPtrArray(dnPtr);
                StringArrayHelpers.FreeUnmanagedIntPtrArray(extsPtr);

                if (rv != CKR.CKR_OK)
                {
                    Assert.Fail(rv.ToString());
                }

                var csrString = PKIHelpers.GetBase64CSR(csr, (int)csrLength);

                Assert.IsTrue(csrString.Length > 0);

                // Очистка памяти, выделенной для полученного буфера
                rv = pkcs11.C_EX_FreeBuffer(csr);
                if (rv != CKR.CKR_OK)
                {
                    Assert.Fail(rv.ToString());
                }

                rv = pkcs11.C_DestroyObject(session, privKeyId);
                if (rv != CKR.CKR_OK)
                {
                    Assert.Fail(rv.ToString());
                }

                rv = pkcs11.C_DestroyObject(session, pubKeyId);
                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());
                }
            }
        }
Пример #5
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());
                }
            }
        }