Токен какой модели Вы пытаетесь инициализировать?
Lehin пишет:при вызове функции получаю исключение PIN_INCORRECT
Если пред вызовом токен был отформатирован в панели Рутокен, с использованием PIN-кода Администратора по умолчанию, то нужно использовать следующее значение пина: "87654321"
должен ли пароль соответствовать какому-то формату при инициализации носителя?
Каждый символ пароля задаётся своим байтом соответственно кодировке ASCII, то есть для пароля администратора по умолчанию это будут байты 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 ("завершающий ноль" не передаётся).
1. C_InitToken() в случае с ruToken очищает память носителя? или только задает пароли администратора и пользователя?
Когда токен инициализирован, все объекты, которые могут быть уничтожены, уничтожаются (т.е. все, кроме
"не разрушаемых" объектов, таких как ключи, встроенные в токен)
2. Чем лучше воспользоваться для более правильного форматирования ruToken (например, чтобы задать политики форматирования)
В библиотеки rtPKCS11.dll присутствует функция C_EX_InitToken одним из её входных параметров является ссылка на структуру, определяющую настройки форматирования:
// структура задающая параметры форматирования токена
CK_RUTOKEN_INIT_PARAM ckRtInitParams;
// размер структуры - входной параметр (необходимо заполнить)
ckRtInitParams.ulSizeofThisStructure = sizeof(CK_RUTOKEN_INIT_PARAM);
// режим восстановления не требует ввода пин-кода администратора (0 - нет, !0 - да)
ckRtInitParams.UseRepairMode = 0;
// задать новый пин администратора
ckRtInitParams.pNewAdminPin = (CK_BYTE_PTR) "87654321";
// задать длину нового пина администратора
ckRtInitParams.ulNewAdminPinLen = 8;
// задать новый пин пользователя
ckRtInitParams.pNewUserPin = (CK_BYTE_PTR) "12345678";
// задать длину нового пина пользователя
ckRtInitParams.ulNewUserPinLen = 8;
// задать политику смены пин-кода пользователя
ckRtInitParams.ChangeUserPINPolicy = TOKEN_FLAGS_ADMIN_CHANGE_USER_PIN | TOKEN_FLAGS_USER_CHANGE_USER_PIN ;
// задать минимальную длину пина администратора
ckRtInitParams.ulMinAdminPinLen = 6;
// задать минимальную длину пина пользователя
ckRtInitParams.ulMinUserPinLen = 6;
// задать максимальное количество попыток доступа к пину администратора
ckRtInitParams.ulMaxAdminRetryCount = 10;
// задать максимальное количество попыток доступа к пину пользователя
ckRtInitParams.ulMaxUserRetryCount = 10;
// задать метку пользователя
ckRtInitParams.pTokenLabel = (CK_UTF8CHAR_PTR) LABEL;
// задать длину метки пользователя
ckRtInitParams.ulLabelLen = arraysize (LABEL);