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

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