/*! \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 . */ #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 & pkeys) { auth_pkeys = pkeys; } //! \~english Get list of trusted clients/servers public digital sign keys //! \~russian Получить список доверенных публичных ключей цифровой подписи клиентов/серверов //! \return \~english List of public keys \~russian Список публичных ключей PIVector 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 auth_pkeys; }; #endif // PIAUTH_H