проблема с Рутокен-ЭЦП (opensc-pkcs11 в linux)
Здравствуйте!
Есть проблемы с использованием Рутокен-ЭЦП в линуксе через opensc-pkcs11
1. Попытка подписать хеш вызовом C_Sign (механизм CKM_GOSTR3410) заканчивается успешно, но последующая попытка проверить полученную только что подпись через C_Verify заканчивается ошибкой CKR_FUNCTION_NOT_SUPPORTED. Поведение не зависит от того, стоят ли параметры хеша в механизме или нет.
2. Попытка создать ЭЦП механизмом CKM_GOSTR3410_WITH_GOSTR3411 валится на этапе C_SignInit с ошибкой CKR_MECHANISM_INVALID. Поведение не зависит от того, стоят ли параметры хеша в механизме или нет.
Рутокен ЭЦП инициализировался как написано здесь: http://www.opensc-project.org/opensc/wi … RutokenECP.
Ключи генерировались вызовом C_GenerateKeyPair (механизм CKM_GOSTR3410_KEY_PAIR_GEN), атрибуты выставлялись такие:
CK_OBJECT_CLASS pub_class = CKO_PUBLIC_KEY;
CK_KEY_TYPE key_type = CKK_GOSTR3410;
CK_UTF8CHAR pub_label[] = "gost public key";
CK_BBOOL true = CK_TRUE;
CK_ATTRIBUTE pkey_attr[] = {
{CKA_LABEL, &pub_label, sizeof(pub_label)-1},
{CKA_CLASS, &pub_class, sizeof(pub_class)},
{CKA_KEY_TYPE, &key_type, sizeof(key_type)},
{CKA_TOKEN, &true, sizeof(true)},
{CKA_GOSTR3410_PARAMS, g3410par, sizeof(g3410par)},
{CKA_GOSTR3411_PARAMS, g3411par, sizeof(g3411par)},
{CKA_ID, id, sizeof(id)},
};
CK_OBJECT_CLASS priv_class = CKO_PRIVATE_KEY;
CK_UTF8CHAR priv_label[] = "gost private key";
CK_ATTRIBUTE skey_attr[] = {
{CKA_LABEL, &priv_label, sizeof(priv_label)-1},
{CKA_CLASS, &priv_class, sizeof(priv_class)},
{CKA_KEY_TYPE, &key_type, sizeof(key_type)},
{CKA_TOKEN, &true, sizeof(true)},
{CKA_SENSITIVE, &true, sizeof(true)},
{CKA_SIGN, &true, sizeof(true)},
{CKA_GOSTR3410_PARAMS, g3410par, sizeof(g3410par)},
{CKA_GOSTR3411_PARAMS, g3411par, sizeof(g3411par)},
{CKA_ID, id, sizeof(id)},
};
Как пытался решать:
1. Пробовал явно загрузить криптопараметры (CKO_DOMAIN_PARAMETERS), как написано в спецификации pkcs11, но C_CreateObject вернула CKR_FUNCTION_NOT_SUPPORTED
2. Подумал было что проблема в идентификаторах CKA_ID - в rutoken_ecp.profile написано, что идентификатор закрытого ключа должен быть {0x01, 0xNN}, а соответствующего ему открытого {0x02, 0xNN}. Однако, при генерации идентификатор закрытого ключа берется из шаблона для открытого и они одинаковы, следовательно, проблема не в идентификаторах.
Вероятно, где-то я что-то делаю не так. В чем может быть проблема?