Рутокен ЭЦП 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]);
Отработала без сюрпризов