import 'dart:convert'; import 'dart:typed_data'; import "package:pointycastle/export.dart"; import '../utils/encryption/aes_helper.dart'; import '/utils/encryption/crypto_utils.dart'; import '/utils/storage/database.dart'; Friend findFriendByFriendId(List friends, String id) { for (var friend in friends) { if (friend.friendId == id) { return friend; } } // Or return `null`. throw ArgumentError.value(id, "id", "No element with that id"); } class Friend{ String id; String userId; String username; String friendId; String friendSymmetricKey; RSAPublicKey publicKey; String acceptedAt; bool? selected; Friend({ required this.id, required this.userId, required this.username, required this.friendId, required this.friendSymmetricKey, required this.publicKey, required this.acceptedAt, this.selected, }); factory Friend.fromJson(Map json, RSAPrivateKey privKey) { Uint8List idDecrypted = CryptoUtils.rsaDecrypt( base64.decode(json['friend_id']), privKey, ); Uint8List username = CryptoUtils.rsaDecrypt( base64.decode(json['friend_username']), privKey, ); Uint8List symmetricKeyDecrypted = CryptoUtils.rsaDecrypt( base64.decode(json['symmetric_key']), privKey, ); String publicKeyString = AesHelper.aesDecrypt( symmetricKeyDecrypted, base64.decode(json['asymmetric_public_key']) ); RSAPublicKey publicKey = CryptoUtils.rsaPublicKeyFromPem(publicKeyString); return Friend( id: json['id'], userId: json['user_id'], username: String.fromCharCodes(username), friendId: String.fromCharCodes(idDecrypted), friendSymmetricKey: base64.encode(symmetricKeyDecrypted), publicKey: publicKey, acceptedAt: json['accepted_at'], ); } @override String toString() { return ''' id: $id userId: $userId username: $username friendId: $friendId accepted_at: $acceptedAt'''; } Map toMap() { return { 'id': id, 'user_id': userId, 'username': username, 'friend_id': friendId, 'symmetric_key': friendSymmetricKey, 'asymmetric_public_key': publicKeyPem(), 'accepted_at': acceptedAt, }; } String publicKeyPem() { return CryptoUtils.encodeRSAPublicKeyToPem(publicKey); } } // A method that retrieves all the dogs from the dogs table. Future> getFriends() async { final db = await getDatabaseConnection(); final List> maps = await db.query('friends'); return List.generate(maps.length, (i) { return Friend( id: maps[i]['id'], userId: maps[i]['user_id'], friendId: maps[i]['friend_id'], friendSymmetricKey: maps[i]['symmetric_key'], publicKey: CryptoUtils.rsaPublicKeyFromPem(maps[i]['asymmetric_public_key']), acceptedAt: maps[i]['accepted_at'], username: maps[i]['username'], ); }); } Future getFriendByFriendId(String userId) async { final db = await getDatabaseConnection(); final List> maps = await db.query( 'friends', where: 'friend_id = ?', whereArgs: [userId], ); if (maps.length != 1) { throw ArgumentError('Invalid user id'); } return Friend( id: maps[0]['id'], userId: maps[0]['user_id'], friendId: maps[0]['friend_id'], friendSymmetricKey: maps[0]['symmetric_key'], publicKey: CryptoUtils.rsaPublicKeyFromPem(maps[0]['asymmetric_public_key']), acceptedAt: maps[0]['accepted_at'], username: maps[0]['username'], ); }