Files
pip/libs/main/crypt/piauth.h

165 lines
7.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*! \file piauth.h
* \addtogroup Crypt
* \{
* \brief Authentication API
* \~english Authentication API for client-server key exchange and authentication
* \~russian API аутентификации для обмена ключами и аутентификации клиент-сервер
* \details
* \~english Provides classes for secure client-server authentication with digital signatures, password verification, and key exchange
* \~russian Предоставляет классы для безопасной клиент-серверной аутентификации с цифровыми подписями, проверкой пароля и обменом ключами
*/
/*
PIP - Platform Independent Primitives
PIP Authentication API
Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIAUTH_H
#define PIAUTH_H
#include "picrypt.h"
#include "piobject.h"
#include "pip_crypt_export.h"
//! \~english Authentication and key exchange class
//! \~russian Класс аутентификации и обмена ключами
class PIP_CRYPT_EXPORT PIAuth: public PIObject {
PIOBJECT(PIAuth)
public:
//! \~english Authentication state
//! \~russian Состояние аутентификации
enum State {
NotConnected, //!< \~english Not connected \~russian Не подключен
AuthProbe, //!< \~english Authentication probe \~russian Зондирование аутентификации
PassRequest, //!< \~english Password request \~russian Запрос пароля
AuthReply, //!< \~english Authentication reply \~russian Ответ аутентификации
KeyExchange, //!< \~english Key exchange \~russian Обмен ключами
Connected //!< \~english Connected, authenticated \~russian Подключено, аутентифицировано
};
//! \~english Create PIAuth with your digital sign
//! \~russian Создать PIAuth с вашей цифровой подписью
//! \param sign \~english Digital sign private key \~russian Приватный ключ цифровой подписи
PIAuth(const PIByteArray & sign);
//! \~english Set server info data for client authorize event
//! \~russian Установить информационные данные сервера для события авторизации клиента
//! \param info \~english Info data \~russian Информационные данные
void setInfoData(const PIByteArray & info) { custom_info = info; }
//! \~english Set server password for check
//! \~russian Установить пароль сервера для проверки
//! \param ps \~english Server password \~russian Пароль сервера
void setServerPassword(const PIString & ps);
//! \~english Set list of trusted clients/servers public digital sign keys
//! \~russian Установить список доверенных публичных ключей цифровой подписи клиентов/серверов
//! \param pkeys \~english List of public keys \~russian Список публичных ключей
void setAuthorizedPublicKeys(const PIVector<PIByteArray> & pkeys) { auth_pkeys = pkeys; }
//! \~english Get list of trusted clients/servers public digital sign keys
//! \~russian Получить список доверенных публичных ключей цифровой подписи клиентов/серверов
//! \return \~english List of public keys \~russian Список публичных ключей
PIVector<PIByteArray> getAuthorizedPublicKeys() { return auth_pkeys; }
//! \~english Get your digital sign public key
//! \~russian Получить ваш публичный ключ цифровой подписи
//! \return Public sign key \~english Публичный ключ подписи
PIByteArray getSignPublicKey() { return sign_pk; }
//! \~english Stop authorization
//! \~russian Остановить авторизацию
void stop();
//! \~english Start authorization as client
//! \~russian Начать авторизацию как клиент
void startClient();
//! \~english Start authorization as server, return first server message for client
//! \~russian Начать авторизацию как сервер, вернуть первое сообщение сервера для клиента
//! \return \~english First server message \~russian Первое сообщение сервера
PIByteArray startServer();
//! \~english Process received message both for client and server, return current state and new message written in "ba"
//! \~russian Обработать полученное сообщение как для клиента, так и для сервера, вернуть текущее состояние и новое сообщение в "ba"
//! \param ba \~english Message to process, output message \~russian Сообщение для обработки, выходное сообщение
//! \return \~english Current authentication state \~russian Текущее состояние аутентификации
State receive(PIByteArray & ba);
//! \~english Get session secret key, return key only when Connected state
//! \~russian Получить секретный ключ сессии, вернуть ключ только в состоянии Connected
//! \return \~english Session secret key \~russian Секретный ключ сессии
//! \note
//! \~english Returns empty array if not connected
//! \~russian Возвращает пустой массив если не подключен
PIByteArray getSecretKey();
//! \~english Generate digital sign from seed
//! \~russian Сгенерировать цифровую подпись из зерна
//! \param seed \~english Seed for key generation \~russian Зерно для генерации ключа
//! \return \~english Generated digital sign key \~russian Сгенерированный ключ цифровой подписи
static PIByteArray generateSign(const PIByteArray & seed);
//! \~english Disconnected event
//! \~russian Событие отключения
EVENT1(disconnected, PIString, reason);
//! \~english Connected event
//! \~russian Событие подключения
EVENT1(connected, PIString, info);
//! \~english Client event for authorize new server
//! \~russian Событие клиента для авторизации нового сервера
EVENT2(authorize, PIByteArray, info, bool *, ok);
//! \~english Client event for input server password
//! \~russian Событие клиента для ввода пароля сервера
EVENT1(passwordRequest, PIString *, pass);
//! \~english Server event on check client password
//! \~russian Событие сервера при проверке пароля клиента
EVENT1(passwordCheck, bool, result);
private:
enum Role {
Client,
Server
};
State disconnect(PIByteArray & ba, const PIString & error = PIString());
bool isAuthorizedKey(const PIByteArray & pkey);
PIByteArray createSKMessage();
Role role;
State state;
PIByteArray custom_info;
PICrypt crypt;
PIByteArray sign_sk, sign_pk;
PIByteArray auth_sign;
PIByteArray box_sk, box_pk;
PIByteArray my_pk;
PIByteArray secret_key;
PIByteArray pass_hash;
PIVector<PIByteArray> auth_pkeys;
};
#endif // PIAUTH_H