import 'dart:convert'; import 'package:crypto/crypto.dart'; /// Represents a Nostr keypair (private and public keys). class NostrKeyPair { /// Private key in hex format (32 bytes, 64 hex characters). final String privateKey; /// Public key in hex format (32 bytes, 64 hex characters). final String publicKey; /// Creates a [NostrKeyPair] with the provided keys. /// /// [privateKey] - Private key in hex format. /// [publicKey] - Public key in hex format. NostrKeyPair({ required this.privateKey, required this.publicKey, }); /// Generates a new Nostr keypair. /// /// Returns a new [NostrKeyPair] with random private and public keys. factory NostrKeyPair.generate() { // Generate random 32-byte private key final random = List.generate(32, (i) => DateTime.now().microsecondsSinceEpoch % 256); final privateKeyBytes = sha256.convert(utf8.encode(DateTime.now().toString() + random.toString())).bytes.sublist(0, 32); final privateKey = privateKeyBytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join(); // Derive public key from private key (simplified - in real Nostr, use secp256k1) final publicKeyBytes = sha256.convert(privateKeyBytes).bytes.sublist(0, 32); final publicKey = publicKeyBytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join(); return NostrKeyPair( privateKey: privateKey, publicKey: publicKey, ); } /// Creates a [NostrKeyPair] from a JSON map. factory NostrKeyPair.fromJson(Map json) { return NostrKeyPair( privateKey: json['privateKey'] as String, publicKey: json['publicKey'] as String, ); } /// Converts the [NostrKeyPair] to a JSON map. Map toJson() { return { 'privateKey': privateKey, 'publicKey': publicKey, }; } @override String toString() { return 'NostrKeyPair(publicKey: ${publicKey.substring(0, 8)}...)'; } }