Рутокен ЭЦП 3.0 как отформатировать/сбросить в заводские настройки?
Привет,
Есть необходимость реанимировать/отформатировать/скинуть в заводские настройки Рутокен ЭЦП 3.0 или 2.0
у которого утеряны все пин коды.
Использую для этого функцию C_EX_InitToken:
void format() {
CK_RUTOKEN_INIT_PARAM ckRtInitParams;
ckRtInitParams.ulSizeofThisStructure = sizeof(CK_RUTOKEN_INIT_PARAM);
ckRtInitParams.UseRepairMode = 1;
ckRtInitParams.pNewAdminPin = SO_PIN;
ckRtInitParams.ulNewAdminPinLen = sizeof(SO_PIN);
ckRtInitParams.pNewUserPin = USER_PIN;
ckRtInitParams.ulNewUserPinLen = sizeof(USER_PIN);
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 = TOKEN_LABEL;
ckRtInitParams.ulLabelLen = sizeof(TOKEN_LABEL);
ckRtInitParams.ulSmMode = 0;
CK_RV rv = m_pkcs11Library.getFunctionListExt()->C_EX_InitToken(
m_slot,
SO_PIN,
sizeof(SO_PIN),
&ckRtInitParams
);
if (rv != CKR_OK) {
throw std::runtime_error(to_string(rv));
}
}
Методом научного тыка выяснил, что для случая утерянных пинкодов, C_EX_InitToken нужно вызвать вхолостую до 10 раз,
пока пинкод администратора не залочится, и только потом она отработает.
0. Есть способ запустить C_EX_InitToken без лока пинкода администратора?
По крайней мере без десятка холостых вызовов с пинкодом.
1. Правильно я понимаю, что параметр UseRepairMode определяет только то, как отработает C_EX_InitToken.
Т.е. UseRepairMode не записыватся на токен во время форматирования и никак не влияет на его дальнейшую работу?
И если пин администратора залочен то C_EX_InitToken отработает только в случае UseRepairMode!=0? И это единственная его функция?
2. Чем упраляет ulSmMode?
3. В rtpkcs11t.h есть такой код:
/* C_EX_SlotManage mode */
#define MODE_RESTORE_FACTORY_DEFAULTS 0x06UL
#define MODE_GET_PIN_SET_TO_BE_CHANGED 0x07UL
/* Data structure to be used in C_EX_SlotManage - extended function with
* MODE_RESTORE_FACTORY_DEFAULTS for token supporting trusted import */
typedef struct CK_VENDOR_RESTORE_FACTORY_DEFAULTS_PARAMS {
CK_ULONG ulSizeofThisStructure; /* [in] init this field by size of this structure. For example -
st.ulSizeofThisStructure = sizeof(CK_RUTOKEN_CHANGE_EMITENT_PASS_PARAM) */
CK_BYTE_PTR pAdminPin; /* [in] pointer to byte array with current admin PIN */
CK_ULONG ulAdminPinLen; /* [in] length of current admin PIN */
CK_RUTOKEN_INIT_PARAM_PTR pInitParam; /* [in] pointer to structure with initialization params*/
CK_BYTE_PTR pNewEmitentKey; /* [in] pointer to byte array with new emitent key (32 bytes) */
CK_ULONG ulNewEmitentKeyLen; /* [in] length of new emitent key (32) */
CK_ULONG ulNewEmitentKeyRetryCount; /* [in] emitent key retry count */
} CK_VENDOR_RESTORE_FACTORY_DEFAULTS_PARAMS;
Это еще один способ сброситься в заводские настройки помимо C_EX_InitToken, но через C_EX_SlotManage?
Если да, то где можно найти пример использования?
В описании C_EX_SlotManage на сайте, не нашел упоминания про MODE_RESTORE_FACTORY_DEFAULTS.