Рутокен ЭЦП 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.
