Хобрук: Ваш путь к мастерству в программировании

Pkcs#11 Session.encrypt CKR_OPERATION_NOT_INITIALIZED с использованием NCryptoki

Я использую Pkcs#11 с dll NCryptoki, чтобы использовать наш HSM и управлять ключами.

Почему этот код иногда выдает ошибку 145 (CKR_OPERATION_NOT_INITIALIZED)? Я пытаюсь избежать этого, но я все еще что-то упускаю... Эта ошибка возникает случайным образом при вызове session.Encrypt().

static public byte[] Crypto(Key key, byte[] input, bool encrypt, Mechanism mech, string command)
{
    //Session session = openSession();
    var tupla = openSessionTupla();
    var session = tupla.Item1;
    try
    {

        Utility.Logger("Crypto encrypt " + encrypt.ToSafeString() + " mech " + mech.ToSafeString(), command);

        if (encrypt)
        {
            session.EncryptInit(mech, key);
            byte[] enc = session.Encrypt(input);
            session.EncryptFinal();
            session.Logout();
            session.Close();
            tupla.Item2.Finalize(IntPtr.Zero);
            return enc;
        }
        else
        {
            session.DecryptInit(mech, key);
            byte[] decriptata = session.Decrypt(input);
            session.DecryptFinal();
            session.Logout();
            session.Close();
            tupla.Item2.Finalize(IntPtr.Zero);
            return decriptata;
        }
    }
    catch (Exception e)
    {
        session.Logout();
        session.Close();
        tupla.Item2.Finalize(IntPtr.Zero);
        Utility.Logger("Crypto " + e.ToSafeString(), command);
        return null;
    }

}

Где находится openSessionTupla

public static Tuple<Session, Cryptoki> openSessionTupla()
{
    Cryptoki.Licensee = Settings.LICENSEE;
    Cryptoki.ProductKey = Settings.PRODUCTKEY;
    Cryptoki cryptoki = new Cryptoki(Settings.PATH);
    //Console.WriteLine(Settings.PATH);
    //Console.WriteLine(Settings.SessionKey);
    cryptoki.Initialize();
    SlotList slots = cryptoki.Slots;
    if (slots.Count == 0)
    {
        //Console.WriteLine("No slot available");
        return null;
    }
    // Gets the first slot available
    Slot slot = slots[0];
    if (!slot.IsTokenPresent)
    {
        //Console.WriteLine("No token inserted in the slot: " + slots[0].Info.Description);
        return null;
    }
    Token token = slot.Token;
    var flags = token.Info.Flags;
    //token.Info.Flags = 1609;
    Session session = token.OpenSession(Session.CKF_SERIAL_SESSION | Session.CKF_RW_SESSION,
                            null,
                            null);

    int nRes = session.Login(Session.CKU_USER, Settings.SessionKey);

    return new Tuple<Session, Cryptoki>(session, cryptoki);
}

  • Можно ли настроить PKCS#11 для записи журналов? Может быть, было бы полезно узнать причину ошибки 20.11.2017
  • @Egl Можете ли вы сказать мне, как это сделать с помощью NCryptoki? Я новичок здесь, и я думаю, что документации не хватает... 20.11.2017
  • Вы можете использовать PKCS11-LOGGER для регистрации всех вызовов PKCS#11. См. Устранение неполадок Pkcs11Interop с помощью PKCS11-LOGGER. как. Просто замените бесплатный Pkcs11Interop на платный NCryptoki при чтении. 21.11.2017
  • @jariq Я не понимаю твое последнее предложение. Что вы имеете в виду под «Просто заменить бесплатный Pkcs11Interop на платный NCryptoki при чтении»? 21.11.2017
  • Связанный документ описывает, как использовать pkcs11-logger с библиотекой Pkcs11Interop, которая является альтернативой NCryptoki. Вам нужно будет приспособить свое мышление/чтение к этому факту. 21.11.2017
  • Итак, я не могу войти в NCryptoki..... 21.11.2017
  • Я не знаю, сможете ли вы войти в систему только с помощью NCryptoki, но вы наверняка сможете войти с помощью pkcs11-logger и NCryptoki. 21.11.2017
  • Кажется, что pkcs11-logger — это оболочка, которая позволяет вам регистрировать вызовы pkcs11. Таким образом, ваша программа должна будет загрузить библиотеку pkcs11-logger вместо библиотеки NCryptoki. И вам нужно определить некоторые переменные среды, чтобы pkcs11-logger знал, какая настоящая библиотека pkcs11, к которой он должен обращаться (в вашем случае, NCryptoki). Согласно комментарию jariq, кажется, что эти переменные среды PKCS11_LOGGER_LIBRARY_PATH, PKCS11_LOGGER_LOG_FILE_PATH и PKCS11_LOGGER_FLAGS 21.11.2017
  • Понял.... Попробую. Есть уже пример с pkcs-11-logger и cryptoki? 22.11.2017
  • @jariq, не могли бы вы посмотреть здесь stackoverflow.com /вопросы/47569311/ 30.11.2017

Ответы:


1

Возможно, вызов session.EncryptInit(mech, key) возвращает ошибку. вот почему последующий вызов Encrypt возвращает CKR_OPERATION_NOT_INITIALIZED

Вы должны написать:

long nRes = session.EncryptInit(mech, key);
if(nRer != 0) {
// manage the error
}
else {
    byte[] enc = session.Encrypt(input);
    session.EncryptFinal();
}
24.05.2018
Новые материалы

Учебные заметки JavaScript Object Oriented Labs
Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

Разбор строк запроса в vue.js
Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
«Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..