瀏覽代碼

Update SRP on change password

Neeraj Gupta 2 年之前
父節點
當前提交
788a6f62da
共有 3 個文件被更改,包括 41 次插入20 次删除
  1. 7 2
      lib/core/configuration.dart
  2. 32 16
      lib/services/user_service.dart
  3. 2 2
      lib/ui/account/password_entry_page.dart

+ 7 - 2
lib/core/configuration.dart

@@ -32,6 +32,7 @@ import 'package:photos/utils/crypto_util.dart';
 import 'package:photos/utils/file_uploader.dart';
 import 'package:photos/utils/validator_util.dart';
 import 'package:shared_preferences/shared_preferences.dart';
+import "package:tuple/tuple.dart";
 import 'package:uuid/uuid.dart';
 import 'package:wakelock/wakelock.dart';
 
@@ -234,7 +235,9 @@ class Configuration {
     return KeyGenResult(attributes, privateAttributes, loginKey);
   }
 
-  Future<KeyAttributes> getAttributesForNewPassword(String password) async {
+  Future<Tuple2<KeyAttributes, Uint8List>> getAttributesForNewPassword(
+    String password,
+  ) async {
     // Get master key
     final masterKey = getKey();
 
@@ -245,6 +248,7 @@ class Configuration {
       utf8.encode(password) as Uint8List,
       kekSalt,
     );
+    final loginKey = await CryptoUtil.deriveLoginKey(derivedKeyResult.key);
 
     // Encrypt the key with this derived key
     final encryptedKeyData =
@@ -252,13 +256,14 @@ class Configuration {
 
     final existingAttributes = getKeyAttributes();
 
-    return existingAttributes!.copyWith(
+    final updatedAttributes = existingAttributes!.copyWith(
       kekSalt: CryptoUtil.bin2base64(kekSalt),
       encryptedKey: CryptoUtil.bin2base64(encryptedKeyData.encryptedData!),
       keyDecryptionNonce: CryptoUtil.bin2base64(encryptedKeyData.nonce!),
       memLimit: derivedKeyResult.memLimit,
       opsLimit: derivedKeyResult.opsLimit,
     );
+    return Tuple2(updatedAttributes, loginKey);
   }
 
   Future<void> decryptAndSaveSecrets(

+ 32 - 16
lib/services/user_service.dart

@@ -436,7 +436,7 @@ class UserService {
 
   Future<void> setAttributes(KeyGenResult result) async {
     try {
-      await registerSrp(result.loginKey);
+      await registerOrUpdateSrp(result.loginKey);
       await _enteDio.put(
         "/users/attributes",
         data: {
@@ -465,7 +465,10 @@ class UserService {
     }
   }
 
-  Future<void> registerSrp(Uint8List loginKey) async {
+  Future<void> registerOrUpdateSrp(
+    Uint8List loginKey, {
+    SetKeysRequest? setKeysRequest,
+  }) async {
     try {
       final String username = const Uuid().v4().toString();
       final SecureRandom random = _getSecureRandom();
@@ -504,15 +507,25 @@ class UserService {
         // ignore: need to calculate secret to get M1, unused_local_variable
         final clientS = client.calculateSecret(serverB);
         final clientM = client.calculateClientEvidenceMessage();
-        final CompleteSRPSetupRequest completeSRPSetupRequest =
-            CompleteSRPSetupRequest(
-          setupID: setupSRPResponse.setupID,
-          srpM1: base64Encode(SRP6Util.encodeBigInt(clientM!)),
-        );
-        final completeResponse = await _enteDio.post(
-          "/users/srp/complete",
-          data: completeSRPSetupRequest.toMap(),
-        );
+        late Response srpCompleteResponse;
+        if(setKeysRequest == null) {
+          srpCompleteResponse = await _enteDio.post(
+            "/users/srp/complete",
+            data: {
+              'setupID': setupSRPResponse.setupID,
+              'srpM1': base64Encode(SRP6Util.encodeBigInt(clientM!)),
+            },
+          );
+        } else {
+          srpCompleteResponse = await _enteDio.post(
+            "/users/srp/update",
+            data: {
+              'setupID': setupSRPResponse.setupID,
+              'srpM1': base64Encode(SRP6Util.encodeBigInt(clientM!)),
+              'updatedKeyAttr': setKeysRequest.toMap(),
+            },
+          );
+        }
       } else {
         throw Exception("register-srp action failed");
       }
@@ -646,7 +659,9 @@ class UserService {
     }
   }
 
-  Future<void> updateKeyAttributes(KeyAttributes keyAttributes) async {
+  Future<void> updateKeyAttributes(KeyAttributes keyAttributes, Uint8List
+  loginKey,)
+  async {
     try {
       final setKeyRequest = SetKeysRequest(
         kekSalt: keyAttributes.kekSalt,
@@ -655,10 +670,11 @@ class UserService {
         memLimit: keyAttributes.memLimit!,
         opsLimit: keyAttributes.opsLimit!,
       );
-      await _enteDio.put(
-        "/users/keys",
-        data: setKeyRequest.toMap(),
-      );
+      await registerOrUpdateSrp(loginKey, setKeysRequest: setKeyRequest);
+      // await _enteDio.put(
+      //   "/users/keys",
+      //   data: setKeyRequest.toMap(),
+      // );
       await _config.setKeyAttributes(keyAttributes);
     } catch (e) {
       _logger.severe(e);

+ 2 - 2
lib/ui/account/password_entry_page.dart

@@ -383,9 +383,9 @@ class _PasswordEntryPageState extends State<PasswordEntryPage> {
         createProgressDialog(context, S.of(context).generatingEncryptionKeys);
     await dialog.show();
     try {
-      final keyAttributes = await Configuration.instance
+      final result = await Configuration.instance
           .getAttributesForNewPassword(_passwordController1.text);
-      await UserService.instance.updateKeyAttributes(keyAttributes);
+      await UserService.instance.updateKeyAttributes(result.item1, result.item2);
       await dialog.hide();
       showShortToast(context, S.of(context).passwordChangedSuccessfully);
       Navigator.of(context).pop();