Open agievich opened 2 years ago
Дополнительные правила поддерживаю. Отмечу также следующее.
Пароли используются как для аутентификации, так и для формирования ключей защищенного соединения. Поэтому нужно рассмотреть случаи, когда защищенные соединения будут создаваться и разрываться для каждого из вышеописанных правил 11 -15. Наверное можно говорить, что если статус аутентификации для какого-то пароля установлен, то значит, что существует защищенное соединения, созданное на общих ключах, сформированных по протоколу BPACE на данном пароле. Более того, если защищенное соединение разрывается принудительно, то и статус соответствующего пароля сбрасывается (например, если команда имеет некорректный формат, см. п. 12.4 СТБ 34.101.79). В этом случае для правил 11 -15 будет выполняться:
Для правила 11. Если ранее была выполнена аутентификация по какому-либо паролю, то при успешной аутентификации по одному из паролей PIN, CAN, PUK старое защищенное соединение разрывается и создается новое.
Для правила 12. В случае успешной повторной аутентификации на том же пароле старое защищенное соединение разрывается и создается новое, в случае ошибки -- старое защищенное соединение разрывается, новое не создается.
Для правила 13. В случае успешной аутентификации на другом пароле старое защищенное соединение разрывается и создается новое, в случае ошибки -- старое не разрывается, новое не создается.
Для правил 14, 15. При успешной аутентификация по PUK или CAN для защищенного соединения справедливы правила, описанные выше для случаев 11 - 13.
Дополнительно предлагается добавить правило 16: Если защищенное соединение разрывается принудительно, то статус пароля, соответствующего защищенному соединению, сбрасывается.
Парольный автомат на языке Си, реализующий описанные правила (некоторые переходы неявно продолжаются сериализацией объектов, разрывом SM и т.д.):
typedef enum
{
puk0, /* terminated */
puk1, puk2, puk3, puk4, puk5, puk6, puk7, puk8, puk9, /* puk attempts */
pin0, /* locked */
pin1, /* last attempt */
pind, /* deactivated */
pins, /* suspended */
pin2, /* two attempts */
pin3, /* operational */
} btok_pin_state;
typedef enum
{
auth_none,
auth_pin,
auth_can,
auth_puk,
} btok_auth_state;
typedef enum
{
pin_ok, pin_bad, pin_deactivate, pin_activate,
can_ok, can_bad,
puk_ok, puk_bad,
auth_close,
} btok_pwd_event;
typedef struct
{
btok_pin_state pin : 4;
btok_auth_state auth : 2;
} btok_pwd_state;
bool_t btokPwdTransition(btok_pwd_state* state, btok_pwd_event event)
{
switch (event)
{
case auth_close:
if (state->auth == auth_none)
return FALSE;
state->auth = auth_none;
return TRUE;
case pin_deactivate:
if (state->auth != auth_pin && state->auth != auth_puk)
return FALSE;
state->pin = pind;
if (state->auth == auth_pin)
state->auth = auth_none;
return TRUE;
case pin_activate:
if (state->pin != pind || state->auth != auth_puk)
return FALSE;
state->pin = pin3;
return TRUE;
case can_ok:
if (state->pin == pins)
state->pin = pin1;
state->auth = auth_can;
return TRUE;
case can_bad:
if (state->auth == auth_can)
state->auth = auth_none;
return TRUE;
case puk_ok:
if (puk1 <= state->pin && state->pin <= pin0)
state->pin = pin3;
state->auth = auth_puk;
return TRUE;
case puk_bad:
if (puk1 <= state->pin && state->pin <= pin0)
--state->pin;
if (state->auth == auth_puk)
state->auth = auth_none;
return TRUE;
case pin_ok:
if (state->pin != pin1 && state->pin != pin2 && state->pin != pin3)
return FALSE;
state->pin = pin3;
state->auth = auth_pin;
return TRUE;
case pin_bad:
if (state->pin != pin1 && state->pin != pin2 && state->pin != pin3)
return FALSE;
--state->pin;
if (state->auth == auth_pin)
state->auth = auth_none;
return TRUE;
}
return FALSE;
}
Правила парольной аутентификации заданы в подразделе 6.3 Стандарта. Вот они:
Правила охватывают не все аспекты парольной аутентификации. Например неясен срок действия статуса аутентификации по тому или иному паролю (PIN, CAN или PUK):
а) до конца сеанса работы с КТ; б) до первого из двух событий: окончание сеанса, успешная аутентификация по другому паролю; в) до первого из трех событий: окончание сеанса, успешная аутентификация по другому паролю, ошибка аутентификации по текущему паролю.
Считая корректным вариант в), предлагается ввести следующие дополнительные правила:
Успешная аутентификация по одному из паролей PIN, CAN, PUK отменяет статус успешной аутентификации по другому паролю. Нельзя быть одновременно аутентифицированным по двум паролям.
После успешной аутентификация по одному из паролей PIN, CAN, PUK можно повторно аутентифицироваться по этому же паролю. В случае успеха статус успешной аутентификации по паролю будет сохранен, в случае ошибки -- потерян.
После успешной аутентификация по одному из паролей PIN, CAN, PUK можно аутентифицироваться по другому паролю. В случае успеха статус успешной аутентификации по первому паролю будет потерян, в случае ошибки -- сохранен.
Даже если PIN заблокирован навсегда, аутентификация по PUK (и тем более по CAN) остается возможной.
Статус успешной аутентификации по CAN должен действовать непосредственно в момент последней попытки ввода PIN. Иначе эта попытка отменяется.