(2024-10-14 20:59:48 отредактировано andydandy)

Рутокен ЭЦП 3.0 вопросы по pkcs11

Привет,

Есть П.О. на с++ которое:
1. Получает сообщение зашифрованное открытым ключем 3072 бит (по алгоритму RSA с OAEP и SHA-1) и расшифровывает его закрытым ключем.
2. С помошью закрытого ключа, генерирует цифровую подпись (по алгоритму RSA PKCS#1 v1.5 и SHA-1).

Задача:
- Перенести выполнение описаных выше функций, на устройство Рутокен ЭЦП 3.0. Использовать библиотеку pkcs11.

1. Загрузка закрытого ключа на рутокен:
    Загружаю ключ с помошью `C_CreateObject`:
   

    CK_RV rv = functionList->C_CreateObject(session,
                                            privateKeyTemplate,
                                            sizeof(privateKeyTemplate) / sizeof(CK_ATTRIBUTE),
                                            &privateKeyHandle);

   
Мне не удалось загрузить ключ размером 3072 бит, но загрузились все остальные.
Я правильно понимаю что Рутокен ЭЦП 3.0 поддерживает только 512, 1024, 2048, 4096 длины ключей?

2. Дешифровка сообщения RSA с OAEP и SHA-1:
    Пытаюсь провести инициализацию:

    CK_RSA_PKCS_OAEP_PARAMS oaepParams;
    oaepParams.hashAlg = CKM_SHA_1;
    oaepParams.mgf = CKG_MGF1_SHA1;
    oaepParams.source = CKZ_DATA_SPECIFIED;
    oaepParams.pSourceData = NULL;
    oaepParams.ulSourceDataLen = 0;

    CK_MECHANISM mechanism;
    mechanism.mechanism = CKM_RSA_PKCS_OAEP;
    mechanism.pParameter = &oaepParams;
    mechanism.ulParameterLen = sizeof(oaepParams);
    
    CK_RV rv = functionList->C_DecryptInit(session, &mechanism, privKeys[0]);

    В качестве референса я использовал код утилиты pkcs11-tool от OpenSC и описание стандарта PKCS#11 current mechanisms v2.40.
   
    `C_DecryptInit` возвращал ошибку, пока я не заменил `oaepParams.source = CKZ_DATA_SPECIFIED;` на `oaepParams.source = 0;`
    C `oaepParams.source = 0;` код работает и сообщение дешифруется.
   
Можете сказать почему рутокен ожидает `oaepParams.source = 0;` в то время как например pkcs11-tool устанавливает `oaepParams.source = CKZ_DATA_SPECIFIED;` в аналогичной ситуации?
Где в стандарте или в каких-нибудь других поясняющих документах это описано?

3. Цифровая подпись RSA PKCS#1 v1.5 и SHA-1:

    CK_MECHANISM rsaSigVerMechWithSha1 = { CKM_SHA1_RSA_PKCS, NULL_PTR, 0 };
    CK_RV rv = functionList->C_SignInit(session, &rsaSigVerMechWithSha1, objects[0]);

Отработала без сюрпризов

Re: Рутокен ЭЦП 3.0 вопросы по pkcs11

andydandy, Здравствуйте.

Я правильно понимаю что Рутокен ЭЦП 3.0 поддерживает только 512, 1024, 2048, 4096 длины ключей?

Только RSA-1024, -2048 и -4096.


Можете сказать почему рутокен ожидает `oaepParams.source = 0;` в то время как например pkcs11-tool устанавливает `oaepParams.source = CKZ_DATA_SPECIFIED;` в аналогичной ситуации?
Где в стандарте или в каких-нибудь других поясняющих документах это описано?

Начиная с версии 2.16.1.0, rtpkcs11ecp (релиз ожидается в конце октября/начале ноября) будет принимать оба варианта значения поля source. В спецификации явно прописан смысл поля source только при ненулевых данных, но не указано, допустимо ли его выставление при нулевых данных.

Выставление данных для OAEP не поддерживается нами. Стек opensc, насколько нам известно, также не поддерживает такое. Чтобы наша библиотека стала более совместимой с реализацией вызовов из opensc, в следующей версии мы решили разрешить выставление данного флага, но при условии, что данные не будут передаваться.