JC-WebClient позволяет производить операции с PIN-кодами.
7.11.1 Способы ввода PIN-кода
В командах ввод PIN(PUK)-кодов возможен несколькими способами:
- Передача значения в качестве аргумента.
- Вызов определенного диалога графического интерфейса приложения JC-WebClient. Диалог подбирается автоматически в зависимости от выполняемой команды.
На примере смены PIN-кода пользователя (команда changePIN) рассмотрим 2 способа.
PIN-код в качестве аргумента
Необходимо передать значение PIN-кода в соответствующий аргумент.
var tokenID = 0, // Идентификатор токена oldUserPIN = 'old user pin', // Текущий PIN-код пользователя newUserPIN = 'new user pin'; // Устанавливаемый PIN-код пользователя// Изменить PIN-код пользователя передав PIN-коды в качестве аргументовJCWebClient2.changePIN({ args: { tokenID: tokenID, oldPin: oldUserPIN, newPin: newUserPIN }});Ввод PIN-кода через прикладной графический интерфейс
Необходимо передать значение true в аргумент useUI.
var tokenID = 0; // Идентификатор токена// Изменить PIN-код пользователя использую прикладной графический интерфейс JC-WebClientJCWebClient2.changePIN({ args: { tokenID: tokenID, useUI: true }});7.11.2 Предъявление PIN-кода
Предъявление PIN-кода необходимо для аутентификации на токене и выполняется при помощи команды bindToken.
Проверить текущее состояние позволяет команда getLoggedInState.
Отмена предъявленного PIN-кПредъявление PIN-коода выполняется при помощи команды unbindToken.
Для примера возьмем токен, который только что подключили и он получил идентификатор 0.
var tokenID = 0, // Идентификатор токена userPin = 'my pin'; // PIN-код пользователя// Проверить текущее состояние аутентификации на токене// (должно равняться JCWebClient2.Vars.AuthState.notBinded)var tokenState = JCWebClient2.getLoggedInState();console.log('1) Token is binded: ' + (tokenState.state == JCWebClient2.Vars.AuthState.binded));// Предъявить PIN-кодJCWebClient2.bindToken({ args: { tokenID: tokenID, pin: userPin }});// Проверить изменившееся состояние// (должно равняться JCWebClient2.Vars.AuthState.binded)tokenState = JCWebClient2.getLoggedInState();console.log('2) Token is binded: ' + (tokenState.state == JCWebClient2.Vars.AuthState.binded));// Отменить предъявление PIN-кодаJCWebClient2.unbindToken();// Проверить текущее состояние аутентификации на токене// (должно равняться JCWebClient2.Vars.AuthState.notBinded)var tokenState = JCWebClient2.getLoggedInState();console.log('3) Token is binded: ' + (tokenState.state == JCWebClient2.Vars.AuthState.binded));// ----- Результат -----// 1) Token is binded: false// 2) Token is binded: true// 3) Token is binded: false7.11.3 Инициализация PIN-кода пользователя
Инициализация PIN-кода пользователя (команда initUserPIN) необходима, если токен был инициализирован без PIN-кода пользователя.
Если на токене уже установлен PIN-код пользователя, то команда вернет ошибку.
Таким образом это действие можно выполнить только один раз после инициализации.
// Функция обработки результатаfunction handleResult(result, error) { if(error) { console.error('Error: ' + error); return; } console.log('User PIN has been initialized');}var tokenID = 0, // Идентификатор токена adminPin = 'admin pin', // PIN-код администратора userPin = 'new user pin'; // Инициализируемый PIN-код пользователя// Инициализировать PIN-код пользователяJCWebClient2.initUserPIN({ args: { tokenID: tokenID, adminPin: adminPin, userPin: userPin, onResult: handleResult }});// Попытка повторной инициализации PIN-кода пользователяJCWebClient2.initUserPIN({ args: { tokenID: tokenID, adminPin: adminPin, userPin: userPin + '_new', onResult: handleResult }});// ----- Результат -----// User PIN has been initialized// Error: JCWebClientError: USER_PIN_ALREADY_INITIALIZED7.11.4 Смена PIN-кода пользователя/администратора
Для смены PIN-кода пользователя/администратора используется команда changePIN.
При смене PIN-кода пользователя необходимо, чтобы токен уже имел PIN-код пользователя.
При работе с токеном GOST 2 PIN-код можно поменять только для пользователя (см. changePIN).
Пример смены PIN-кода администратора для токена PKI
var tokenID = 0, // Идентификатор токена oldPin = 'old pin', // Старый PIN администратора newPin = 'new pin'; // Новый PIN администратора// Сменить PIN-код администратораJCWebClient2.changePIN({ args: { tokenID: tokenID, userType:JCWebClient2.Vars.UserType.admin, oldPin: oldPin, newPin: newPin }});console.log('Admin PIN has been changed.');// ----- Результат -----// Admin PIN has been changed.Пример смены PIN-кода пользователя для токенов PKI и GOST 2
var tokenID = 0, // Идентификатор токена oldPin = 'old pin', // Старый PIN пользователя newPin = 'new pin'; // Новый PIN пользователя// Сменить PIN-код пользователяJCWebClient2.changePIN({ args: { tokenID: tokenID, userType:JCWebClient2.Vars.UserType.user, oldPin: oldPin, newPin: newPin }});console.log('User PIN has been changed.');// ----- Результат -----// User PIN has been changed.7.11.5 Разблокировка PIN-кода пользователя
Для разблокировки PIN-кода пользователя используется команда unblockUserPIN.
Данное действие необходимо выполнять, если истекли попытки ввода PIN-кода.
Для разблокировки токена GOST 2 необходимо ввести PUK-код.
Пример разблокировки PIN-кода пользователя для токена PKI
var tokenID = 0, // Идентификатор токена adminPin = 'admin pin'; // PIN-код администратора// Разблокировать PIN-код пользователяJCWebClient2.unblockUserPIN({ args: { tokenID: tokenID, adminPin: adminPin }});console.log('User PIN has been unblocked.');// ----- Результат -----// User PIN has been unblocked.Пример разблокировки PIN-кода пользователя для токена GOST 2
var tokenID = 0, // Идентификатор токена pukCode = 'puk code'; // PUK-код// Разблокировать PIN-код пользователяJCWebClient2.unblockUserPIN({ args: { tokenID: tokenID, pukCode: pukCode }});console.log('User PIN has been unblocked.');// ----- Результат -----// User PIN has been unblocked.7.11.6 PIN-код подписи токена GOST 2
Установка PIN-кода подписи
Для установки PIN-кода подписи используется команда setSignaturePIN.
var tokenID = 0, // Идентификатор токена pin = 'pin'; // PIN подписи// Сменить PIN-код пользователяJCWebClient2.setSignaturePIN({ args: { tokenID: tokenID, pin: pin }});console.log('Signature PIN has been set.');// ----- Результат -----// Signature PIN has been set.Смена PIN-кода подписи
Для смены PIN-кода подписи используется команда changeSignaturePIN.
При смене PIN-кода подписи необходимо, чтобы он уже был установлен.
var tokenID = 0, // Идентификатор токена oldPin = 'old pin', // Старый PIN подписи newPin = 'new pin'; // Новый PIN подписи// Сменить PIN-код пользователяJCWebClient2.changeSignaturePIN({ args: { tokenID: tokenID, oldPin: oldPin, newPin: newPin }});console.log('Signature PIN has been changed.');// ----- Результат -----// Signature PIN has been changed.Проверка наличия PIN-кода подписи
Признак наличия PIN-кода подписи можно получить из дополнительной информации о токене. Для этого используется команда getTokenInfo с аргументом extendedInfo равным true, в результате выполнения которой можно получить признак наличия PIN-кода подписи (extendedInfo.signPinState.exists).
var tokenID = 0; // Идентификатор токена// Получить информацию о токене, включая дополнительные данныеvar tokenInfo = JCWebClient2.getTokenInfo({ args: { tokenID: tokenID, extendedInfo: true }});var isExists = tokenInfo.extendedInfo.signPinState.exists;console.log('Signature PIN exists: ' + isExists);// ----- Результат -----// Signature PIN exists: true // если PIN-код подписи установлен// или// Signature PIN exists: false // если PIN-код подписи не установленПризнак необходимости предъявления PIN-кода подписи устанавливается при создании ключевой пары в аргументе requireSignaturePin команды createKeyPair. Таким образом этот признак можно получить в списке ключевых парах (команда getKeyPairList) или в списке контейнеров (команда getContainerList).
Обе команды возвращают список объектов и в каждом из объектов есть параметр signaturePin, который принимает следующие значения:
JCWebClient2.Vars.SignaturePinState.on- требуется предъявление PIN-кода подписи;JCWebClient2.Vars.SignaturePinState.off- не требуется предъявление PIN-кода подписи;JCWebClient2.Vars.SignaturePinState.n_a- нет информации о предъявлении PIN-кода подписи.
Так как информация о предъявлении PIN-кода подписи является приватной, то при состоянии аутентификации равной JCWebClient2.Vars.AuthState.notBinded всегда будет возвращаться значение JCWebClient2.Vars.SignaturePinState.n_a.
Предположим, что на токене есть 2 контейнера со следующими описаниями:
- container_pin_required - контейнер требует предъявления PIN-кода;
- container_pin_not_required - контейнер не требует предъявления PIN-кода.
Получение признака необходимости предъявления PIN-кода подписи при состоянии аутентификации JCWebClient2.Vars.AuthState.notBinded
// Вспомогательная функция отображения списка контейнеровfunction printContainerList(message, list) { console.log(message); list.forEach(function(element) { console.log(element.description + ': signaturePin - ' + element.signaturePin); });}var tokenID = 0, // Идентификатор токена userPin = 'my pin'; // PIN-код пользователя// Пример 1. Получение признака необходимости предъявления PIN-кода подписи// при состоянии аутентификации JCWebClient2.Vars.AuthState.notBinded// Получить список контейнеровvar containers = JCWebClient2.getContainerList({ args: { tokenID: tokenID }});// Отобразить список контейнеровprintContainerList('Example 1', containers);// Пример 2. Получение признака необходимости предъявления PIN-кода подписи// при состоянии аутентификации выше, чем JCWebClient2.Vars.AuthState.notBinded// Предъявить PIN-кодJCWebClient2.bindToken({ args: { tokenID: tokenID, pin: userPin }});// Получить список контейнеровcontainers = JCWebClient2.getContainerList({ args: { tokenID: tokenID }});// Отобразить список контейнеровprintContainerList('Example 2', containers);// Отменить ввод PIN-кодаJCWebClient2.unbindToken();// ----- Результат -----// Example 1:// container_pin_required: signaturePin - n_a// container_pin_not_required: signaturePin - n_a// Example 2:// container_pin_required: signaturePin - on// container_pin_not_required: signaturePin - off