You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.7 KiB
48 lines
1.7 KiB
/* |
|
* crypto.h — Криптографические утилиты для chat GUI |
|
* |
|
* Ключи: X25519 → SHA-512 → Ed25519 (аналог sc_derive_ed25519_key / pubkey в utun) |
|
* Подпись: Ed25519 (EVP_DigestSign / EVP_DigestVerify) |
|
*/ |
|
|
|
#ifndef MSG_CRYPTO_H |
|
#define MSG_CRYPTO_H |
|
|
|
#include <QByteArray> |
|
#include <QString> |
|
#include <functional> |
|
|
|
namespace Crypto { |
|
|
|
static constexpr size_t kKeySize = 32; // X25519 / Ed25519 key size |
|
static constexpr size_t kSignSize = 64; // Ed25519 signature size |
|
static constexpr size_t kSha512Size = 64; // SHA-512 digest size |
|
|
|
// ---------------- синхронные (малые блоки) ---------------- |
|
|
|
QByteArray deriveEd25519Privkey(const QByteArray& x25519Privkey); |
|
QByteArray deriveEd25519Pubkey(const QByteArray& x25519Privkey); |
|
|
|
QByteArray sign(const QByteArray& ed25519Privkey, const QByteArray& data); |
|
bool verify(const QByteArray& ed25519Pubkey, const QByteArray& data, const QByteArray& sig); |
|
|
|
// ---------------- асинхронные (файлы / большие блоки) ---------------- |
|
|
|
struct SignResult { |
|
bool ok = false; |
|
QByteArray signature; // 64 bytes |
|
QString error; |
|
}; |
|
|
|
using SignCallback = std::function<void(const SignResult&)>; |
|
|
|
void signFile(const QString& path, const QByteArray& ed25519Privkey, SignCallback cb); |
|
void verifyFile(const QString& path, const QByteArray& ed25519Pubkey, |
|
const QByteArray& signature, SignCallback cb); |
|
void signAsync(const QByteArray& ed25519Privkey, const QByteArray& data, SignCallback cb); |
|
void verifyAsync(const QByteArray& ed25519Pubkey, const QByteArray& data, |
|
const QByteArray& signature, SignCallback cb); |
|
|
|
} // namespace Crypto |
|
|
|
#endif // MSG_CRYPTO_H
|
|
|