Skip to content

Commit 8ec9c73

Browse files
committed
fix: keychain test
1 parent e458ee8 commit 8ec9c73

File tree

8 files changed

+47
-22
lines changed

8 files changed

+47
-22
lines changed

lib/bloc/crypto/api_crypto.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,16 @@ class ApiCrypto {
163163
}
164164

165165
Future<String?> decodeKeychain(
166-
{required String encoded, required String password}) async {
166+
{required String xprv,
167+
required String encoded,
168+
required String password}) async {
167169
CryptoIsolate cryptoIsolate = Locator.instance.get<CryptoIsolate>();
168-
return await cryptoIsolate.send(method: 'decodeKeychain', params: {
170+
var resp = await cryptoIsolate.send(method: 'decodeKeychain', params: {
171+
'xprv': xprv,
169172
'encoded': encoded,
170173
'password': password,
171174
});
175+
return resp;
172176
}
173177

174178
Future<String> encryptXprv(

lib/bloc/crypto/crypto_bloc.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:async';
2+
import 'dart:convert';
23
import 'dart:isolate';
34
import 'dart:typed_data';
45
import 'package:bloc/bloc.dart';

lib/bloc/crypto/crypto_isolate.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ String _encodeKeychain(Map<String, dynamic> params) {
309309
String? _decodeKeychain(Map<String, dynamic> params) {
310310
String encoded = params['encoded'];
311311
String password = params['password'];
312+
String xprv = params['xprv'];
312313
Uint8List dat = Uint8List.fromList(hexToBytes(encoded));
313314
Uint8List iv = dat.sublist(0, 16);
314315
Uint8List salt = dat.sublist(16, 48);
@@ -320,7 +321,9 @@ String? _decodeKeychain(Map<String, dynamic> params) {
320321
String plainText;
321322
try {
322323
plainText = utf8.decode(decoded).trim();
323-
return plainText;
324+
Xprv _xprv = Xprv.fromEncryptedXprv(xprv, json.decode(plainText)['WITNET']);
325+
String address = _xprv.address.address;
326+
return json.decode(plainText)['WITNET'];
324327
} catch (e) {
325328
return null;
326329
}

lib/shared/api_database.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,9 @@ class ApiDatabase {
112112
walletStorage.setCurrentAddressList(addressList);
113113
}
114114

115-
Future<bool> verifyPassword(String password) async {
115+
Future<bool> verifyPassword(String xprv, String password) async {
116116
try {
117-
bool isValidPasssword = await db.verifyPassword(password);
117+
bool isValidPasssword = await db.verifyPassword(xprv, password);
118118
if (isValidPasssword) {
119119
unlocked = true;
120120
}
@@ -128,7 +128,8 @@ class ApiDatabase {
128128
Future<bool> verifyLogin(String password) async {
129129
try {
130130
String? key = await getKeychain();
131-
var value = await verifyPassword(password);
131+
List<Wallet> w = await db.walletRepository.getWallets(db.database);
132+
var value = await verifyPassword(w[0].xprv!, password);
132133
// Avoid validating the password when importing a new wallet and a keychain is already unlocked
133134
return key != '' ? true : value;
134135
} catch (e) {
@@ -150,7 +151,8 @@ class ApiDatabase {
150151

151152
Future<bool> setPassword(String newPassword,
152153
[String? oldPassword = null]) async {
153-
return await db.setPassword(newPassword, oldPassword);
154+
List<Wallet> w = await db.walletRepository.getWallets(db.database);
155+
return await db.setPassword(w[0].xprv!, newPassword, oldPassword);
154156
}
155157

156158
Future<bool> openDatabase() async {

lib/util/storage/database/database_service.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,15 +208,15 @@ class DatabaseService {
208208
return keyExists;
209209
}
210210

211-
Future<bool> verifyPassword(String password) async {
211+
Future<bool> verifyPassword(String xprv, String password) async {
212212
try {
213213
bool keyExists = await masterKeySet();
214214
if (!keyExists) {
215215
return false;
216216
}
217217

218218
String? key = await keyChain.getKey();
219-
bool valid = await keyChain.validatePassword(key, password);
219+
bool valid = await keyChain.validatePassword(xprv, key, password);
220220
if (valid) {
221221
unlocked = true;
222222
}
@@ -227,9 +227,10 @@ class DatabaseService {
227227
}
228228
}
229229

230-
Future<bool> setPassword(String newPassword, String? oldPassword) async {
230+
Future<bool> setPassword(
231+
String xprv, String newPassword, String? oldPassword) async {
231232
try {
232-
bool success = await keyChain.setKey(newPassword, oldPassword);
233+
bool success = await keyChain.setKey(xprv, newPassword, oldPassword);
233234
return success;
234235
} catch (e) {
235236
return false;

lib/util/storage/database/encrypt/keychain.dart

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,17 @@ class KeyChain {
1818
return await apiCrypto.encodeKeychain(password: password);
1919
}
2020

21-
Future<String?> decode(String encoded, String password) async {
21+
Future<String?> decode(String xprv, String encoded, String password) async {
2222
String encoded = await encode(password);
23-
return await apiCrypto.decodeKeychain(encoded: encoded, password: password);
23+
String? decoded = await apiCrypto.decodeKeychain(
24+
xprv: xprv, encoded: encoded, password: password);
25+
return decoded;
2426
}
2527

26-
Future<bool> validatePassword(String encoded, String password) async {
27-
unlocked = (await decode(encoded, password) == null) ? false : true;
28+
Future<bool> validatePassword(
29+
String xprv, String encoded, String password) async {
30+
String? valid = await decode(xprv, encoded, password);
31+
unlocked = valid != null ? true : false;
2832
return unlocked;
2933
}
3034

@@ -51,12 +55,13 @@ class KeyChain {
5155
}
5256
}
5357

54-
Future<bool> setKey(String newPassword, String? oldPassword) async {
58+
Future<bool> setKey(
59+
String xprv, String newPassword, String? oldPassword) async {
5560
bool exists = await keyExists();
5661
String encodedKey = await encode(newPassword);
5762
if (exists) {
5863
String key = await getKey();
59-
bool valid = await validatePassword(key, oldPassword!);
64+
bool valid = await validatePassword(xprv, key, oldPassword!);
6065
if (!valid) {
6166
return false;
6267
}

lib/widgets/witnet/transactions/value_transfer/modals/unlock_keychain_modal.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ Future<String?> unlockKeychainModal(
3939
_password = password;
4040
try {
4141
if (validate) {
42-
bool valid = await apiDatabase.verifyPassword(password);
42+
bool valid = await apiDatabase.verifyPassword(
43+
apiDatabase.walletStorage.currentWallet.xprv!,
44+
password);
4345
if (!valid) {
4446
setState(() => _passwordInputErrorText =
4547
localization.invalidPassword);
Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
1+
import 'package:flutter_dotenv/flutter_dotenv.dart';
2+
import 'package:my_wit_wallet/shared/locator.dart';
13
import 'package:test/test.dart';
24
import 'package:my_wit_wallet/util/storage/database/encrypt/keychain.dart';
35

46
void main() async {
7+
await dotenv.load(fileName: ".env");
8+
Locator.setup();
9+
String sheikahXprv = dotenv.get('SHEIKAH_XPRV');
510
test('Password Encryption Test', () async {
611
KeyChain keyChain = KeyChain();
712
final String password = 'Witnet';
813
final String incorrectPassword = 'Witnet1';
914

1015
var encoded = await keyChain.encode(password);
1116

12-
expect(await keyChain.validatePassword(encoded, password), true);
13-
expect(await keyChain.validatePassword(encoded, incorrectPassword), false);
14-
expect(keyChain.decode(encoded, password).runtimeType, String);
15-
expect(keyChain.decode(encoded, incorrectPassword).runtimeType, Null);
17+
var decoded = await keyChain.decode(sheikahXprv, encoded, password);
18+
var decodedIncorrect =
19+
await keyChain.decode(sheikahXprv, encoded, incorrectPassword);
20+
expect(decoded,
21+
'a70cf2d30f83959261e6180437d3e21f6e4c1572894274a89de2d94a598201a1');
22+
expect(decoded == decodedIncorrect, false);
1623
});
1724
}

0 commit comments

Comments
 (0)