Re: Работа с функциями библиотеки rtPKCS11ECP

Здравствуйте!
Возможно-ли использовать функцию C_Digest вне токена? На токене хеш высчитывается долго, приходиться использовать сторонний софт.

Re: Работа с функциями библиотеки rtPKCS11ECP

Добрый день!

Да, можно.
В комплекте разработчика в файле Common.h есть закомментированный список программных механизмов, вот например:
Механизм программного хеширования ГОСТ Р 34.11-94
CK_MECHANISM gostR3411HashMech = {CKM_GOSTR3411, parametersGostR3411, arraysize(parametersGostR3411)};

Re: Работа с функциями библиотеки rtPKCS11ECP

а для Android'а?

Re: Работа с функциями библиотеки rtPKCS11ECP

абсолютно так же :)
нужно только описать такой же тип в прослойке-wrappere и использовать его.
справитесь сами или нужно помочь?

Re: Работа с функциями библиотеки rtPKCS11ECP

сниппет очень-бы помог. заранее спасибо

Re: Работа с функциями библиотеки rtPKCS11ECP

Добрый день!

Ниже фрагмент кода создания механизма, необходимого для подсчета хэша программно (т.е. вне токена).

Можно проверить, например, на семпле sdk GOST3410 из sunPkcs11Wrapper для java.
Для Android'а все аналогично.

Long mechanismType = RtPkcs11Constants.CKM_GOSTR3411.longValue();

byte[] gostR3411params_oid = { (byte)0x06, (byte)0x07, (byte)0x2a, (byte)0x85, (byte)0x03,
                               (byte)0x02, (byte)0x02, (byte)0x1e, (byte)0x01 };

CK_MECHANISM ckMechanism = new CK_MECHANISM(mechanismType, gostR3411params_oid);

Re: Работа с функциями библиотеки rtPKCS11ECP

Здравствуйте!
А можно получить обёртку для C#?
Заранее спасибо!
Она реально облегчает разработку?

Re: Работа с функциями библиотеки rtPKCS11ECP

https://github.com/AktivCo/RutokenPkcs11Interop
https://github.com/AktivCo/RutokenPkcs11Interop.Samples

Re: Работа с функциями библиотеки rtPKCS11ECP

Спасибо! Оказывается это то, с чём я уже начал разбираться! А вопросы по данной обёртке кому и где лучше задавать?
Извините!

Re: Работа с функциями библиотеки rtPKCS11ECP

Добрый вечер, mikrob24RUS

Свои вопросы по RutokenPkcs11Interop Вы можете задавать на здесь на форуме или направлять на hotline@rutoken.ru

Re: Работа с функциями библиотеки rtPKCS11ECP

Пишу на VS2017 ASP.NET WebForms.
При помощи Вашей "обёртки", в режиме отладки на локальном IIS, получилось уже многое. Однако, после публикации пробного приложения на внешний IIS и при инициализации библиотеки возникает ошибка: "Library initialization - Operation failed [Message: Unable to load library. Error code: 0x0000007E]"
Подскажите, вполне возможно, что я концептуально не в том направлении выбрал движение!? Вроде как работа с Рутокеном из web организуется при помощи Рутокен Plugin, но с какой стороны к нему начать подходить, не пойму... а здесь вроде уже есть кое какие успехи! Подскажите пожалуйста пути решения! Хочу реализовать возможность работы с Рутокен ЭЦП 2.0 через web приложение.

Re: Работа с функциями библиотеки rtPKCS11ECP

Инициализации происходит кажется в строке:
using (var pkcs11 = new Pkcs11(Settings.RutokenEcpDllDefaultPath, Settings.OsLockingDefault))
Может какая-то проблема с путями, что dll не "цепляются"!?

Re: Работа с функциями библиотеки rtPKCS11ECP

Добрый день! Использую функцию хэширования ГОСТ34.11-2012 (512) на токене ЭЦП 2.0 следующим образом:

QByteArray Token::Hash(CK_SESSION_HANDLE &hSession)
{
    CK_BYTE data[] = { 
        0x32,0x31,0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x39,0x38,0x37,
        0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,
        0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x39,0x38,0x37,0x36,0x35,
        0x34,0x33,0x32,0x31,0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30 
    };

    CK_ULONG hashSize;
    CK_BYTE_PTR hash;
    returnValue = pFunctionList->C_DigestInit(hSession, &ckmGOST34_11_2012_512Mech);

    if(returnValue != CKR_OK)
    {
        return NULL;
    }

    returnValue = pFunctionList->C_Digest(hSession, data, arraysize(data), NULL_PTR, &hashSize);

    if(returnValue != CKR_OK)
    {
        return NULL;
    }

    hash = (CK_BYTE_PTR)malloc(hashSize * sizeof(CK_BYTE));
    memset(hash, 0, hashSize * sizeof(CK_BYTE));
    pFunctionList->C_Digest(hSession, data, arraysize(data), hash, &hashSize);

    if(returnValue != CKR_OK)
    {
        return NULL;
    }

    QByteArray result = QByteArray::fromRawData((const char*)hash, hashSize);
    qDebug() << result.toHex();
    return result;
}

В массиве data содержится тестовый набор №1 из ГОСТ34.11-2012. В результате хеширования получается следующий массив байт: "150fd4d141347ae78253b1fc9fcd2522aaad2bf06316a5e9189b7487835bc022b85a503627136177c9d6f133a3f338c83
277ca5798bd6bc0ee34282ba0a3d353".

А по стандарту должно получиться:
"486f64c1917879417fef082b3381a4e211c324f074654c38823a7b76f830ad00fa1fbae42b1285c0352f227524bc9ab1
6254288dd6863dccd5b9f54a1ad0541b"

Делал все по примерам из SDK. В чем может заключаться ошибка?

(2018-04-02 16:19:33 отредактировано Аникушин Евгений)

Re: Работа с функциями библиотеки rtPKCS11ECP

Данные в примерах ГОСТ34.11-2012 представлены в формате "big-endian". Для сверки с нашим PKCS#11 необходимо разворачивать входной и выходной буферы.

 CK_BYTE message[] = {
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
    0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
    0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33,
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31,
    0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
    0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
    0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32,
}

CK_BYTE expected_hash[] = {
    0x1b, 0x54, 0xd0, 0x1a, 0x4a, 0xf5, 0xb9, 0xd5,
    0xcc, 0x3d, 0x86, 0xd6, 0x8d, 0x28, 0x54, 0x62,
    0xb1, 0x9a, 0xbc, 0x24, 0x75, 0x22, 0x2f, 0x35,
    0xc0, 0x85, 0x12, 0x2b, 0xe4, 0xba, 0x1f, 0xfa,
    0x00, 0xad, 0x30, 0xf8, 0x76, 0x7b, 0x3a, 0x82,
    0x38, 0x4c, 0x65, 0x74, 0xf0, 0x24, 0xc3, 0x11,
    0xe2, 0xa4, 0x81, 0x33, 0x2b, 0x08, 0xef, 0x7f,
    0x41, 0x79, 0x78, 0x91, 0xc1, 0x64, 0x6f, 0x48,
}

Re: Работа с функциями библиотеки rtPKCS11ECP

Да, спасибо, все заработало верно. С подписью ГОСТ 34.10-2012 точно также поступать?

Аникушин Евгений пишет:

Данные в примерах ГОСТ34.11-2012 представлены в формате "little-endian". Для сверки с нашим PKCS#11 необходимо разворачивать входной и выходной буферы.

 CK_BYTE message[] = {
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
    0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
    0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33,
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31,
    0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
    0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
    0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32,
}

CK_BYTE expected_hash[] = {
    0x1b, 0x54, 0xd0, 0x1a, 0x4a, 0xf5, 0xb9, 0xd5,
    0xcc, 0x3d, 0x86, 0xd6, 0x8d, 0x28, 0x54, 0x62,
    0xb1, 0x9a, 0xbc, 0x24, 0x75, 0x22, 0x2f, 0x35,
    0xc0, 0x85, 0x12, 0x2b, 0xe4, 0xba, 0x1f, 0xfa,
    0x00, 0xad, 0x30, 0xf8, 0x76, 0x7b, 0x3a, 0x82,
    0x38, 0x4c, 0x65, 0x74, 0xf0, 0x24, 0xc3, 0x11,
    0xe2, 0xa4, 0x81, 0x33, 0x2b, 0x08, 0xef, 0x7f,
    0x41, 0x79, 0x78, 0x91, 0xc1, 0x64, 0x6f, 0x48,
}