/* * 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 #include #include 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 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