69 lines
1.7 KiB
C++
69 lines
1.7 KiB
C++
// 2022 (c) GPLv3, acetone at i2pmail.org
|
|
// Zero Storage Captcha
|
|
|
|
#ifndef ZEROSTORAGECAPTCHACRYPTO_H
|
|
#define ZEROSTORAGECAPTCHACRYPTO_H
|
|
|
|
#include <QString>
|
|
#include <QTimer>
|
|
#include <QMutex>
|
|
#include <QMultiMap>
|
|
#include <openssl/evp.h>
|
|
|
|
constexpr int KEYSIZE = 32;
|
|
constexpr int SIGSIZE = 64;
|
|
|
|
namespace ZeroStorageCaptchaCrypto {
|
|
|
|
QString hash(const QString& str);
|
|
QByteArray random(int length, bool onlyNumbers = false);
|
|
|
|
/////////
|
|
|
|
class TimeToken
|
|
{
|
|
public:
|
|
TimeToken() = delete;
|
|
|
|
static void init();
|
|
static bool inited() { return m_updater; }
|
|
static const QString currentToken() { return m_current; }
|
|
static const QString prevToken() { return m_prev; }
|
|
|
|
private:
|
|
static QTimer* m_updater;
|
|
static QString m_current;
|
|
static QString m_prev;
|
|
};
|
|
|
|
/////////
|
|
|
|
class KeyHolder
|
|
{
|
|
public:
|
|
KeyHolder() = delete;
|
|
|
|
static QString captchaSecretLine(const QString& captchaAnswer, bool prevTimeToken = false);
|
|
static bool validateCaptchaAnswer(const QString& answer, const QString& secretLine);
|
|
static void setCaseSensitive(bool enabled = false) { m_caseSensitive = enabled; }
|
|
static void setMaxSizeOfUsedTokensCache(size_t size) { m_maximalSizeOfUsedMap = size; }
|
|
|
|
friend TimeToken;
|
|
|
|
private:
|
|
static QString compact(const QString& str);
|
|
static void sign(const uint8_t * buf, size_t len, uint8_t * signature, const uint8_t * privateKey);
|
|
|
|
static void warningLog();
|
|
static void removeOldToken(const QString& oldPrevToken);
|
|
static QMutex m_usedTokensMtx;
|
|
static QMultiMap<QString, QString> m_usedTokens;
|
|
static int m_maximalSizeOfUsedMap;
|
|
static bool m_caseSensitive;
|
|
static uint8_t m_key[KEYSIZE];
|
|
};
|
|
|
|
} // namespace
|
|
|
|
#endif // ZEROSTORAGECAPTCHACRYPTO_H
|