Pull to refresh

Comments 4

Спасибо за статью, а сможете выложить код нагрузочного теста — мы посмотрим на предмет дедлока?
И версия 3.9 довольна старая — рекомендую проверить на последней сборке CSP 4.0.

fpPath — вариант криптографии OpenSSL/КриптоПро (OpenSSL сейчас подключаем для не ГОСТовых сертификатов).
/**<summary>Поток теста</summary>**/
public void CertTest() {
    Random pRand = new Random();
    CancellationToken pToken = fpTokenSource.Token;
    X509Certificate2 pCert1 = null;
    X509Certificate2 pCertTemp;
    byte[] arData = new byte[] { 1, 2, 3 ,4, 5};
    byte[] arSign = new byte[] {};
    int    iRes;
    string sLoc = "";
    string sErr = "";
    while (!pToken.IsCancellationRequested) {
        try {
            Thread.Sleep(pRand.Next(10));
            // 0) Получаем сертификат
            pCert1 = UCUtils.FindCertificate(fsHash, fpPath,
                                             StoreLocation.CurrentUser, StoreName.My,
                                             X509FindType.FindByThumbprint);                    
            if (pCert1 == null) Console.WriteLine("{0}: No Cert", fsPref);
            sLoc = "Cert";
            // 1) Подписываем
            arSign = UCUtils.SignData(arData, pCert1, fpPath);
            if (arSign.Length < 1000) Console.WriteLine("{0}: Err Sign", fsPref);
            sLoc = "Sign";
            // 2) Проверяем подпись
            iRes = UCUtils.CheckSign(arData, arSign, out pCertTemp, ref sErr, true, fpPath);
            if (iRes != UConsts.S_OK) AddErrCnt();
            sLoc = "CheckSign";
            // 2.1) Извлекаем инфу
            if (UCUtils.GetSignInfo(arSign, fpPath).Count == 0) 
                 Console.WriteLine("{0}: Err Sign Info", fsPref);
            sLoc = "SignInfo";
            // 3) Шифруем
            List<X509Certificate2> pCerts = new List<X509Certificate2>();
            pCerts.Add(pCert1);
            byte[] arCrypted = UCUtils.EncryptData(arData, pCerts, fpPath);
            if (arCrypted.Length == 0) Console.WriteLine("{0}: Err Crypt", fsPref);
            sLoc = "Crypt";
            // 4) Дешифруем
            if (UCUtils.DecryptData(arCrypted, fpPath).Length != 5) 
                Console.WriteLine("{0}: Err DeCrypt", fsPref);
            sLoc = "DeCrypt";
            AddCnt();
        } catch (Exception E){
            Console.WriteLine("{2}: Err Full {0} - {1}", sLoc, E.Message, fsPref);
        }
    }
}

Данный метод запускался в нескольких потоках
/**<summary>Запуск теста</summary>
* <param name="_iCnt">Количество потоков</param>
* **/
public void Start(int _iCnt) {
    rStart = DateTime.Now;
    for (int i = 0; i < _iCnt; i++) {
        new Thread(CertTest).Start();
     }
}

При 10 потоках вставало после суммарно 120к-160к циклов.
При 50 потоках иногда не доходило и до 30к.
4-ую версию попробуем.



Спасибо, посмотрим.
Кстати, в CSP 5.0 мы начали реализовывать зарубежную криптографию — возможно вам будет удобнее воспользоваться им, а не OpenSSL?

Учитывая что альтернатива это OpenSSL, то наверняка будет удобнее. Но пока на 5.0 версию вроде нет сертификата, поэтому целиком перейти на нее не получится. Так что видимо пока придется работать с двумя системами сразу — ГОСТовые через сертифицированный CSP 3.9 или 4, а все остальные через OpenSSL.
Sign up to leave a comment.

Articles