Implement chat server auth, models, handlers, and docs context

This commit is contained in:
Foxyz committed 2026-02-20 03:44:02 +03:00
1 parent 23602efd5f
commit f6b27565cd
16 files changed
+1285 -152

No files matched your search

+23 -19
View File
@@ -1,13 +1,13 @@
import 'dart:convert';
import 'dart:math';
import 'dart:typed_data';
import 'package:bcrypt/bcrypt.dart';
import 'package:collection/collection.dart';
import 'package:crypto/crypto.dart';
import 'package:crypton/crypton.dart';
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
import 'package:crypton/crypton.dart' as crypton;
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart' as jwt;
import '../config/config.dart';
import '../../config/config.dart';
class KeyPair {
final String publicKey;
@@ -31,7 +31,7 @@ class KeyPair {
class CryptoService {
/// Generate a new Ed25519 key pair
static KeyPair generateKeyPair() {
final keyPair = ECKeypair.fromRandom();
final keyPair = crypton.ECKeypair.fromRandom();
return KeyPair(
publicKey: keyPair.publicKey.toString(),
privateKey: keyPair.privateKey.toString(),
@@ -40,17 +40,19 @@ class CryptoService {
/// Sign data with private key
static String sign(String data, String privateKey) {
final privKey = ECPrivateKey.fromString(privateKey);
final signature = privKey.createSignature(data);
return signature.toString();
final privKey = crypton.ECPrivateKey.fromString(privateKey);
final message = Uint8List.fromList(utf8.encode(data));
final signature = privKey.createSHA256Signature(message);
return base64Encode(signature);
}
/// Verify signature with public key
static bool verify(String data, String signature, String publicKey) {
try {
final pubKey = ECPublicKey.fromString(publicKey);
final sig = ECSignature.fromString(signature);
return pubKey.verifySignature(data, sig);
final pubKey = crypton.ECPublicKey.fromString(publicKey);
final message = Uint8List.fromList(utf8.encode(data));
final signatureBytes = Uint8List.fromList(base64Decode(signature));
return pubKey.verifySHA256Signature(message, signatureBytes);
} catch (_) {
return false;
}
@@ -118,6 +120,8 @@ class EncryptedKey {
}
class AuthService {
static final _nonceRandom = Random.secure();
/// Generate JWT token for user
static String generateToken(String userId, String username) {
final payload = {
@@ -125,9 +129,9 @@ class AuthService {
'username': username,
};
final jwt = JWT(payload);
return jwt.sign(
SecretKey(Config.jwtSecret),
final token = jwt.JWT(payload);
return token.sign(
jwt.SecretKey(Config.jwtSecret),
expiresIn: Config.tokenExpiry,
);
}
@@ -135,8 +139,8 @@ class AuthService {
/// Verify JWT token and return payload
static Map<String, dynamic>? verifyToken(String token) {
try {
final jwt = JWT.verify(token, SecretKey(Config.jwtSecret));
return Map<String, dynamic>.from(jwt.payload as Map);
final verified = jwt.JWT.verify(token, jwt.SecretKey(Config.jwtSecret));
return Map<String, dynamic>.from(verified.payload as Map);
} catch (_) {
return null;
}
@@ -154,8 +158,8 @@ class AuthService {
/// Generate a nonce for signature verification
static String generateNonce() {
final bytes = List<int>.generate(32, (_) => DateTime.now().microsecondsSinceEpoch % 256);
final randomBytes = sha256.convert(bytes as Uint8List);
return randomBytes.toString().substring(0, 32);
final bytes = List<int>.generate(32, (_) => _nonceRandom.nextInt(256));
final hash = sha256.convert(bytes);
return hash.toString().substring(0, 32);
}
}